#! /bin/bash

####################################################################################
# 描述：更新 conky 天气数据 
# 作者：李景强
# 创建：2023-04-19
# 修订：2023-04-20
# 说明：
#      ① 系统平台：deepin20.9
#      ② 支持显示3天内的天气
#      ③ 支持显示天气图片
####################################################################################

### 预定义部分 ###

APP_NAME="myconky-weather-update"   							#本脚本文件名称
APP_VER="23.04.20"																#脚本版本号
APP_DIR="$HOME/.myconky"													#脚本所文件夹
DATA_DIR="$APP_DIR/.data"													#天气数据所在文件夹

CONKYRC_USER="$HOME/.conkyrc"											# conky 用户配置文件
CONKYRC_MINI="$APP_DIR/myconkyrc_mini"						# conky 配置文件模板

USER_CITY_CFG="$DATA_DIR/myconky-weather.cfg"			#用户自定义的城市天气网页地址

WEATHER_DATA="$DATA_DIR/myconky-weather.db"				#存储天气数据的文件
WEATHER_PAGE="https://tianqi.moji.com"      			#墨迹天气官网主页
# 强行指定地理位置（打开墨迹天气，选择位置后，复制浏览器地址栏网址即可）
WEATHER_URL="https://tianqi.moji.com/weather/china/henan/lingbao"	

WEATHER_HTML=`mktemp`

URL_SRC="https://h5tq.moji.com/tianqi/assets/images/weather"
PIC_SRC="$HOME/.myconky/moji-weather"
PIC_DIR="$DATA_DIR"

### DEBUG 开关 ###
# =1：显示 DEBUG 信息； =0：不显示 DEBUG 信息
DEBUG=0 

### 获取墨迹天气图标 ###
## https://h5tq.moji.com/tianqi/assets/images/weather/w*.png
#  测试范围： w0.png → w99.png
## 部分图片未使用，跳过下载，如：
# w11-w12.png, w21-w28.png; w37-w43.png; w47-w99.png

if [ ! -d "$PIC_DIR" ]
then
	mkdir -p "$PIC_DIR"
	for a in `seq 0 46`
	do
  	case "$a" in
			1[12] | 2[1-8] | 3[7-9] | 4[0-37-9] | [5-9][0-9]) continue ;;
			*) : ;;
		esac
	wget -c "$URL_DIR/w$a.png" -O "$PIC_DIR/w$a.png"
	done
fi


### 某一天的天气图标 ###
declare -a picname dayname
dayname[0]="weather-day00.png"
dayname[1]="weather-day01.png"
dayname[2]="weather-day02.png"
dayname[3]="weather-day03.png"

_feed_weather_picname () {
## 数组 line_pic[@]: 天气数据页面中，某一天的天气图片
#    w0.png - w46.png 在哪一行
## 可以在城市天气页面的源代码文件中找到相关行信息
#  下面是墨迹天气默认3天天气预报中的行信息
#		112：今天天气图标【当前时段】；152：今天天气图标；171：明天天气图标；190：后天天气图标

declare -a line_pic

case "$LINE_MODE" in
	1) line_pic=( 112 152 171 190 ) ;;
	2) line_pic=( 122 162 181 200 ) ;;
	*) line_pic=( 132 172 191 210 ) ;;
esac

picname[0]=`sed -n "${line_pic[0]}p" "$WEATHER_HTML" | cut -d'/' -f8 | cut -d'"' -f1`
picname[1]=`sed -n "${line_pic[1]}p" "$WEATHER_HTML" | cut -d'/' -f8 | cut -d'"' -f1`
picname[2]=`sed -n "${line_pic[2]}p" "$WEATHER_HTML" | cut -d'/' -f8 | cut -d'"' -f1`
picname[3]=`sed -n "${line_pic[3]}p" "$WEATHER_HTML" | cut -d'/' -f8 | cut -d'"' -f1`

