dotfiles

Dash Eclipse's dotfiles
git clone git://ezup.dev/dotfiles.git
Log | Files | Refs | README | LICENSE

tg-noworg.sh (3483B)


      1#!/bin/sh
      2
      3## $ crontab -l
      4## * * * * * ~/.local/bin/tg-noworg.sh -u
      5## 0 * * * * ~/.local/bin/tg-noworg.sh -d
      6
      7: "${progname:="${0##*/}"}"
      8
      9#CHAT_ID="" # private (message.from.id)
     10CHAT_ID="" # channel (channel_post.chat.id)
     11TG_BOT_TOKEN=""
     12tgbotapi="curl -s -F chat_id=$CHAT_ID https://api.telegram.org/bot${TG_BOT_TOKEN}"
     13
     14NOWORG="$HOME/orgmode/now.org"
     15BASENAME=$(basename $NOWORG)
     16TEMP="/tmp/tg-noworg"
     17LAST_CHECKED="${TEMP}/last_checked.txt"
     18LOG="$HOME/tg-noworg/log.json"
     19
     20if [ ! -d "$TEMP" ]; then
     21	mkdir $TEMP && cp $NOWORG $TEMP
     22	date -u +%s >$LAST_CHECKED
     23	echo "make directory: ${TEMP}"
     24	exit 0
     25fi
     26
     27send_message() {
     28	${tgbotapi}/sendMessage -F parse_mode="MarkdownV2" --form-string text="$1" | sed -e 's/\(,"text":"\).*/\1"}}\n/' >>$LOG
     29}
     30
     31modify_diff() {
     32	sed -e '
     33	# remove first two lines, empty address lines
     34	1,2d
     35	s/^@@ .*$//
     36
     37	# remove lines which contains orgmode timestamps
     38	/\(SCHEDULED:\|CLOSED:\|:PROPERTIES:\|:LAST_REPEAT:\|:END:\|- State "DONE"       from "TODO"\)/d
     39
     40	# escape for MarkdownV2
     41	s/\\/\\\\/g
     42	s/\(_\|*\|\[\|\]\|(\|)\|~\|`\|>\|#\|+\|-\|=\||\|{\|}\|\.\|!\)/\\\1/g
     43
     44	# headlines
     45	/^\(\\\-\|\\+\)\(\\\*\\\* \)/ {s/^\(\\\-\|\\+\)\(\\\*\\\* \)/\1*/; s/$/*/}
     46	/^\(\\-\|\\+\)\\\*\\\*\\\* / {s/^\(\\-\|\\+\)\(\\\*\\\*\\\*\) \(\|TODO\|DONE\)\(\| \)/\1*\\#\3* __*_/; s/$/_*__/}
     47
     48	# plain lists
     49	/^\(\\\-\|\\+\)\(\|\s\+\)\(\\\-\|\\+\|[0-9]\\\.\|[0-9]\\)\) / {s/^\(\\\-\|\\+\)\(\|\s\+\)\(\\\-\|\\+\|[0-9]\\\.\|[0-9]\\)\)\(\| \)\(\|\\\[ \\\]\|\\\[X\\\]\|\\\[\\\-\\\]\)\(\| \)/\1`\2\3\4\5\6`_/; s/$/_/}
     50	s/\(\\\-\|\\+\)\(\s\+ \)/\1`\2`/
     51
     52	# strikethrough for removed lines, remove ^+ for added lines
     53	s/^\\\-/~/; /^~/s/$/~/
     54	s/^\\+//
     55	'
     56}
     57
     58update_modified() {
     59	lastcheck=$(cat $LAST_CHECKED)
     60	echo "lastcheck: $(date -u +%FT%TZ -d @${lastcheck})"
     61	lastmod=$(stat -c %Y $NOWORG)
     62	if [ "$lastmod" -gt "$lastcheck" ]; then
     63		TEXT=$(diff -u0 ${TEMP}/$BASENAME $NOWORG | modify_diff)
     64		send_message "$TEXT"
     65		cp $NOWORG ${TEMP}/$BASENAME
     66		date -u +%s >$LAST_CHECKED
     67		echo "update: $BASENAME"
     68	else
     69		echo "skip: $BASENAME"
     70	fi
     71}
     72
     73purge_message() {
     74	sed -i '/^$/d' $LOG
     75	TIME_48H_AGO=$(date -u -d-48hours-5minute +%s)
     76	TIME_40H_AGO=$(date -u -d-40hours +%s)
     77	i=1
     78	while IFS= read -r json; do
     79		echo "########## Line $i"
     80		json=$(echo "$json" | sed 's/\(,"description":"\).*/\1"}/')
     81		OK=$(echo "$json" | jq .ok)
     82		if [ $OK = true ]; then
     83			MESSAGE_ID=$(echo "$json" | jq .result.message_id)
     84			CHAT_ID=$(echo "$json" | jq .result.chat.id)
     85			JSON_DATE=$(echo "$json" | jq .result.date)
     86			FORMATTED_DATE=$(date -u +%FT%TZ -d@${JSON_DATE})
     87			DURATION=$(ddiff -i'%s' -f'%H hours %M minutes ago' $JSON_DATE $(date +%s))
     88			[ $JSON_DATE -lt $TIME_48H_AGO ] && echo "$FORMATTED_DATE ($DURATION) -- CANT BE DELETED"
     89			[ $JSON_DATE -gt $TIME_40H_AGO ] && echo "$FORMATTED_DATE ($DURATION) -- RESERVED"
     90			if [ $JSON_DATE -ge $TIME_48H_AGO ] && [ $JSON_DATE -le $TIME_40H_AGO ]; then
     91				echo "$FORMATTED_DATE ($DURATION) -- WILL BE DELETED"
     92				$tgbotapi/deleteMessage -F message_id=$MESSAGE_ID | sed 's/$/\n/'
     93				sed -i "${i}s/^.*$//" $LOG
     94				sleep 1
     95			fi
     96		else
     97			ERROR_CODE=$(echo "$json" | jq .error_code)
     98			echo "Contains ERROR CODE: $ERROR_CODE"
     99		fi
    100		i=$(( i + 1 ))
    101		echo
    102	done <$LOG
    103}
    104
    105usage() {
    106	cat <<_EOF
    107Usage: $progname -u    Update modified content to Telegram channel
    108       $progname -d    Purge messages which sent between 40 and 48 hours ago
    109_EOF
    110	exit 1
    111}
    112
    113case "$1" in
    114	-u) update_modified ;;
    115	-d) purge_message ;;
    116	*) usage ;;
    117esac
    118exit 0