diff options
Diffstat (limited to 'segments/earthquake.sh')
-rwxr-xr-x | segments/earthquake.sh | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/segments/earthquake.sh b/segments/earthquake.sh new file mode 100755 index 0000000..3859094 --- /dev/null +++ b/segments/earthquake.sh @@ -0,0 +1,173 @@ +# Prints the most recent earthquake (currently only supports japan) +# It prints the location, time, and magnitude if the quake happened within +# a timelimit and magnitude threshold + +earthquake_symbol='#[fg=colour1]~' + +# The update period in seconds. +update_period=600 + +TMUX_POWERLINE_SEG_EARTHQUAKE_DATA_PROVIDER_DEFAULT="goo" +TMUX_POWERLINE_SEG_EARTHQUAKE_UPDATE_PERIOD_DEFAULT="600" +TMUX_POWERLINE_SEG_EARTHQUAKE_ALERT_TIME_WINDOW_DEFAULT="60" +TMUX_POWERLINE_SEG_EARTHQUAKE_TIME_FORMAT_DEFAULT='(%H:%M)' +TMUX_POWERLINE_SEG_EARTHQUAKE_MIN_MAGNITUDE_DEFAULT='3' + +generate_segmentrc() { + read -d '' rccontents << EORC +# The data provider to use. Currently only "goo" is supported. +export TMUX_POWERLINE_SEG_EARTHQUAKE_DATA_PROVIDER="${TMUX_POWERLINE_SEG_EARTHQUAKE_DATA_PROVIDER_DEFAULT}" +# How often to update the earthquake data in seconds. +# Note: This is not an early warning detector, use this +# to be informed about recent earthquake magnitudes in your +# area. If this is too often, goo may decide to ban you form +# their server +export TMUX_POWERLINE_SEG_EARTHQUAKE_UPDATE_PERIOD="${TMUX_POWERLINE_SEG_EARTHQUAKE_UPDATE_PERIOD_DEFAULT}" +# Only display information when earthquakes are within this many minutes +export TMUX_POWERLINE_SEG_EARTHQUAKE_ALERT_TIME_WINDOW="${TMUX_POWERLINE_SEG_EARTHQUAKE_ALERT_TIME_WINDOW_DEFAULT}" +# Display time with this format +export TMUX_POWERLINE_SEG_EARTHQUAKE_TIME_FORMAT='${TMUX_POWERLINE_SEG_EARTHQUAKE_TIME_FORMAT_DEFAULT}' +# Display only if magnitude is greater or equal to this number +export TMUX_POWERLINE_SEG_EARTHQUAKE_MIN_MAGNITUDE="${TMUX_POWERLINE_SEG_EARTHQUAKE_MIN_MAGNITUDE_DEFAULT}" +EORC + echo "$rccontents" +} + +run_segment() { + __process_settings + local tmp_file="${TMUX_POWERLINE_DIR_TEMPORARY}/earthquake.txt" + local earthquake + case "$TMUX_POWERLINE_SEG_EARTHQUAKE_DATA_PROVIDER" in + "goo") earthquake=$(__goo_earthquake) ;; + *) + echo "Unknown earthquake-information provider [${$TMUX_POWERLINE_SEG_EARTHQUAKE_DATA_PROVIDER}]"; + return 1 + esac + if [ -n "$earthquake" ]; then + echo "$earthquake_symbol #[fg=colour237]${earthquake}" + fi +} + +__process_settings() { + if [ -z "$TMUX_POWERLINE_SEG_EARTHQUAKE_DATA_PROVIDER" ]; then + export TMUX_POWERLINE_SEG_EARTHQUAKE_DATA_PROVIDER="${TMUX_POWERLINE_SEG_EARTHQUAKE_DATA_PROVIDER_DEFAULT}" + fi + if [ -z "$TMUX_POWERLINE_SEG_EARTHQUAKE_UPDATE_PERIOD" ]; then + export TMUX_POWERLINE_SEG_EARTHQUAKE_UPDATE_PERIOD="${TMUX_POWERLINE_SEG_EARTHQUAKE_UPDATE_PERIOD_DEFAULT}" + fi + if [ -z "$TMUX_POWERLINE_SEG_EARTHQUAKE_ALERT_TIME_WINDOW" ]; then + export TMUX_POWERLINE_SEG_EARTHQUAKE_ALERT_TIME_WINDOW="${TMUX_POWERLINE_SEG_EARTHQUAKE_ALERT_TIME_WINDOW_DEFAULT}" + fi + if [ -z "$TMUX_POWERLINE_SEG_EARTHQUAKE_TIME_FORMAT" ]; then + export TMUX_POWERLINE_SEG_EARTHQUAKE_TIME_FORMAT="${TMUX_POWERLINE_SEG_EARTHQUAKE_TIME_FORMAT_DEFAULT}" + fi + if [ -z "$TMUX_POWERLINE_SEG_EARTHQUAKE_MIN_MAGNITUDE" ]; then + export TMUX_POWERLINE_SEG_EARTHQUAKE_MIN_MAGNITUDE="${TMUX_POWERLINE_SEG_EARTHQUAKE_MIN_MAGNITUDE_DEFAULT}" + fi +} + +__goo_earthquake() { + location="" + magnitude="" + magnitude_number="" + timestamp="" + if [[ -f "$tmp_file" ]]; then + if shell_is_osx || shell_is_bsd; then + last_update=$(stat -f "%m" ${tmp_file}) + elif shell_is_linux; then + last_update=$(stat -c "%Y" ${tmp_file}) + fi + time_now=$(date +%s) + + up_to_date=$(echo "(${time_now}-${last_update}) < ${update_period}" | bc) + if [ "$up_to_date" -eq 1 ]; then + __read_tmp_file + fi + fi + + if [ -z "$magnitude" ]; then + # get the rss file, convert encoding to UTF-8, then delete windows carriage-returns + earthquake_data=$(curl --max-time 4 -s "http://weather.goo.ne.jp/earthquake/index.rdf" | iconv -f EUC-JP -t UTF-8 | tr -d "\r") + if [ "$?" -eq "0" ]; then + # This rss feed is not very clean or easy to use, but we will use it because + # this is all that can be found for now + + # we grab the data from the title of the first item (most recent earthquake) + earthquake_data=${earthquake_data#*item\><title>} + # end our data at the end of the approx. time + earthquake_data=${earthquake_data%%頃*} + + # pluck our data + location=$(echo $earthquake_data | awk '{print $2}') + magnitude=$(echo $earthquake_data | awk '{print $4}') + timestamp=${earthquake_data#*\(} + + __convert_jp_magnitude + __convert_jp_timestamp + + echo $location > $tmp_file + echo $magnitude >> $tmp_file + echo $timestamp >> $tmp_file + elif [ -f "$tmp_file" ]; then + __read_tmp_file + fi + fi + __convert_timestamp_to_fmt + + # extract the numerical portion of magnitude + magnitude_number=$(echo $magnitude | sed -e 's/+//' -e 's/-//') + + if [ -n "$magnitude" ]; then + if __check_alert_time_window && __check_min_magnitude ; then + echo "${location}${timestamp_fmt}:#[fg=colour0]${magnitude}" + fi + fi +} + +__convert_jp_magnitude() { + magnitude=${magnitude#震度} + # simplify high-lower designation (only used in extreme cases: above 4) + if [[ "$magnitude" == *弱 ]] ; then + magnitude="-${magnitude%弱}" + elif [[ "$magnitude" == *強 ]] ; then + magnitude="+${magnitude%強}" + fi +} + +__check_alert_time_window() { + [[ $(( ( $(date +%s) - $timestamp ) / 60 )) -lt $TMUX_POWERLINE_SEG_EARTHQUAKE_ALERT_TIME_WINDOW ]] +} + +__check_min_magnitude() { + [[ $magnitude_number -ge $TMUX_POWERLINE_SEG_EARTHQUAKE_MIN_MAGNITUDE ]] +} + +__convert_jp_timestamp() { + if shell_is_osx ; then + timestamp=$(date -j -f "%Y年%m月%d日 %H時%M分" "$timestamp" +"%s") + else + timestamp=$(echo $timestamp | $sed -e 's/年/-/' -e 's/月/-/' -e 's/日//' -e 's/時/:/' -e 's/分//') + timestamp=$(date -d "$timestamp" +"%s") + fi +} + +__convert_timestamp_to_fmt() { + if shell_is_osx ; then + timestamp_fmt=$(date -r "$timestamp" +"$TMUX_POWERLINE_SEG_EARTHQUAKE_TIME_FORMAT") + else + timestamp_fmt=$(date -d "$timestamp" +"$TMUX_POWERLINE_SEG_EARTHQUAKE_TIME_FORMAT") + fi +} + +__read_tmp_file() { + if [ ! -f "$tmp_file" ]; then + return + fi + IFS_bak="$IFS" + IFS=$'\n' + lines=($(cat ${tmp_file})) + IFS="$IFS_bak" + location="${lines[0]}" + magnitude="${lines[1]}" + timestamp="${lines[2]}" +} |