mirror of
https://github.com/octoleo/telegram-bot-bash.git
synced 2025-02-10 14:18:29 +00:00
fix source commands.sh, fix sendJson, sendMEssage module
This commit is contained in:
parent
5b10e75b94
commit
92f022d038
208
bashbot.sh
208
bashbot.sh
@ -12,7 +12,7 @@
|
|||||||
# This file is public domain in the USA and all free countries.
|
# This file is public domain in the USA and all free countries.
|
||||||
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
||||||
#
|
#
|
||||||
#### $$VERSION$$ v0.80-dev2-4-gb7df57a
|
#### $$VERSION$$ v0.80-dev2-6-g5b10e75
|
||||||
#
|
#
|
||||||
# Exit Codes:
|
# Exit Codes:
|
||||||
# - 0 sucess (hopefully)
|
# - 0 sucess (hopefully)
|
||||||
@ -122,30 +122,14 @@ fi
|
|||||||
BOTTOKEN="$(cat "${TOKENFILE}")"
|
BOTTOKEN="$(cat "${TOKENFILE}")"
|
||||||
URL='https://api.telegram.org/bot'$BOTTOKEN
|
URL='https://api.telegram.org/bot'$BOTTOKEN
|
||||||
|
|
||||||
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'
|
|
||||||
ME_URL=$URL'/getMe'
|
ME_URL=$URL'/getMe'
|
||||||
DELETE_URL=$URL'/deleteMessage'
|
|
||||||
GETMEMBER_URL=$URL'/getChatMember'
|
|
||||||
|
|
||||||
UPD_URL=$URL'/getUpdates?offset='
|
UPD_URL=$URL'/getUpdates?offset='
|
||||||
GETFILE_URL=$URL'/getFile'
|
GETFILE_URL=$URL'/getFile'
|
||||||
|
|
||||||
unset USER
|
unset USER
|
||||||
declare -A BOTSENT USER MESSAGE URLS CONTACT LOCATION CHAT FORWARD REPLYTO VENUE iQUERY
|
declare -A BOTSENT USER MESSAGE URLS CONTACT LOCATION CHAT FORWARD REPLYTO VENUE iQUERY
|
||||||
export BOTSENT USER MESSAGE URLS CONTACT LOCATION CHAT FORWARD REPLYTO VENUE iQUERY
|
export res BOTSENT USER MESSAGE URLS CONTACT LOCATION CHAT FORWARD REPLYTO VENUE iQUERY
|
||||||
|
|
||||||
COMMANDS="${BASHBOT_ETC:-.}/commands.sh"
|
COMMANDS="${BASHBOT_ETC:-.}/commands.sh"
|
||||||
if [ "$1" != "source" ]; then
|
if [ "$1" != "source" ]; then
|
||||||
@ -160,116 +144,11 @@ if [ "$1" != "source" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
send_normal_message() {
|
DELETE_URL=$URL'/deleteMessage'
|
||||||
local text="${2}"
|
|
||||||
until [ -z "${text}" ]; do
|
|
||||||
sendJson "${1}" '"text":"'"${text:0:4096}"'"' "${MSG_URL}"
|
|
||||||
text="${text:4096}"
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
send_markdown_message() {
|
|
||||||
local text="${2}"
|
|
||||||
until [ -z "${text}" ]; do
|
|
||||||
sendJson "${1}" '"text":"'"${text:0:4096}"'","parse_mode":"markdown"' "${MSG_URL}"
|
|
||||||
text="${text:4096}"
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
send_html_message() {
|
|
||||||
local text="${2}"
|
|
||||||
until [ -z "${text}" ]; do
|
|
||||||
sendJson "${1}" '"text":"'"${text:0:4096}"'","parse_mode":"html"' "${MSG_URL}"
|
|
||||||
text="${text:4096}"
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
delete_message() {
|
delete_message() {
|
||||||
sendJson "${1}" 'message_id: '"${2}"'' "${DELETE_URL}"
|
sendJson "${1}" 'message_id: '"${2}"'' "${DELETE_URL}"
|
||||||
}
|
}
|
||||||
|
|
||||||
# usage: status="$(get_chat_member_status "chat" "user")"
|
|
||||||
get_chat_member_status() {
|
|
||||||
sendJson "$1" 'user_id: '"$2"'' "$GETMEMBER_URL"
|
|
||||||
JsonGetString '"result","status"' <<< "$res"
|
|
||||||
}
|
|
||||||
|
|
||||||
kick_chat_member() {
|
|
||||||
sendJson "$1" 'user_id: '"$2"'' "$KICK_URL"
|
|
||||||
}
|
|
||||||
|
|
||||||
unban_chat_member() {
|
|
||||||
sendJson "$1" 'user_id: '"$2"'' "$UNBAN_URL"
|
|
||||||
}
|
|
||||||
|
|
||||||
leave_chat() {
|
|
||||||
sendJson "$1" "" "$LEAVE_URL"
|
|
||||||
}
|
|
||||||
|
|
||||||
user_is_creator() {
|
|
||||||
if [ "${1:--}" = "${2:-+}" ] || [ "$(get_chat_member_status "$1" "$2")" = "creator" ]; then return 0; fi
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
user_is_admin() {
|
|
||||||
local me; me="$(get_chat_member_status "$1" "$2")"
|
|
||||||
if [ "${me}" = "creator" ] || [ "${me}" = "administrator" ]; then return 0; fi
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
user_is_botadmin() {
|
|
||||||
local admin; admin="$(head -n 1 "${BOTADMIN}")"
|
|
||||||
[ "${admin}" = "${1}" ] && return 0
|
|
||||||
[[ "${admin}" = "@*" ]] && [[ "${admin}" = "${2}" ]] && return 0
|
|
||||||
if [ "${admin}" = "?" ]; then echo "${1:-?}" >"${BOTADMIN}"; return 0; fi
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
user_is_allowed() {
|
|
||||||
local acl="$1"
|
|
||||||
[ "$1" = "" ] && return 1
|
|
||||||
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}"
|
|
||||||
}
|
|
||||||
|
|
||||||
old_send_keyboard() {
|
|
||||||
local text='"text":"'"${2}"'"'
|
|
||||||
shift 2
|
|
||||||
local keyboard=init
|
|
||||||
OLDIFS=$IFS
|
|
||||||
IFS=$(echo -en "\"")
|
|
||||||
for f in "$@" ;do [ "$f" != " " ] && keyboard="$keyboard, [\"$f\"]";done
|
|
||||||
IFS=$OLDIFS
|
|
||||||
keyboard=${keyboard/init, /}
|
|
||||||
sendJson "${1}" "${text}"', "reply_markup": {"keyboard": [ '"${keyboard}"' ],"one_time_keyboard": true}' "$MSG_URL"
|
|
||||||
}
|
|
||||||
|
|
||||||
ISEMPTY="ThisTextIsEmptyAndWillBeDeleted"
|
|
||||||
send_keyboard() {
|
|
||||||
if [[ "$3" != *'['* ]]; then old_send_keyboard "$@"; return; fi
|
|
||||||
local text='"text":"'"${2}"'"'; [ "${2}" = "" ] && text='"text":"'"${ISEMPTY}"'"'
|
|
||||||
local one_time=', "one_time_keyboard":true' && [ "$4" != "" ] && one_time=""
|
|
||||||
sendJson "${1}" "${text}"', "reply_markup": {"keyboard": [ '"${3}"' ] '"${one_time}"'}' "$MSG_URL"
|
|
||||||
# '"text":"$2", "reply_markup": {"keyboard": [ ${3} ], "one_time_keyboard": true}'
|
|
||||||
}
|
|
||||||
|
|
||||||
remove_keyboard() {
|
|
||||||
local text='"text":"'"${2}"'"'; [ "${2}" = "" ] && text='"text":"'"${ISEMPTY}"'"'
|
|
||||||
sendJson "${1}" "${text}"', "reply_markup": {"remove_keyboard":true}' "$MSG_URL"
|
|
||||||
#JSON='"text":"$2", "reply_markup": {"remove_keyboard":true}'
|
|
||||||
}
|
|
||||||
send_inline_keyboard() {
|
|
||||||
local text='"text":"'"${2}"'"'; [ "${2}" = "" ] && text='"text":"'"${ISEMPTY}"'"'
|
|
||||||
sendJson "${1}" "${text}"', "reply_markup": {"inline_keyboard": [ '"${3}"' ]}' "$MSG_URL"
|
|
||||||
# JSON='"text":"$2", "reply_markup": {"inline_keyboard": [ $3->[{"text":"text", "url":"url"}]<- ]}'
|
|
||||||
}
|
|
||||||
send_button() {
|
|
||||||
send_inline_keyboard "${1}" "${2}" '[ {"text":"'"${3}"'", "url":"'"${4}"'"}]'
|
|
||||||
}
|
|
||||||
|
|
||||||
# usage: sendJson "chat" "JSON" "URL"
|
# usage: sendJson "chat" "JSON" "URL"
|
||||||
sendJson(){
|
sendJson(){
|
||||||
local chat="";
|
local chat="";
|
||||||
@ -278,7 +157,6 @@ sendJson(){
|
|||||||
-H "Content-Type: application/json" | "${JSONSHFILE}" -s -b -n )"
|
-H "Content-Type: application/json" | "${JSONSHFILE}" -s -b -n )"
|
||||||
BOTSENT[OK]="$(JsonGetLine '"ok"' <<< "$res")"
|
BOTSENT[OK]="$(JsonGetLine '"ok"' <<< "$res")"
|
||||||
BOTSENT[ID]="$(JsonGetValue '"result","message_id"' <<< "$res")"
|
BOTSENT[ID]="$(JsonGetValue '"result","message_id"' <<< "$res")"
|
||||||
[[ "${2}" = *"${ISEMPTY}"* ]] && delete_message "${1}" "${BOTSENT[ID]}"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# convert common telegram entities to JSON
|
# convert common telegram entities to JSON
|
||||||
@ -300,82 +178,6 @@ get_file() {
|
|||||||
echo "${URL}/$(echo "${res}" | jsonGetString '"result","file_path"')"
|
echo "${URL}/$(echo "${res}" | jsonGetString '"result","file_path"')"
|
||||||
}
|
}
|
||||||
|
|
||||||
send_file() {
|
|
||||||
[ "$2" = "" ] && return
|
|
||||||
local CAPTION
|
|
||||||
local chat_id=$1
|
|
||||||
local file=$2
|
|
||||||
echo "$file" | grep -qE "$FILE_REGEX" || return
|
|
||||||
local ext="${file##*.}"
|
|
||||||
case $ext in
|
|
||||||
mp3|flac)
|
|
||||||
CUR_URL=$AUDIO_URL
|
|
||||||
WHAT=audio
|
|
||||||
STATUS=upload_audio
|
|
||||||
CAPTION="$3"
|
|
||||||
;;
|
|
||||||
png|jpg|jpeg|gif)
|
|
||||||
CUR_URL=$PHO_URL
|
|
||||||
WHAT=photo
|
|
||||||
STATUS=upload_photo
|
|
||||||
CAPTION="$3"
|
|
||||||
;;
|
|
||||||
webp)
|
|
||||||
CUR_URL=$STICKER_URL
|
|
||||||
WHAT=sticker
|
|
||||||
STATUS=
|
|
||||||
;;
|
|
||||||
mp4)
|
|
||||||
CUR_URL=$VIDEO_URL
|
|
||||||
WHAT=video
|
|
||||||
STATUS=upload_video
|
|
||||||
CAPTION="$3"
|
|
||||||
;;
|
|
||||||
|
|
||||||
ogg)
|
|
||||||
CUR_URL=$VOICE_URL
|
|
||||||
WHAT=voice
|
|
||||||
STATUS=
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
CUR_URL=$DOCUMENT_URL
|
|
||||||
WHAT=document
|
|
||||||
STATUS=upload_document
|
|
||||||
CAPTION="$3"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
send_action "$chat_id" "$STATUS"
|
|
||||||
res="$(curl -s "$CUR_URL" -F "chat_id=$chat_id" -F "$WHAT=@$file" -F "caption=$CAPTION")"
|
|
||||||
}
|
|
||||||
|
|
||||||
# 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() {
|
|
||||||
[ "$2" = "" ] && return
|
|
||||||
sendJson "${1}" '"action": "'"${2}"'"' "$ACTION_URL"
|
|
||||||
}
|
|
||||||
|
|
||||||
send_location() {
|
|
||||||
[ "$3" = "" ] && return
|
|
||||||
sendJson "${1}" '"latitude": '"${2}"', "longitude": '"${3}"'' "$LOCATION_URL"
|
|
||||||
}
|
|
||||||
|
|
||||||
send_venue() {
|
|
||||||
local add=""
|
|
||||||
[ "$5" = "" ] && return
|
|
||||||
[ "$6" != "" ] && add=', "foursquare_id": '"$6"''
|
|
||||||
sendJson "${1}" '"latitude": '"${2}"', "longitude": '"${3}"', "address": "'"${5}"'", "title": "'"${4}"'"'"${add}" "$VENUE_URL"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
forward_message() {
|
|
||||||
[ "$3" = "" ] && return
|
|
||||||
sendJson "${1}" '"from_chat_id": '"${2}"', "message_id": '"${3}"'' "$FORWARD_URL"
|
|
||||||
}
|
|
||||||
forward() { # backward compatibility
|
|
||||||
forward_message "$@" || return
|
|
||||||
}
|
|
||||||
|
|
||||||
# returns true if function exist
|
# returns true if function exist
|
||||||
_is_function()
|
_is_function()
|
||||||
{
|
{
|
||||||
@ -398,7 +200,9 @@ process_client() {
|
|||||||
fi
|
fi
|
||||||
# Tmux
|
# Tmux
|
||||||
copname="$ME"_"${CHAT[ID]}"
|
copname="$ME"_"${CHAT[ID]}"
|
||||||
source commands.sh
|
# shellcheck source=./commands.sh
|
||||||
|
source "${COMMANDS}" "$1"
|
||||||
|
|
||||||
tmpcount="COUNT${CHAT[ID]}"
|
tmpcount="COUNT${CHAT[ID]}"
|
||||||
grep -q "$tmpcount" <"${COUNTFILE}" >/dev/null 2>&1 || echo "$tmpcount">>"${COUNTFILE}"
|
grep -q "$tmpcount" <"${COUNTFILE}" >/dev/null 2>&1 || echo "$tmpcount">>"${COUNTFILE}"
|
||||||
# To get user count execute bash bashbot.sh count
|
# To get user count execute bash bashbot.sh count
|
||||||
|
39
commands.sh
39
commands.sh
@ -5,10 +5,8 @@
|
|||||||
# This file is public domain in the USA and all free countries.
|
# This file is public domain in the USA and all free countries.
|
||||||
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
||||||
#
|
#
|
||||||
#### $$VERSION$$ v0.80-dev2-4-gb7df57a
|
#### $$VERSION$$ v0.80-dev2-6-g5b10e75
|
||||||
#
|
#
|
||||||
# shellcheck disable=SC2154
|
|
||||||
# shellcheck disable=SC2034
|
|
||||||
|
|
||||||
# adjust your language setting here, e.g.when run from other user or cron.
|
# adjust your language setting here, e.g.when run from other user or cron.
|
||||||
# https://github.com/topkecleon/telegram-bot-bash#setting-up-your-environment
|
# https://github.com/topkecleon/telegram-bot-bash#setting-up-your-environment
|
||||||
@ -38,43 +36,50 @@ Written by Drew (@topkecleon), Daniil Gentili (@danogentili) and KayM(@gnadelwar
|
|||||||
Get the code in my [GitHub](http://github.com/topkecleon/telegram-bot-bash)
|
Get the code in my [GitHub](http://github.com/topkecleon/telegram-bot-bash)
|
||||||
'
|
'
|
||||||
|
|
||||||
if [ "${1}" != "source" ]; then
|
# load modues on startup and always on on debug
|
||||||
# shellcheck source=./modules/aliases.sh
|
if [ "${1}" = "source" ] || [[ "${1}" = *"debug"* ]] ; then
|
||||||
[ -r "${MODULEDIR:-.}/aliases.sh" ] && source "${MODULEDIR:-.}/aliases.sh"
|
# load all readable modules
|
||||||
# shellcheck source=./modules/background.sh
|
for modules in ${MODULEDIR:-.}/*.sh ; do
|
||||||
[ -r "${MODULEDIR:-.}/background.sh" ] && source "${MODULEDIR:-.}/background.sh"
|
# shellcheck source=./modules/aliases.sh
|
||||||
# shellcheck source=./modules/background.sh
|
[ -r "${modules}" ] && source "${modules}" "${1}"
|
||||||
[ -r "${MODULEDIR:-.}/inline.sh" ] && source "${MODULEDIR:-.}/inline.sh"
|
done
|
||||||
else
|
|
||||||
# defaults to no inline and nonsense home dir
|
|
||||||
INLINE="0"
|
|
||||||
FILE_REGEX='/home/user/allowed/.*'
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# defaults to no inline and nonsense home dir
|
||||||
|
export INLINE="0"
|
||||||
|
export FILE_REGEX='/home/user/allowed/.*'
|
||||||
|
|
||||||
|
|
||||||
# load mycommands
|
# load mycommands
|
||||||
# shellcheck source=./commands.sh
|
# shellcheck source=./commands.sh
|
||||||
[ -r "${BASHBOT_ETC:-.}/mycommands.sh" ] && source "${BASHBOT_ETC:-.}/mycommands.sh" "${1}"
|
[ -r "${BASHBOT_ETC:-.}/mycommands.sh" ] && source "${BASHBOT_ETC:-.}/mycommands.sh" "${1}"
|
||||||
|
|
||||||
|
|
||||||
if [ "${1}" != "source" ];then
|
if [ "${1}" != "source" ];then
|
||||||
|
# this was here from beginning, can some tell me what this is for?
|
||||||
|
# I GUESS it was used to auto send files and locations??
|
||||||
|
# this will be removed!!!
|
||||||
if ! tmux ls 2>/dev/null | grep -v send | grep -q "$copname"; then
|
if ! tmux ls 2>/dev/null | grep -v send | grep -q "$copname"; then
|
||||||
# interactive running?
|
|
||||||
[ ! -z "${URLS[*]}" ] && {
|
[ ! -z "${URLS[*]}" ] && {
|
||||||
curl -s "${URLS[*]}" -o "$NAME"
|
curl -s "${URLS[*]}" -o "$NAME"
|
||||||
send_file "${CHAT[ID]}" "$NAME" "$CAPTION"
|
send_file "${CHAT[ID]}" "$NAME" "$CAPTION"
|
||||||
rm -f "$NAME"
|
rm -f "$NAME"
|
||||||
}
|
}
|
||||||
[ ! -z "${LOCATION[*]}" ] && send_location "${CHAT[ID]}" "${LOCATION[LATITUDE]}" "${LOCATION[LONGITUDE]}"
|
[ ! -z "${LOCATION[*]}" ] && send_location "${CHAT[ID]}" "${LOCATION[LATITUDE]}" "${LOCATION[LONGITUDE]}"
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# detect inline commands....
|
||||||
|
# no default commands, all processing is done in myinlines()
|
||||||
if [ "$INLINE" != "0" ] && [ "${iQUERY[ID]}" != "" ]; then
|
if [ "$INLINE" != "0" ] && [ "${iQUERY[ID]}" != "" ]; then
|
||||||
if _is_function process_inline; then
|
if _is_function process_inline; then
|
||||||
# forward iinline query to optional dispatcher
|
# forward iinline query to optional dispatcher
|
||||||
_is_function myinlines && myinlines
|
_is_function myinlines && myinlines
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# regular (gobal) commands ...
|
||||||
|
# your commands are in mycommands()
|
||||||
else
|
else
|
||||||
|
|
||||||
case "${MESSAGE}" in
|
case "${MESSAGE}" in
|
||||||
################################################
|
################################################
|
||||||
# GLOBAL commands start here, edit messages only
|
# GLOBAL commands start here, edit messages only
|
||||||
|
102
modules/answerInline.sh
Normal file
102
modules/answerInline.sh
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# file: modules/inline.sh
|
||||||
|
# do not edit, this file will be overwritten on update
|
||||||
|
|
||||||
|
# This file is public domain in the USA and all free countries.
|
||||||
|
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
||||||
|
#
|
||||||
|
#### $$VERSION$$ v0.80-dev2-4-gb7df57a
|
||||||
|
|
||||||
|
# source from commands.sh to use the inline functions
|
||||||
|
|
||||||
|
INLINE_QUERY=$URL'/answerInlineQuery'
|
||||||
|
|
||||||
|
answer_inline_query() {
|
||||||
|
answer_inline_multi "${1}" "$(shift; inline_query_compose "$RANDOM" "$@")"
|
||||||
|
}
|
||||||
|
answer_inline_multi() {
|
||||||
|
sendJson "" '"inline_query_id": '"${1}"', "results": ['"${2}"']' "${INLINE_QUERY}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# $1 unique ID for answer
|
||||||
|
# $2 type of answer
|
||||||
|
# remaining arguments are the "must have" arguments in the order as in telegram doc
|
||||||
|
# followed by the optional arguments: https://core.telegram.org/bots/api#inlinequeryresult
|
||||||
|
inline_query_compose(){
|
||||||
|
local JSON="{}"
|
||||||
|
local ID="${1}"
|
||||||
|
local fours last
|
||||||
|
# title2Json title caption description markup inlinekeyboard
|
||||||
|
case "${2}" in
|
||||||
|
# user provided media
|
||||||
|
"article"|"message") # article ID title message (markup decription)
|
||||||
|
JSON='{"type":"article","id":"'$ID'","input_message_content": {"message_text":"'$4'"} '$(title2Json "$3" "" "$5" "$6")'}'
|
||||||
|
;;
|
||||||
|
"photo") # photo ID photoURL (thumbURL title description caption)
|
||||||
|
[ "$4" = "" ] && tumb="$3"
|
||||||
|
JSON='{"type":"photo","id":"'$ID'","photo_url":"'$3'","thumb_url":"'$4${tumb}'"'$(title2Json "$5" "$7" "$6")'}'
|
||||||
|
;;
|
||||||
|
"gif") # gif ID photoURL (thumbURL title caption)
|
||||||
|
[ "$4" = "" ] && tumb="$3"
|
||||||
|
JSON='{"type":"gif","id":"'$ID'","gif_url":"'$3'", "thumb_url":"'$4${tumb}'"'$(title2Json "$5" "$6")'}'
|
||||||
|
;;
|
||||||
|
"mpeg4_gif") # mpeg4_gif ID mpegURL (thumbURL title caption)
|
||||||
|
[ "$4" != "" ] && tumb='","thumb_url":"'$4'"'
|
||||||
|
JSON='{"type":"mpeg4_gif","id":"'$ID'","mpeg4_url":"'$3'"'${tumb}$(title2Json "$5" "$6")'}'
|
||||||
|
;;
|
||||||
|
"video") # video ID videoURL mime thumbURL title (caption)
|
||||||
|
JSON='{"type":"video","id":"'$ID'","video_url":"'$3'","mime_type":"'$4'","thumb_url":"'$5'"'$(title2Json "$6" "$7")'}'
|
||||||
|
;;
|
||||||
|
"audio") # audio ID audioURL title (caption)
|
||||||
|
JSON='{"type":"audio","id":"'$ID'","audio_url":"'$3'"'$(title2Json "$4" "$5")'}'
|
||||||
|
;;
|
||||||
|
"voice") # voice ID voiceURL title (caption)
|
||||||
|
JSON='{"type":"voice","id":"'$ID'","voice_url":"'$3'"'$(title2Json "$4" "$5")'}'
|
||||||
|
;;
|
||||||
|
"document") # document ID title documentURL mimetype (caption description)
|
||||||
|
JSON='{"type":"document","id":"'$ID'","document_url":"'$4'","mime_type":"'$5'"'$(title2Json "$3" "$6" "$7")'}'
|
||||||
|
;;
|
||||||
|
"location") # location ID lat long title
|
||||||
|
JSON='{"type":"location","id":"'$ID'","latitude":"'$3'","longitude":"'$4'","title":"'$5'"}'
|
||||||
|
;;
|
||||||
|
"venue") # venue ID lat long title (adress forsquare)
|
||||||
|
[ "$6" = "" ] && addr="$5"
|
||||||
|
[ "$7" != "" ] && fours=',"foursquare_id":"'$7'"'
|
||||||
|
JSON='{"type":"venue","id":"'$ID'","latitude":"'$3'","longitude":"'$4'","title":"'$5'","address":"'$6${addr}'"'${fours}'}'
|
||||||
|
;;
|
||||||
|
"contact") # contact ID phone first (last thumb)
|
||||||
|
[ "$5" != "" ] && last=',"last_name":"'$5'"'
|
||||||
|
[ "$6" != "" ] && tumb='","thumb_url":"'$6'"'
|
||||||
|
JSON='{"type":"contact","id":"'$ID'","phone_number":"'$3'","first_name":"'$4'"'${last}'"}'
|
||||||
|
;;
|
||||||
|
# title2Json title caption description markup inlinekeyboard
|
||||||
|
# Cached media stored in Telegram server
|
||||||
|
"cached_photo") # photo ID file (title description caption)
|
||||||
|
JSON='{"type":"photo","id":"'$ID'","photo_file_id":"'$3'"'$(title2Json "$4" "$6" "$5")'}'
|
||||||
|
;;
|
||||||
|
"cached_gif") # gif ID file (title caption)
|
||||||
|
JSON='{"type":"gif","id":"'$ID'","gif_file_id":"'$3'"'$(title2Json "$4" "$5")'}'
|
||||||
|
;;
|
||||||
|
"cached_mpeg4_gif") # mpeg ID file (title caption)
|
||||||
|
JSON='{"type":"mpeg4_gif","id":"'$ID'","mpeg4_file_id":"'$3'"'$(title2Json "$4" "$5")'}'
|
||||||
|
;;
|
||||||
|
"cached_sticker") # sticker ID file
|
||||||
|
JSON='{"type":"sticker","id":"'$ID'","sticker_file_id":"'$3'"}'
|
||||||
|
;;
|
||||||
|
"cached_document") # document ID title file (description caption)
|
||||||
|
JSON='{"type":"document","id":"'$ID'","document_file_id":"'$4'"'$(title2Json "$3" "$6" "$5")'}'
|
||||||
|
;;
|
||||||
|
"cached_video") # video ID file title (description caption)
|
||||||
|
JSON='{"type":"video","id":"'$ID'","video_file_id":"'$3'"'$(title2Json "$4" "$6" "$5")'}'
|
||||||
|
;;
|
||||||
|
"cached_voice") # voice ID file title (caption)
|
||||||
|
JSON='{"type":"voice","id":"'$ID'","voice_file_id":"'$3'"'$(title2Json "$4" "$5")'}'
|
||||||
|
;;
|
||||||
|
"cached_audio") # audio ID file title (caption)
|
||||||
|
JSON='{"type":"audio","id":"'$ID'","audio_file_id":"'$3'"'$(title2Json "$4" "$5")'}'
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo "${JSON}"
|
||||||
|
}
|
||||||
|
|
@ -5,78 +5,10 @@
|
|||||||
# This file is public domain in the USA and all free countries.
|
# This file is public domain in the USA and all free countries.
|
||||||
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
||||||
#
|
#
|
||||||
#### $$VERSION$$ v0.80-dev2-1-g0b36bc5
|
#### $$VERSION$$ v0.80-dev2-6-g5b10e75
|
||||||
|
|
||||||
# source from commands.sh if you want ro use interactive or background jobs
|
# source from commands.sh if you want ro use interactive or background jobs
|
||||||
|
|
||||||
## to statisfy shellcheck
|
|
||||||
export res
|
|
||||||
|
|
||||||
####
|
|
||||||
# I placed send_message here because main use case is interactive chats and background jobs
|
|
||||||
send_message() {
|
|
||||||
[ "$2" = "" ] && return
|
|
||||||
local text keyboard btext burl no_keyboard file lat long title address sent
|
|
||||||
text="$(sed <<< "${2}" 's/ mykeyboardend.*//;s/ *my[kfltab][a-z]\{2,13\}startshere.*//')$(sed <<< "${2}" -n '/mytextstartshere/ s/.*mytextstartshere//p')"
|
|
||||||
text="$(sed <<< "${text}" 's/ *mynewlinestartshere */\r\n/g')"
|
|
||||||
[ "$3" != "safe" ] && {
|
|
||||||
no_keyboard="$(sed <<< "${2}" '/mykeyboardendshere/!d;s/.*mykeyboardendshere.*/mykeyboardendshere/')"
|
|
||||||
keyboard="$(sed <<< "${2}" '/mykeyboardstartshere /!d;s/.*mykeyboardstartshere *//;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
|
||||||
btext="$(sed <<< "${2}" '/mybtextstartshere /!d;s/.*mybtextstartshere //;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
|
||||||
burl="$(sed <<< "${2}" '/myburlstartshere /!d;s/.*myburlstartshere //;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//g;s/ *mykeyboardendshere.*//g')"
|
|
||||||
file="$(sed <<< "${2}" '/myfilelocationstartshere /!d;s/.*myfilelocationstartshere //;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
|
||||||
lat="$(sed <<< "${2}" '/mylatstartshere /!d;s/.*mylatstartshere //;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
|
||||||
long="$(sed <<< "${2}" '/mylongstartshere /!d;s/.*mylongstartshere //;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
|
||||||
title="$(sed <<< "${2}" '/mytitlestartshere /!d;s/.*mytitlestartshere //;s/ *my[kfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
|
||||||
address="$(sed <<< "${2}" '/myaddressstartshere /!d;s/.*myaddressstartshere //;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
|
||||||
}
|
|
||||||
if [ "$no_keyboard" != "" ]; then
|
|
||||||
remove_keyboard "$1" "$text"
|
|
||||||
sent=y
|
|
||||||
fi
|
|
||||||
if [ "$keyboard" != "" ]; then
|
|
||||||
if [[ "$keyboard" != *"["* ]]; then # pre 0.60 style
|
|
||||||
keyboard="[ ${keyboard//\" \"/\" \] , \[ \"} ]"
|
|
||||||
fi
|
|
||||||
send_keyboard "$1" "$text" "$keyboard"
|
|
||||||
sent=y
|
|
||||||
fi
|
|
||||||
if [ "$btext" != "" ] && [ "$burl" != "" ]; then
|
|
||||||
send_button "$1" "$text" "$btext" "$burl"
|
|
||||||
sent=y
|
|
||||||
fi
|
|
||||||
if [ "$file" != "" ]; then
|
|
||||||
send_file "$1" "$file" "$text"
|
|
||||||
sent=y
|
|
||||||
fi
|
|
||||||
if [ "$lat" != "" ] && [ "$long" != "" ]; then
|
|
||||||
if [ "$address" != "" ] && [ "$title" != "" ]; then
|
|
||||||
send_venue "$1" "$lat" "$long" "$title" "$address"
|
|
||||||
else
|
|
||||||
send_location "$1" "$lat" "$long"
|
|
||||||
fi
|
|
||||||
sent=y
|
|
||||||
fi
|
|
||||||
if [ "$sent" != "y" ];then
|
|
||||||
send_text "$1" "$text"
|
|
||||||
fi
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
send_text() {
|
|
||||||
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}"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
send_normal_message "$1" "$2"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
######
|
######
|
||||||
# interactive and background functions
|
# interactive and background functions
|
||||||
|
|
||||||
@ -99,7 +31,9 @@ checkback() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
checkproc() {
|
checkproc() {
|
||||||
tmux ls | grep -q "$1${copname}"; res=$?; return $?
|
tmux ls | grep -q "$1${copname}"
|
||||||
|
# shellcheck disable=SC2034
|
||||||
|
res=$?; return $?
|
||||||
}
|
}
|
||||||
|
|
||||||
killback() {
|
killback() {
|
||||||
|
63
modules/chatMember.sh
Normal file
63
modules/chatMember.sh
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# file: modules/chatMember.sh
|
||||||
|
# do not edit, this file will be overwritten on update
|
||||||
|
|
||||||
|
# This file is public domain in the USA and all free countries.
|
||||||
|
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
||||||
|
#
|
||||||
|
#### $$VERSION$$ v0.80-dev2-6-g5b10e75
|
||||||
|
|
||||||
|
# source from commands.sh to use the member functions
|
||||||
|
|
||||||
|
LEAVE_URL=$URL'/leaveChat'
|
||||||
|
KICK_URL=$URL'/kickChatMember'
|
||||||
|
UNBAN_URL=$URL'/unbanChatMember'
|
||||||
|
GETMEMBER_URL=$URL'/getChatMember'
|
||||||
|
|
||||||
|
# usage: status="$(get_chat_member_status "chat" "user")"
|
||||||
|
get_chat_member_status() {
|
||||||
|
sendJson "$1" 'user_id: '"$2"'' "$GETMEMBER_URL"
|
||||||
|
# shellcheck disable=SC2154
|
||||||
|
JsonGetString '"result","status"' <<< "$res"
|
||||||
|
}
|
||||||
|
|
||||||
|
kick_chat_member() {
|
||||||
|
sendJson "$1" 'user_id: '"$2"'' "$KICK_URL"
|
||||||
|
}
|
||||||
|
|
||||||
|
unban_chat_member() {
|
||||||
|
sendJson "$1" 'user_id: '"$2"'' "$UNBAN_URL"
|
||||||
|
}
|
||||||
|
|
||||||
|
leave_chat() {
|
||||||
|
sendJson "$1" "" "$LEAVE_URL"
|
||||||
|
}
|
||||||
|
|
||||||
|
user_is_creator() {
|
||||||
|
if [ "${1:--}" = "${2:-+}" ] || [ "$(get_chat_member_status "$1" "$2")" = "creator" ]; then return 0; fi
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
user_is_admin() {
|
||||||
|
local me; me="$(get_chat_member_status "$1" "$2")"
|
||||||
|
if [ "${me}" = "creator" ] || [ "${me}" = "administrator" ]; then return 0; fi
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
user_is_botadmin() {
|
||||||
|
local admin; admin="$(head -n 1 "${BOTADMIN}")"
|
||||||
|
[ "${admin}" = "${1}" ] && return 0
|
||||||
|
[[ "${admin}" = "@*" ]] && [[ "${admin}" = "${2}" ]] && return 0
|
||||||
|
if [ "${admin}" = "?" ]; then echo "${1:-?}" >"${BOTADMIN}"; return 0; fi
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
user_is_allowed() {
|
||||||
|
local acl="$1"
|
||||||
|
[ "$1" = "" ] && return 1
|
||||||
|
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}"
|
||||||
|
}
|
@ -1,102 +1,2 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# file: modules/inline.sh
|
echo "use answerInline.sh" >&2
|
||||||
# do not edit, this file will be overwritten on update
|
|
||||||
|
|
||||||
# This file is public domain in the USA and all free countries.
|
|
||||||
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
|
||||||
#
|
|
||||||
#### $$VERSION$$ v0.80-dev2-4-gb7df57a
|
|
||||||
|
|
||||||
# source from commands.sh to use the inline functions
|
|
||||||
|
|
||||||
INLINE_QUERY=$URL'/answerInlineQuery'
|
|
||||||
|
|
||||||
answer_inline_query() {
|
|
||||||
answer_inline_multi "${1}" "$(shift; inline_query_compose "$RANDOM" "$@")"
|
|
||||||
}
|
|
||||||
answer_inline_multi() {
|
|
||||||
sendJson "" '"inline_query_id": '"${1}"', "results": ['"${2}"']' "${INLINE_QUERY}"
|
|
||||||
}
|
|
||||||
|
|
||||||
# $1 unique ID for answer
|
|
||||||
# $2 type of answer
|
|
||||||
# remaining arguments are the "must have" arguments in the order as in telegram doc
|
|
||||||
# followed by the optional arguments: https://core.telegram.org/bots/api#inlinequeryresult
|
|
||||||
inline_query_compose(){
|
|
||||||
local JSON="{}"
|
|
||||||
local ID="${1}"
|
|
||||||
local fours last
|
|
||||||
# title2Json title caption description markup inlinekeyboard
|
|
||||||
case "${2}" in
|
|
||||||
# user provided media
|
|
||||||
"article"|"message") # article ID title message (markup decription)
|
|
||||||
JSON='{"type":"article","id":"'$ID'","input_message_content": {"message_text":"'$4'"} '$(title2Json "$3" "" "$5" "$6")'}'
|
|
||||||
;;
|
|
||||||
"photo") # photo ID photoURL (thumbURL title description caption)
|
|
||||||
[ "$4" = "" ] && tumb="$3"
|
|
||||||
JSON='{"type":"photo","id":"'$ID'","photo_url":"'$3'","thumb_url":"'$4${tumb}'"'$(title2Json "$5" "$7" "$6")'}'
|
|
||||||
;;
|
|
||||||
"gif") # gif ID photoURL (thumbURL title caption)
|
|
||||||
[ "$4" = "" ] && tumb="$3"
|
|
||||||
JSON='{"type":"gif","id":"'$ID'","gif_url":"'$3'", "thumb_url":"'$4${tumb}'"'$(title2Json "$5" "$6")'}'
|
|
||||||
;;
|
|
||||||
"mpeg4_gif") # mpeg4_gif ID mpegURL (thumbURL title caption)
|
|
||||||
[ "$4" != "" ] && tumb='","thumb_url":"'$4'"'
|
|
||||||
JSON='{"type":"mpeg4_gif","id":"'$ID'","mpeg4_url":"'$3'"'${tumb}$(title2Json "$5" "$6")'}'
|
|
||||||
;;
|
|
||||||
"video") # video ID videoURL mime thumbURL title (caption)
|
|
||||||
JSON='{"type":"video","id":"'$ID'","video_url":"'$3'","mime_type":"'$4'","thumb_url":"'$5'"'$(title2Json "$6" "$7")'}'
|
|
||||||
;;
|
|
||||||
"audio") # audio ID audioURL title (caption)
|
|
||||||
JSON='{"type":"audio","id":"'$ID'","audio_url":"'$3'"'$(title2Json "$4" "$5")'}'
|
|
||||||
;;
|
|
||||||
"voice") # voice ID voiceURL title (caption)
|
|
||||||
JSON='{"type":"voice","id":"'$ID'","voice_url":"'$3'"'$(title2Json "$4" "$5")'}'
|
|
||||||
;;
|
|
||||||
"document") # document ID title documentURL mimetype (caption description)
|
|
||||||
JSON='{"type":"document","id":"'$ID'","document_url":"'$4'","mime_type":"'$5'"'$(title2Json "$3" "$6" "$7")'}'
|
|
||||||
;;
|
|
||||||
"location") # location ID lat long title
|
|
||||||
JSON='{"type":"location","id":"'$ID'","latitude":"'$3'","longitude":"'$4'","title":"'$5'"}'
|
|
||||||
;;
|
|
||||||
"venue") # venue ID lat long title (adress forsquare)
|
|
||||||
[ "$6" = "" ] && addr="$5"
|
|
||||||
[ "$7" != "" ] && fours=',"foursquare_id":"'$7'"'
|
|
||||||
JSON='{"type":"venue","id":"'$ID'","latitude":"'$3'","longitude":"'$4'","title":"'$5'","address":"'$6${addr}'"'${fours}'}'
|
|
||||||
;;
|
|
||||||
"contact") # contact ID phone first (last thumb)
|
|
||||||
[ "$5" != "" ] && last=',"last_name":"'$5'"'
|
|
||||||
[ "$6" != "" ] && tumb='","thumb_url":"'$6'"'
|
|
||||||
JSON='{"type":"contact","id":"'$ID'","phone_number":"'$3'","first_name":"'$4'"'${last}'"}'
|
|
||||||
;;
|
|
||||||
# title2Json title caption description markup inlinekeyboard
|
|
||||||
# Cached media stored in Telegram server
|
|
||||||
"cached_photo") # photo ID file (title description caption)
|
|
||||||
JSON='{"type":"photo","id":"'$ID'","photo_file_id":"'$3'"'$(title2Json "$4" "$6" "$5")'}'
|
|
||||||
;;
|
|
||||||
"cached_gif") # gif ID file (title caption)
|
|
||||||
JSON='{"type":"gif","id":"'$ID'","gif_file_id":"'$3'"'$(title2Json "$4" "$5")'}'
|
|
||||||
;;
|
|
||||||
"cached_mpeg4_gif") # mpeg ID file (title caption)
|
|
||||||
JSON='{"type":"mpeg4_gif","id":"'$ID'","mpeg4_file_id":"'$3'"'$(title2Json "$4" "$5")'}'
|
|
||||||
;;
|
|
||||||
"cached_sticker") # sticker ID file
|
|
||||||
JSON='{"type":"sticker","id":"'$ID'","sticker_file_id":"'$3'"}'
|
|
||||||
;;
|
|
||||||
"cached_document") # document ID title file (description caption)
|
|
||||||
JSON='{"type":"document","id":"'$ID'","document_file_id":"'$4'"'$(title2Json "$3" "$6" "$5")'}'
|
|
||||||
;;
|
|
||||||
"cached_video") # video ID file title (description caption)
|
|
||||||
JSON='{"type":"video","id":"'$ID'","video_file_id":"'$3'"'$(title2Json "$4" "$6" "$5")'}'
|
|
||||||
;;
|
|
||||||
"cached_voice") # voice ID file title (caption)
|
|
||||||
JSON='{"type":"voice","id":"'$ID'","voice_file_id":"'$3'"'$(title2Json "$4" "$5")'}'
|
|
||||||
;;
|
|
||||||
"cached_audio") # audio ID file title (caption)
|
|
||||||
JSON='{"type":"audio","id":"'$ID'","audio_file_id":"'$3'"'$(title2Json "$4" "$5")'}'
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
echo "${JSON}"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
228
modules/sendMessage.sh
Normal file
228
modules/sendMessage.sh
Normal file
@ -0,0 +1,228 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# file: modules/message.sh
|
||||||
|
# do not edit, this file will be overwritten on update
|
||||||
|
|
||||||
|
# This file is public domain in the USA and all free countries.
|
||||||
|
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
||||||
|
#
|
||||||
|
#### $$VERSION$$ v0.80-dev2-6-g5b10e75
|
||||||
|
|
||||||
|
# source from commands.sh to use the sendMessage functions
|
||||||
|
|
||||||
|
MSG_URL=$URL'/sendMessage'
|
||||||
|
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'
|
||||||
|
|
||||||
|
send_normal_message() {
|
||||||
|
local text="${2}"
|
||||||
|
until [ -z "${text}" ]; do
|
||||||
|
sendJson "${1}" '"text":"'"${text:0:4096}"'"' "${MSG_URL}"
|
||||||
|
text="${text:4096}"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
send_markdown_message() {
|
||||||
|
local text="${2}"
|
||||||
|
until [ -z "${text}" ]; do
|
||||||
|
sendJson "${1}" '"text":"'"${text:0:4096}"'","parse_mode":"markdown"' "${MSG_URL}"
|
||||||
|
text="${text:4096}"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
send_html_message() {
|
||||||
|
local text="${2}"
|
||||||
|
until [ -z "${text}" ]; do
|
||||||
|
sendJson "${1}" '"text":"'"${text:0:4096}"'","parse_mode":"html"' "${MSG_URL}"
|
||||||
|
text="${text:4096}"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
old_send_keyboard() {
|
||||||
|
local text='"text":"'"${2}"'"'
|
||||||
|
shift 2
|
||||||
|
local keyboard=init
|
||||||
|
OLDIFS=$IFS
|
||||||
|
IFS=$(echo -en "\"")
|
||||||
|
for f in "$@" ;do [ "$f" != " " ] && keyboard="$keyboard, [\"$f\"]";done
|
||||||
|
IFS=$OLDIFS
|
||||||
|
keyboard=${keyboard/init, /}
|
||||||
|
sendJson "${1}" "${text}"', "reply_markup": {"keyboard": [ '"${keyboard}"' ],"one_time_keyboard": true}' "$MSG_URL"
|
||||||
|
}
|
||||||
|
|
||||||
|
ISEMPTY="ThisTextIsEmptyAndWillBeDeleted"
|
||||||
|
sendEmpty() {
|
||||||
|
sendJson "${@}"
|
||||||
|
[[ "${2}" = *"${ISEMPTY}"* ]] && delete_message "${1}" "${BOTSENT[ID]}"
|
||||||
|
}
|
||||||
|
send_keyboard() {
|
||||||
|
if [[ "$3" != *'['* ]]; then old_send_keyboard "${@}"; return; fi
|
||||||
|
local text='"text":"'"${2}"'"'; [ "${2}" = "" ] && text='"text":"'"${ISEMPTY}"'"'
|
||||||
|
local one_time=', "one_time_keyboard":true' && [ "$4" != "" ] && one_time=""
|
||||||
|
sendEmpty "${1}" "${text}"', "reply_markup": {"keyboard": [ '"${3}"' ] '"${one_time}"'}' "$MSG_URL"
|
||||||
|
# '"text":"$2", "reply_markup": {"keyboard": [ ${3} ], "one_time_keyboard": true}'
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_keyboard() {
|
||||||
|
local text='"text":"'"${2}"'"'; [ "${2}" = "" ] && text='"text":"'"${ISEMPTY}"'"'
|
||||||
|
sendEmpty "${1}" "${text}"', "reply_markup": {"remove_keyboard":true}' "$MSG_URL"
|
||||||
|
#JSON='"text":"$2", "reply_markup": {"remove_keyboard":true}'
|
||||||
|
}
|
||||||
|
send_inline_keyboard() {
|
||||||
|
local text='"text":"'"${2}"'"'; [ "${2}" = "" ] && text='"text":"'"${ISEMPTY}"'"'
|
||||||
|
sendEmpty "${1}" "${text}"', "reply_markup": {"inline_keyboard": [ '"${3}"' ]}' "$MSG_URL"
|
||||||
|
# JSON='"text":"$2", "reply_markup": {"inline_keyboard": [ $3->[{"text":"text", "url":"url"}]<- ]}'
|
||||||
|
}
|
||||||
|
send_button() {
|
||||||
|
send_inline_keyboard "${1}" "${2}" '[ {"text":"'"${3}"'", "url":"'"${4}"'"}]'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
send_file() {
|
||||||
|
[ "$2" = "" ] && return
|
||||||
|
local CAPTION
|
||||||
|
local chat_id=$1
|
||||||
|
local file=$2
|
||||||
|
echo "$file" | grep -qE "$FILE_REGEX" || return
|
||||||
|
local ext="${file##*.}"
|
||||||
|
case $ext in
|
||||||
|
mp3|flac)
|
||||||
|
CUR_URL=$AUDIO_URL
|
||||||
|
WHAT=audio
|
||||||
|
STATUS=upload_audio
|
||||||
|
CAPTION="$3"
|
||||||
|
;;
|
||||||
|
png|jpg|jpeg|gif)
|
||||||
|
CUR_URL=$PHO_URL
|
||||||
|
WHAT=photo
|
||||||
|
STATUS=upload_photo
|
||||||
|
CAPTION="$3"
|
||||||
|
;;
|
||||||
|
webp)
|
||||||
|
CUR_URL=$STICKER_URL
|
||||||
|
WHAT=sticker
|
||||||
|
STATUS=
|
||||||
|
;;
|
||||||
|
mp4)
|
||||||
|
CUR_URL=$VIDEO_URL
|
||||||
|
WHAT=video
|
||||||
|
STATUS=upload_video
|
||||||
|
CAPTION="$3"
|
||||||
|
;;
|
||||||
|
|
||||||
|
ogg)
|
||||||
|
CUR_URL=$VOICE_URL
|
||||||
|
WHAT=voice
|
||||||
|
STATUS=
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
CUR_URL=$DOCUMENT_URL
|
||||||
|
WHAT=document
|
||||||
|
STATUS=upload_document
|
||||||
|
CAPTION="$3"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
send_action "$chat_id" "$STATUS"
|
||||||
|
# convert over to sendJson!!
|
||||||
|
# shellcheck disable=SC2034
|
||||||
|
res="$(curl -s "$CUR_URL" -F "chat_id=$chat_id" -F "$WHAT=@$file" -F "caption=$CAPTION")"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 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() {
|
||||||
|
[ "$2" = "" ] && return
|
||||||
|
sendJson "${1}" '"action": "'"${2}"'"' "$ACTION_URL"
|
||||||
|
}
|
||||||
|
|
||||||
|
send_location() {
|
||||||
|
[ "$3" = "" ] && return
|
||||||
|
sendJson "${1}" '"latitude": '"${2}"', "longitude": '"${3}"'' "$LOCATION_URL"
|
||||||
|
}
|
||||||
|
|
||||||
|
send_venue() {
|
||||||
|
local add=""
|
||||||
|
[ "$5" = "" ] && return
|
||||||
|
[ "$6" != "" ] && add=', "foursquare_id": '"$6"''
|
||||||
|
sendJson "${1}" '"latitude": '"${2}"', "longitude": '"${3}"', "address": "'"${5}"'", "title": "'"${4}"'"'"${add}" "$VENUE_URL"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
forward_message() {
|
||||||
|
[ "$3" = "" ] && return
|
||||||
|
sendJson "${1}" '"from_chat_id": '"${2}"', "message_id": '"${3}"'' "$FORWARD_URL"
|
||||||
|
}
|
||||||
|
forward() { # backward compatibility
|
||||||
|
forward_message "$@" || return
|
||||||
|
}
|
||||||
|
|
||||||
|
send_message() {
|
||||||
|
[ "$2" = "" ] && return
|
||||||
|
local text keyboard btext burl no_keyboard file lat long title address sent
|
||||||
|
text="$(sed <<< "${2}" 's/ mykeyboardend.*//;s/ *my[kfltab][a-z]\{2,13\}startshere.*//')$(sed <<< "${2}" -n '/mytextstartshere/ s/.*mytextstartshere//p')"
|
||||||
|
text="$(sed <<< "${text}" 's/ *mynewlinestartshere */\r\n/g')"
|
||||||
|
[ "$3" != "safe" ] && {
|
||||||
|
no_keyboard="$(sed <<< "${2}" '/mykeyboardendshere/!d;s/.*mykeyboardendshere.*/mykeyboardendshere/')"
|
||||||
|
keyboard="$(sed <<< "${2}" '/mykeyboardstartshere /!d;s/.*mykeyboardstartshere *//;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
||||||
|
btext="$(sed <<< "${2}" '/mybtextstartshere /!d;s/.*mybtextstartshere //;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
||||||
|
burl="$(sed <<< "${2}" '/myburlstartshere /!d;s/.*myburlstartshere //;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//g;s/ *mykeyboardendshere.*//g')"
|
||||||
|
file="$(sed <<< "${2}" '/myfilelocationstartshere /!d;s/.*myfilelocationstartshere //;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
||||||
|
lat="$(sed <<< "${2}" '/mylatstartshere /!d;s/.*mylatstartshere //;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
||||||
|
long="$(sed <<< "${2}" '/mylongstartshere /!d;s/.*mylongstartshere //;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
||||||
|
title="$(sed <<< "${2}" '/mytitlestartshere /!d;s/.*mytitlestartshere //;s/ *my[kfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
||||||
|
address="$(sed <<< "${2}" '/myaddressstartshere /!d;s/.*myaddressstartshere //;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
||||||
|
}
|
||||||
|
if [ "$no_keyboard" != "" ]; then
|
||||||
|
remove_keyboard "$1" "$text"
|
||||||
|
sent=y
|
||||||
|
fi
|
||||||
|
if [ "$keyboard" != "" ]; then
|
||||||
|
if [[ "$keyboard" != *"["* ]]; then # pre 0.60 style
|
||||||
|
keyboard="[ ${keyboard//\" \"/\" \] , \[ \"} ]"
|
||||||
|
fi
|
||||||
|
send_keyboard "$1" "$text" "$keyboard"
|
||||||
|
sent=y
|
||||||
|
fi
|
||||||
|
if [ "$btext" != "" ] && [ "$burl" != "" ]; then
|
||||||
|
send_button "$1" "$text" "$btext" "$burl"
|
||||||
|
sent=y
|
||||||
|
fi
|
||||||
|
if [ "$file" != "" ]; then
|
||||||
|
send_file "$1" "$file" "$text"
|
||||||
|
sent=y
|
||||||
|
fi
|
||||||
|
if [ "$lat" != "" ] && [ "$long" != "" ]; then
|
||||||
|
if [ "$address" != "" ] && [ "$title" != "" ]; then
|
||||||
|
send_venue "$1" "$lat" "$long" "$title" "$address"
|
||||||
|
else
|
||||||
|
send_location "$1" "$lat" "$long"
|
||||||
|
fi
|
||||||
|
sent=y
|
||||||
|
fi
|
||||||
|
if [ "$sent" != "y" ];then
|
||||||
|
send_text "$1" "$text"
|
||||||
|
fi
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
send_text() {
|
||||||
|
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}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
send_normal_message "$1" "$2"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
@ -2,24 +2,22 @@
|
|||||||
# files: mycommands.sh.dist
|
# files: mycommands.sh.dist
|
||||||
# copy to mycommands.sh and add all your commands and functions here ...
|
# copy to mycommands.sh and add all your commands and functions here ...
|
||||||
#
|
#
|
||||||
#### $$VERSION$$ v0.80-dev2-2-g0c5e3dd
|
#### $$VERSION$$ v0.80-dev2-6-g5b10e75
|
||||||
#
|
#
|
||||||
# shellcheck disable=SC2154
|
|
||||||
# shellcheck disable=SC2034
|
|
||||||
|
|
||||||
|
|
||||||
# uncomment the following lines to overwrite info and help messages
|
# uncomment the following lines to overwrite info and help messages
|
||||||
# bashbot_info='This is bashbot, the Telegram bot written entirely in bash.
|
# bashbot_info='This is bashbot, the Telegram bot written entirely in bash.
|
||||||
#'
|
#'
|
||||||
# bashbot_help='*Available commands*:
|
# bashbot_help='*Available commands*:
|
||||||
#'
|
#'
|
||||||
|
res=""
|
||||||
|
|
||||||
if [ "$1" = "source" ];then
|
if [ "$1" = "source" ];then
|
||||||
# Set INLINE to 1 in order to receive inline queries.
|
# Set INLINE to 1 in order to receive inline queries.
|
||||||
# To enable this option in your bot, send the /setinline command to @BotFather.
|
# To enable this option in your bot, send the /setinline command to @BotFather.
|
||||||
INLINE="0"
|
export INLINE="0"
|
||||||
# Set to .* to allow sending files from all locations
|
# Set to .* to allow sending files from all locations
|
||||||
FILE_REGEX='/home/user/allowed/.*'
|
export FILE_REGEX='/home/user/allowed/.*'
|
||||||
|
|
||||||
else
|
else
|
||||||
# your additional bahsbot commands
|
# your additional bahsbot commands
|
||||||
|
Loading…
x
Reference in New Issue
Block a user