2016-01-02 19:35:15 +00:00
#!/bin/bash
2016-04-19 09:49:35 +00:00
2015-07-10 05:43:08 +00:00
# bashbot, the Telegram bot written in bash.
2016-04-19 09:49:35 +00:00
# Written by Drew (@topkecleon) and Daniil Gentili (@danogentili).
2019-03-24 18:31:54 +00:00
# Also contributed: JuanPotato, BigNerd95, TiagoDanin, iicc1, Gnadelwartz.
2016-01-05 16:54:34 +00:00
# https://github.com/topkecleon/telegram-bot-bash
2016-04-19 09:49:35 +00:00
# Depends on JSON.sh (http://github.com/dominictarr/JSON.sh) (MIT/Apache),
# and on tmux (http://github.com/tmux/tmux) (BSD).
2015-07-10 05:43:08 +00:00
# This file is public domain in the USA and all free countries.
2016-04-19 09:49:35 +00:00
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
2015-07-10 05:43:08 +00:00
2019-03-22 16:47:36 +00:00
# get location of bashbot.sh an change to bashbot dir
SCRIPT = " ./ $( basename $0 ) "
SCRIPTDIR = " $( dirname $0 ) "
cd " ${ SCRIPTDIR } "
if [ ! -w "." ] ; then
echo -e " \e[0;31mWARNING: $SCRIPTDIR is not writeable!\e[0m "
ls -ld .
fi
2019-03-18 13:45:19 +00:00
2016-05-13 15:45:56 +00:00
if [ ! -f "JSON.sh/JSON.sh" ] ; then
2016-04-19 09:59:37 +00:00
echo "You did not clone recursively! Downloading JSON.sh..."
2016-05-05 13:40:56 +00:00
git clone http://github.com/dominictarr/JSON.sh
2016-04-19 09:59:37 +00:00
echo "JSON.sh has been downloaded. Proceeding."
fi
2016-06-05 10:41:49 +00:00
if [ ! -f "token" ] ; then
clear
echo -e '\e[0;31mTOKEN MISSING.\e[0m'
echo "PLEASE WRITE YOUR TOKEN HERE"
read token
echo " $token " >> token
fi
2019-03-22 16:47:36 +00:00
TMPDIR = "./tmp-bot-bash"
2019-03-18 13:45:19 +00:00
if [ ! -d " $TMPDIR " ] ; then
mkdir " $TMPDIR "
2019-03-22 16:47:36 +00:00
elif [ ! -w " $TMPDIR " ] ; then
clear
echo -e " \e[0;31mCan't write to $TMPDIR !.\e[0m "
ls -ld $TMPDIR
exit 1
2019-03-18 13:45:19 +00:00
fi
2019-03-22 16:47:36 +00:00
COUNT = "./count"
if [ ! -f " $COUNT " ] ; then
touch " $COUNT "
elif [ ! -w " $COUNT " ] ; then
clear
echo -e " \e[0;31mCan't write to $COUNT !.\e[0m "
ls -l $COUNT
exit 1
fi
2016-04-18 10:05:31 +00:00
source commands.sh source
2015-07-10 05:43:08 +00:00
URL = 'https://api.telegram.org/bot' $TOKEN
2016-01-06 16:11:56 +00:00
2016-04-16 01:43:15 +00:00
2015-11-25 03:07:39 +00:00
MSG_URL = $URL '/sendMessage'
2016-06-05 10:41:49 +00:00
LEAVE_URL = $URL '/leaveChat'
KICK_URL = $URL '/kickChatMember'
UNBAN_URL = $URL '/unbanChatMember'
2015-11-25 03:07:39 +00:00
PHO_URL = $URL '/sendPhoto'
2016-01-06 16:11:56 +00:00
AUDIO_URL = $URL '/sendAudio'
DOCUMENT_URL = $URL '/sendDocument'
STICKER_URL = $URL '/sendSticker'
VIDEO_URL = $URL '/sendVideo'
VOICE_URL = $URL '/sendVoice'
LOCATION_URL = $URL '/sendLocation'
2016-04-17 18:00:37 +00:00
VENUE_URL = $URL '/sendVenue'
2016-01-06 16:11:56 +00:00
ACTION_URL = $URL '/sendChatAction'
2016-01-17 16:46:24 +00:00
FORWARD_URL = $URL '/forwardMessage'
2016-04-16 01:43:15 +00:00
INLINE_QUERY = $URL '/answerInlineQuery'
2016-04-16 18:50:05 +00:00
ME_URL = $URL '/getMe'
2019-03-18 13:45:19 +00:00
DELETE_URL = $URL '/deleteMessage'
2016-04-19 09:49:35 +00:00
ME = $( curl -s $ME_URL | ./JSON.sh/JSON.sh -s | egrep '\["result","username"\]' | cut -f 2 | cut -d '"' -f 2)
2016-04-16 18:50:05 +00:00
2016-01-06 16:11:56 +00:00
2016-01-05 17:26:27 +00:00
FILE_URL = 'https://api.telegram.org/file/bot' $TOKEN '/'
2015-07-10 05:43:08 +00:00
UPD_URL = $URL '/getUpdates?offset='
2016-01-06 16:11:56 +00:00
GET_URL = $URL '/getFile'
2015-07-10 05:43:08 +00:00
OFFSET = 0
2019-03-22 19:30:22 +00:00
declare -A USER MESSAGE URLS CONTACT LOCATION CHAT FORWARD REPLYTO
2015-07-10 05:43:08 +00:00
2016-06-09 12:11:33 +00:00
urlencode( ) {
echo " $* " | sed 's:%:%25:g;s: :%20:g;s:<:%3C:g;s:>:%3E:g;s:#:%23:g;s:{:%7B:g;s:}:%7D:g;s:|:%7C:g;s:\\:%5C:g;s:\^:%5E:g;s:~:%7E:g;s:\[:%5B:g;s:\]:%5D:g;s:`:%60:g;s:;:%3B:g;s:/:%2F:g;s:?:%3F:g;s^:^%3A^g;s:@:%40:g;s:=:%3D:g;s:&:%26:g;s:\$:%24:g;s:\!:%21:g;s:\*:%2A:g'
}
2015-12-26 01:47:10 +00:00
send_message( ) {
2016-04-17 12:00:45 +00:00
[ " $2 " = "" ] && return 1
2016-01-05 16:01:28 +00:00
local chat = " $1 "
2017-11-11 07:51:49 +00:00
local text = " $( echo " $2 " | sed 's/ mykeyboardstartshere.*//g;s/ myfilelocationstartshere.*//g;s/ mylatstartshere.*//g;s/ mylongstartshere.*//g;s/ mytitlestartshere.*//g;s/ myaddressstartshere.*//g;s/ mykeyboardendshere.*//g' ) "
2016-04-16 18:50:05 +00:00
local arg = " $3 "
[ " $3 " != "safe" ] && {
2019-03-14 20:07:27 +00:00
text = " $( echo " $text " | sed 's/ mynewlinestartshere /\r\n/g' ) " # hack for linebreaks in startproc scripts
2017-11-11 07:51:49 +00:00
local no_keyboard = " $( echo $2 | sed '/mykeyboardendshere/!d;s/.*mykeyboardendshere.*/mykeyboardendshere/' ) "
2016-01-19 13:17:06 +00:00
2017-11-11 07:51:49 +00:00
local keyboard = " $( echo " $2 " | sed '/mykeyboardstartshere /!d;s/.*mykeyboardstartshere //g;s/ myfilelocationstartshere.*//g;s/ mylatstartshere.*//g;s/ mylongstartshere.*//g;s/ mytitlestartshere.*//g;s/ myaddressstartshere.*//g;s/ mykeyboardendshere.*//g' ) "
2016-01-19 13:17:06 +00:00
2017-11-11 07:51:49 +00:00
local file = " $( echo " $2 " | sed '/myfilelocationstartshere /!d;s/.*myfilelocationstartshere //g;s/ mykeyboardstartshere.*//g;s/ mylatstartshere.*//g;s/ mylongstartshere.*//g;s/ mytitlestartshere.*//g;s/ myaddressstartshere.*//g;s/ mykeyboardendshere.*//g' ) "
2016-01-19 13:17:06 +00:00
2017-11-11 07:51:49 +00:00
local lat = " $( echo " $2 " | sed '/mylatstartshere /!d;s/.*mylatstartshere //g;s/ mykeyboardstartshere.*//g;s/ myfilelocationstartshere.*//g;s/ mylongstartshere.*//g;s/ mytitlestartshere.*//g;s/ myaddressstartshere.*//g;s/ mykeyboardendshere.*//g' ) "
2016-04-19 09:49:35 +00:00
2017-11-11 07:51:49 +00:00
local long = " $( echo " $2 " | sed '/mylongstartshere /!d;s/.*mylongstartshere //g;s/ mykeyboardstartshere.*//g;s/ myfilelocationstartshere.*//g;s/ mylatstartshere.*//g;s/ mytitlestartshere.*//g;s/ myaddressstartshere.*//g;s/ mykeyboardendshere.*//g' ) "
2016-04-19 09:49:35 +00:00
2017-11-11 07:51:49 +00:00
local title = " $( echo " $2 " | sed '/mytitlestartshere /!d;s/.*mylongstartshere //g;s/ mykeyboardstartshere.*//g;s/ myfilelocationstartshere.*//g;s/ mylatstartshere.*//g;s/ myaddressstartshere.*//g;s/ mykeyboardendshere.*//g' ) "
local address = " $( echo " $2 " | sed '/myaddressstartshere /!d;s/.*mylongstartshere //g;s/ mykeyboardstartshere.*//g;s/ myfilelocationstartshere.*//g;s/ mylatstartshere.*//g;s/ mytitlestartshere.*//g;s/ mykeyboardendshere.*//g' ) "
2016-04-19 09:49:35 +00:00
2016-03-23 14:56:22 +00:00
}
2017-11-11 07:51:49 +00:00
if [ " $no_keyboard " != "" ] ; then
2019-03-18 13:45:19 +00:00
echo " remove_keyboard $chat $text " > $TMPDIR /prova
2017-11-11 07:51:49 +00:00
remove_keyboard " $chat " " $text "
local sent = y
fi
2016-01-05 16:54:34 +00:00
if [ " $keyboard " != "" ] ; then
2016-01-05 16:01:28 +00:00
send_keyboard " $chat " " $text " " $keyboard "
2016-01-05 16:54:34 +00:00
local sent = y
fi
2016-01-19 13:17:06 +00:00
if [ " $file " != "" ] ; then
2016-03-20 21:34:55 +00:00
send_file " $chat " " $file " " $text "
2016-01-05 16:54:34 +00:00
local sent = y
fi
2016-04-17 18:00:37 +00:00
if [ " $lat " != "" -a " $long " != "" -a " $address " = "" -a " $title " = "" ] ; then
2016-01-19 13:17:06 +00:00
send_location " $chat " " $lat " " $long "
local sent = y
fi
2016-04-17 18:00:37 +00:00
if [ " $lat " != "" -a " $long " != "" -a " $address " != "" -a " $title " != "" ] ; then
send_venue " $chat " " $lat " " $long " " $title " " $address "
local sent = y
fi
2016-01-19 19:27:09 +00:00
if [ " $sent " != "y" ] ; then
2016-04-16 18:50:05 +00:00
send_text " $chat " " $text "
2016-01-19 19:27:09 +00:00
fi
2016-01-03 01:14:07 +00:00
}
2016-01-05 16:01:28 +00:00
2016-04-16 18:50:05 +00:00
send_text( ) {
2016-04-17 12:00:45 +00:00
case " $2 " in
html_parse_mode*)
send_html_message " $1 " " ${ 2 //html_parse_mode } "
; ;
markdown_parse_mode*)
send_markdown_message " $1 " " ${ 2 //markdown_parse_mode } "
; ;
*)
2016-10-25 15:58:09 +00:00
send_normal_message " $1 " " $2 "
2016-04-17 12:00:45 +00:00
; ;
esac
2016-04-16 18:50:05 +00:00
}
2016-10-25 15:58:09 +00:00
send_normal_message( ) {
text = " $2 "
until [ $( echo -n " $text " | wc -m) -eq 0 ] ; do
2019-02-28 19:18:23 +00:00
res = $( curl -s " $MSG_URL " -d " chat_id= $1 " --data-urlencode " text= ${ text : 0 : 4096 } " )
2016-10-25 15:58:09 +00:00
text = " ${ text : 4096 } "
done
}
2016-03-19 01:08:25 +00:00
send_markdown_message( ) {
2016-10-25 15:58:09 +00:00
text = " $2 "
until [ $( echo -n " $text " | wc -m) -eq 0 ] ; do
2019-02-28 19:18:23 +00:00
res = $( curl -s " $MSG_URL " -d " chat_id= $1 " --data-urlencode " text= ${ text : 0 : 4096 } " -d "parse_mode=markdown" -d "disable_web_page_preview=true" )
2016-10-25 15:58:09 +00:00
text = " ${ text : 4096 } "
done
2016-04-17 12:00:45 +00:00
}
send_html_message( ) {
2016-10-25 15:58:09 +00:00
text = " $2 "
until [ $( echo -n " $text " | wc -m) -eq 0 ] ; do
2019-02-28 19:18:23 +00:00
res = $( curl -s " $MSG_URL " -F " chat_id= $1 " --data-urlencode " text= ${ text : 0 : 4096 } " -F "parse_mode=html" )
2016-10-25 15:58:09 +00:00
text = " ${ text : 4096 } "
done
2016-03-19 01:08:25 +00:00
}
2019-03-11 14:41:21 +00:00
delete_message( ) {
res = $( curl -s " $DELETE_URL " -F " chat_id= $1 " -F " message_id= $2 " )
}
2016-06-05 10:41:49 +00:00
kick_chat_member( ) {
res = $( curl -s " $KICK_URL " -F " chat_id= $1 " -F " user_id= $2 " )
}
unban_chat_member( ) {
res = $( curl -s " $UNBAN_URL " -F " chat_id= $1 " -F " user_id= $2 " )
}
leave_chat( ) {
2016-06-09 13:40:39 +00:00
res = $( curl -s " $LEAVE_URL " -F " chat_id= $1 " )
2016-06-05 10:41:49 +00:00
}
2016-04-16 01:43:15 +00:00
answer_inline_query( ) {
case $2 in
"article" )
2016-05-27 15:09:22 +00:00
InlineQueryResult = '[{"type":"' $2 '","id":"' $RANDOM '","title":"' $3 '","message_text":"' $4 '"}]'
2016-04-16 01:43:15 +00:00
; ;
"photo" )
2016-05-27 15:09:22 +00:00
InlineQueryResult = '[{"type":"' $2 '","id":"' $RANDOM '","photo_url":"' $3 '","thumb_url":"' $4 '"}]'
2016-04-16 01:43:15 +00:00
; ;
"gif" )
2016-05-27 15:09:22 +00:00
InlineQueryResult = '[{"type":"' $2 '","id":"' $RANDOM '","gif_url":"' $3 '", "thumb_url":"' $4 '"}]'
2016-04-16 01:43:15 +00:00
; ;
"mpeg4_gif" )
2016-05-27 15:09:22 +00:00
InlineQueryResult = '[{"type":"' $2 '","id":"' $RANDOM '","mpeg4_url":"' $3 '"}]'
2016-04-16 01:43:15 +00:00
; ;
"video" )
2016-05-27 15:09:22 +00:00
InlineQueryResult = '[{"type":"' $2 '","id":"' $RANDOM '","video_url":"' $3 '","mime_type":"' $4 '","thumb_url":"' $5 '","title":"' $6 '"}]'
2016-04-16 01:43:15 +00:00
; ;
"audio" )
2016-05-27 15:09:22 +00:00
InlineQueryResult = '[{"type":"' $2 '","id":"' $RANDOM '","audio_url":"' $3 '","title":"' $4 '"}]'
2016-04-16 01:43:15 +00:00
; ;
"voice" )
2016-05-27 15:09:22 +00:00
InlineQueryResult = '[{"type":"' $2 '","id":"' $RANDOM '","voice_url":"' $3 '","title":"' $4 '"}]'
2016-04-16 01:43:15 +00:00
; ;
"document" )
2016-05-27 15:09:22 +00:00
InlineQueryResult = '[{"type":"' $2 '","id":"' $RANDOM '","title":"' $3 '","caption":"' $4 '","document_url":"' $5 '","mime_type":"' $6 '"}]'
2016-04-16 01:43:15 +00:00
; ;
"location" )
2016-05-27 15:09:22 +00:00
InlineQueryResult = '[{"type":"' $2 '","id":"' $RANDOM '","latitude":"' $3 '","longitude":"' $4 '","title":"' $5 '"}]'
2016-04-16 01:43:15 +00:00
; ;
"venue" )
2016-05-27 15:09:22 +00:00
InlineQueryResult = '[{"type":"' $2 '","id":"' $RANDOM '","latitude":"' $3 '","longitude":"' $4 '","title":"' $5 '","address":"' $6 '"}]'
2016-04-16 18:50:05 +00:00
; ;
2016-04-16 01:43:15 +00:00
"contact" )
2016-05-27 15:09:22 +00:00
InlineQueryResult = '[{"type":"' $2 '","id":"' $RANDOM '","phone_number":"' $3 '","first_name":"' $4 '"}]'
2016-04-16 18:50:05 +00:00
; ;
2016-04-19 09:49:35 +00:00
2016-04-16 01:43:15 +00:00
# Cached media stored in Telegram server
"cached_photo" )
2016-05-27 15:09:22 +00:00
InlineQueryResult = '[{"type":"photo","id":"' $RANDOM '","photo_file_id":"' $3 '"}]'
2016-04-16 01:43:15 +00:00
; ;
"cached_gif" )
2016-05-27 15:09:22 +00:00
InlineQueryResult = '[{"type":"gif","id":"' $RANDOM '","gif_file_id":"' $3 '"}]'
2016-04-16 01:43:15 +00:00
; ;
"cached_mpeg4_gif" )
2016-05-27 15:09:22 +00:00
InlineQueryResult = '[{"type":"mpeg4_gif","id":"' $RANDOM '","mpeg4_file_id":"' $3 '"}]'
2016-04-16 01:43:15 +00:00
; ;
"cached_sticker" )
2016-05-27 15:09:22 +00:00
InlineQueryResult = '[{"type":"sticker","id":"' $RANDOM '","sticker_file_id":"' $3 '"}]'
2016-04-16 01:43:15 +00:00
; ;
"cached_document" )
2016-05-27 15:09:22 +00:00
InlineQueryResult = '[{"type":"document","id":"' $RANDOM '","title":"' $3 '","document_file_id":"' $4 '"}]'
2016-04-16 01:43:15 +00:00
; ;
"cached_video" )
2016-05-27 15:09:22 +00:00
InlineQueryResult = '[{"type":"video","id":"' $RANDOM '","video_file_id":"' $3 '","title":"' $4 '"}]'
2016-04-16 01:43:15 +00:00
; ;
"cached_voice" )
2016-05-27 15:09:22 +00:00
InlineQueryResult = '[{"type":"voice","id":"' $RANDOM '","voice_file_id":"' $3 '","title":"' $4 '"}]'
2016-04-16 01:43:15 +00:00
; ;
"cached_audio" )
2016-05-27 15:09:22 +00:00
InlineQueryResult = '[{"type":"audio","id":"' $RANDOM '","audio_file_id":"' $3 '"}]'
2016-04-16 01:43:15 +00:00
; ;
2016-04-19 09:49:35 +00:00
2016-04-16 01:43:15 +00:00
esac
2016-04-19 09:49:35 +00:00
2016-04-16 01:43:15 +00:00
res = $( curl -s " $INLINE_QUERY " -F " inline_query_id= $1 " -F " results= $InlineQueryResult " )
2016-04-19 09:49:35 +00:00
2016-04-16 01:43:15 +00:00
}
2016-01-03 01:14:07 +00:00
send_keyboard( ) {
2016-01-05 16:01:28 +00:00
local chat = " $1 "
local text = " $2 "
shift 2
2016-01-05 16:54:34 +00:00
local keyboard = init
2016-01-22 15:47:58 +00:00
OLDIFS = $IFS
IFS = $( echo -en "\"" )
2016-01-22 17:52:37 +00:00
for f in $* ; do [ " $f " != " " ] && local keyboard = " $keyboard , [\" $f \"] " ; done
2016-01-22 15:47:58 +00:00
IFS = $OLDIFS
2016-01-05 16:54:34 +00:00
local keyboard = ${ keyboard /init, / }
2016-01-05 16:01:28 +00:00
res = $( curl -s " $MSG_URL " --header "content-type: multipart/form-data" -F " chat_id= $chat " -F " text= $text " -F " reply_markup={\"keyboard\": [ $keyboard ],\"one_time_keyboard\": true} " )
2015-11-25 03:07:39 +00:00
}
2017-11-11 07:51:49 +00:00
remove_keyboard( ) {
local chat = " $1 "
local text = " $2 "
shift 2
res = $( curl -s " $MSG_URL " --header "content-type: multipart/form-data" -F " chat_id= $chat " -F " text= $text " -F "reply_markup={\"remove_keyboard\": true}" )
}
2016-01-06 16:11:56 +00:00
get_file( ) {
2016-04-19 09:49:35 +00:00
[ " $1 " != "" ] && echo $FILE_URL $( curl -s " $GET_URL " -F " file_id= $1 " | ./JSON.sh/JSON.sh -s | egrep '\["result","file_path"\]' | cut -f 2 | cut -d '"' -f 2)
2016-01-06 16:11:56 +00:00
}
send_file( ) {
2016-01-17 16:46:24 +00:00
[ " $2 " = "" ] && return
2016-01-19 13:17:06 +00:00
local chat_id = $1
local file = $2
2016-04-18 10:05:31 +00:00
echo " $file " | grep -qE $FILE_REGEX || return
2016-01-19 13:17:06 +00:00
local ext = " ${ file ##*. } "
2016-04-19 09:49:35 +00:00
case $ext in
2016-06-09 12:11:33 +00:00
mp3| flac)
2016-01-17 16:46:24 +00:00
CUR_URL = $AUDIO_URL
WHAT = audio
STATUS = upload_audio
2016-06-09 12:11:33 +00:00
local CAPTION = " $3 "
2016-01-17 16:46:24 +00:00
; ;
png| jpg| jpeg| gif)
CUR_URL = $PHO_URL
WHAT = photo
STATUS = upload_photo
2016-06-09 12:11:33 +00:00
local CAPTION = " $3 "
2016-01-17 16:46:24 +00:00
; ;
webp)
CUR_URL = $STICKER_URL
WHAT = sticker
STATUS =
; ;
mp4)
CUR_URL = $VIDEO_URL
WHAT = video
STATUS = upload_video
2016-06-09 12:11:33 +00:00
local CAPTION = " $3 "
2016-01-17 16:46:24 +00:00
; ;
ogg)
CUR_URL = $VOICE_URL
WHAT = voice
STATUS =
; ;
*)
CUR_URL = $DOCUMENT_URL
WHAT = document
STATUS = upload_document
2016-06-09 12:11:33 +00:00
local CAPTION = " $3 "
2016-01-17 16:46:24 +00:00
; ;
esac
send_action $chat_id $STATUS
2016-06-09 12:11:33 +00:00
res = $( curl -s " $CUR_URL " -F " chat_id= $chat_id " -F " $WHAT =@ $file " -F " caption= $CAPTION " )
2016-01-06 16:11:56 +00:00
}
2016-01-17 16:46:24 +00:00
# typing for text messages, upload_photo for photos, record_video or upload_video for videos, record_audio or upload_audio for audio files, upload_document for general files, find_location for location
send_action( ) {
2016-04-19 09:49:35 +00:00
[ " $2 " = "" ] && return
2016-01-17 16:46:24 +00:00
res = $( curl -s " $ACTION_URL " -F " chat_id= $1 " -F " action= $2 " )
}
send_location( ) {
[ " $3 " = "" ] && return
res = $( curl -s " $LOCATION_URL " -F " chat_id= $1 " -F " latitude= $2 " -F " longitude= $3 " )
}
2016-04-17 18:00:37 +00:00
send_venue( ) {
[ " $5 " = "" ] && return
[ " $6 " != "" ] add = " -F \"foursquare_id= $6 \" "
res = $( curl -s " $VENUE_URL " -F " chat_id= $1 " -F " latitude= $2 " -F " longitude= $3 " -F " title= $4 " -F " address= $5 " $add )
}
2016-01-17 16:46:24 +00:00
forward( ) {
[ " $3 " = "" ] && return
2016-04-19 09:49:35 +00:00
res = $( curl -s " $FORWARD_URL " -F " chat_id= $1 " -F " from_chat_id= $2 " -F " message_id= $3 " )
2016-01-17 16:46:24 +00:00
}
2019-03-18 13:45:19 +00:00
background( ) {
echo " ${ CHAT [ID] } : $2 : $1 " >" $TMPDIR / ${ copname } $2 -back.cmd "
startproc " $1 " " back- $2 - "
}
2016-01-05 16:01:28 +00:00
startproc( ) {
2019-03-18 13:45:19 +00:00
killproc " $2 "
local fifo = " $2 ${ copname } " # add $1 to copname, so we can have more than one running script per chat
mkfifo " $TMPDIR / ${ fifo } "
TMUX = tmux new-session -d -s " ${ fifo } " " $1 &> $TMPDIR / ${ fifo } ; echo imprettydarnsuredatdisisdaendofdacmd> $TMPDIR / ${ fifo } "
TMUX = tmux new-session -d -s sendprocess_${ fifo } " bash $SCRIPT outproc ${ CHAT [ID] } ${ fifo } "
}
checkback( ) {
checkproc " back- $1 - "
}
checkproc( ) {
tmux ls | grep -q " $1 ${ copname } " ; res = $?
}
killback( ) {
killproc " back- $1 - "
rm " $TMPDIR / ${ copname } $1 -back.cmd "
2016-01-02 20:51:45 +00:00
}
2016-01-06 16:11:56 +00:00
2016-04-15 17:37:44 +00:00
killproc( ) {
2019-03-18 13:45:19 +00:00
local fifo = " $1 ${ copname } "
( tmux kill-session -t " ${ fifo } " ; echo imprettydarnsuredatdisisdaendofdacmd>$TMPDIR /${ fifo } ; tmux kill-session -t sendprocess_${ fifo } ; rm -r $TMPDIR /${ fifo } ) 2>/dev/null
2016-04-15 17:37:44 +00:00
}
2016-01-03 01:14:07 +00:00
inproc( ) {
2016-01-19 19:59:15 +00:00
tmux send-keys -t $copname " $MESSAGE ${ URLS [*] }
2016-01-05 16:01:28 +00:00
"
2016-01-03 01:14:07 +00:00
}
2016-10-24 22:13:52 +00:00
process_updates( ) {
MAX_PROCESS_NUMBER = $( echo " $UPDATE " | sed '/\["result",[0-9]*\]/!d' | tail -1 | sed 's/\["result",//g;s/\].*//g' )
for ( ( PROCESS_NUMBER = 0; PROCESS_NUMBER<= MAX_PROCESS_NUMBER; PROCESS_NUMBER++) ) ; do
if [ " $1 " = = "test" ] ; then
process_client " $1 "
else
process_client " $1 " &
fi
done
}
2015-12-26 01:47:10 +00:00
process_client( ) {
2019-03-26 19:35:42 +00:00
local TMP = " $TMPDIR / $RANDOM -MESSAGE "
2019-03-26 16:49:47 +00:00
echo " $UPDATE " >" $TMP "
2016-04-16 18:50:05 +00:00
# Message
2019-03-26 16:49:47 +00:00
MESSAGE[ 0] = " $( echo -e " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","text"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) " | sed 's#\\/#/#g' ) "
MESSAGE[ ID] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","message_id"\]/ s/.*\][ \t]//p' <" $TMP " ) "
2016-10-24 22:13:52 +00:00
2016-06-05 10:41:49 +00:00
# Chat
2019-03-26 16:49:47 +00:00
CHAT[ ID] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","chat","id"\]/ s/.*\][ \t]//p' <" $TMP " ) "
CHAT[ FIRST_NAME] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","chat","first_name"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) "
CHAT[ LAST_NAME] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","chat","last_name"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) "
CHAT[ USERNAME] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","chat","username"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) "
CHAT[ TITLE] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","chat","title"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) "
CHAT[ TYPE] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","chat","type"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) "
CHAT[ ALL_MEMBERS_ARE_ADMINISTRATORS] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","chat","all_members_are_administrators"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) "
2016-04-19 09:49:35 +00:00
2016-01-17 16:46:24 +00:00
# User
2019-03-26 16:49:47 +00:00
USER[ ID] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","from","id"\]/ s/.*\][ \t]//p' <" $TMP " ) "
USER[ FIRST_NAME] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","from","first_name"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) "
USER[ LAST_NAME] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","from","last_name"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) "
USER[ USERNAME] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","from","username"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) "
2016-01-17 16:46:24 +00:00
2019-03-22 19:30:22 +00:00
# in reply to message from
2019-03-26 16:49:47 +00:00
REPLYTO[ UID] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","reply_to_message","from","id"\]/ s/.*\][ \t]//p' <" $TMP " ) "
2019-03-22 19:41:34 +00:00
if [ " ${ REPLYTO [UID] } " != "" ] ; then
2019-03-26 16:49:47 +00:00
REPLYTO[ 0] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","reply_to_message","text"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) "
REPLYTO[ ID] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","reply_to_message","message_id"\/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) "
REPLYTO[ FIRST_NAME] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","reply_to_message","from","first_name"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) "
REPLYTO[ LAST_NAME] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","reply_to_message","from","last_name"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) "
REPLYTO[ USERNAME] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","reply_to_message","from","username"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) "
2019-03-22 19:41:34 +00:00
fi
2019-03-22 19:30:22 +00:00
# forwarded message from
2019-03-26 16:49:47 +00:00
FORWARD[ UID] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","forward_from","id"\]/ s/.*\][ \t]//p' <" $TMP " ) "
2019-03-22 19:41:34 +00:00
if [ " ${ FORWARD [UID] } " != "" ] ; then
FORWARD[ ID] = " ${ MESSAGE [ID] } " # same as message ID
2019-03-26 16:49:47 +00:00
FORWARD[ FIRST_NAME] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","forward_from","first_name"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) "
FORWARD[ LAST_NAME] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","forward_from","last_name"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) "
FORWARD[ USERNAME] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","forward_from","username"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) "
2019-03-22 19:41:34 +00:00
fi
2019-03-22 19:30:22 +00:00
2016-01-17 16:46:24 +00:00
# Audio
2019-03-26 16:49:47 +00:00
URLS[ AUDIO] = " $( get_file " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","audio","file_id"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) " ) "
2016-01-19 19:27:09 +00:00
# Document
2019-03-26 16:49:47 +00:00
URLS[ DOCUMENT] = " $( get_file " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","document","file_id"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) " ) "
2016-01-17 16:46:24 +00:00
# Photo
2019-03-26 16:49:47 +00:00
URLS[ PHOTO] = " $( get_file " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","photo",.*,"file_id"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) " ) "
2016-01-17 16:46:24 +00:00
# Sticker
2019-03-26 16:49:47 +00:00
URLS[ STICKER] = " $( get_file " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","sticker","file_id"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) " ) "
2016-01-17 16:46:24 +00:00
# Video
2019-03-26 16:49:47 +00:00
URLS[ VIDEO] = " $( get_file " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","video","file_id"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) " ) "
2016-01-17 16:46:24 +00:00
# Voice
2019-03-26 16:49:47 +00:00
URLS[ VOICE] = " $( get_file " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","voice","file_id"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) " ) "
2016-01-17 16:46:24 +00:00
# Contact
2019-03-26 16:49:47 +00:00
CONTACT[ NUMBER] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","contact","phone_number"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) "
CONTACT[ FIRST_NAME] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","contact","first_name"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) "
CONTACT[ LAST_NAME] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","contact","last_name"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) "
CONTACT[ USER_ID] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","contact","user_id"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) "
2016-01-17 16:46:24 +00:00
# Caption
2019-03-26 16:49:47 +00:00
CAPTION = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","caption"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) "
2016-01-17 16:46:24 +00:00
# Location
2019-03-26 16:49:47 +00:00
LOCATION[ LONGITUDE] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","location","longitude"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) "
LOCATION[ LATITUDE] = " $( sed -n -e '/\["result",' $PROCESS_NUMBER ',"message","location","latitude"\]/ s/.*\][ \t]"\(.*\)"$/\1/p' <" $TMP " ) "
2016-05-27 13:52:34 +00:00
NAME = " $( echo ${ URLS [*] } | sed 's/.*\///g' ) "
2019-03-26 16:49:47 +00:00
rm " $TMP "
2016-01-17 16:46:24 +00:00
2016-04-19 09:49:35 +00:00
# Tmux
2016-06-05 10:41:49 +00:00
copname = " $ME " _" ${ CHAT [ID] } "
2016-01-17 16:46:24 +00:00
2016-04-17 18:00:37 +00:00
source commands.sh
2016-04-19 09:49:35 +00:00
2016-06-05 10:41:49 +00:00
tmpcount = " COUNT ${ CHAT [ID] } "
2019-03-22 16:47:36 +00:00
cat ${ COUNT } | grep -q " $tmpcount " || echo " $tmpcount " >>${ COUNT }
2016-04-16 18:50:05 +00:00
# To get user count execute bash bashbot.sh count
2015-12-26 01:47:10 +00:00
}
2016-03-20 21:34:55 +00:00
# source the script with source as param to use functions in other scripts
2016-04-17 12:13:28 +00:00
while [ " $1 " = = "startbot" ] ; do {
2015-07-10 05:43:08 +00:00
2016-10-24 22:13:52 +00:00
UPDATE = $( curl -s $UPD_URL $OFFSET | ./JSON.sh/JSON.sh)
2015-07-10 05:43:08 +00:00
2016-01-06 16:11:56 +00:00
# Offset
2016-10-24 22:13:52 +00:00
OFFSET = $( echo " $UPDATE " | egrep '\["result",[0-9]*,"update_id"\]' | tail -1 | cut -f 2)
2015-07-10 05:43:08 +00:00
OFFSET = $(( OFFSET+1))
2015-07-10 07:32:34 +00:00
if [ $OFFSET != 1 ] ; then
2016-06-09 13:40:39 +00:00
if [ " $2 " = = "test" ] ; then
2016-10-24 22:13:52 +00:00
process_updates " $2 "
2016-06-09 13:40:39 +00:00
else
2016-10-24 22:13:52 +00:00
process_updates " $2 " &
2016-06-09 13:40:39 +00:00
fi
2015-07-10 07:32:34 +00:00
fi
2015-07-10 05:43:08 +00:00
2016-01-05 16:01:28 +00:00
} ; done
2016-04-16 18:50:05 +00:00
case " $1 " in
"outproc" )
until [ " $line " = "imprettydarnsuredatdisisdaendofdacmd" ] ; do
line =
read -t 10 line
[ " $line " != "" -a " $line " != "imprettydarnsuredatdisisdaendofdacmd" ] && send_message " $2 " " $line "
2019-03-18 13:45:19 +00:00
done <$TMPDIR /$3
rm -r $TMPDIR /$3
2016-04-16 18:50:05 +00:00
; ;
"count" )
2019-03-22 16:47:36 +00:00
echo " A total of $( wc -l ${ COUNT } | sed 's/count//g' ) users used me. "
2016-04-16 18:50:05 +00:00
; ;
"broadcast" )
2019-03-22 16:47:36 +00:00
echo " Sending the broadcast $* to $( wc -l ${ COUNT } | sed 's/count//g' ) users. "
[ $( wc -l ${ COUNT } | sed 's/ count//g' ) -gt 300 ] && sleep = "sleep 0.5"
2016-04-16 18:50:05 +00:00
shift
2019-03-22 16:47:36 +00:00
for f in $( cat ${ COUNT } ) ; do send_message ${ f //COUNT } " $* " ; $sleep ; done
2016-04-16 18:50:05 +00:00
; ;
2016-04-17 12:13:28 +00:00
"start" )
2016-06-05 10:41:49 +00:00
clear
2016-04-17 12:13:28 +00:00
tmux kill-session -t $ME & >/dev/null
2016-06-05 10:41:49 +00:00
tmux new-session -d -s $ME " bash $SCRIPT startbot " && echo -e '\e[0;32mBot started successfully.\e[0m'
echo " Tmux session name $ME " || echo -e '\e[0;31mAn error occurred while starting the bot. \e[0m'
send_markdown_message " ${ CHAT [ID] } " "*Bot started*"
2016-04-17 12:13:28 +00:00
; ;
2019-03-25 10:15:07 +00:00
"init" ) # adjust users and permissions
MYUSER = " $USER "
[ [ $( id -u) -eq 0 ] ] && MYUSER = "www"
echo -n " Enter User to run basbot [ $MYUSER ]: "
read TOUSER
[ " $TOUSER " = "" ] && TOUSER = " $MYUSER "
if ! compgen -u " $TOUSER " 2>& 1 >/dev/null; then
echo -e " \e[0;31mUser \" $TOUSER \" not found!\e[0m "
exit 2
else
echo "Adjusting Owner and Permissions ..."
chown -R " $TOUSER " . *
chmod 711 .
chmod -R a-w *
2019-03-25 17:29:10 +00:00
chmod -R u+w " $COUNT " " $TMPDIR " *.log
chmod -R o-r,o-w " $COUNT " " $TMPDIR " token
2019-03-25 10:15:07 +00:00
ls -la
exit
fi
; ;
2019-03-24 12:57:49 +00:00
"background" | "resumeback" )
2019-03-18 19:00:16 +00:00
clear
echo -e '\e[0;32mRestart background processes ...\e[0m'
for FILE in ${ TMPDIR } /*-back.cmd; do
if [ " $FILE " = = " ${ TMPDIR } /*-back.cmd " ] ; then
echo -e '\e[0;31mNo background processes to start.\e[0m' ; break
else
RESTART = " $( cat " $FILE " ) "
CHAT[ ID] = " ${ RESTART %% : * } "
JOB = " ${ RESTART #* : } "
PROG = " ${ JOB #* : } "
JOB = " ${ JOB % : * } "
fifo = " back- ${ JOB } - ${ ME } _ ${ CHAT [ID] } " # compose fifo from jobname, $ME (botname) and CHAT[ID]
echo " restartbackground ${ PROG } ${ fifo } "
( tmux kill-session -t " ${ fifo } " ; tmux kill-session -t sendprocess_${ fifo } ; rm -r $TMPDIR /${ fifo } ) 2>/dev/null
mkfifo " $TMPDIR / ${ fifo } "
TMUX = tmux new-session -d -s " ${ fifo } " " ${ PROG } &> $TMPDIR / ${ fifo } ; echo imprettydarnsuredatdisisdaendofdacmd> $TMPDIR / ${ fifo } "
TMUX = tmux new-session -d -s sendprocess_${ fifo } " bash $SCRIPT outproc ${ CHAT [ID] } ${ fifo } "
fi
done
; ;
2016-04-17 12:13:28 +00:00
"kill" )
2016-06-05 10:41:49 +00:00
clear
2016-04-17 12:13:28 +00:00
tmux kill-session -t $ME & >/dev/null
2016-06-05 10:41:49 +00:00
send_markdown_message " ${ CHAT [ID] } " "*Bot stopped*"
echo -e '\e[0;32mOK. Bot stopped successfully.\e[0m'
2016-04-17 12:13:28 +00:00
; ;
2019-03-24 12:57:49 +00:00
"killback" | "suspendback" )
2019-03-18 21:19:44 +00:00
clear
2019-03-24 12:57:49 +00:00
echo -e "\e[0;32mStopping background processes ...\e[0m"
2019-03-18 21:19:44 +00:00
for FILE in ${ TMPDIR } /*-back.cmd; do
if [ " $FILE " = = " ${ TMPDIR } /*-back.cmd " ] ; then
echo -e "\e[0;31mNo background processes.\e[0m" ; break
else
REMOVE = " $( cat " $FILE " ) "
JOB = " ${ REMOVE #* : } "
fifo = " back- ${ JOB % : * } - ${ ME } _ ${ REMOVE %% : * } "
echo " killbackground ${ fifo } "
2019-03-24 12:57:49 +00:00
[ " $1 " = = "killback" ] && rm $FILE # remove job
2019-03-18 21:19:44 +00:00
( tmux kill-session -t " ${ fifo } " ; tmux kill-session -t sendprocess_${ fifo } ; rm -r $TMPDIR /${ fifo } ) 2>/dev/null
fi
done
; ;
2016-04-17 12:13:28 +00:00
"help" )
2016-06-05 10:41:49 +00:00
clear
2016-04-19 09:49:35 +00:00
less README.md
; ;
"attach" )
tmux attach -t $ME
; ;
2016-10-24 22:13:52 +00:00
"source" )
echo "OK"
; ;
2016-04-19 09:49:35 +00:00
*)
2016-06-05 10:41:49 +00:00
echo -e '\e[0;31mBAD REQUEST\e[0m'
2019-03-24 12:57:49 +00:00
echo -e '\e[0;31mAvailable arguments: outproc, count, broadcast, start, suspendback, resumeback, kill, killback, help, attach\e[0m'
2016-04-17 12:13:28 +00:00
; ;
2016-04-16 18:50:05 +00:00
esac
2016-06-05 10:41:49 +00:00
2019-03-24 12:57:49 +00:00
# warn if root
if [ [ $( id -u) -eq 0 ] ] ; then
echo -e " \n\e[0;31mWARNING: ${ SCRIPT } was started as ROOT (UID 0)!\e[0m "
echo -e '\e[0;31mYou are at HIGH RISK when processing user input with root privilegs!\e[0m'
fi