2021-08-31 00:16:15 +02:00
#!/bin/bash
TELEGRAM_TOKEN = ""
PARSE_MODE = "MarkdownV2"
2022-04-03 17:28:50 +02:00
ESCAPE_ALL = false
2022-04-03 17:42:49 +02:00
API_URL = "https://api.telegram.org"
2021-08-31 00:16:15 +02:00
2021-09-03 21:55:52 +02:00
# _escape_text(input_text)
2022-04-03 17:28:50 +02:00
function _escape( ) {
2022-04-08 21:46:14 +02:00
sed -E 's/[`~!@#$%^&*():<>.,?\|{}=+_-]/\\&/g' <<< " $1 "
2021-09-02 18:13:01 +02:00
}
2021-09-29 16:49:55 +02:00
# _unescape_text(input_text)
function _unescape_text( ) {
2022-04-03 17:28:50 +02:00
sed -E 's/\\/&<26> Meow<6F> /g;s/\\<5C> Meow<6F> \\<5C> Meow<6F> \\<5C> Meow<6F> /\\/;s/\\<5C> Meow<6F> //g' <<< " $1 "
2021-09-29 16:49:55 +02:00
}
2021-09-30 15:08:19 +02:00
# tg_send(chat, text, file, type, [id])
2021-09-02 18:13:01 +02:00
function tg_send( ) {
2022-04-03 17:28:50 +02:00
if [ [ $ESCAPE_ALL = = true ] ] ; then
2022-04-03 18:05:38 +02:00
text = " $( _escape " $2 " ) "
2022-04-08 21:46:14 +02:00
echo " $2 "
echo " $text "
2022-04-03 17:28:50 +02:00
else
text = " $2 "
fi
2021-08-31 00:16:15 +02:00
if [ [ $3 != '' ] ] ; then
local type_snake = $4
[ [ $4 = = '' ] ] && local type_snake = 'document'
[ [ $4 = = '' || $4 = = 'document' ] ] && local type = "Document"
[ [ $4 = = 'photo' ] ] && local type = "Photo"
[ [ $4 = = 'audio' ] ] && local type = "Audio"
[ [ $4 = = 'video' ] ] && local type = "Video"
[ [ $4 = = 'animation' ] ] && local type = "Animation"
[ [ $4 = = 'voice' ] ] && local type = "Voice"
[ [ $4 = = 'video_note' ] ] && local type = "VideoNote"
2021-09-30 15:08:19 +02:00
[ [ $4 = = 'sticker' ] ] && local type = "Sticker"
if [ [ $3 = = "remoteFileId" ] ] ; then
curl -s \
2022-04-08 21:46:14 +02:00
--form-string chat_id = $1 \
--form-string caption = " $text " \
2021-09-30 15:08:19 +02:00
-F parse_mode = $PARSE_MODE \
-F $type_snake = $5 \
2022-04-03 17:42:49 +02:00
" ${ API_URL } /bot ${ TELEGRAM_TOKEN } /send ${ type } "
2021-09-30 15:08:19 +02:00
else
curl -s \
2022-04-08 21:46:14 +02:00
--form-string chat_id = $1 \
--form-string caption = " $text " \
2021-09-30 15:08:19 +02:00
-F parse_mode = $PARSE_MODE \
-F $type_snake = @$3 \
2022-04-03 17:42:49 +02:00
" ${ API_URL } /bot ${ TELEGRAM_TOKEN } /send ${ type } "
2021-09-30 15:08:19 +02:00
fi
2021-08-31 00:16:15 +02:00
else
2021-09-02 18:13:01 +02:00
curl -s \
2022-04-08 21:46:14 +02:00
--form-string chat_id = $1 \
--form-string text = " $text " \
2021-08-31 00:16:15 +02:00
-F parse_mode = $PARSE_MODE \
2022-04-03 17:42:49 +02:00
" ${ API_URL } /bot ${ TELEGRAM_TOKEN } /sendMessage "
2021-08-31 00:16:15 +02:00
fi
}
# tg_get_me()
function tg_get_me( ) {
2022-04-03 17:42:49 +02:00
curl -s " ${ API_URL } /bot ${ TELEGRAM_TOKEN } /getMe "
2021-08-31 00:16:15 +02:00
}
2022-04-03 18:01:04 +02:00
# tg_get_file(id)
function tg_get_file( ) {
curl -s " ${ API_URL } /file/bot ${ TELEGRAM_TOKEN } / $( curl -s " ${ API_URL } /bot ${ TELEGRAM_TOKEN } /getFile?file_id= $1 " | jq -r '.result.file_path' ) "
}
2021-08-31 00:16:15 +02:00
# tg_get_messages(offset, timeout)
function _tg_get_updates( ) {
2022-04-03 17:42:49 +02:00
curl -s " ${ API_URL } /bot ${ TELEGRAM_TOKEN } /getUpdates?offset= $1 &timeout=p " | jq -c '.result[]'
2021-08-31 00:16:15 +02:00
}
2021-08-31 09:01:39 +02:00
function _on_msg( ) {
echo " [msg] ${ event [from_username] } : ${ event [text] } "
2021-08-31 00:16:15 +02:00
}
function _on_edit( ) {
echo " [edit] ${ event [json] } "
}
function _on_animation( ) {
echo " [animation] ${ event [json] } "
}
function _on_audio( ) {
echo " [audio] ${ event [json] } "
}
function _on_document( ) {
echo " [document] ${ event [json] } "
}
function _on_photo( ) {
echo " [photo] ${ event [json] } "
}
function _on_sticker( ) {
echo " [sticker] ${ event [json] } "
}
function _on_video( ) {
echo " [video] ${ event [json] } "
}
function _on_video_note( ) {
echo " [video_note] ${ event [json] } "
}
function _on_voice( ) {
echo " [voice] ${ event [json] } "
}
2021-08-31 19:50:47 +02:00
#jq_to_array(jq_expression)
function _jq_to_array( ) {
2021-09-02 18:13:01 +02:00
declare -ga " _tmp=( $( jq -r " $1 " | sed 's/[][`~!@#$%^&*():;<>.,?\|{}=+-]/\\&/g;' "s@\\\'@\\'@g" ) ) "
}
function tg_start( ) {
_offset = 0
while true; do
IFS = $'\n'
_events = ( $( _tg_get_updates $_offset 10) )
unset IFS
2021-09-03 22:23:26 +02:00
2021-09-02 18:13:01 +02:00
for ( ( i = 0; i<${# _events [@] } ; i++ ) ) ; do
declare -A event
2021-09-03 21:55:52 +02:00
_msg_type = " $( jq -r '(select(.message) | if .message.forward_date then "forwarded_message" else "message" end ), (select(.edited_message) | "edited_message")' <<< " ${ _events [ $i ] } " ) "
2021-09-02 18:13:01 +02:00
_event_type = " $( jq -r ' ( select ( .message) | .message), (select(.edited_message) | .edited_message) | (
( select ( .animation) | "animation" ) ,
( select ( .audio) | "audio" ) ,
2021-09-29 14:16:03 +02:00
( select ( .animation = = null) | select ( .document) | "document" ) ,
2021-09-02 18:13:01 +02:00
( select ( .photo) | "photo" ) ,
( select ( .sticker) | "sticker" ) ,
( select ( .video) | "video" ) ,
( select ( .video_note) | "video_note" ) ,
( select ( .voice) | "voice" ) ) ' <<< " ${ _events [ $i ] } " ) "
_jq_to_array ' ( select ( .message) | .message) , ( select ( .edited_message) | .edited_message) |
[ .message_id,
.from.id,
.from.is_bot,
.from.first_name,
.from.last_name,
.from.username,
.chat.id,
( if .chat.type = = "private" then .chat.username else .chat.title end) ,
.chat.type,
.date,
2021-09-29 14:16:03 +02:00
( select ( .text) | .text) , ( select ( .caption) | .caption) ,
2021-09-02 18:13:01 +02:00
( if .reply_to_message then
.reply_to_message | (
"true" ,
.message_id,
.from.id,
.from.is_bot,
.from.first_name,
.from.last_name,
.from.username,
.date,
.text
)
else
"false"
end) ]
| @sh' <<< " ${ _events [ $i ] } "
event[ message_id] = " ${ _tmp [0] } "
event[ from_id] = " ${ _tmp [1] } "
event[ from_is_bot] = " ${ _tmp [2] } "
2021-09-29 16:49:55 +02:00
event[ from_first_name] = " $( _unescape_text " ${ _tmp [3] } " ) "
event[ from_last_name] = " $( _unescape_text " ${ _tmp [4] } " ) "
2021-09-02 18:13:01 +02:00
event[ from_username] = " ${ _tmp [5] } "
event[ chat_id] = " ${ _tmp [6] } "
2021-09-29 16:49:55 +02:00
event[ chat_title] = " $( _unescape_text " ${ _tmp [7] } " ) "
2021-09-02 18:13:01 +02:00
event[ chat_type] = " ${ _tmp [8] } "
event[ date] = " ${ _tmp [9] } "
2021-09-29 16:49:55 +02:00
event[ text] = " $( _unescape_text " ${ _tmp [10] } " ) "
2021-09-02 18:13:01 +02:00
if [ [ " ${ _tmp [11] } " = = "true" ] ] ; then
event[ reply] = true
event[ reply_message_id] = " ${ _tmp [12] } "
event[ reply_from_id] = " ${ _tmp [13] } "
event[ reply_from_is_bot] = " ${ _tmp [14] } "
2021-09-29 16:49:55 +02:00
event[ reply_from_first_name] = " $( _unescape_text " ${ _tmp [15] } " ) "
event[ reply_from_last_name] = " $( _unescape_text " ${ _tmp [16] } " ) "
2021-09-02 18:13:01 +02:00
event[ reply_from_username] = " ${ _tmp [17] } "
event[ reply_date] = " ${ _tmp [18] } "
2021-09-29 16:49:55 +02:00
event[ reply_text] = " $( _unescape_text " ${ _tmp [19] } " ) "
2021-09-02 18:13:01 +02:00
else
event[ reply] = false
fi
2021-09-03 21:55:52 +02:00
unset _tmp
2022-04-03 17:28:50 +02:00
if [ [ " $_msg_type " = = forwarded_message ] ] ; then
2021-09-03 21:55:52 +02:00
_jq_to_array ' .message |
[ .forward_from.id,
.forward_from.is_bot,
.forward_from.first_name,
.forward_from.last_name,
.forward_from.username,
.forward_date] | @sh' <<< " ${ _events [ $i ] } "
event[ forward_id] = " ${ _tmp [0] } "
event[ forward_is_bot] = " ${ _tmp [1] } "
2021-09-29 16:49:55 +02:00
event[ forward_first_name] = " $( _unescape_text " ${ _tmp [2] } " ) "
event[ forward_last_name] = " $( _unescape_text " ${ _tmp [3] } " ) "
2021-09-03 21:55:52 +02:00
event[ forward_username] = " ${ _tmp [4] } "
event[ forward_date] = " ${ _tmp [5] } "
unset _tmp
fi
2021-09-03 22:23:26 +02:00
2021-09-02 18:13:01 +02:00
event[ type] = " $_msg_type "
event[ json] = " ${ _events [ $i ] } "
if [ [ " $_msg_type " = = edited_message ] ] ; then
_on_edit
elif [ [ " $_event_type " = = animation ] ] ; then
2021-09-29 14:16:03 +02:00
_jq_to_array ' ( select ( .message) | .message) , ( select ( .edited_message) | .edited_message) | .animation |
[ .file_name,
.mime_type,
.duration,
.width,
.height,
.thumb.file_id,
.thumb.file_unique_id,
.thumb.height,
.thumb.width,
.file_id,
.file_unique_id,
.file_size] | @sh' <<< " ${ _events [ $i ] } "
event[ animation_file_name] = " ${ _tmp [0] } "
event[ animation_mime_type] = " ${ _tmp [1] } "
event[ animation_duration] = " ${ _tmp [2] } "
event[ animation_width] = " ${ _tmp [3] } "
event[ animation_height] = " ${ _tmp [4] } "
event[ animation_thumb_file_id] = " ${ _tmp [5] } "
event[ animation_thumb_file_unique_id] = " ${ _tmp [6] } "
event[ animation_thumb_height] = " ${ _tmp [7] } "
event[ animation_thumb_width] = " ${ _tmp [8] } "
event[ animation_file_id] = " ${ _tmp [9] } "
event[ animation_file_unique_id] = " ${ _tmp [10] } "
event[ animation_file_size] = " ${ _tmp [11] } "
unset _tmp
2021-09-02 18:13:01 +02:00
_on_animation
elif [ [ " $_event_type " = = audio ] ] ; then
2021-09-29 14:16:03 +02:00
_jq_to_array ' ( select ( .message) | .message) , ( select ( .edited_message) | .edited_message) | .audio |
[ .duration,
.file_name,
.mime_type,
.title,
.performer,
.thumb.file_id,
.thumb.file_unique_id,
.thumb.width,
.thumb.height,
.file_id,
.file_unique_id,
.file_size] | @sh' <<< " ${ _events [ $i ] } "
event[ audio_duration] = " ${ _tmp [0] } "
event[ file_name] = " ${ _tmp [1] } "
event[ mime_type] = " ${ _tmp [2] } "
2021-09-29 16:49:55 +02:00
event[ title] = " $( _unescape_text " ${ _tmp [3] } " ) "
event[ performer] = " $( _unescape_text " ${ _tmp [4] } " ) "
2021-09-29 14:16:03 +02:00
event[ thumb_file_id] = " ${ _tmp [5] } "
event[ thumb_file_unique_id] = " ${ _tmp [6] } "
event[ thumb_width] = " ${ _tmp [7] } "
event[ thumb_height] = " ${ _tmp [8] } "
event[ file_id] = " ${ _tmp [9] } "
event[ file_unique_id] = " ${ _tmp [10] } "
event[ file_size] = " ${ _tmp [11] } "
unset _tmp
2021-09-02 18:13:01 +02:00
_on_audio
elif [ [ " $_event_type " = = document ] ] ; then
2021-09-03 21:55:52 +02:00
_jq_to_array ' ( select ( .message) | .message) , ( select ( .edited_message) | .edited_message) | .document |
[ .file_name,
.mime_type,
.file_id,
.file_unique_id,
.file_size] | @sh' <<< " ${ _events [ $i ] } "
event[ document_file_name] = " ${ _tmp [0] } "
event[ document_mime_type] = " ${ _tmp [1] } "
event[ document_file_id] = " ${ _tmp [2] } "
event[ document_file_unique_id] = " ${ _tmp [3] } "
event[ document_file_size] = " ${ _tmp [4] } "
unset _tmp
2021-09-03 22:23:26 +02:00
2021-09-02 18:13:01 +02:00
_on_document
elif [ [ " $_event_type " = = photo ] ] ; then
2021-09-03 22:23:26 +02:00
_jq_to_array ' ( select ( .message) | .message) , ( select ( .edited_message) | .edited_message) | .photo[ -1] |
[ .file_id,
.file_unique_id,
.file_size,
.width,
.height] | @sh' <<< " ${ _events [ $i ] } " # stub - add more things to me!
event[ photo_file_id] = " ${ _tmp [0] } "
event[ photo_file_unique_id] = " ${ _tmp [1] } "
event[ photo_file_size] = " ${ _tmp [2] } "
event[ photo_height] = " ${ _tmp [3] } "
event[ photo_width] = " ${ _tmp [4] } "
unset _tmp
2021-09-02 18:13:01 +02:00
_on_photo
elif [ [ " $_event_type " = = sticker ] ] ; then
2021-09-29 14:16:03 +02:00
_jq_to_array ' ( select ( .message) | .message) , ( select ( .edited_message) | .edited_message) | .sticker |
[ .width,
.height,
.emoji,
.set_name,
.is_animated,
.file_id,
.file_unique_id,
.file_size] | @sh' <<< " ${ _events [ $i ] } "
event[ sticker_width] = " ${ _tmp [0] } "
event[ sticker_height] = " ${ _tmp [1] } "
event[ sticker_emoji] = " ${ _tmp [2] } "
event[ sticker_set_name] = " ${ _tmp [3] } "
event[ sticker_is_animated] = " ${ _tmp [4] } "
event[ sticker_file_id] = " ${ _tmp [5] } "
event[ sticker_file_unique_id] = " ${ _tmp [6] } "
2021-09-30 15:08:19 +02:00
event[ sticker_file_size] = " ${ _tmp [7] } "
2021-09-29 14:16:03 +02:00
unset _tmp
2021-09-02 18:13:01 +02:00
_on_sticker
elif [ [ " $_event_type " = = video ] ] ; then
2021-09-29 14:16:03 +02:00
_jq_to_array ' ( select ( .message) | .message) , ( select ( .edited_message) | .edited_message) | .video |
[ .duration,
.width,
.height,
.file_name,
.mime_type,
.thumb.file_id,
.thumb.file_unique_id,
.thumb.width,
.thumb.height,
.file_id,
.file_unique_id,
.file_size] | @sh' <<< " ${ _events [ $i ] } "
event[ video_duration] = " ${ _tmp [0] } "
event[ video_width] = " ${ _tmp [1] } "
event[ video_height] = " ${ _tmp [2] } "
event[ video_file_name] = " ${ _tmp [3] } "
event[ video_mime_type] = " ${ _tmp [4] } "
event[ video_thumb_file_id] = " ${ _tmp [5] } "
event[ video_thumb_file_unique_id] = " ${ _tmp [6] } "
event[ video_thumb_width] = " ${ _tmp [7] } "
event[ video_thumb_height] = " ${ _tmp [8] } "
event[ video_file_id] = " ${ _tmp [9] } "
event[ video_file_unique_id] = " ${ _tmp [10] } "
event[ video_file_size] = " ${ _tmp [11] } "
unset _tmp
2021-09-02 18:13:01 +02:00
_on_video
elif [ [ " $_event_type " = = video_note ] ] ; then
2021-09-29 14:16:03 +02:00
# implement it yourself or use raw JSON
# I don't consider video_note to be a valid way of messaging
_on_video_note
2021-09-02 18:13:01 +02:00
elif [ [ " $_event_type " = = voice ] ] ; then
2021-09-29 14:16:03 +02:00
_jq_to_array ' ( select ( .message) | .message) , ( select ( .edited_message) | .edited_message) | .voice |
[ .duration,
.mime_type,
.file_id,
.file_unique_id,
.file_size] | @sh' <<< " ${ _events [ $i ] } "
event[ voice_duration] = " ${ _tmp [0] } "
event[ voice_mime_type] = " ${ _tmp [1] } "
event[ voice_file_id] = " ${ _tmp [2] } "
event[ voice_file_unique_id] = " ${ _tmp [3] } "
event[ voice_file_size] = " ${ _tmp [4] } "
unset _tmp
2021-09-02 18:13:01 +02:00
_on_voice
2021-09-03 22:23:26 +02:00
else
2021-09-03 21:55:52 +02:00
_on_msg
2021-09-02 18:13:01 +02:00
fi
2021-09-29 14:16:03 +02:00
declare -p event
2021-09-02 18:13:01 +02:00
unset event
done
[ [ ${# _events [@] } -gt 0 ] ] && _update_id = $( jq 'select(.update_id != null) | .update_id' <<< " ${ _events [-1] } " )
[ [ $_update_id != '' ] ] && _offset = $(( _update_id+1))
2021-08-31 00:16:15 +02:00
done
2021-09-02 18:13:01 +02:00
}