# 更新天气图片 ( $DATA_DIR/weather-day??.png )
for a in 0 1 2 3
do
	## 确认 picname[@] 是否有效
	# （主要防止因为网络慢，或者无网络导致天气数据文件缺失或不完整，产生无效的文件名）
	#     w44.png 为空白的透明图片。
	case "${picname[a]}" in
		w[0-9].png | w[0-9][0-9].png) : ;;
		*) picname[a]="w44.png" ;;
	esac

	## 先删除旧的3天内的天气图片（实际即取消3个 weather-day??.png 图片的符号链接） 
	if [ -L "$PIC_DIR/${dayname[a]}" ]
	then
		unlink "$PIC_DIR/${dayname[a]}"
	elif [ -e "$PIC_DIR/${dayname[a]}" ]
	then
		rm -f "$PIC_DIR/${dayname[a]}"    
	else 
		mv -fv "$PIC_DIR/${dayname[a]}" "$PIC_DIR/${dayname[a]}.$(date +'%s')"
  fi
  
  ln -s "$PIC_SRC/${picname[a]}" "$PIC_DIR/${dayname[a]}"
done  
}


### 截取“明天”和“后天”的天气数据 ###

declare -a line_day_2nd line_day_3th

_feed_3days () {
## 天气数据和对应的行数（示例）：
# L79: XX县，省，中国
#
# 数据模式1：数组 line_day_2nd[@], line_day_3th[@]
# id 0: L167 / L186: 明天 / 后天
# id 1: L171 / L190: 雷阵雨
# id 2: L174 / L193: 9° / 23°
# id 3: L176 / L195: 北风
# id 4: L177 / L196: 3-4级
# id 5: L180 / L199: 80 良
# ...

if [ "$DEBUG" = 1 ]
then
	echo "  L201: LINE_MODE=$LINE_MODE"
fi

case "$LINE_MODE" in
	1) 	
		line_day_2nd=( 167 171 174 176 177 180 )
    line_day_3th=( 186 190 193 195 196 199 )
		;;
 	2) 	
		line_day_2nd=( 177 181 184 186 187 190 )
		line_day_3th=( 196 200 203 205 206 209 )
		;;
	3 | *) 	
		line_day_2nd=( 157 161 164 166 167 170 )
		line_day_3th=( 176 180 183 185 186 189 )
	  ;;		
esac

if [ "$DEBUG" = 1 ]; then
	echo
	echo "  L220: LINE_MODE=$LINE_MODE"
	echo "  line_day_2nd[@] = ( ${line_day_2nd[*]} )"
	echo "  line_day_3th[@] = ( ${line_day_3th[*]} )"
	echo 
fi

sed -n "${line_day_2nd[0]}p" "$WEATHER_HTML" | cut -d'>' -f2 | cut -d'<' -f1 | tee -a "$WEATHER_DATA"

sed -n "${line_day_2nd[1]}p" "$WEATHER_HTML" | cut -d'"' -f4 | tee -a "$WEATHER_DATA"

sed -n "${line_day_2nd[2]}p" "$WEATHER_HTML" | cut -d'>' -f2 | cut -d'<' -f1 | tee -a "$WEATHER_DATA"
sed -n "${line_day_2nd[3]}p" "$WEATHER_HTML" | cut -d'>' -f2 | cut -d'<' -f1 | tee -a "$WEATHER_DATA"
sed -n "${line_day_2nd[4]}p" "$WEATHER_HTML" | cut -d'>' -f2 | cut -d'<' -f1 | tee -a "$WEATHER_DATA"

sed -n "${line_day_2nd[5]}p" "$WEATHER_HTML" | sed 's/^[ \t]*//' | cut -d' ' -f-2 | tee -a "$WEATHER_DATA"

echo | tee -a "$WEATHER_DATA"

sed -n "${line_day_3th[0]}p" "$WEATHER_HTML" | cut -d'>' -f2 | cut -d'<' -f1 | tee -a "$WEATHER_DATA"

sed -n "${line_day_3th[1]}p" "$WEATHER_HTML" | cut -d'"' -f4 | tee -a "$WEATHER_DATA"

sed -n "${line_day_3th[2]}p" "$WEATHER_HTML" | cut -d'>' -f2 | cut -d'<' -f1 | tee -a "$WEATHER_DATA"
sed -n "${line_day_3th[3]}p" "$WEATHER_HTML" | cut -d'>' -f2 | cut -d'<' -f1 | tee -a "$WEATHER_DATA"
sed -n "${line_day_3th[4]}p" "$WEATHER_HTML" | cut -d'>' -f2 | cut -d'<' -f1 | tee -a "$WEATHER_DATA"

