2016-01-02 19:35:15 +00:00
#!/bin/bash
2019-04-24 08:07:46 +00:00
# file: bashbot.sh
# do not edit, this file will be overwritten on update
2016-04-19 09:49:35 +00:00
2015-07-10 05:43:08 +00:00
# bashbot, the Telegram bot written in bash.
2019-04-01 10:52:25 +00:00
# Written by Drew (@topkecleon) and Daniil Gentili (@danogentili), KayM (@gnadelwartz).
# Also contributed: JuanPotato, BigNerd95, TiagoDanin, iicc1.
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)
2019-03-28 15:51:33 +00:00
#
2019-04-25 15:46:47 +00:00
#### $$VERSION$$ v0.70-dev3-5-g8b8da67
2019-04-01 10:52:25 +00:00
#
# Exit Codes:
# - 0 sucess (hopefully)
2019-04-12 08:30:35 +00:00
# - 1 can't change to dir
2019-04-12 09:27:20 +00:00
# - 2 can't write to tmp, count or token
2019-04-23 11:24:34 +00:00
# - 3 user / command / file not found
2019-04-01 10:52:25 +00:00
# - 4 unkown command
2019-04-15 10:19:04 +00:00
# - 5 cannot connect to telegram bot
2019-03-22 16:47:36 +00:00
2019-03-28 13:24:08 +00:00
# are we runnig in a terminal?
2019-03-31 10:12:55 +00:00
if [ -t 1 ] && [ " $TERM " != "" ] ; then
2019-03-29 16:52:00 +00:00
CLEAR = 'clear'
2019-03-28 13:24:08 +00:00
RED = '\e[31m'
GREEN = '\e[32m'
ORANGE = '\e[35m'
NC = '\e[0m'
fi
2019-04-23 11:07:20 +00:00
# get location and name of bashbot.sh
SCRIPT = " $0 "
2019-04-01 17:13:13 +00:00
SCRIPTDIR = " $( dirname " $0 " ) "
2019-04-23 11:07:20 +00:00
RUNDIR = " ${ BASHBOT_VAR :- ${ SCRIPTDIR } } "
[ " ${ RUNDIR } " = " ${ SCRIPTDIR } " ] && SCRIPT = " ./ $( basename " ${ SCRIPT } " ) "
2019-04-23 16:11:24 +00:00
RUNUSER = " ${ USER } " # USER is overwritten by bashbot array
2019-03-31 10:52:11 +00:00
2019-04-23 11:07:20 +00:00
if [ " $1 " != "source" ] && ! cd " ${ RUNDIR } " ; then
echo -e " ${ RED } ERROR: Can't change to ${ RUNDIR } ... ${ NC } "
2019-03-31 10:52:11 +00:00
exit 1
fi
2019-03-28 13:24:08 +00:00
2019-03-22 16:47:36 +00:00
if [ ! -w "." ] ; then
2019-04-23 11:07:20 +00:00
echo -e " ${ ORANGE } WARNING: ${ RUNDIR } is not writeable! ${ NC } "
2019-03-22 16:47:36 +00:00
ls -ld .
fi
2019-03-18 13:45:19 +00:00
2019-04-23 11:07:20 +00:00
TOKENFILE = " ${ BASHBOT_ETC :- . } /token "
2019-04-19 15:31:01 +00:00
if [ ! -f " ${ TOKENFILE } " ] ; then
if [ " ${ CLEAR } " = "" ] && [ " $1 " != "init" ] ; then
2019-04-12 09:27:20 +00:00
echo " Running headless, run ${ SCRIPT } init first! "
exit 2
else
2019-04-12 08:30:35 +00:00
${ CLEAR }
2019-03-28 13:24:08 +00:00
echo -e " ${ RED } TOKEN MISSING. ${ NC } "
2019-04-12 15:18:20 +00:00
echo -e " ${ ORANGE } PLEASE WRITE YOUR TOKEN HERE OR PRESS CTRL+C TO ABORT ${ NC } "
2019-04-01 17:13:13 +00:00
read -r token
2019-04-19 15:31:01 +00:00
echo " ${ token } " > " ${ TOKENFILE } "
2019-04-12 09:27:20 +00:00
fi
2019-04-12 08:30:35 +00:00
fi
2019-04-23 11:24:34 +00:00
JSONSHFILE = " ${ BASHBOT_JSONSH :- ${ RUNDIR } /JSON.sh/JSON.sh } "
[ [ " ${ JSONSHFILE } " != *"/JSON.sh" ] ] && echo -e " ${ RED } ERROR: \" ${ JSONSHFILE } \" ends not with \"JSONS.sh\". ${ NC } " && exit 3
2019-04-21 18:57:23 +00:00
if [ ! -f " ${ JSONSHFILE } " ] ; then
2019-04-21 16:20:56 +00:00
echo " Seems to be first run, Downloading ${ JSONSHFILE } ... "
2019-04-21 18:57:23 +00:00
mkdir "JSON.sh" 2>/dev/null;
curl -sL -o " ${ JSONSHFILE } " "https://cdn.jsdelivr.net/gh/dominictarr/JSON.sh/JSON.sh"
chmod +x " ${ JSONSHFILE } "
2019-04-12 15:18:20 +00:00
fi
2019-04-23 11:07:20 +00:00
BOTADMIN = " ${ BASHBOT_ETC :- . } /botadmin "
2019-04-12 08:30:35 +00:00
if [ ! -f " ${ BOTADMIN } " ] ; then
2019-04-12 17:39:21 +00:00
if [ " ${ CLEAR } " = "" ] ; then
2019-04-12 09:27:20 +00:00
echo "Running headless, set botadmin to AUTO MODE!"
2019-04-12 17:39:21 +00:00
echo '?' > " ${ BOTADMIN } "
2019-04-12 09:27:20 +00:00
else
2019-04-12 08:30:35 +00:00
${ CLEAR }
echo -e " ${ RED } BOTADMIN MISSING. ${ NC } "
2019-04-12 09:27:20 +00:00
echo -e " ${ ORANGE } PLEASE WRITE YOUR TELEGRAM ID HERE OR ENTER '?' ${ NC } "
echo -e " ${ ORANGE } TO MAKE FIRST USER TYPING '/start' TO BOTADMIN ${ NC } "
2019-04-12 08:30:35 +00:00
read -r token
2019-04-12 09:27:20 +00:00
echo " ${ token } " > " ${ BOTADMIN } "
fi
2016-06-05 10:41:49 +00:00
fi
2019-04-23 11:07:20 +00:00
BOTACL = " ${ BASHBOT_ETC :- . } /botacl "
2019-04-12 11:14:33 +00:00
if [ ! -f " ${ BOTACL } " ] ; then
echo -e " ${ ORANGE } Create empty ${ BOTACL } file. ${ NC } "
2019-04-20 19:31:05 +00:00
echo "" >" ${ BOTACL } "
2019-04-12 11:14:33 +00:00
fi
2019-04-23 16:11:24 +00:00
TMPDIR = " ${ BASHBOT_VAR :- . } /data-bot-bash "
2019-04-12 08:30:35 +00:00
if [ ! -d " ${ TMPDIR } " ] ; then
mkdir " ${ TMPDIR } "
elif [ ! -w " ${ TMPDIR } " ] ; then
${ CLEAR }
echo -e " ${ RED } ERROR: Can't write to ${ TMPDIR } !. ${ NC } "
ls -ld " ${ TMPDIR } "
2019-04-01 10:52:25 +00:00
exit 2
2019-03-18 13:45:19 +00:00
fi
2019-04-23 11:07:20 +00:00
COUNTFILE = " ${ BASHBOT_VAR :- . } /count "
2019-04-20 14:26:16 +00:00
if [ ! -f " ${ COUNTFILE } " ] ; then
2019-04-20 19:31:05 +00:00
echo "" >" ${ COUNTFILE } "
2019-04-20 14:26:16 +00:00
elif [ ! -w " ${ COUNTFILE } " ] ; then
2019-04-12 08:30:35 +00:00
${ CLEAR }
2019-04-20 14:26:16 +00:00
echo -e " ${ RED } ERROR: Can't write to ${ COUNTFILE } !. ${ NC } "
ls -l " ${ COUNTFILE } "
2019-04-01 10:52:25 +00:00
exit 2
2019-03-22 16:47:36 +00:00
fi
2019-04-23 11:24:34 +00:00
COMMANDS = " ${ BASHBOT_COMMANDS :- ${ RUNDIR } /commands.sh } "
[ [ " ${ COMMANDS } " != *".sh" ] ] && echo -e " ${ RED } ERROR: \" ${ COMMANDS } \" ends not with \".sh\". ${ NC } " && exit 3
2019-04-20 14:26:16 +00:00
if [ " $1 " != "source" ] ; then
if [ ! -f " ${ COMMANDS } " ] || [ ! -r " ${ COMMANDS } " ] ; then
${ CLEAR }
echo -e " ${ RED } ERROR: ${ COMMANDS } does not exist or is not readable!. ${ NC } "
ls -l " ${ COMMANDS } "
exit 3
fi
# shellcheck source=./commands.sh
source " ${ COMMANDS } " "source"
2019-04-12 15:18:20 +00:00
fi
2019-03-22 16:47:36 +00:00
2019-04-12 15:18:20 +00:00
2019-04-20 14:26:16 +00:00
BOTTOKEN = " $( cat " ${ TOKENFILE } " ) "
URL = 'https://api.telegram.org/bot' $BOTTOKEN
2019-04-12 18:49:58 +00:00
MSG_URL = $URL '/sendMessage'
LEAVE_URL = $URL '/leaveChat'
KICK_URL = $URL '/kickChatMember'
UNBAN_URL = $URL '/unbanChatMember'
PHO_URL = $URL '/sendPhoto'
AUDIO_URL = $URL '/sendAudio'
DOCUMENT_URL = $URL '/sendDocument'
STICKER_URL = $URL '/sendSticker'
VIDEO_URL = $URL '/sendVideo'
VOICE_URL = $URL '/sendVoice'
LOCATION_URL = $URL '/sendLocation'
VENUE_URL = $URL '/sendVenue'
ACTION_URL = $URL '/sendChatAction'
FORWARD_URL = $URL '/forwardMessage'
INLINE_QUERY = $URL '/answerInlineQuery'
ME_URL = $URL '/getMe'
DELETE_URL = $URL '/deleteMessage'
GETMEMBER_URL = $URL '/getChatMember'
2019-04-20 14:26:16 +00:00
FILE_URL = 'https://api.telegram.org/file/bot' $BOTTOKEN '/'
2019-04-12 18:49:58 +00:00
UPD_URL = $URL '/getUpdates?offset='
GET_URL = $URL '/getFile'
2019-04-23 16:11:24 +00:00
unset USER
2019-04-25 11:54:31 +00:00
declare -A BOTSENT USER MESSAGE URLS CONTACT LOCATION CHAT FORWARD REPLYTO VENUE
export BOTSENT USER MESSAGE URLS CONTACT LOCATION CHAT FORWARD REPLYTO VENUE
2019-04-12 18:49:58 +00:00
2016-06-09 12:11:33 +00:00
2016-10-25 15:58:09 +00:00
send_normal_message( ) {
text = " $2 "
2019-03-29 16:52:00 +00:00
until [ " $( echo -n " $text " | wc -m) " -eq "0" ] ; do
2019-04-25 14:59:17 +00:00
sendJson " ${ 1 } " '"text":"' " ${ text : 0 : 4096 } " '"' " $MSG_URL "
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 "
2019-03-29 16:52:00 +00:00
until [ " $( echo -n " $text " | wc -m) " -eq "0" ] ; do
2019-04-25 14:59:17 +00:00
sendJson " ${ 1 } " '"text":"' " ${ text : 0 : 4096 } " '","parse_mode":"markdown"' " $MSG_URL "
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 "
2019-03-29 16:52:00 +00:00
until [ " $( echo -n " $text " | wc -m) " -eq "0" ] ; do
2019-04-25 14:59:17 +00:00
sendJson " ${ 1 } " '"text":"' " ${ text : 0 : 4096 } " '","parse_mode":"html"' " $MSG_URL "
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( ) {
2019-04-25 13:39:42 +00:00
sendJson " $1 " 'message_id: ' " $2 " '' " $DELETE_URL "
2019-03-11 14:41:21 +00:00
}
2019-04-11 18:33:39 +00:00
# usage: status="$(get_chat_member_status "chat" "user")"
get_chat_member_status( ) {
2019-04-25 13:39:42 +00:00
sendJson " $1 " 'user_id: ' " $2 " '' " $GETMEMBER_URL "
echo " $res " | JsonGetString '"result","status"'
2019-04-11 18:33:39 +00:00
}
2016-06-05 10:41:49 +00:00
kick_chat_member( ) {
2019-04-25 13:39:42 +00:00
sendJson " $1 " 'user_id: ' " $2 " '' " $KICK_URL "
2016-06-05 10:41:49 +00:00
}
unban_chat_member( ) {
2019-04-25 13:39:42 +00:00
sendJson " $1 " 'user_id: ' " $2 " '' " $UNBAN_URL "
2016-06-05 10:41:49 +00:00
}
leave_chat( ) {
2019-04-25 13:39:42 +00:00
sendJson " $1 " "" " $LEAVE_URL "
2016-06-05 10:41:49 +00:00
}
2019-04-11 18:33:39 +00:00
user_is_creator( ) {
2019-04-12 17:39:21 +00:00
if [ " ${ 1 :- - } " = " ${ 2 :- + } " ] || [ " $( get_chat_member_status " $1 " " $2 " ) " = "creator" ] ; then return 0; fi
2019-04-11 18:33:39 +00:00
return 1
}
user_is_admin( ) {
local me; me = " $( get_chat_member_status " $1 " " $2 " ) "
2019-04-12 17:39:21 +00:00
if [ " ${ me } " = "creator" ] || [ " ${ me } " = "administrator" ] ; then return 0; fi
2019-04-11 18:33:39 +00:00
return 1
}
2019-04-12 09:27:20 +00:00
user_is_botadmin( ) {
local admin; admin = " $( head -n 1 " ${ BOTADMIN } " ) "
2019-04-12 17:39:21 +00:00
[ " ${ admin } " = " ${ 1 } " ] && return 0
[ [ " ${ admin } " = "@*" ] ] && [ [ " ${ admin } " = " ${ 2 } " ] ] && return 0
if [ " ${ admin } " = "?" ] ; then echo " ${ 1 :- ? } " >" ${ BOTADMIN } " ; return 0; fi
2019-04-12 09:27:20 +00:00
return 1
}
2019-04-12 11:14:33 +00:00
user_is_allowed( ) {
2019-04-12 15:18:20 +00:00
local acl = " $1 "
2019-04-12 17:39:21 +00:00
[ " $1 " = "" ] && return 1
2019-04-12 11:14:33 +00:00
grep -F -xq " ${ acl } :*:* " <" ${ BOTACL } " && return 0
[ " $2 " != "" ] && acl = " ${ acl } : $2 "
grep -F -xq " ${ acl } :* " <" ${ BOTACL } " && return 0
[ " $3 " != "" ] && acl = " ${ acl } : $3 "
grep -F -xq " ${ acl } " <" ${ BOTACL } "
}
2016-04-16 01:43:15 +00:00
answer_inline_query( ) {
2019-03-29 16:52:00 +00:00
case " $2 " in
2016-04-16 01:43:15 +00:00
"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
2019-03-29 16:52:00 +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
}
2019-04-17 07:34:02 +00:00
old_send_keyboard( ) {
local chat = " $1 "
2019-04-25 15:46:47 +00:00
local text = '"text":"' " ${ 2 } " '"'
2019-04-17 07:34:02 +00:00
shift 2
local keyboard = init
OLDIFS = $IFS
IFS = $( echo -en "\"" )
for f in " $@ " ; do [ " $f " != " " ] && keyboard = " $keyboard , [\" $f \"] " ; done
IFS = $OLDIFS
keyboard = ${ keyboard /init, / }
2019-04-25 15:46:47 +00:00
local JSON = " ${ text } " ', "reply_markup": {"keyboard": [ ' " ${ keyboard } " ' ],"one_time_keyboard": true}'
sendJson " ${ chat } " " $JSON " " $MSG_URL "
2019-04-17 07:34:02 +00:00
}
2019-04-25 13:17:35 +00:00
TEXTISEMPTY = "ThisTextIsEmptyAndWillBeDeleted"
2016-01-03 01:14:07 +00:00
send_keyboard( ) {
2019-04-17 07:34:02 +00:00
if [ [ " $3 " != *'[' * ] ] ; then old_send_keyboard " $@ " ; return ; fi
2019-04-25 13:17:35 +00:00
local chat = " ${ 1 } "
2019-04-25 11:54:31 +00:00
local text = '"text":"' " ${ 2 } " '"' ; [ " ${ 2 } " = "" ] && text = '"text":"' " ${ TEXTISEMPTY } " '"'
local one_time = ', "one_time_keyboard":true' && [ " $4 " != "" ] && one_time = ""
2019-04-25 13:17:35 +00:00
local JSON = " ${ text } " ', "reply_markup": {"keyboard": [ ' " ${ 3 } " ' ] ' " ${ one_time } " '}'
# '"text":"$2", "reply_markup": {"keyboard": [ ${3} ], "one_time_keyboard": true}'
sendJson " ${ chat } " " $JSON " " $MSG_URL "
2015-11-25 03:07:39 +00:00
}
2017-11-11 07:51:49 +00:00
remove_keyboard( ) {
2019-04-25 13:17:35 +00:00
local chat = " ${ 1 } "
2019-04-25 11:54:31 +00:00
local text = '"text":"' " ${ 2 } " '"' ; [ " ${ 2 } " = "" ] && text = '"text":"' " ${ TEXTISEMPTY } " '"'
2019-04-25 13:17:35 +00:00
local JSON = " ${ text } " ', "reply_markup": {"remove_keyboard":true}'
#JSON='"text":"$2", "reply_markup": {"remove_keyboard":true}'
sendJson " ${ chat } " " $JSON " " $MSG_URL "
2019-04-24 16:24:54 +00:00
}
send_inline_keyboard( ) {
2019-04-25 13:17:35 +00:00
local chat = " ${ 1 } "
2019-04-25 11:54:31 +00:00
local text = '"text":"' " ${ 2 } " '"' ; [ " ${ 2 } " = "" ] && text = '"text":"' " ${ TEXTISEMPTY } " '"'
2019-04-25 13:17:35 +00:00
local JSON = " ${ text } " ', "reply_markup": {"inline_keyboard": [ ' " ${ 3 } " ' ]}'
# JSON='"text":"$2", "reply_markup": {"inline_keyboard": [ $3->[{"text":"text", "url":"url"}]<- ]}'
sendJson " ${ chat } " " $JSON " " $MSG_URL "
2019-04-25 11:54:31 +00:00
}
send_inline_button( ) {
send_inline_keyboard " ${ 1 } " " ${ 2 } " '[ {"text":"' " ${ 3 } " '", "url":"' " ${ 4 } " '"}]'
2017-11-11 07:51:49 +00:00
}
2019-04-24 16:24:54 +00:00
2019-04-25 13:17:35 +00:00
# usage: sendJson "chat" "JSON" "URL"
2019-04-24 16:24:54 +00:00
sendJson( ) {
2019-04-25 15:46:47 +00:00
local chat = '"chat_id":' " ${ 1 } " ',' ; [ " ${ 1 } " = "" ] && chat = ""
res = " $( curl -s -d '{' " ${ chat } $2 " '}' -H "Content-Type: application/json" \
2019-04-25 13:17:35 +00:00
-X POST " ${ 3 } " | " ${ JSONSHFILE } " -s -b -n ) "
2019-04-25 11:54:31 +00:00
BOTSENT[ OK] = " $( echo " $res " | JsonGetLine '"ok"' ) "
BOTSENT[ ID] = " $( echo " $res " | JsonGetValue '"result","message_id"' ) "
2019-04-25 13:17:35 +00:00
[ [ " ${ 2 } " = *" ${ TEXTISEMPTY } " * ] ] && delete_message " ${ 1 } " " ${ BOTSENT [ID] } "
2019-04-24 15:34:36 +00:00
}
2017-11-11 07:51:49 +00:00
2016-01-06 16:11:56 +00:00
get_file( ) {
2019-04-21 11:45:51 +00:00
[ " $1 " = "" ] && return
2019-04-25 15:46:47 +00:00
local JSON = '"file_id": ' " ${ 1 } "
sendJson "" " ${ JSON } " " ${ GET_URL } "
echo " ${ FILE_URL } $( echo " ${ res } " | jsonGetString '"result","file_path"' ) "
2016-01-06 16:11:56 +00:00
}
send_file( ) {
2016-01-17 16:46:24 +00:00
[ " $2 " = "" ] && return
2019-04-08 09:58:55 +00:00
local CAPTION
2016-01-19 13:17:06 +00:00
local chat_id = $1
local file = $2
2019-04-01 17:13:13 +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
2019-04-08 09:58:55 +00:00
CAPTION = " $3 "
2016-01-17 16:46:24 +00:00
; ;
png| jpg| jpeg| gif)
CUR_URL = $PHO_URL
WHAT = photo
STATUS = upload_photo
2019-04-08 09:58:55 +00:00
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
2019-04-08 09:58:55 +00:00
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
2019-04-08 09:58:55 +00:00
CAPTION = " $3 "
2016-01-17 16:46:24 +00:00
; ;
esac
2019-04-01 17:13:13 +00:00
send_action " $chat_id " " $STATUS "
2019-03-29 16:52:00 +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( ) {
2019-04-12 17:39:21 +00:00
[ " $2 " = "" ] && return
2019-04-25 15:46:47 +00:00
sendJson " ${ 1 } " '"action": "' " ${ 2 } " '"' " $ACTION_URL "
2016-01-17 16:46:24 +00:00
}
send_location( ) {
2019-04-12 17:39:21 +00:00
[ " $3 " = "" ] && return
2019-04-25 15:46:47 +00:00
local JSON = '"latitude": ' " ${ 2 } " ', "longitude": ' " ${ 3 } " ''
sendJson " ${ 1 } " " ${ JSON } " " $LOCATION_URL "
2016-01-17 16:46:24 +00:00
}
2016-04-17 18:00:37 +00:00
send_venue( ) {
2019-04-12 17:39:21 +00:00
[ " $5 " = "" ] && return
2019-04-25 15:46:47 +00:00
local JSON = '"latitude": ' " ${ 2 } " ', "longitude": ' " ${ 3 } " ', "title": "' " ${ 4 } " '"'
[ " $6 " != "" ] JSON = " $JSON " ', "foursquare_id": ' " $6 " ''
sendJson " ${ 1 } " " ${ JSON } " " $VENUE_URL "
2016-04-17 18:00:37 +00:00
}
2019-04-16 11:29:49 +00:00
forward_message( ) {
2019-04-12 17:39:21 +00:00
[ " $3 " = "" ] && return
2019-04-25 15:46:47 +00:00
local JSON = '"from_chat_id": ' " ${ 2 } " ', "message_id": ' " ${ 3 } " ''
sendJson " ${ 1 } " " ${ JSON } " " $FORWARD_URL "
2016-01-17 16:46:24 +00:00
}
2019-04-16 11:29:49 +00:00
forward( ) { # backward compatibility
forward_message " $@ " || return
}
2019-03-18 13:45:19 +00:00
2019-04-24 08:07:46 +00:00
# returns true if function exist
2019-04-23 18:37:15 +00:00
_is_function( )
{
[ " $( LC_ALL = C type -t " $1 " ) " = "function" ]
}
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
2019-04-12 17:39:21 +00:00
if [ " $1 " = "test" ] ; then
2016-10-24 22:13:52 +00:00
process_client " $1 "
else
process_client " $1 " &
fi
done
}
2019-04-21 11:45:51 +00:00
process_client( ) {
process_message " $PROCESS_NUMBER "
# Tmux
copname = " $ME " _" ${ CHAT [ID] } "
source commands.sh
tmpcount = " COUNT ${ CHAT [ID] } "
2019-04-23 11:07:20 +00:00
grep -q " $tmpcount " <" ${ COUNTFILE } " >/dev/null 2>& 1 || echo " $tmpcount " >>" ${ COUNTFILE } "
2019-04-21 11:45:51 +00:00
# To get user count execute bash bashbot.sh count
}
2019-04-13 18:53:59 +00:00
JsonGetString( ) {
2019-04-21 15:15:46 +00:00
sed -n -e '0,/\[' " $1 " '\]/ s/\[' " $1 " '\][ \t]"\(.*\)"$/\1/p'
}
JsonGetLine( ) {
2019-04-25 11:54:31 +00:00
sed -n -e '0,/\[' " $1 " '\]/ s/\[' " $1 " '\][ \t]//p'
2019-04-13 18:53:59 +00:00
}
JsonGetValue( ) {
2019-04-21 15:15:46 +00:00
sed -n -e '0,/\[' " $1 " '\]/ s/\[' " $1 " '\][ \t]\([0-9.,]*\).*/\1/p'
2019-04-13 18:53:59 +00:00
}
2019-04-21 11:45:51 +00:00
process_message( ) {
local num = " $1 "
2019-04-08 10:11:17 +00:00
local TMP = " ${ TMPDIR :- . } / $RANDOM $RANDOM -MESSAGE "
2019-03-26 16:49:47 +00:00
echo " $UPDATE " >" $TMP "
2016-04-16 18:50:05 +00:00
# Message
2019-04-21 11:45:51 +00:00
MESSAGE[ 0] = " $( JsonDecode " $( JsonGetString '"result",' " ${ num } " ',"message","text"' <" $TMP " ) " | sed 's#\\/#/#g' ) "
MESSAGE[ ID] = " $( JsonGetValue '"result",' " ${ num } " ',"message","message_id"' <" $TMP " ) "
2016-10-24 22:13:52 +00:00
2016-06-05 10:41:49 +00:00
# Chat
2019-04-21 11:45:51 +00:00
CHAT[ ID] = " $( JsonGetValue '"result",' " ${ num } " ',"message","chat","id"' <" $TMP " ) "
CHAT[ FIRST_NAME] = " $( JsonDecode " $( JsonGetString '"result",' " ${ num } " ',"message","chat","first_name"' <" $TMP " ) " ) "
CHAT[ LAST_NAME] = " $( JsonDecode " $( JsonGetString '"result",' " ${ num } " ',"message","chat","last_name"' <" $TMP " ) " ) "
CHAT[ USERNAME] = " $( JsonDecode " $( JsonGetString '"result",' " ${ num } " ',"message","chat","username"' <" $TMP " ) " ) "
CHAT[ TITLE] = " $( JsonDecode " $( JsonGetString '"result",' " ${ num } " ',"message","chat","title"' <" $TMP " ) " ) "
CHAT[ TYPE] = " $( JsonDecode " $( JsonGetString '"result",' " ${ num } " ',"message","chat","type"' <" $TMP " ) " ) "
CHAT[ ALL_MEMBERS_ARE_ADMINISTRATORS] = " $( JsonDecode " $( JsonGetString '"result",' " ${ num } " ',"message","chat","all_members_are_administrators"' <" $TMP " ) " ) "
2016-04-19 09:49:35 +00:00
2016-01-17 16:46:24 +00:00
# User
2019-04-21 11:45:51 +00:00
USER[ ID] = " $( JsonGetValue '"result",' " ${ num } " ',"message","from","id"' <" $TMP " ) "
USER[ FIRST_NAME] = " $( JsonDecode " $( JsonGetString '"result",' " ${ num } " ',"message","from","first_name"' <" $TMP " ) " ) "
USER[ LAST_NAME] = " $( JsonDecode " $( JsonGetString '"result",' " ${ num } " ',"message","from","last_name"' <" $TMP " ) " ) "
USER[ USERNAME] = " $( JsonDecode " $( JsonGetString '"result",' " ${ num } " ',"message","from","username"' <" $TMP " ) " ) "
2016-01-17 16:46:24 +00:00
2019-03-22 19:30:22 +00:00
# in reply to message from
2019-04-21 11:45:51 +00:00
REPLYTO[ UID] = " $( JsonGetValue '"result",' " ${ num } " ',"message","reply_to_message","from","id"' <" $TMP " ) "
2019-03-22 19:41:34 +00:00
if [ " ${ REPLYTO [UID] } " != "" ] ; then
2019-04-21 11:45:51 +00:00
REPLYTO[ 0] = " $( JsonDecode " $( JsonGetString '"result",' " ${ num } " ',"message","reply_to_message","text"' <" $TMP " ) " ) "
REPLYTO[ ID] = " $( JsonGetValue '"result",' " ${ num } " ',"message","reply_to_message","message_id"' <" $TMP " ) "
REPLYTO[ FIRST_NAME] = " $( JsonDecode " $( JsonGetString '"result",' " ${ num } " ',"message","reply_to_message","from","first_name"' <" $TMP " ) " ) "
REPLYTO[ LAST_NAME] = " $( JsonDecode " $( JsonGetString '"result",' " ${ num } " ',"message","reply_to_message","from","last_name"' <" $TMP " ) " ) "
REPLYTO[ USERNAME] = " $( JsonDecode " $( JsonGetString '"result",' " ${ num } " ',"message","reply_to_message","from","username"' <" $TMP " ) " ) "
2019-03-22 19:41:34 +00:00
fi
2019-03-22 19:30:22 +00:00
# forwarded message from
2019-04-21 11:45:51 +00:00
FORWARD[ UID] = " $( JsonGetValue '"result",' " ${ num } " ',"message","forward_from","id"' <" $TMP " ) "
2019-03-22 19:41:34 +00:00
if [ " ${ FORWARD [UID] } " != "" ] ; then
FORWARD[ ID] = " ${ MESSAGE [ID] } " # same as message ID
2019-04-21 11:45:51 +00:00
FORWARD[ FIRST_NAME] = " $( JsonDecode " $( JsonGetString '"result",' " ${ num } " ',"message","forward_from","first_name"' <" $TMP " ) " ) "
FORWARD[ LAST_NAME] = " $( JsonDecode " $( JsonGetString '"result",' " ${ num } " ',"message","forward_from","last_name"' <" $TMP " ) " ) "
FORWARD[ USERNAME] = " $( JsonDecode " $( JsonGetString '"result",' " ${ num } " ',"message","forward_from","username"' <" $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-04-21 15:15:46 +00:00
URLS[ AUDIO] = " $( get_file " $( JsonGetString '"result",' " ${ num } " ',"message","audio","file_id"' <" $TMP " ) " ) "
2016-01-19 19:27:09 +00:00
# Document
2019-04-21 15:15:46 +00:00
URLS[ DOCUMENT] = " $( get_file " $( JsonGetString '"result",' " ${ num } " ',"message","document","file_id"' <" $TMP " ) " ) "
2016-01-17 16:46:24 +00:00
# Photo
2019-04-21 15:15:46 +00:00
URLS[ PHOTO] = " $( get_file " $( JsonGetString '"result",' " ${ num } " ',"message","photo",0,"file_id"' <" $TMP " ) " ) "
2016-01-17 16:46:24 +00:00
# Sticker
2019-04-21 15:15:46 +00:00
URLS[ STICKER] = " $( get_file " $( JsonGetString '"result",' " ${ num } " ',"message","sticker","file_id"' <" $TMP " ) " ) "
2016-01-17 16:46:24 +00:00
# Video
2019-04-21 15:15:46 +00:00
URLS[ VIDEO] = " $( get_file " $( JsonGetString '"result",' " ${ num } " ',"message","video","file_id"' <" $TMP " ) " ) "
2016-01-17 16:46:24 +00:00
# Voice
2019-04-21 15:15:46 +00:00
URLS[ VOICE] = " $( get_file " $( JsonGetString '"result",' " ${ num } " ',"message","voice","file_id"' <" $TMP " ) " ) "
2016-01-17 16:46:24 +00:00
# Contact
2019-04-23 17:00:17 +00:00
CONTACT[ USER_ID] = " $( JsonDecode " $( JsonGetString '"result",' " ${ num } " ',"message","contact","user_id"' <" $TMP " ) " ) "
2019-04-21 11:45:51 +00:00
CONTACT[ FIRST_NAME] = " $( JsonDecode " $( JsonGetString '"result",' " ${ num } " ',"message","contact","first_name"' <" $TMP " ) " ) "
CONTACT[ LAST_NAME] = " $( JsonDecode " $( JsonGetString '"result",' " ${ num } " ',"message","contact","last_name"' <" $TMP " ) " ) "
2019-04-23 17:00:17 +00:00
CONTACT[ NUMBER] = " $( JsonGetString '"result",' " ${ num } " ',"message","contact","phone_number"' <" $TMP " ) "
CONTACT[ VCARD] = " $( JsonGetString '"result",' " ${ num } " ',"message","contact","vcard"' <" $TMP " ) "
# vunue
VENUE[ TITLE] = " $( JsonDecode " $( JsonGetString '"result",' " ${ num } " ',"message","venue","title"' <" $TMP " ) " ) "
VENUE[ ADDRESS] = " $( JsonDecode " $( JsonGetString '"result",' " ${ num } " ',"message","venue","address"' <" $TMP " ) " ) "
VENUE[ LONGITUDE] = " $( JsonGetValue '"result",' " ${ num } " ',"message","venue","location","longitude"' <" $TMP " ) "
VENUE[ LATITUDE] = " $( JsonGetValue '"result",' " ${ num } " ',"message","venue","location","latitude"' <" $TMP " ) "
VENUE[ FOURSQUARE] = " $( JsonGetString '"result",' " ${ num } " ',"message","venue","foursquare_id"' <" $TMP " ) "
2016-01-17 16:46:24 +00:00
# Caption
2019-04-21 11:45:51 +00:00
CAPTION = " $( JsonDecode " $( JsonGetString '"result",' " ${ num } " ',"message","caption"' <" $TMP " ) " ) "
2016-01-17 16:46:24 +00:00
# Location
2019-04-21 12:52:55 +00:00
LOCATION[ LONGITUDE] = " $( JsonGetValue '"result",' " ${ num } " ',"message","location","longitude"' <" $TMP " ) "
LOCATION[ LATITUDE] = " $( JsonGetValue '"result",' " ${ num } " ',"message","location","latitude"' <" $TMP " ) "
2019-04-01 17:13:13 +00:00
NAME = " $( echo " ${ URLS [*] } " | sed 's/.*\///g' ) "
2019-04-21 15:15:46 +00:00
rm " $TMP "
2015-12-26 01:47:10 +00:00
}
2019-04-22 19:05:52 +00:00
# main get updates loop, should never terminate
start_bot( ) {
2019-04-23 16:11:24 +00:00
local OFFSET = 0
2019-04-22 19:50:38 +00:00
local mysleep = "100" # ms
2019-04-23 10:48:05 +00:00
local addsleep = "100"
local maxsleep = " $(( ${ BASHBOT_SLEEP :- 5000 } + 100 )) "
2019-04-22 19:05:52 +00:00
while true; do {
2019-04-23 11:07:20 +00:00
UPDATE = " $( curl -s " $UPD_URL $OFFSET " | " ${ JSONSHFILE } " ) "
2019-04-22 19:05:52 +00:00
# Offset
OFFSET = " $( echo " $UPDATE " | grep '\["result",[0-9]*,"update_id"\]' | tail -1 | cut -f 2) "
OFFSET = $(( OFFSET+1))
if [ " $OFFSET " != "1" ] ; then
2019-04-22 19:50:38 +00:00
mysleep = "100"
if [ " $1 " = "test" ] ; then
process_updates " $1 "
2019-04-22 19:05:52 +00:00
else
2019-04-22 19:50:38 +00:00
process_updates " $1 " &
2019-04-22 19:05:52 +00:00
fi
fi
2019-04-22 19:50:38 +00:00
# adaptive sleep in ms rounded to next lower second
sleep " ${ mysleep %??? } " ; mysleep = $(( mysleep+addsleep)) ; [ " ${ mysleep } " -gt " ${ maxsleep } " ] && mysleep = " ${ maxsleep } "
2019-04-22 19:05:52 +00:00
}
done
}
# initialize bot environment, user and permissions
bot_init( ) {
2019-04-23 16:11:24 +00:00
# move tmpdir to datadir
local OLDTMP = " ${ BASHBOT_VAR :- . } /tmp-bot-bash "
[ -d " ${ OLDTMP } " ] && { mv -n " ${ OLDTMP } / " * " ${ TMPDIR } " ; rmdir " ${ OLDTMP } " ; }
2019-04-22 19:05:52 +00:00
[ [ " $( id -u) " -eq "0" ] ] && RUNUSER = "nobody"
echo -n " Enter User to run basbot [ $RUNUSER ]: "
read -r TOUSER
[ " $TOUSER " = "" ] && TOUSER = " $RUNUSER "
if ! compgen -u " $TOUSER " >/dev/null 2>& 1; then
echo -e " ${ RED } User \" $TOUSER \" not found! ${ NC } "
exit 3
else
echo " Adjusting user \" ${ TOUSER } \" files and permissions ... "
sed -i '/^[# ]*runas=/ s/runas=.*$/runas="' $TOUSER '"/' bashbot.rc
chown -R " $TOUSER " . ./*
chmod 711 .
chmod -R a-w ./*
chmod -R u+w " ${ COUNTFILE } " " ${ TMPDIR } " " ${ BOTADMIN } " ./*.log 2>/dev/null
chmod -R o-r,o-w " ${ COUNTFILE } " " ${ TMPDIR } " " ${ TOKENFILE } " " ${ BOTADMIN } " " ${ BOTACL } " 2>/dev/null
ls -la
fi
}
2019-04-15 10:19:04 +00:00
# get bot name
getBotName( ) {
2019-04-25 15:46:47 +00:00
res = " $( curl -s " $ME_URL " | " ${ JSONSHFILE } " -s -b -n ) "
echo " $res " | JsonGetString '"result","username"'
2019-04-15 10:19:04 +00:00
}
ME = " $( getBotName) "
if [ " $ME " = "" ] ; then
2019-04-19 15:31:01 +00:00
if [ " $( cat " ${ TOKENFILE } " ) " = "bashbottestscript" ] ; then
ME = "bashbottestscript"
else
2019-04-15 10:19:04 +00:00
echo -e " ${ RED } ERROR: Can't connect to Telegram Bot! May be your TOKEN is invalid ... ${ NC } "
exit 1
2019-04-19 15:31:01 +00:00
fi
2019-04-15 10:19:04 +00:00
fi
2015-12-26 01:47:10 +00:00
2019-04-14 15:43:12 +00:00
# use phyton JSON to decode JSON UFT-8, provide bash implementaion as fallback
2019-04-23 09:45:03 +00:00
if [ " ${ BASHBOT_DECODE } " != "" ] && which python >/dev/null 2>& 1 ; then
2019-04-14 15:43:12 +00:00
JsonDecode( ) {
printf '"%s\\n"' " ${ 1 // \" / \\ \" } " | python -c 'import json, sys; sys.stdout.write(json.load(sys.stdin).encode("utf-8"))'
}
else
# pure bash implementaion, done by KayM (@gnadelwartz)
# see https://stackoverflow.com/a/55666449/9381171
JsonDecode( ) {
local out = " $1 "
local remain = ""
2019-04-15 08:55:22 +00:00
local regexp = '(.*)\\u[dD]([0-9a-fA-F]{3})\\u[dD]([0-9a-fA-F]{3})(.*)'
2019-04-14 15:43:12 +00:00
while [ [ " ${ out } " = ~ $regexp ] ] ; do
2019-04-15 10:19:04 +00:00
# match 2 \udxxx hex values, calculate new U, then split and replace
2019-04-22 19:50:38 +00:00
local W1 = $(( ( 0 xd${ BASH_REMATCH [2] } & 0 x3ff) <<10 ))
local W2 = $(( 0 xd${ BASH_REMATCH [3] } & 0 x3ff ))
local U = $(( ( W1 | W2 ) + 0 x10000 ))
2019-04-14 15:43:12 +00:00
remain = " $( printf '\\U%8.8x' " ${ U } " ) ${ BASH_REMATCH [4] } ${ remain } "
out = " ${ BASH_REMATCH [1] } "
done
echo -e " ${ out } ${ remain } "
}
fi
2016-03-20 21:34:55 +00:00
# source the script with source as param to use functions in other scripts
2019-04-20 14:26:16 +00:00
# do not execute if read from other scripts
if [ " $1 " != "source" ] ; then
2016-04-16 18:50:05 +00:00
2019-04-22 19:05:52 +00:00
##############
# internal options only for use from bashbot and developers
2019-04-20 14:26:16 +00:00
case " $1 " in
2019-04-22 19:05:52 +00:00
"outproc" ) # forward output from interactive and jobs to chat
2016-04-16 18:50:05 +00:00
until [ " $line " = "imprettydarnsuredatdisisdaendofdacmd" ] ; do
2019-03-30 14:14:13 +00:00
line = ""
2019-04-01 17:13:13 +00:00
read -r -t 10 line
[ " $line " != "" ] && [ " $line " != "imprettydarnsuredatdisisdaendofdacmd" ] && send_message " $2 " " $line "
2019-04-08 10:11:17 +00:00
done <" ${ TMPDIR :- . } / $3 "
rm -f -r " ${ TMPDIR :- . } / $3 "
2019-04-22 19:05:52 +00:00
exit
; ;
"startbot" )
2019-04-22 19:50:38 +00:00
start_bot " $2 "
2019-04-22 19:05:52 +00:00
exit
2016-04-16 18:50:05 +00:00
; ;
2019-04-22 19:05:52 +00:00
"source" ) # this should never arrive here
exit
; ;
"init" ) # adjust users and permissions
bot_init
exit
; ;
"attach" )
tmux attach -t " $ME "
exit
; ;
esac
###############
# "official" arguments as shown to users
case " $1 " in
2016-04-16 18:50:05 +00:00
"count" )
2019-04-20 14:26:16 +00:00
echo " A total of $( wc -l <" ${ COUNTFILE } " ) users used me. "
2019-04-04 13:25:27 +00:00
exit
2016-04-16 18:50:05 +00:00
; ;
"broadcast" )
2019-04-20 14:26:16 +00:00
NUMCOUNT = " $( wc -l <" ${ COUNTFILE } " ) "
2019-04-08 10:40:07 +00:00
echo " Sending the broadcast $* to $NUMCOUNT users. "
[ " $NUMCOUNT " -gt "300" ] && sleep = "sleep 0.5"
2016-04-16 18:50:05 +00:00
shift
2019-04-24 14:53:01 +00:00
while read -r f; do send_markdown_message " ${ f //COUNT } " " $* " ; $sleep ; done <" ${ COUNTFILE } "
2016-04-16 18:50:05 +00:00
; ;
2016-04-17 12:13:28 +00:00
"start" )
2019-04-12 08:30:35 +00:00
${ CLEAR }
2019-04-01 17:13:13 +00:00
tmux kill-session -t " $ME " & >/dev/null
tmux new-session -d -s " $ME " " bash $SCRIPT startbot " && echo -e " ${ GREEN } Bot started successfully. ${ NC } "
2019-03-28 13:24:08 +00:00
echo " Tmux session name $ME " || echo -e " ${ RED } An error occurred while starting the bot. ${ NC } "
2016-06-05 10:41:49 +00:00
send_markdown_message " ${ CHAT [ID] } " "*Bot started*"
2016-04-17 12:13:28 +00:00
; ;
2019-04-22 19:05:52 +00:00
"kill" )
${ CLEAR }
tmux kill-session -t " $ME " & >/dev/null
send_markdown_message " ${ CHAT [ID] } " "*Bot stopped*"
echo -e " ${ GREEN } OK. Bot stopped successfully. ${ NC } "
2019-03-25 10:15:07 +00:00
; ;
2019-03-24 12:57:49 +00:00
"background" | "resumeback" )
2019-04-12 08:30:35 +00:00
${ CLEAR }
2019-03-28 13:24:08 +00:00
echo -e " ${ GREEN } Restart background processes ... ${ NC } "
2019-04-08 10:11:17 +00:00
for FILE in " ${ TMPDIR :- . } / " *-back.cmd; do
2019-04-12 17:39:21 +00:00
if [ " ${ FILE } " = " ${ TMPDIR :- . } /*-back.cmd " ] ; then
2019-03-28 13:24:08 +00:00
echo -e " ${ RED } No background processes to start. ${ NC } " ; break
2019-03-18 19:00:16 +00:00
else
2019-04-12 09:27:20 +00:00
RESTART = " $( < " ${ FILE } " ) "
2019-03-18 19:00:16 +00:00
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 } "
2019-04-08 10:11:17 +00:00
( tmux kill-session -t " ${ fifo } " ; tmux kill-session -t " sendprocess_ ${ fifo } " ; rm -f -r " ${ TMPDIR :- . } / ${ fifo } " ) 2>/dev/null
mkfifo " ${ TMPDIR :- . } / ${ fifo } "
2019-04-08 10:23:31 +00:00
tmux new-session -d -s " ${ fifo } " " ${ PROG } &> ${ TMPDIR :- . } / ${ fifo } ; echo imprettydarnsuredatdisisdaendofdacmd> ${ TMPDIR :- . } / ${ fifo } "
tmux new-session -d -s " sendprocess_ ${ fifo } " " bash $SCRIPT outproc ${ CHAT [ID] } ${ fifo } "
2019-03-18 19:00:16 +00:00
fi
done
; ;
2019-03-24 12:57:49 +00:00
"killback" | "suspendback" )
2019-04-12 08:30:35 +00:00
${ CLEAR }
2019-03-28 13:24:08 +00:00
echo -e " ${ GREEN } Stopping background processes ... ${ NC } "
2019-04-08 10:11:17 +00:00
for FILE in " ${ TMPDIR :- . } / " *-back.cmd; do
2019-04-12 17:39:21 +00:00
if [ " ${ FILE } " = " ${ TMPDIR :- . } /*-back.cmd " ] ; then
2019-03-28 13:24:08 +00:00
echo -e " ${ RED } No background processes. ${ NC } " ; break
2019-03-18 21:19:44 +00:00
else
2019-04-12 09:27:20 +00:00
REMOVE = " $( < " ${ FILE } " ) "
2019-03-18 21:19:44 +00:00
JOB = " ${ REMOVE #* : } "
fifo = " back- ${ JOB % : * } - ${ ME } _ ${ REMOVE %% : * } "
echo " killbackground ${ fifo } "
2019-04-12 17:39:21 +00:00
[ " $1 " = "killback" ] && rm -f " ${ FILE } " # remove job
2019-04-08 10:11:17 +00:00
( tmux kill-session -t " ${ fifo } " ; tmux kill-session -t " sendprocess_ ${ fifo } " ; rm -f -r " ${ TMPDIR :- . } / ${ fifo } " ) 2>/dev/null
2019-03-18 21:19:44 +00:00
fi
done
; ;
2016-04-17 12:13:28 +00:00
"help" )
2019-04-12 08:30:35 +00:00
${ CLEAR }
2019-04-09 11:41:38 +00:00
less "README.txt"
2019-04-01 10:52:25 +00:00
exit
2016-04-19 09:49:35 +00:00
; ;
*)
2019-04-15 10:19:04 +00:00
echo -e " ${ RED } ${ ME } : BAD REQUEST ${ NC } "
2019-04-22 19:05:52 +00:00
echo -e " ${ RED } Available arguments: start, kill, count, broadcast, help, suspendback, resumeback, killback ${ NC } "
2019-04-01 10:52:25 +00:00
exit 4
2016-04-17 12:13:28 +00:00
; ;
2019-04-20 14:26:16 +00:00
esac
2016-06-05 10:41:49 +00:00
2019-04-20 14:26:16 +00:00
# warn if root
if [ [ " $( id -u) " -eq "0" ] ] ; then
2019-04-01 17:13:13 +00:00
echo -e " \\n ${ ORANGE } WARNING: ${ SCRIPT } was started as ROOT (UID 0)! ${ NC } "
2019-03-28 13:24:08 +00:00
echo -e " ${ ORANGE } You are at HIGH RISK when processing user input with root privilegs! ${ NC } "
2019-04-20 14:26:16 +00:00
fi
fi # end source