# 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\>} # 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]}" }