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