sed -n "${line_day_3th[5]}p" "$WEATHER_HTML" | sed 's/^[ \t]*//' | cut -d' ' -f-2 | tee -a "$WEATHER_DATA"
}


### 更新 Conky 天气数据 ###
##  读取城市天气的默认配置文件：$USER_CITY_CFG
#   如果配置文件 $USER_CITY_CFG 存在，获取城市天气信息网址
if [ -s "$USER_CITY_CFG" ]
then
	WEATHER_URL=`grep "^http" "$USER_CITY_CFG" | head -1`
fi


### 下载天气页面的 html 文件 ###
wget -c -q -t 3 -T 5 "${WEATHER_URL}" -O "$WEATHER_HTML"

## 1. 如果联网失败，无法下载天气数据文件（即文件大小为0），
#   	可能要保留旧的天气数据, 并取消本次天气更新：
#     如果文件修改日期 = 今天，则确定要保留文件，再取消本次天气更新；
#	    否则强制清空文件，并取消本次天气更新。
## 2.如果联网正常，则清空旧的天气数据，并进行后面的更新操作

## STR_TODAY，STR_ANYDAY 变量示例(年，月，日)：( 2018_02_28 )
STR_ANYDAY=`ls -l --time-style +_%Y_%m_%d_ "$WEATHER_DATA" | cut -d'_' -f2-4`
STR_TODAY="$(date +'%Y_%m_%d')"
		
if [ ! -s "$WEATHER_HTML" ]
then
  NEED_UPDATE=0
	  
	if [ "$STR_ANYDAY" = "$STR_TODAY" ]
	then
		KEEP_DATA=1; 		#保留今天的天气数据
	else
		KEEP_DATA=0;		#清除旧的天气数据
	fi

else 
  KEEP_DATA=0 			#清除旧的天气数据
  NEED_UPDATE=1	
fi

if [ "$DEBUG" = 1 ]
then
	ls -l $WEATHER_HTML
	echo -e "  L800:  STR_TODAY=$STR_TODAY\n\tSTR_ANYDAY=$STR_ANYDAY"
	echo -e "  \tKEEP_DATA=$KEEP_DATA\n\tNEED_UPDATE=$NEED_UPDATE"
fi
	
if [ "$KEEP_DATA" != 1 ]
then
  : > "$WEATHER_DATA"		#清空旧的（过期的）天气数据文件，防止过期的天气数据误导用户
fi

if [ "$NEED_UPDATE" = 1 ]
then
  :
else
  echo  "  提示: 取消本次天气更新！"
  exit 0;
fi
	
date | tee -a "$WEATHER_DATA"

echo -e "\n\e[1;36m→ 正在获取天气信息, 请稍候...\e[0m"

sleep 2

declare -a line_uptime=( 124 114 124 104 134 ) 
declare -a line_day_1st
declare -i MODES=4

for a in `seq 1 $MODES`
do
  case "$a" in
		1) LINE_TEST=108
			pd=`sed -n "${LINE_TEST}p" "$WEATHER_HTML" | grep li`
        
			if  [ "$pd" = '' ]
			then
				L_UPTIME=114;
				line_day_1st=( 111 113 122 155 72 105 117 118 )
				LINE_MODE=1
				break
			else
				echo "  [信息] 切换到数据模式2, 重新解析数据..."
				continue;  	
			fi
		;;
		2) LINE_TEST=118
			pd=`sed -n "${LINE_TEST}p" "$WEATHER_HTML" | grep li`
        
			if  [ "$pd" = '' ]
			then
				L_UPTIME=124; 
				line_day_1st=( 121 123 132 165 72 105 127 128 )
				LINE_MODE=2
				break
			else 
				echo "  [信息] 切换到数据模式3, 重新解析数据..."
				continue;  	
			fi
		;;
		3) ## 调试中，待确认
			LINE_TEST=98
			pd=`sed -n "${LINE_TEST}p" "$WEATHER_HTML" | grep li`
        
			if  [ "$pd" = '' ]
			then
				L_UPTIME=104; 
				line_day_1st=( 101 103 112 145 72 105 107 108 )
				LINE_MODE=3
				break
			else 
				echo "  [信息] 切换到数据模式4, 重新解析数据..."
				continue;  	
			fi
		;;
		4 | *) LINE_TEST=128
			pd=`sed -n "${LINE_TEST}p" "$WEATHER_HTML" | grep li`
        
			if  [ "$pd" = '' ]
			then
				L_UPTIME=134; 
				line_day_1st=( 131 133 142 175 72 105 137 138 )
				LINE_MODE=4
			else 
				echo "  错误: 无效的天气页面文件。可能是解析模式错误（没有在指定的行找到数据），或者网络异常导致无法正常下载天气数据！" 1>&2
	  		exit 0;   	
			fi
		;; 	
	esac
done    


if [ "$DEBUG" = 1 ]
then
  echo
  echo "  L585: LINE_MODE=$LINE_MODE"
  echo "  line_day_1st[*] = ( ${line_day_1st[*]} )"
  echo "  line_uptime[*] = ( ${line_uptime[*]} )"
  echo 
fi


wd=`sed -n "${line_day_1st[0]}p" "$WEATHER_HTML" | awk -F'>' '{print $2}' | awk -F'<' '{print $1}'`
tq=`sed -n "${line_day_1st[1]}p" "$WEATHER_HTML" | awk -F'>' '{print $2}' | awk -F'<' '{print $1}' `
by=`sed -n "${line_day_1st[2]}p" "$WEATHER_HTML" | awk -F'>' '{print $2}' | awk -F'<' '{print $1}'`
wc=`sed -n "${line_day_1st[3]}p" "$WEATHER_HTML" | awk -F'>' '{print $2}' | awk -F'<' '{print $1}' `

dq=`sed -n "${line_day_1st[4]}p" "$WEATHER_HTML" | awk -F'>' '{print $2}' | awk -F'<' '{print $1}'`
kqzl=`sed -n "${line_day_1st[5]}p" "$WEATHER_HTML" | awk -F'>' '{print $2}' | awk -F'<' '{print $1}' | awk '{print $1 $2}'`

sd=`sed -n "${line_day_1st[6]}p" "$WEATHER_HTML" | awk -F'>' '{print $2}' | awk -F'<' '{print $1}' | awk '{print $1 $2}'`
fl=`sed -n "${line_day_1st[7]}p" "$WEATHER_HTML" | awk -F'>' '{print $2}' | awk -F'<' '{print $1}'`

UPTIME="`sed -n "${L_UPTIME}p" "$WEATHER_HTML" | awk -F'>' '{print $2}' | awk -F'<' '{print $1}'`"

### CITY 城市数据所在的行号（默认使用第72行）:
#         66（市）,82（市）; 
#   或者： 72（县，或者城市）,79(县，省，中国)。

declare -a line_city=( 72 79 66 82 )

for a in "${line_city[@]}"
do
  CITY="`sed -n "${a}p" "$WEATHER_HTML" | cut -d'>' -f2 | cut -d'<' -f1`"
  
  ## 如果获取的城市的名称无效或空白，则尝试从其它行获取城市名称
  case "$CITY" in
	'' | .) # echo "  L447: CITY='$CITY'"
	continue; ;;
	..* | *) : ; break ;;
  esac
done	
	
echo

echo -e "$CITY" | tee -a "$WEATHER_DATA"
echo -e "$wd°"  | tee -a "$WEATHER_DATA"
echo -e "$tq    $wc" | tee -a "$WEATHER_DATA"

echo -e "空气质量：$kqzl    $fl    $sd\n$by　 [ ${UPTIME} ]\n" | tee -a "$WEATHER_DATA"

_feed_3days

## 创建天气对应的图片文件的符号链接, 如：
#  图片原始目录：
#		~/.myconky/moji-weather
#  保存到：
# 	~/.myconky/.data/weather-day00.png，weather-day02.png，weather-day03.png 
_feed_weather_picname

exit 0;
