1
0
mirror of https://github.com/AAAAAEXQOSyIpN2JZ0ehUQ/SSHPLUS-MANAGER-FREE.git synced 2024-11-13 14:09:31 +00:00
SSHPLUS-MANAGER-FREE/Install/ShellBot.sh
AAAAAEXQOSyIpN2JZ0ehUQ 0c6a834d35 Update Script
2020-12-29 21:32:39 -03:00

6092 lines
171 KiB
Bash

#!/usr/bin/env bash
#-----------------------------------------------------------------------------------------------------------
# DATA: 07 de Março de 2017
# SCRIPT: ShellBot.sh
# VERSÃO: 6.4.0
# DESENVOLVIDO POR: Juliano Santos [SHAMAN]
# PÁGINA: http://www.shellscriptx.blogspot.com.br
# FANPAGE: https://www.facebook.com/shellscriptx
# GITHUB: https://github.com/shellscriptx
# CONTATO: shellscriptx@gmail.com
#
# DESCRIÇÃO: ShellBot é uma API não-oficial desenvolvida para facilitar a criação de
# bots na plataforma TELEGRAM. Constituída por uma coleção de métodos
# e funções que permitem ao desenvolvedor:
#
# * Gerenciar grupos, canais e membros.
# * Enviar mensagens, documentos, músicas, contatos e etc.
# * Enviar teclados (KeyboardMarkup e InlineKeyboard).
# * Obter informações sobre membros, arquivos, grupos e canais.
# * Para mais informações consulte a documentação:
#
# https://github.com/shellscriptx/ShellBot/wiki
#
# O ShellBot mantém o padrão da nomenclatura dos métodos registrados da
# API original (Telegram), assim como seus campos e valores. Os métodos
# requerem parâmetros e argumentos para a chamada e execução. Parâmetros
# obrigatórios retornam uma mensagem de erro caso o argumento seja omitido.
#
# NOTAS: Desenvolvida na linguagem Shell Script, utilizando o interpretador de
# comandos BASH e explorando ao máximo os recursos built-in do mesmo,
# reduzindo o nível de dependências de pacotes externos.
#-----------------------------------------------------------------------------------------------------------
[[ $_SHELLBOT_SH_ ]] && return 1
if ! awk 'BEGIN { exit ARGV[1] < 4.3 }' ${BASH_VERSINFO[0]}.${BASH_VERSINFO[1]}; then
echo "${BASH_SOURCE:-${0##*/}}: erro: requer o interpretador de comandos 'bash 4.3' ou superior." 1>&2
exit 1
fi
# Informações
readonly -A _SHELLBOT_=(
[name]='ShellBot'
[keywords]='Shell Script Telegram API'
[description]='API não-oficial para criação de bots na plataforma Telegram.'
[version]='6.4.0'
[language]='shellscript'
[shell]=${SHELL}
[shell_version]=${BASH_VERSION}
[author]='Juliano Santos [SHAMAN]'
[email]='shellscriptx@gmail.com'
[wiki]='https://github.com/shellscriptx/shellbot/wiki'
[github]='https://github.com/shellscriptx/shellbot'
[packages]='curl 7.0, getopt 2.0, jq 1.5'
)
# Verifica dependências.
while read _pkg_ _ver_; do
if command -v $_pkg_ &>/dev/null; then
if [[ $($_pkg_ --version 2>&1) =~ [0-9]+\.[0-9]+ ]]; then
if ! awk 'BEGIN { exit ARGV[1] < ARGV[2] }' $BASH_REMATCH $_ver_; then
printf "%s: erro: requer o pacote '%s %s' ou superior.\n" ${_SHELLBOT_[name]} $_pkg_ $_ver_ 1>&2
exit 1
fi
else
printf "%s: erro: '%s' não foi possível obter a versão.\n" ${_SHELLBOT_[name]} $_pkg_ 1>&2
exit 1
fi
else
printf "%s: erro: '%s' o pacote requerido está ausente.\n" ${_SHELLBOT_[name]} $_pkg_ 1>&2
exit 1
fi
done <<< "${_SHELLBOT_[packages]//,/$'\n'}"
# bash (opções).
shopt -s checkwinsize \
cmdhist \
complete_fullquote \
expand_aliases \
extglob \
extquote \
force_fignore \
histappend \
interactive_comments \
progcomp \
promptvars \
sourcepath
# Desabilita a expansão de nomes de arquivos (globbing).
set -f
readonly _SHELLBOT_SH_=1 # Inicialização
readonly _BOT_SCRIPT_=${0##*/} # Script
readonly _CURL_OPT_='--silent --request' # CURL (opções)
# Erros
readonly _ERR_TYPE_BOOL_='tipo incompatível: suporta somente "true" ou "false".'
readonly _ERR_TYPE_INT_='tipo incompatível: suporta somente inteiro.'
readonly _ERR_TYPE_FLOAT_='tipo incompatível: suporta somente float.'
readonly _ERR_PARAM_REQUIRED_='opção requerida: verique se o(s) parâmetro(s) ou argumento(s) obrigatório(s) estão presente(s).'
readonly _ERR_TOKEN_UNAUTHORIZED_='não autorizado: verifique se possui permissões para utilizar o token.'
readonly _ERR_TOKEN_INVALID_='token inválido: verique o número do token e tente novamente.'
readonly _ERR_BOT_ALREADY_INIT_='ação não permitida: o bot já foi inicializado.'
readonly _ERR_FILE_NOT_FOUND_='falha ao acessar: não foi possível ler o arquivo.'
readonly _ERR_DIR_WRITE_DENIED_='permissão negada: não é possível gravar no diretório.'
readonly _ERR_DIR_NOT_FOUND_='Não foi possível acessar: diretório não encontrado.'
readonly _ERR_FILE_INVALID_ID_='id inválido: arquivo não encontrado.'
readonly _ERR_UNKNOWN_='erro desconhecido: ocorreu uma falha inesperada. Reporte o problema ao desenvolvedor.'
readonly _ERR_SERVICE_NOT_ROOT_='acesso negado: requer privilégios de root.'
readonly _ERR_SERVICE_EXISTS_='erro ao criar o serviço: o nome do serviço já existe.'
readonly _ERR_SERVICE_SYSTEMD_NOT_FOUND_='erro ao ativar: o sistema não possui suporte ao gerenciamento de serviços "systemd".'
readonly _ERR_SERVICE_USER_NOT_FOUND_='usuário não encontrado: a conta de usuário informada é inválida.'
readonly _ERR_VAR_NAME_='variável não encontrada: o identificador é inválido ou não existe.'
readonly _ERR_FUNCTION_NOT_FOUND_='função não encontrada: o identificador especificado é inválido ou não existe.'
readonly _ERR_ARG_='argumento inválido: o argumento não é suportado pelo parâmetro especificado.'
readonly _ERR_RULE_ALREADY_EXISTS_='falha ao definir: o nome da regra já existe.'
readonly _ERR_HANDLE_EXISTS_='erro ao registar: já existe um handle vinculado ao callback'
readonly _ERR_CONNECTION_='falha de conexão: não foi possível estabelecer conexão com o Telegram.'
# Maps
declare -A _BOT_HANDLE_
declare -A _BOT_RULES_
declare -A return
declare -i _BOT_RULES_INDEX_
declare _VAR_INIT_
Json() { local obj=$(jq -Mc "$1" <<< "${*:2}"); obj=${obj#\"}; echo "${obj%\"}"; }
SetDelmValues(){
local obj=$(jq "[..|select(type == \"string\" or type == \"number\" or type == \"boolean\")|tostring]|join(\"${_BOT_DELM_/\"/\\\"}\")" <<< "$1")
obj=${obj#\"}; echo "${obj%\"}"
}
GetAllValues(){
jq '[..|select(type == "string" or type == "number" or type == "boolean")|tostring]|.[]' <<< "$1"
}
GetAllKeys(){
jq -r 'path(..|select(type == "string" or type == "number" or type == "boolean"))|map(if type == "number" then .|tostring|"["+.+"]" else . end)|join(".")|gsub("\\.\\[";"[")' <<< "$1"
}
FlagConv()
{
local var str=$2
while [[ $str =~ \$\{([a-z_]+)\} ]]; do
if [[ ${BASH_REMATCH[1]} == @(${_VAR_INIT_// /|}) ]]; then
var=${BASH_REMATCH[1]}[$1]
str=${str//${BASH_REMATCH[0]}/${!var}}
else
str=${str//${BASH_REMATCH[0]}}
fi
done
echo "$str"
}
CreateLog()
{
local fid fbot fname fuser lcode cid ctype
local ctitle mid mdate mtext etype
local i fmt obj oid
for ((i=0; i < $1; i++)); do
printf -v fmt "$_BOT_LOG_FORMAT_" || MessageError API
# Suprimir erros.
exec 5<&2
exec 2<&-
# Objeto (tipo)
if [[ ${message_contact_phone_number[$i]:-${edited_message_contact_phone_number[$i]}} ]] ||
[[ ${channel_post_contact_phone_number[$i]:-${edited_channel_post_contact_phone_number[$i]}} ]]; then obj=contact
elif [[ ${message_sticker_file_id[$i]:-${edited_message_sticker_file_id[$i]}} ]] ||
[[ ${channel_post_sticker_file_id[$i]:-${edited_channel_post_sticker_file_id[$i]}} ]]; then obj=sticker
elif [[ ${message_animation_file_id[$i]:-${edited_message_animation_file_id[$i]}} ]] ||
[[ ${channel_post_animation_file_id[$i]:-${edited_channel_post_animation_file_id[$i]}} ]]; then obj=animation
elif [[ ${message_photo_file_id[$i]:-${edited_message_photo_file_id[$i]}} ]] ||
[[ ${channel_post_photo_file_id[$i]:-${edited_channel_post_photo_file_id[$i]}} ]]; then obj=photo
elif [[ ${message_audio_file_id[$i]:-${edited_message_audio_file_id[$i]}} ]] ||
[[ ${channel_post_audio_file_id[$i]:-${edited_channel_post_audio_file_id[$i]}} ]]; then obj=audio
elif [[ ${message_video_file_id[$i]:-${edited_message_video_file_id[$i]}} ]] ||
[[ ${channel_post_video_file_id[$i]:-${edited_channel_post_video_file_id[$i]}} ]]; then obj=video
elif [[ ${message_voice_file_id[$i]:-${edited_message_voice_file_id[$i]}} ]] ||
[[ ${channel_post_voice_file_id[$i]:-${edited_channel_post_voice_file_id[$i]}} ]]; then obj=voice
elif [[ ${message_document_file_id[$i]:-${edited_message_document_file_id[$i]}} ]] ||
[[ ${channel_post_document_file_id[$i]:-${edited_channel_post_document_file_id[$i]}} ]]; then obj=document
elif [[ ${message_venue_location_latitude[$i]:-${edited_message_venue_location_latitude[$i]}} ]] ||
[[ ${channel_post_venue_location_latitude[$i]-${edited_channel_post_venue_location_latitude[$i]}} ]]; then obj=venue
elif [[ ${message_location_latitude[$i]:-${edited_message_location_latitude[$i]}} ]] ||
[[ ${channel_post_location_latitude[$i]:-${edited_channel_post_location_latitude[$i]}} ]]; then obj=location
elif [[ ${message_text[$i]:-${edited_message_text[$i]}} ]] ||
[[ ${channel_post_text[$i]:-${edited_channel_post_text[$i]}} ]]; then obj=text
elif [[ ${callback_query_id[$i]} ]]; then obj=callback
elif [[ ${inline_query_id[$i]} ]]; then obj=inline
elif [[ ${chosen_inline_result_result_id[$i]} ]]; then obj=chosen
fi
# Objeto (id)
[[ ${oid:=${message_contact_phone_number[$i]}} ]] ||
[[ ${oid:=${message_sticker_file_id[$i]}} ]] ||
[[ ${oid:=${message_animation_file_id[$i]}} ]] ||
[[ ${oid:=${message_photo_file_id[$i]}} ]] ||
[[ ${oid:=${message_audio_file_id[$i]}} ]] ||
[[ ${oid:=${message_video_file_id[$i]}} ]] ||
[[ ${oid:=${message_voice_file_id[$i]}} ]] ||
[[ ${oid:=${message_document_file_id[$i]}} ]] ||
[[ ${oid:=${edited_message_contact_phone_number[$i]}} ]] ||
[[ ${oid:=${edited_message_sticker_file_id[$i]}} ]] ||
[[ ${oid:=${edited_message_animation_file_id[$i]}} ]] ||
[[ ${oid:=${edited_message_photo_file_id[$i]}} ]] ||
[[ ${oid:=${edited_message_audio_file_id[$i]}} ]] ||
[[ ${oid:=${edited_message_video_file_id[$i]}} ]] ||
[[ ${oid:=${edited_message_voice_file_id[$i]}} ]] ||
[[ ${oid:=${edited_message_document_file_id[$i]}} ]] ||
[[ ${oid:=${channel_post_contact_phone_number[$i]}} ]] ||
[[ ${oid:=${channel_post_sticker_file_id[$i]}} ]] ||
[[ ${oid:=${channel_post_animation_file_id[$i]}} ]] ||
[[ ${oid:=${channel_post_photo_file_id[$i]}} ]] ||
[[ ${oid:=${channel_post_audio_file_id[$i]}} ]] ||
[[ ${oid:=${channel_post_video_file_id[$i]}} ]] ||
[[ ${oid:=${channel_post_voice_file_id[$i]}} ]] ||
[[ ${oid:=${channel_post_document_file_id[$i]}} ]] ||
[[ ${oid:=${edited_channel_post_contact_phone_number[$i]}} ]] ||
[[ ${oid:=${edited_channel_post_sticker_file_id[$i]}} ]] ||
[[ ${oid:=${edited_channel_post_animation_file_id[$i]}} ]] ||
[[ ${oid:=${edited_channel_post_photo_file_id[$i]}} ]] ||
[[ ${oid:=${edited_channel_post_audio_file_id[$i]}} ]] ||
[[ ${oid:=${edited_channel_post_video_file_id[$i]}} ]] ||
[[ ${oid:=${edited_channel_post_voice_file_id[$i]}} ]] ||
[[ ${oid:=${edited_channel_post_document_file_id[$i]}} ]] ||
[[ ${oid:=${message_message_id[$i]}} ]] ||
[[ ${oid:=${edited_message_message_id[$i]}} ]] ||
[[ ${oid:=${channel_post_message_id[$i]}} ]] ||
[[ ${oid:=${edited_channel_post_message_id[$i]}} ]] ||
[[ ${oid:=${callback_query_id[$i]}} ]] ||
[[ ${oid:=${inline_query_id[$i]}} ]] ||
[[ ${oid:=${chosen_inline_result_result_id[$i]}} ]]
# Remetente (id)
[[ ${fid:=${message_from_id[$i]}} ]] ||
[[ ${fid:=${edited_message_from_id[$i]}} ]] ||
[[ ${fid:=${callback_query_from_id[$i]}} ]] ||
[[ ${fid:=${inline_query_from_id[$i]}} ]] ||
[[ ${fid:=${chosen_inline_result_from_id[$i]}} ]]
# Bot
[[ ${fbot:=${message_from_is_bot[$i]}} ]] ||
[[ ${fbot:=${edited_message_from_is_bot[$i]}} ]] ||
[[ ${fbot:=${callback_query_from_is_bot[$i]}} ]] ||
[[ ${fbot:=${inline_query_from_is_bot[$i]}} ]] ||
[[ ${fbot:=${chosen_inline_result_from_is_bot[$i]}} ]]
# Usuário (nome)
[[ ${fname:=${message_from_first_name[$i]}} ]] ||
[[ ${fname:=${edited_message_from_first_name[$i]}} ]] ||
[[ ${fname:=${callback_query_from_first_name[$i]}} ]] ||
[[ ${fname:=${inline_query_from_first_name[$i]}} ]] ||
[[ ${fname:=${chosen_inline_result_from_first_name[$i]}} ]] ||
[[ ${fname:=${channel_post_author_signature[$i]}} ]] ||
[[ ${fname:=${edited_channel_post_author_signature[$i]}} ]]
# Usuário (conta)
[[ ${fuser:=${message_from_username[$i]}} ]] ||
[[ ${fuser:=${edited_message_from_username[$i]}} ]] ||
[[ ${fuser:=${callback_query_from_username[$i]}} ]] ||
[[ ${fuser:=${inline_query_from_username[$i]}} ]] ||
[[ ${fuser:=${chosen_inline_result_from_username[$i]}} ]]
# Idioma
[[ ${lcode:=${message_from_language_code[$i]}} ]] ||
[[ ${lcode:=${edited_message_from_language_code[$i]}} ]] ||
[[ ${lcode:=${callback_query_from_language_code[$i]}} ]] ||
[[ ${lcode:=${inline_query_from_language_code[$i]}} ]] ||
[[ ${lcode:=${chosen_inline_result_from_language_code[$i]}} ]]
# Bate-papo (id)
[[ ${cid:=${message_chat_id[$i]}} ]] ||
[[ ${cid:=${edited_message_chat_id[$i]}} ]] ||
[[ ${cid:=${callback_query_message_chat_id[$i]}} ]] ||
[[ ${cid:=${channel_post_chat_id[$i]}} ]] ||
[[ ${cid:=${edited_channel_post_chat_id[$i]}} ]]
# Bate-papo (tipo)
[[ ${ctype:=${message_chat_type[$i]}} ]] ||
[[ ${ctype:=${edited_message_chat_type[$i]}} ]] ||
[[ ${ctype:=${callback_query_message_chat_type[$i]}} ]] ||
[[ ${ctype:=${channel_post_chat_type[$i]}} ]] ||
[[ ${ctype:=${edited_channel_post_chat_type[$i]}} ]]
# Bate-papo (título)
[[ ${ctitle:=${message_chat_title[$i]}} ]] ||
[[ ${ctitle:=${edited_message_chat_title[$i]}} ]] ||
[[ ${ctitle:=${callback_query_message_chat_title[$i]}} ]] ||
[[ ${ctitle:=${channel_post_chat_title[$i]}} ]] ||
[[ ${ctitle:=${edited_channel_post_chat_title[$i]}} ]]
# Mensagem (id)
[[ ${mid:=${message_message_id[$i]}} ]] ||
[[ ${mid:=${edited_message_message_id[$i]}} ]] ||
[[ ${mid:=${callback_query_id[$i]}} ]] ||
[[ ${mid:=${inline_query_id[$i]}} ]] ||
[[ ${mid:=${chosen_inline_result_result_id[$i]}} ]] ||
[[ ${mid:=${channel_post_message_id[$i]}} ]] ||
[[ ${mid:=${edited_channel_post_message_id[$i]}} ]]
# Mensagem (data)
[[ ${mdate:=${message_date[$i]}} ]] ||
[[ ${mdate:=${edited_message_date[$i]}} ]] ||
[[ ${mdate:=${callback_query_message_date[$i]}} ]] ||
[[ ${mdate:=${channel_post_date[$i]}} ]] ||
[[ ${mdate:=${edited_channel_post_date[$i]}} ]]
# Mensagem (texto)
[[ ${mtext:=${message_text[$i]}} ]] ||
[[ ${mtext:=${edited_message_text[$i]}} ]] ||
[[ ${mtext:=${callback_query_message_text[$i]}} ]] ||
[[ ${mtext:=${inline_query_query[$i]}} ]] ||
[[ ${mtext:=${chosen_inline_result_query[$i]}} ]] ||
[[ ${mtext:=${channel_post_text[$i]}} ]] ||
[[ ${mtext:=${edited_channel_post_text[$i]}} ]]
# Mensagem (tipo)
[[ ${etype:=${message_entities_type[$i]}} ]] ||
[[ ${etype:=${edited_message_entities_type[$i]}} ]] ||
[[ ${etype:=${callback_query_message_entities_type[$i]}} ]] ||
[[ ${etype:=${channel_post_entities_type[$i]}} ]] ||
[[ ${etype:=${edited_channel_post_entities_type[$i]}} ]]
# Flags
fmt=${fmt//\{BOT_TOKEN\}/${_BOT_INFO_[0]:--}}
fmt=${fmt//\{BOT_ID\}/${_BOT_INFO_[1]:--}}
fmt=${fmt//\{BOT_FIRST_NAME\}/${_BOT_INFO_[2]:--}}
fmt=${fmt//\{BOT_USERNAME\}/${_BOT_INFO_[3]:--}}
fmt=${fmt//\{BASENAME\}/${_BOT_SCRIPT_:--}}
fmt=${fmt//\{OK\}/${return[ok]:-${ok:--}}}
fmt=${fmt//\{UPDATE_ID\}/${update_id[$i]:--}}
fmt=${fmt//\{OBJECT_TYPE\}/${obj:--}}
fmt=${fmt//\{OBJECT_ID\}/${oid:--}}
fmt=${fmt//\{FROM_ID\}/${fid:--}}
fmt=${fmt//\{FROM_IS_BOT\}/${fbot:--}}
fmt=${fmt//\{FROM_FIRST_NAME\}/${fname:--}}
fmt=${fmt//\{FROM_USERNAME\}/${fuser:--}}
fmt=${fmt//\{FROM_LANGUAGE_CODE\}/${lcode:--}}
fmt=${fmt//\{CHAT_ID\}/${cid:--}}
fmt=${fmt//\{CHAT_TYPE\}/${ctype:--}}
fmt=${fmt//\{CHAT_TITLE\}/${ctitle:--}}
fmt=${fmt//\{MESSAGE_ID\}/${mid:--}}
fmt=${fmt//\{MESSAGE_DATE\}/${mdate:--}}
fmt=${fmt//\{MESSAGE_TEXT\}/${mtext:--}}
fmt=${fmt//\{ENTITIES_TYPE\}/${etype:--}}
fmt=${fmt//\{METHOD\}/${FUNCNAME[2]/main/ShellBot.getUpdates}}
fmt=${fmt//\{RETURN\}/$(SetDelmValues "$2")}
exec 2<&5
# log
[[ $fmt ]] && { echo "$fmt" >> "$_BOT_LOG_FILE_" || MessageError API; }
# Limpa objetos
fid= fbot= fname= fuser= lcode= cid= ctype=
ctitle= mid= mdate= mtext= etype= obj= oid=
done
return $?
}
MethodReturn()
{
# Retorno
case $_BOT_TYPE_RETURN_ in
json) echo "$1";;
value) SetDelmValues "$1";;
map)
local key val vars vals i obj
return=()
mapfile -t vars <<< $(GetAllKeys "$1")
mapfile -t vals <<< $(GetAllValues "$1")
for i in ${!vars[@]}; do
key=${vars[$i]//[0-9\[\]]/}
key=${key#result.}
key=${key//./_}
val=${vals[$i]}
val=${val#\"}
val=${val%\"}
[[ ${return[$key]} ]] && return[$key]+=${_BOT_DELM_}${val} || return[$key]=$val
[[ $_BOT_MONITOR_ ]] && printf "[%s]: return[%s] = '%s'\n" "${FUNCNAME[1]}" "$key" "$val"
done
;;
esac
[[ $(jq -r '.ok' <<< "$1") == true ]]
return $?
}
MessageError()
{
# Variáveis locais
local err_message err_param assert i
# A variável 'BASH_LINENO' é dinâmica e armazena o número da linha onde foi expandida.
# Quando chamada dentro de um subshell, passa ser instanciada como um array, armazenando diversos
# valores onde cada índice refere-se a um shell/subshell. As mesmas caracteristicas se aplicam a variável
# 'FUNCNAME', onde é armazenado o nome da função onde foi chamada.
# Obtem o índice da função na hierarquia de chamada.
[[ ${FUNCNAME[1]} == CheckArgType ]] && i=2 || i=1
# Lê o tipo de ocorrência.
# TG - Erro externo retornado pelo core do telegram.
# API - Erro interno gerado pela API do ShellBot.
case $1 in
TG)
err_param="$(Json '.error_code' "$2")"
err_message="$(Json '.description' "$2")"
;;
API)
err_param="${3:--}: ${4:--}"
err_message="$2"
assert=true
;;
esac
# Imprime erro
printf "%s: erro: linha %s: %s: %s: %s\n" \
"${_BOT_SCRIPT_}" \
"${BASH_LINENO[$i]:--}" \
"${FUNCNAME[$i]:--}" \
"${err_param:--}" \
"${err_message:-$_ERR_UNKNOWN_}" 1>&2
# Finaliza script/thread em caso de erro interno, caso contrário retorna 1
${assert:-false} && exit 1 || return 1
}
CheckArgType()
{
# CheckArgType recebe os dados da função chamadora e verifica
# o dado recebido com o tipo suportado pelo parâmetro.
# É retornado '0' para sucesso, caso contrário uma mensagem
# de erro é retornada e o script/thread é finalizado com status '1'.
case $1 in
user) id "$3" &>/dev/null || MessageError API "$_ERR_SERVICE_USER_NOT_FOUND_" "$2" "$3";;
func) [[ $(type -t "$3") == function ]] || MessageError API "$_ERR_FUNCTION_NOT_FOUND_" "$2" "$3";;
var) [[ -v $3 ]] || MessageError API "$_ERR_VAR_NAME_" "$2" "$3";;
int) [[ $3 =~ ^-?[0-9]+$ ]] || MessageError API "$_ERR_TYPE_INT_" "$2" "$3";;
float) [[ $3 =~ ^-?[0-9]+\.[0-9]+$ ]] || MessageError API "$_ERR_TYPE_FLOAT_" "$2" "$3";;
bool) [[ $3 =~ ^(true|false)$ ]] || MessageError API "$_ERR_TYPE_BOOL_" "$2" "$3";;
token) [[ $3 =~ ^[0-9]+:[a-zA-Z0-9_-]+$ ]] || MessageError API "$_ERR_TOKEN_INVALID_" "$2" "$3";;
file) [[ $3 =~ ^@ && ! -f ${3#@} ]] && MessageError API "$_ERR_FILE_NOT_FOUND_" "$2" "$3";;
return) [[ $3 == @(json|map|value) ]] || MessageError API "$_ERR_ARG_" "$2" "$3";;
cmd) [[ $3 =~ ^/[a-zA-Z0-9_]+$ ]] || MessageError API "$_ERR_ARG_" "$2" "$3";;
flag) [[ $3 =~ ^[a-zA-Z0-9_]+$ ]] || MessageError API "$_ERR_ARG_" "$2" "$3";;
esac
return $?
}
FlushOffset()
{
local sid eid jq_obj
while :; do
jq_obj=$(ShellBot.getUpdates --limit 100 --offset $(ShellBot.OffsetNext))
IFS=' ' read -a update_id <<< $(jq -r '.result|.[]|.update_id' <<< $jq_obj)
[[ $update_id ]] || break
sid=${sid:-${update_id[0]}}
eid=${update_id[-1]}
done
echo "${sid:-0}|${eid:-0}"
return $?
}
CreateUnitService()
{
local service=${1%.*}.service
local ok='\033[0;32m[OK]\033[0;m'
local fail='\033[0;31m[FALHA]\033[0;m'
((UID == 0)) || MessageError API "$_ERR_SERVICE_NOT_ROOT_"
# O modo 'service' requer que o sistema de gerenciamento de processos 'systemd'
# esteja presente para que o Unit target seja linkado ao serviço.
if ! which systemctl &>/dev/null; then
MessageError API "$_ERR_SERVICE_SYSTEMD_NOT_FOUND_"; fi
# Se o serviço existe.
test -e /lib/systemd/system/$service && \
MessageError API "$_ERR_SERVICE_EXISTS_" "$service"
# Gerando as configurações do target.
cat > /lib/systemd/system/$service << _eof
[Unit]
Description=$1 - (SHELLBOT)
After=network-online.target
[Service]
User=$2
WorkingDirectory=$PWD
ExecStart=/bin/bash $1
ExecReload=/bin/kill -HUP \$MAINPID
ExecStop=/bin/kill -KILL \$MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=simple
[Install]
WantedBy=multi-user.target
_eof
[[ $? -eq 0 ]] && {
printf '%s foi criado com sucesso !!\n' $service
echo -n "Habilitando..."
systemctl enable $service &>/dev/null && echo -e $ok || \
{ echo -e $fail; MessageError API; }
sed -i -r '/^\s*ShellBot.init\s/s/\s--?(s(ervice)?|u(ser)?\s+\w+)\b//g' "$1"
systemctl daemon-reload
echo -n "Iniciando..."
systemctl start $service &>/dev/null && {
echo -e $ok
systemctl status $service
echo -e "\nUso: sudo systemctl {start|stop|restart|reload|status} $service"
} || echo -e $fail
} || MessageError API
exit 0
}
# Inicializa o bot, definindo sua API e _TOKEN_.
ShellBot.init()
{
local method_return delm ret logfmt jq_obj offset
local token monitor flush service user logfile logfmt
# Verifica se o bot já foi inicializado.
[[ $_SHELLBOT_INIT_ ]] && MessageError API "$_ERR_BOT_ALREADY_INIT_"
local param=$(getopt --name "$FUNCNAME" \
--options 't:mfsu:l:o:r:d:' \
--longoptions 'token:,
monitor,
flush,
service,
user:,
log_file:,
log_format:,
return:,
delimiter:' \
-- "$@")
# Define os parâmetros posicionais
eval set -- "$param"
while :
do
case $1 in
-t|--token)
CheckArgType token "$1" "$2"
token=$2
shift 2
;;
-m|--monitor)
# Ativa modo monitor
monitor=true
shift
;;
-f|--flush)
# Define a FLAG flush para o método 'ShellBot.getUpdates'. Se ativada, faz com que
# o método obtenha somente as atualizações disponíveis, ignorando a extração dos
# objetos JSON e a inicialização das variáveis.
flush=true
shift
;;
-s|--service)
service=true
shift
;;
-u|--user)
CheckArgType user "$1" "$2"
user=$2
shift 2
;;
-l|--log_file)
logfile=$2
shift 2
;;
-o|--log_format)
logfmt=$2
shift 2
;;
-r|--return)
CheckArgType return "$1" "$2"
ret=$2
shift 2
;;
-d|--delimiter)
delm=$2
shift 2
;;
--)
shift
break
;;
esac
done
# Parâmetro obrigatório.
[[ $token ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-t, --token]"
[[ $user && ! $service ]] && MessageError API "$_ERR_PARAM_REQUIRED_" "[-s, --service]"
[[ $service ]] && CreateUnitService "$_BOT_SCRIPT_" "${user:-$USER}"
declare -gr _TOKEN_=$token # TOKEN
declare -gr _API_TELEGRAM_="https://api.telegram.org/bot$_TOKEN_" # API
# Testa conexão.
curl -s "$_API_TELEGRAM_" &>- || MessageError API "$_ERR_CONNECTION_"
# Um método simples para testar o token de autenticação do seu bot.
# Não requer parâmetros. Retorna informações básicas sobre o bot em forma de um objeto Usuário.
ShellBot.getMe()
{
# Chama o método getMe passando o endereço da API, seguido do nome do método.
jq_obj=$(curl $_CURL_OPT_ GET $_API_TELEGRAM_/${FUNCNAME#*.})
# Verifica o status de retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
return $?
}
ShellBot.getMe &>- || MessageError API "$_ERR_TOKEN_UNAUTHORIZED_" '[-t, --token]'
# Salva as informações do bot.
declare -gr _BOT_INFO_=(
[0]=$_TOKEN_
[1]=$(Json '.result.id' $jq_obj)
[2]=$(Json '.result.first_name' $jq_obj)
[3]=$(Json '.result.username' $jq_obj)
)
# Configurações.
declare -gr _BOT_FLUSH_=$flush
declare -gr _BOT_MONITOR_=$monitor
declare -gr _BOT_SERVICE_=$service
declare -gr _BOT_USER_SERVICE_=$user
declare -gr _BOT_TYPE_RETURN_=${ret:-value}
declare -gr _BOT_DELM_=${delm:-|}
declare -gr _BOT_LOG_FILE_=${logfile}
declare -gr _BOT_LOG_FORMAT_=${logfmt:-%(%d/%m/%Y %H:%M:%S)T: \{BASENAME\}: \{BOT_USERNAME\}: \{UPDATE_ID\}: \{METHOD\}: \{CHAT_TYPE\}: \{FROM_USERNAME\}: \{OBJECT_TYPE\}: \{OBJECT_ID\}: \{MESSAGE_TEXT\}}
declare -gr _SHELLBOT_INIT_=1
# SHELLBOT (FUNÇÕES)
# Inicializa as funções para chamadas aos métodos da API do telegram.
ShellBot.ListUpdates(){ echo ${!update_id[@]}; }
ShellBot.TotalUpdates(){ echo ${#update_id[@]}; }
ShellBot.OffsetEnd(){ local -i offset=${update_id[@]: -1}; echo $offset; }
ShellBot.OffsetNext(){ echo $((${update_id[@]: -1}+1)); }
ShellBot.token() { echo "${_BOT_INFO_[0]}"; }
ShellBot.id() { echo "${_BOT_INFO_[1]}"; }
ShellBot.first_name() { echo "${_BOT_INFO_[2]}"; }
ShellBot.username() { echo "${_BOT_INFO_[3]}"; }
ShellBot.getConfig()
{
local jq_obj
printf -v jq_obj '{"monitor":%s,"flush":%s,"service":%s,"return":"%s","delimiter":"%s","user":"%s","log_file":"%s","log_format":"%s"}' \
"${_BOT_MONITOR_:-false}" \
"${_BOT_FLUSH_:-false}" \
"${_BOT_SERVICE_:-false}" \
"${_BOT_TYPE_RETURN_}" \
"${_BOT_DELM_}" \
"${_BOT_USER_SERVICE_}" \
"${_BOT_LOG_FILE_}" \
"${_BOT_LOG_FORMAT_}"
MethodReturn "$jq_obj"
return $?
}
ShellBot.regHandleFunction()
{
local function data handle args
local param=$(getopt --name "$FUNCNAME" \
--options 'f:a:d:' \
--longoptions 'function:,
args:,
callback_data:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-f|--function)
CheckArgType func "$1" "$2"
function=$2
shift 2
;;
-a|--args)
args=$2
shift 2
;;
-d|--callback_data)
data=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $function ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-f, --function]"
[[ $data ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-d, --callback_data]"
[[ ${_BOT_HANDLE_[$data]} ]] && MessageError API "$_ERR_HANDLE_EXISTS_" '[-d, --callback_data]'
_BOT_HANDLE_[$data]=func:$function' '$args
return 0
}
ShellBot.regHandleExec()
{
local cmd data
local param=$(getopt --name "$FUNCNAME" \
--options 'c:d:' \
--longoptions 'command:,
callback_data:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--command)
cmd=$2
shift 2
;;
-d|--callback_data)
data=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $cmd ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --command]"
[[ $data ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-d, --callback_data]"
[[ ${_BOT_HANDLE_[$data]} ]] && MessageError API "$_ERR_HANDLE_EXISTS_" "[-d, --callback_data]"
_BOT_HANDLE_[$data]=exec:$cmd
return 0
}
ShellBot.watchHandle()
{
local data flag cmd
local param=$(getopt --name "$FUNCNAME" \
--options 'd' \
--longoptions 'callback_data' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-d|--callback_data)
shift 2
data=$1
;;
*)
shift
break
;;
esac
done
# Handles (somente-leitura)
readonly _BOT_HANDLE_
[[ $data ]] || return 1 # vazio
IFS=':' read -r flag cmd <<< "${_BOT_HANDLE_[$data]}"
case $flag in
func) $cmd;;
exec) eval "$cmd";;
esac
# retorno
return 0
}
ShellBot.getWebhookInfo()
{
# Variável local
local jq_obj
# Chama o método getMe passando o endereço da API, seguido do nome do método.
jq_obj=$(curl $_CURL_OPT_ GET $_API_TELEGRAM_/${FUNCNAME#*.})
# Verifica o status de retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
return $?
}
ShellBot.deleteWebhook()
{
# Variável local
local jq_obj
# Chama o método getMe passando o endereço da API, seguido do nome do método.
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.})
# Verifica o status de retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
return $?
}
ShellBot.setWebhook()
{
local url certificate max_connections allowed_updates jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'u:c:m:a:' \
--longoptions 'url:,
certificate:,
max_connections:,
allowed_updates:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-u|--url)
url=$2
shift 2
;;
-c|--certificate)
CheckArgType file "$1" "$2"
certificate=$2
shift 2
;;
-m|--max_connections)
CheckArgType int "$1" "$2"
max_connections=$2
shift 2
;;
-a|--allowed_updates)
allowed_updates=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $url ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-u, --url]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${url:+-d url="$url"} \
${certificate:+-d certificate="$certificate"} \
${max_connections:+-d max_connections="$max_connections"} \
${allowed_updates:+-d allowed_updates="$allowed_updates"})
# Testa o retorno do método.
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.setChatPhoto()
{
local chat_id photo jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'c:p:' \
--longoptions 'chat_id:,photo:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-p|--photo)
CheckArgType file "$1" "$2"
photo=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $photo ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-p, --photo]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-F chat_id="$chat_id"} \
${photo:+-F photo="$photo"})
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.deleteChatPhoto()
{
local chat_id jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'c:' \
--longoptions 'chat_id:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"})
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.setChatTitle()
{
local chat_id title jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'c:t:' \
--longoptions 'chat_id:,title:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-t|--title)
title=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $title ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-t, --title]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-d chat_id="$chat_id"} \
${title:+-d title="$title"})
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.setChatDescription()
{
local chat_id description jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'c:d:' \
--longoptions 'chat_id:,description:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-d|--description)
description=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $description ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-d, --description]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-d chat_id="$chat_id"} \
${description:+-d description="$description"})
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.pinChatMessage()
{
local chat_id message_id disable_notification jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'c:m:n:' \
--longoptions 'chat_id:,
message_id:,
disable_notification:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-m|--message_id)
CheckArgType int "$1" "$2"
message_id=$2
shift 2
;;
-n|--disable_notification)
CheckArgType bool "$1" "$2"
disable_notification=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $message_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-m, --message_id]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-d chat_id="$chat_id"} \
${message_id:+-d message_id="$message_id"} \
${disable_notification:+-d disable_notification="$disable_notification"})
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.unpinChatMessage()
{
local chat_id jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'c:' \
--longoptions 'chat_id:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"})
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.restrictChatMember()
{
local chat_id user_id until_date permissions jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'c:u:d:p:' \
--longoptions 'chat_id:,
user_id:,
until_date:,
permissions:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-u|--user_id)
CheckArgType int "$1" "$2"
user_id=$2
shift 2
;;
-d|--until_date)
CheckArgType int "$1" "$2"
until_date=$2
shift 2
;;
-p|--permissions)
permissions=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $user_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-u, --user_id]"
[[ $permissions ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-p, --permissions]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-d chat_id="$chat_id"} \
${user_id:+-d user_id="$user_id"} \
${until_date:+-d until_date="$until_date"} \
${permissions:+-d permissions="$permissions"})
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.promoteChatMember()
{
local chat_id user_id can_change_info can_post_messages \
can_edit_messages can_delete_messages can_invite_users \
can_restrict_members can_pin_messages can_promote_members \
jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'c:u:i:p:e:d:v:r:f:m:' \
--longoptions 'chat_id:,
user_id:,
can_change_info:,
can_post_messages:,
can_edit_messages:,
can_delete_messages:,
can_invite_users:,
can_restrict_members:,
can_pin_messages:,
can_promote_members:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-u|--user_id)
CheckArgType int "$1" "$2"
user_id=$2
shift 2
;;
-i|--can_change_info)
CheckArgType bool "$1" "$2"
can_change_info=$2
shift 2
;;
-p|--can_post_messages)
CheckArgType bool "$1" "$2"
can_post_messages=$2
shift 2
;;
-e|--can_edit_messages)
CheckArgType bool "$1" "$2"
can_edit_messages=$2
shift 2
;;
-d|--can_delete_messages)
CheckArgType bool "$1" "$2"
can_delete_messages=$2
shift 2
;;
-v|--can_invite_users)
CheckArgType bool "$1" "$2"
can_invite_users=$2
shift 2
;;
-r|--can_restrict_members)
CheckArgType bool "$1" "$2"
can_restrict_members=$2
shift 2
;;
-f|--can_pin_messages)
CheckArgType bool "$1" "$2"
can_pin_messages=$2
shift 2
;;
-m|--can_promote_members)
CheckArgType bool "$1" "$2"
can_promote_members=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $user_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --user_id]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-d chat_id="$chat_id"} \
${user_id:+-d user_id="$user_id"} \
${can_change_info:+-d can_change_info="$can_change_info"} \
${can_post_messages:+-d can_post_messages="$can_post_messages"} \
${can_edit_messages:+-d can_edit_messages="$can_edit_messages"} \
${can_delete_messages:+-d can_delete_messages="$can_delete_messages"} \
${can_invite_users:+-d can_invite_users="$can_invite_users"} \
${can_restrict_members:+-d can_restrict_members="$can_restrict_members"} \
${can_pin_messages:+-d can_pin_messages="$can_pin_messages"} \
${can_promote_members:+-d can_promote_members="$can_promote_members"})
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.exportChatInviteLink()
{
local chat_id jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'c:' \
--longoptions 'chat_id:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
jq_obj=$(curl $_CURL_OPT_ GET $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"})
# Testa o retorno do método.
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.sendVideoNote()
{
local chat_id video_note duration length disable_notification \
reply_to_message_id reply_markup jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'c:v:t:l:n:r:k:' \
--longoptions 'chat_id:,
video_note:,
duration:,
length:,
disable_notification:,
reply_to_message_id:,
reply_markup:' \
-- "$@")
# Define os parâmetros posicionais
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-v|--video_note)
CheckArgType file "$1" "$2"
video_note=$2
shift 2
;;
-t|--duration)
CheckArgType int "$1" "$2"
duration=$2
shift 2
;;
-l|--length)
CheckArgType int "$1" "$2"
length=$2
shift 2
;;
-n|--disable_notification)
CheckArgType bool "$1" "$2"
disable_notification=$2
shift 2
;;
-r|--reply_to_message_id)
CheckArgType int "$1" "$2"
reply_to_message_id=$2
shift 2
;;
-k|--reply_markup)
reply_markup=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $video_note ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-v, --video_note]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-F chat_id="$chat_id"} \
${video_note:+-F video_note="$video_note"} \
${duration:+-F duration="$duration"} \
${length:+-F length="$length"} \
${disable_notification:+-F disable_notification="$disable_notification"} \
${reply_to_message_id:+-F reply_to_message_id="$reply_to_message_id"} \
${reply_markup:+-F reply_markup="$reply_markup"})
# Testa o retorno do método.
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.InlineKeyboardButton()
{
local __button __line __text __url __callback_data \
__switch_inline_query __switch_inline_query_current_chat
local __param=$(getopt --name "$FUNCNAME" \
--options 'b:l:t:u:c:q:s:' \
--longoptions 'button:,
line:,
text:,
url:,
callback_data:,
switch_inline_query:,
switch_inline_query_chat:' \
-- "$@")
eval set -- "$__param"
while :
do
case $1 in
-b|--button)
# Ponteiro que recebe o endereço de "button" com as definições
# da configuração do botão inserido.
CheckArgType var "$1" "$2"
__button=$2
shift 2
;;
-l|--line)
CheckArgType int "$1" "$2"
__line=$(($2-1))
shift 2
;;
-t|--text)
__text=$(echo -e "$2")
shift 2
;;
-u|--url)
__url=$2
shift 2
;;
-c|--callback_data)
__callback_data=$2
shift 2
;;
-q|--switch_inline_query)
__switch_inline_query=$2
shift 2
;;
-s|--switch_inline_query_current_chat)
__switch_inline_query_current_chat=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $__button ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-b, --button]"
[[ $__text ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-t, --text]"
[[ $__callback_data ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --callback_data]"
[[ $__line ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-l, --line]"
__button=$__button[$__line]
printf -v $__button '%s' "${!__button#[}"
printf -v $__button '%s' "${!__button%]}"
printf -v $__button '%s {"text": "%s", "callback_data": "%s", "url": "%s", "switch_inline_query": "%s", "switch_inline_query_current_chat": "%s"}' \
"${!__button:+${!__button},}" \
"${__text}" \
"${__callback_data}" \
"${__url}" \
"${__switch_inline_query}" \
"${__switch_inline_query_current_chat}"
printf -v $__button '%s' "[${!__button}]"
return $?
}
ShellBot.InlineKeyboardMarkup()
{
local __button __keyboard
local __param=$(getopt --name "$FUNCNAME" \
--options 'b:' \
--longoptions 'button:' \
-- "$@")
eval set -- "$__param"
while :
do
case $1 in
-b|--button)
# Ponteiro que recebe o endereço da variável "teclado" com as definições
# de configuração do botão inserido.
CheckArgType var "$1" "$2"
__button="$2"
shift 2
;;
--)
shift
break
;;
esac
done
[[ $__button ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-b, --button]"
__button=$__button[@]
printf -v __keyboard '%s,' "${!__button}"
printf -v __keyboard '%s' "${__keyboard%,}"
# Constroi a estrutura dos objetos + array keyboard, define os valores e salva as configurações.
# Por padrão todos os valores são 'false' até que seja definido.
printf '{"inline_keyboard": [%s]}' "${__keyboard}"
return $?
}
ShellBot.answerCallbackQuery()
{
local callback_query_id text show_alert url cache_time jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'c:t:s:u:e:' \
--longoptions 'callback_query_id:,
text:,
show_alert:,
url:,
cache_time:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--callback_query_id)
callback_query_id=$2
shift 2
;;
-t|--text)
text=$(echo -e "$2")
shift 2
;;
-s|--show_alert)
# boolean
CheckArgType bool "$1" "$2"
show_alert=$2
shift 2
;;
-u|--url)
url=$2
shift 2
;;
-e|--cache_time)
# inteiro
CheckArgType int "$1" "$2"
cache_time=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $callback_query_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --callback_query_id]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${callback_query_id:+-d callback_query_id="$callback_query_id"} \
${text:+-d text="$text"} \
${show_alert:+-d show_alert="$show_alert"} \
${url:+-d url="$url"} \
${cache_time:+-d cache_time="$cache_time"})
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
return $?
}
# Cria objeto que representa um teclado personalizado com opções de resposta
ShellBot.ReplyKeyboardMarkup()
{
# Variáveis locais
local __button __resize_keyboard __on_time_keyboard __selective __keyboard
# Lê os parâmetros da função.
local __param=$(getopt --name "$FUNCNAME" \
--options 'b:r:t:s:' \
--longoptions 'button:,
resize_keyboard:,
one_time_keyboard:,
selective:' \
-- "$@")
# Transforma os parâmetros da função em parâmetros posicionais
#
# Exemplo:
# --param1 arg1 --param2 arg2 --param3 arg3 ...
# $1 $2 $3
eval set -- "$__param"
# Aguarda leitura dos parâmetros
while :
do
# Lê o parâmetro da primeira posição "$1"; Se for um parâmetro válido,
# salva o valor do argumento na posição '$2' e desloca duas posições a esquerda (shift 2); Repete o processo
# até que o valor de '$1' seja igual '--' e finaliza o loop.
case $1 in
-b|--button)
CheckArgType var "$1" "$2"
__button=$2
shift 2
;;
-r|--resize_keyboard)
# Tipo: boolean
CheckArgType bool "$1" "$2"
__resize_keyboard=$2
shift 2
;;
-t|--one_time_keyboard)
# Tipo: boolean
CheckArgType bool "$1" "$2"
__on_time_keyboard=$2
shift 2
;;
-s|--selective)
# Tipo: boolean
CheckArgType bool "$1" "$2"
__selective=$2
shift 2
;;
--)
shift
break
;;
esac
done
# Imprime mensagem de erro se o parâmetro obrigatório for omitido.
[[ $__button ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-b, --button]"
__button=$__button[@]
printf -v __keyboard '%s,' "${!__button}"
printf -v __keyboard '%s' "${__keyboard%,}"
# Constroi a estrutura dos objetos + array keyboard, define os valores e salva as configurações.
# Por padrão todos os valores são 'false' até que seja definido.
printf '{"keyboard": [%s], "resize_keyboard": %s, "one_time_keyboard": %s, "selective": %s}' \
"${__keyboard}" \
"${__resize_keyboard:-false}" \
"${__on_time_keyboard:-false}" \
"${__selective:-false}"
# status
return $?
}
ShellBot.KeyboardButton()
{
local __text __contact __location __button __line __request_poll
local __param=$(getopt --name "$FUNCNAME" \
--options 'b:l:t:c:o:r:' \
--longoptions 'button:,
line:,
text:,
request_contact:,
request_location:,
request_poll:' \
-- "$@")
eval set -- "$__param"
while :
do
case $1 in
-b|--button)
CheckArgType var "$1" "$2"
__button=$2
shift 2
;;
-l|--line)
CheckArgType int "$1" "$2"
__line=$(($2-1))
shift 2
;;
-t|--text)
__text=$(echo -e "$2")
shift 2
;;
-c|--request_contact)
CheckArgType bool "$1" "$2"
__contact=$2
shift 2
;;
-o|--request_location)
CheckArgType bool "$1" "$2"
__location=$2
shift 2
;;
-r|--request_poll)
__request_poll=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $__button ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-b, --button]"
[[ $__text ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-t, --text]"
[[ $__line ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-l, --line]"
__button=$__button[$__line]
printf -v $__button '%s' "${!__button#[}"
printf -v $__button '%s' "${!__button%]}"
printf -v $__button '%s {"text": "%s", "request_contact": %s, "request_location": %s, "request_poll": %s}' \
"${!__button:+${!__button},}" \
"${__text}" \
"${__contact:-false}" \
"${__location:-false}" \
"${__request_poll:-\"\"}"
printf -v $__button '%s' "[${!__button}]"
return $?
}
ShellBot.ForceReply()
{
local selective
local param=$(getopt --name "$FUNCNAME" \
--options 's:' \
--longoptions 'selective:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-s|--selective)
CheckArgType bool "$1" "$2"
selective=$2
shift 2
;;
--)
shift
break
;;
esac
done
printf '{"force_reply": true, "selective": %s}' ${selective:-false}
return $?
}
ShellBot.ReplyKeyboardRemove()
{
local selective
local param=$(getopt --name "$FUNCNAME" \
--options 's:' \
--longoptions 'selective:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-s|--selective)
CheckArgType bool "$1" "$2"
selective=$2
shift 2
;;
--)
shift
break
;;
esac
done
printf '{"remove_keyboard": true, "selective": %s}' ${selective:-false}
return $?
}
# Envia mensagens
ShellBot.sendMessage()
{
# Variáveis locais
local chat_id text parse_mode disable_web_page_preview
local disable_notification reply_to_message_id reply_markup jq_obj
# Lê os parâmetros da função
local param=$(getopt --name "$FUNCNAME" \
--options 'c:t:p:w:n:r:k:' \
--longoptions 'chat_id:,
text:,
parse_mode:,
disable_web_page_preview:,
disable_notification:,
reply_to_message_id:,
reply_markup:' \
-- "$@")
# Define os parâmetros posicionais
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-t|--text)
text=$(echo -e "$2")
shift 2
;;
-p|--parse_mode)
# Tipo: "markdown" ou "html"
parse_mode=$2
shift 2
;;
-w|--disable_web_page_preview)
# Tipo: boolean
CheckArgType bool "$1" "$2"
disable_web_page_preview=$2
shift 2
;;
-n|--disable_notification)
# Tipo: boolean
CheckArgType bool "$1" "$2"
disable_notification=$2
shift 2
;;
-r|--reply_to_message_id)
# Tipo: inteiro
CheckArgType int "$1" "$2"
reply_to_message_id=$2
shift 2
;;
-k|--reply_markup)
reply_markup=$2
shift 2
;;
--)
shift
break
;;
esac
done
# Parâmetros obrigatórios.
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $text ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-t, --text]"
# Chama o método da API, utilizando o comando request especificado; Os parâmetros
# e valores são passados no form e lidos pelo método. O retorno do método é redirecionado para o arquivo 'update.Json'.
# Variáveis com valores nulos são ignoradas e consequentemente os respectivos parâmetros omitidos.
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-d chat_id="$chat_id"} \
${text:+-d text="$text"} \
${parse_mode:+-d parse_mode="$parse_mode"} \
${disable_web_page_preview:+-d disable_web_page_preview="$disable_web_page_preview"} \
${disable_notification:+-d disable_notification="$disable_notification"} \
${reply_to_message_id:+-d reply_to_message_id="$reply_to_message_id"} \
${reply_markup:+-d reply_markup="$reply_markup"})
# Testa o retorno do método.
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
# Função para reencaminhar mensagens de qualquer tipo.
ShellBot.forwardMessage()
{
# Variáveis locais
local chat_id form_chat_id disable_notification message_id jq_obj
# Lê os parâmetros da função
local param=$(getopt --name "$FUNCNAME" \
--options 'c:f:n:m:' \
--longoptions 'chat_id:,
from_chat_id:,
disable_notification:,
message_id:' \
-- "$@")
# Define os parâmetros posicionais
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id="$2"
shift 2
;;
-f|--from_chat_id)
from_chat_id="$2"
shift 2
;;
-n|--disable_notification)
# Tipo: boolean
CheckArgType bool "$1" "$2"
disable_notification="$2"
shift 2
;;
-m|--message_id)
# Tipo: inteiro
CheckArgType int "$1" "$2"
message_id="$2"
shift 2
;;
--)
shift
break
;;
esac
done
# Parâmetros obrigatórios.
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $from_chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-f, --from_chat_id]"
[[ $message_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-m, --message_id]"
# Chama o método
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-d chat_id="$chat_id"} \
${from_chat_id:+-d from_chat_id="$from_chat_id"} \
${disable_notification:+-d disable_notification="$disable_notification"} \
${message_id:+-d message_id="$message_id"})
# Retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# status
return $?
}
# Utilize essa função para enviar fotos.
ShellBot.sendPhoto()
{
# Variáveis locais
local chat_id photo caption disable_notification
local parse_mode reply_to_message_id reply_markup jq_obj
# Lê os parâmetros da função
local param=$(getopt --name "$FUNCNAME" \
--options 'c:p:t:m:n:r:k:' \
--longoptions 'chat_id:,
photo:,
caption:,
parse_mode:,
disable_notification:,
reply_to_message_id:,
reply_markup:' \
-- "$@")
# Define os parâmetros posicionais
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-p|--photo)
CheckArgType file "$1" "$2"
photo=$2
shift 2
;;
-t|--caption)
# Limite máximo de caracteres: 200
caption=$(echo -e "$2")
shift 2
;;
-m|--parse_mode)
parse_mode=$2
shift 2
;;
-n|--disable_notification)
# Tipo: boolean
CheckArgType bool "$1" "$2"
disable_notification=$2
shift 2
;;
-r|--reply_to_message_id)
# Tipo: inteiro
CheckArgType int "$1" "$2"
reply_to_message_id=$2
shift 2
;;
-k|--reply_markup)
reply_markup=$2
shift 2
;;
--)
shift
break
;;
esac
done
# Parâmetros obrigatórios
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $photo ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-p, --photo]"
# Chama o método
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-F chat_id="$chat_id"} \
${photo:+-F photo="$photo"} \
${caption:+-F caption="$caption"} \
${parse_mode:+-F parse_mode="$parse_mode"} \
${disable_notification:+-F disable_notification="$disable_notification"} \
${reply_to_message_id:+-F reply_to_message_id="$reply_to_message_id"} \
${reply_markup:+-F reply_markup="$reply_markup"})
# Retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
# Utilize essa função para enviar arquivos de audio.
ShellBot.sendAudio()
{
# Variáveis locais
local chat_id audio caption duration performer title
local parse_mode disable_notification reply_to_message_id reply_markup jq_obj
# Lê os parâmetros da função
local param=$(getopt --name "$FUNCNAME" \
--options 'c:a:t:m:d:e:i:n:r:k' \
--longoptions 'chat_id:,
audio:,
caption:,
parse_mode:,
duration:,
performer:,
title:,
disable_notification:,
reply_to_message_id:,
reply_markup:' \
-- "$@")
# Define os parâmetros posicionais
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-a|--audio)
CheckArgType file "$1" "$2"
audio=$2
shift 2
;;
-t|--caption)
caption=$(echo -e "$2")
shift 2
;;
-m|--parse_mode)
parse_mode=$2
shift 2
;;
-d|--duration)
# Tipo: inteiro
CheckArgType int "$1" "$2"
duration=$2
shift 2
;;
-e|--performer)
performer=$2
shift 2
;;
-i|--title)
title=$2
shift 2
;;
-n|--disable_notification)
# Tipo: boolean
CheckArgType bool "$1" "$2"
disable_notification=$2
shift 2
;;
-r|--reply_to_message_id)
# Tipo: inteiro
CheckArgType int "$1" "$2"
reply_to_message_id=$2
shift 2
;;
-k|--reply_markup)
reply_markup=$2
shift 2
;;
--)
shift
break
;;
esac
done
# Parâmetros obrigatórios
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $audio ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-a, --audio]"
# Chama o método
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-F chat_id="$chat_id"} \
${audio:+-F audio="$audio"} \
${caption:+-F caption="$caption"} \
${parse_mode:+-F parse_mode="$parse_mode"} \
${duration:+-F duration="$duration"} \
${performer:+-F performer="$performer"} \
${title:+-F title="$title"} \
${disable_notification:+-F disable_notification="$disable_notification"} \
${reply_to_message_id:+-F reply_to_message_id="$reply_to_message_id"} \
${reply_markup:+-F reply_markup="$reply_markup"})
# Retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
# Utilize essa função para enviar documentos.
ShellBot.sendDocument()
{
# Variáveis locais
local chat_id document caption disable_notification
local parse_mode reply_to_message_id reply_markup jq_obj
# Lê os parâmetros da função
local param=$(getopt --name "$FUNCNAME" \
--options 'c:d:t:m:n:r:k:' \
--longoptions 'chat_id:,
document:,
caption:,
parse_mode:,
disable_notification:,
reply_to_message_id:,
reply_markup:' \
-- "$@")
# Define os parâmetros posicionais
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-d|--document)
CheckArgType file "$1" "$2"
document=$2
shift 2
;;
-t|--caption)
caption=$(echo -e "$2")
shift 2
;;
-m|--parse_mode)
parse_mode=$2
shift 2
;;
-n|--disable_notification)
CheckArgType bool "$1" "$2"
disable_notification=$2
shift 2
;;
-r|--reply_to_message_id)
CheckArgType int "$1" "$2"
reply_to_message_id=$2
shift 2
;;
-k|--reply_markup)
reply_markup=$2
shift 2
;;
--)
shift
break
;;
esac
done
# Parâmetros obrigatórios
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $document ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-d, --document]"
# Chama o método
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-F chat_id="$chat_id"} \
${document:+-F document="$document"} \
${caption:+-F caption="$caption"} \
${parse_mode:+-F parse_mode="$parse_mode"} \
${disable_notification:+-F disable_notification="$disable_notification"} \
${reply_to_message_id:+-F reply_to_message_id="$reply_to_message_id"} \
${reply_markup:+-F reply_markup="$reply_markup"})
# Retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
# Utilize essa função para enviat stickers
ShellBot.sendSticker()
{
# Variáveis locais
local chat_id sticker disable_notification reply_to_message_id reply_markup jq_obj
# Lê os parâmetros da função
local param=$(getopt --name "$FUNCNAME" \
--options 'c:s:n:r:k:' \
--longoptions 'chat_id:,
sticker:,
disable_notification:,
reply_to_message_id:,
reply_markup:' \
-- "$@")
# Define os parâmetros posicionais
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-s|--sticker)
CheckArgType file "$1" "$2"
sticker=$2
shift 2
;;
-n|--disable_notification)
# Tipo: boolean
CheckArgType bool "$1" "$2"
disable_notification=$2
shift 2
;;
-r|--reply_to_message_id)
# Tipo: inteiro
CheckArgType int "$1" "$2"
reply_to_message_id=$2
shift 2
;;
-k|--reply_markup)
reply_markup=$2
shift 2
;;
--)
shift
break
;;
esac
done
# Parâmetros obrigatórios
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $sticker ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-s, --sticker]"
# Chama o método
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-F chat_id="$chat_id"} \
${sticker:+-F sticker="$sticker"} \
${disable_notification:+-F disable_notification="$disable_notification"} \
${reply_to_message_id:+-F reply_to_message_id="$reply_to_message_id"} \
${reply_markup:+-F reply_markup="$reply_markup"})
# Testa o retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.getStickerSet()
{
local name jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'n:' \
--longoptions 'name:' \
-- "$@")
# parâmetros posicionais
eval set -- "$param"
while :
do
case $1 in
-n|--name)
name=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $name ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-n, --name]"
jq_obj=$(curl $_CURL_OPT_ GET $_API_TELEGRAM_/${FUNCNAME#*.} ${name:+-d name="$name"})
# Testa o retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.uploadStickerFile()
{
local user_id png_sticker jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'u:s:' \
--longoptions 'user_id:,
png_sticker:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-u|--user_id)
CheckArgType int "$1" "$2"
user_id=$2
shift 2
;;
-s|--png_sticker)
CheckArgType file "$1" "$2"
png_sticker=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $user_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-u, --user_id]"
[[ $png_sticker ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-s, --png_sticker]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${user_id:+-F user_id="$user_id"} \
${png_sticker:+-F png_sticker="$png_sticker"})
# Testa o retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.setStickerPositionInSet()
{
local sticker position jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 's:p:' \
--longoptions 'sticker:,
position:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-s|--sticker)
sticker=$2
shift 2
;;
-p|--position)
CheckArgType int "$1" "$2"
position=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $sticker ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-s, --sticker]"
[[ $position ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-p, --position]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${sticker:+-d sticker="$sticker"} \
${position:+-d position="$position"})
# Testa o retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.deleteStickerFromSet()
{
local sticker jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 's:' \
--longoptions 'sticker:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-s|--sticker)
sticker=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $sticker ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-s, --sticker]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${sticker:+-d sticker="$sticker"})
# Testa o retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.stickerMaskPosition()
{
local point x_shift y_shift scale zoom
local param=$(getopt --name "$FUNCNAME" \
--options 'p:x:y:s:z:' \
--longoptions 'point:,
x_shift:,
y_shift:,
scale:,
zoom:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-p|--point)
point=$2
shift 2
;;
-x|--x_shift)
CheckArgType float "$1" "$2"
x_shift=$2
shift 2
;;
-y|--y_shift)
CheckArgType float "$1" "$2"
y_shift=$2
shift 2
;;
-s|--scale)
CheckArgType float "$1" "$2"
scale=$2
shift 2
;;
-z|--zoom)
CheckArgType float "$1" "$2"
zoom=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $point ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-p, --point]"
[[ $x_shift ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-x, --x_shift]"
[[ $y_shift ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-y, --y_shift]"
[[ $scale ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-s, --scale]"
[[ $zoom ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-z, --zoom]"
cat << _EOF
{ "point": "$point", "x_shift": $x_shift, "y_shift": $y_shift, "scale": $scale, "zoom": $zoom }
_EOF
return 0
}
ShellBot.createNewStickerSet()
{
local user_id name title png_sticker emojis contains_masks mask_position jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'u:n:t:s:e:c:m:' \
--longoptions 'user_id:,
name:,
title:,
png_sticker:,
emojis:,
contains_mask:,
mask_position:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-u|--user_id)
CheckArgType int "$1" "$2"
user_id=$2
shift 2
;;
-n|--name)
name=$2
shift 2
;;
-t|--title)
title=$2
shift 2
;;
-s|--png_sticker)
CheckArgType file "$1" "$2"
png_sticker=$2
shift 2
;;
-e|--emojis)
emojis=$2
shift 2
;;
-c|--contains_masks)
CheckArgType bool "$1" "$2"
contains_masks=$2
shift 2
;;
-m|--mask_position)
mask_position=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $user_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-u, --user_id]"
[[ $name ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-n, --name]"
[[ $title ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-t, --title]"
[[ $png_sticker ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-s, --png_sticker]"
[[ $emojis ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-e, --emojis]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${user_id:+-F user_id="$user_id"} \
${name:+-F name="$name"} \
${title:+-F title="$title"} \
${png_sticker:+-F png_sticker="$png_sticker"} \
${emojis:+-F emojis="$emojis"} \
${contains_masks:+-F contains_masks="$contains_masks"} \
${mask_position:+-F mask_position="$mask_position"})
# Testa o retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.addStickerToSet()
{
local user_id name png_sticker emojis mask_position jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'u:n:s:e:m:' \
--longoptions 'user_id:,
name:,
png_sticker:,
emojis:,
mask_position:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-u|--user_id)
CheckArgType int "$1" "$2"
user_id=$2
shift 2
;;
-n|--name)
name=$2
shift 2
;;
-s|--png_sticker)
CheckArgType file "$1" "$2"
png_sticker=$2
shift 2
;;
-e|--emojis)
emojis=$2
shift 2
;;
-m|--mask_position)
mask_position=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $user_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-u, --user_id]"
[[ $name ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-n, --name]"
[[ $png_sticker ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-s, --png_sticker]"
[[ $emojis ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-e, --emojis]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${user_id:+-F user_id="$user_id"} \
${name:+-F name="$name"} \
${png_sticker:+-F png_sticker="$png_sticker"} \
${emojis:+-F emojis="$emojis"} \
${mask_position:+-F mask_position="$mask_position"})
# Testa o retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
# Função para enviar arquivos de vídeo.
ShellBot.sendVideo()
{
# Variáveis locais
local chat_id video duration width height caption disable_notification
local parse_mode reply_to_message_id reply_markup jq_obj supports_streaming
# Lê os parâmetros da função
local param=$(getopt --name "$FUNCNAME" \
--options 'c:v:d:w:h:t:m:n:r:k:s:' \
--longoptions 'chat_id:,
video:,
duration:,
width:,
height:,
caption:,
parse_mode:,
disable_notification:,
reply_to_message_id:,
reply_markup:,
supports_streaming:' \
-- "$@")
# Define os parâmetros posicionais
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-v|--video)
CheckArgType file "$1" "$2"
video=$2
shift 2
;;
-d|--duration)
# Tipo: inteiro
CheckArgType int "$1" "$2"
duration=$2
shift 2
;;
-w|--width)
# Tipo: inteiro
CheckArgType int "$1" "$2"
width=$2
shift 2
;;
-h|--height)
# Tipo: inteiro
CheckArgType int "$1" "$2"
height=$2
shift 2
;;
-t|--caption)
caption=$(echo -e "$2")
shift 2
;;
-m|--parse_mode)
parse_mode=$2
shift 2
;;
-n|--disable_notification)
# Tipo: boolean
CheckArgType bool "$1" "$2"
disable_notification=$2
shift 2
;;
-r|--reply_to_message_id)
CheckArgType int "$1" "$2"
reply_to_message_id=$2
shift 2
;;
-k|--reply_markup)
reply_markup=$2
shift 2
;;
-s|--supports_streaming)
CheckArgType bool "$1" "$2"
supports_streaming=$2
shift 2
;;
--)
shift
break
;;
esac
done
# Parâmetros obrigatórios.
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $video ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-v, --video]"
# Chama o método
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-F chat_id="$chat_id"} \
${video:+-F video="$video"} \
${duration:+-F duration="$duration"} \
${width:+-F width="$width"} \
${height:+-F height="$height"} \
${caption:+-F caption="$caption"} \
${parse_mode:+-F parse_mode="$parse_mode"} \
${disable_notification:+-F disable_notification="$disable_notification"} \
${reply_to_message_id:+-F reply_to_message_id="$reply_to_message_id"} \
${reply_markup:+-F reply_markup="$reply_markup"} \
${supports_streaming:+-F supports_streaming="$supports_streaming"})
# Testa o retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
# Função para enviar audio.
ShellBot.sendVoice()
{
# Variáveis locais
local chat_id voice caption duration disable_notification
local parse_mode reply_to_message_id reply_markup jq_obj
# Lê os parâmetros da função
local param=$(getopt --name "$FUNCNAME" \
--options 'c:v:t:m:d:n:r:k:' \
--longoptions 'chat_id:,
voice:,
caption:,
parse_mode:,
duration:,
disable_notification:,
reply_to_message_id:,
reply_markup:' \
-- "$@")
# Define os parâmetros posicionais
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-v|--voice)
CheckArgType file "$1" "$2"
voice=$2
shift 2
;;
-t|--caption)
caption=$(echo -e "$2")
shift 2
;;
-m|--parse_mode)
parse_mode=$2
shift 2
;;
-d|--duration)
# Tipo: inteiro
CheckArgType int "$1" "$2"
duration=$2
shift 2
;;
-n|--disable_notification)
# Tipo: boolean
CheckArgType bool "$1" "$2"
disable_notification=$2
shift 2
;;
-r|--reply_to_message_id)
# Tipo: inteiro
CheckArgType int "$1" "$2"
reply_to_message_id=$2
shift 2
;;
-k|--reply_markup)
reply_markup=$2
shift 2
;;
--)
shift
break
;;
esac
done
# Parâmetros obrigatórios.
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $voice ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-v, --voice]"
# Chama o método
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-F chat_id="$chat_id"} \
${voice:+-F voice="$voice"} \
${caption:+-F caption="$caption"} \
${parse_mode:+-F parse_mode="$parse_mode"} \
${duration:+-F duration="$duration"} \
${disable_notification:+-F disable_notification="$disable_notification"} \
${reply_to_message_id:+-F reply_to_message_id="$reply_to_message_id"} \
${reply_markup:+-F reply_markup="$reply_markup"})
# Testa o retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
# Função utilizada para enviar uma localidade utilizando coordenadas de latitude e longitude.
ShellBot.sendLocation()
{
# Variáveis locais
local chat_id latitude longitude live_period
local disable_notification reply_to_message_id reply_markup jq_obj
# Lê os parâmetros da função
local param=$(getopt --name "$FUNCNAME" \
--options 'c:l:g:p:n:r:k:' \
--longoptions 'chat_id:,
latitude:,
longitude:,
live_period:,
disable_notification:,
reply_to_message_id:,
reply_markup:' \
-- "$@")
# Define os parâmetros posicionais
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-l|--latitude)
# Tipo: float
CheckArgType float "$1" "$2"
latitude=$2
shift 2
;;
-g|--longitude)
# Tipo: float
CheckArgType float "$1" "$2"
longitude=$2
shift 2
;;
-p|--live_period)
CheckArgType int "$1" "$2"
live_period=$2
shift 2
;;
-n|--disable_notification)
# Tipo: boolean
CheckArgType bool "$1" "$2"
disable_notification=$2
shift 2
;;
-r|--reply_to_message_id)
# Tipo: inteiro
CheckArgType int "$1" "$2"
reply_to_message_id=$2
shift 2
;;
-k|--reply_markup)
reply_markup=$2
shift 2
;;
--)
shift
break
;;
esac
done
# Parâmetros obrigatórios
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $latitude ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-l, --latitude]"
[[ $longitude ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-g, --longitude]"
# Chama o método
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-F chat_id="$chat_id"} \
${latitude:+-F latitude="$latitude"} \
${longitude:+-F longitude="$longitude"} \
${live_period:+-F live_period="$live_period"} \
${disable_notification:+-F disable_notification="$disable_notification"} \
${reply_to_message_id:+-F reply_to_message_id="$reply_to_message_id"} \
${reply_markup:+-F reply_markup="$reply_markup"})
# Testa o retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
return $?
}
# Função utlizada para enviar detalhes de um local.
ShellBot.sendVenue()
{
# Variáveis locais
local chat_id latitude longitude title address foursquare_id disable_notification reply_to_message_id reply_markup jq_obj
# Lê os parâmetros da função
local param=$(getopt --name "$FUNCNAME" \
--options 'c:l:g:i:a:f:n:r:k:' \
--longoptions 'chat_id:,
latitude:,
longitude:,
title:,
address:,
foursquare_id:,
disable_notification:,
reply_to_message_id:,
reply_markup:' \
-- "$@")
# Define os parâmetros posicionais
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-l|--latitude)
# Tipo: float
CheckArgType float "$1" "$2"
latitude=$2
shift 2
;;
-g|--longitude)
# Tipo: float
CheckArgType float "$1" "$2"
longitude=$2
shift 2
;;
-i|--title)
title=$2
shift 2
;;
-a|--address)
address=$2
shift 2
;;
-f|--foursquare_id)
foursquare_id=$2
shift 2
;;
-n|--disable_notification)
# Tipo: boolean
CheckArgType bool "$1" "$2"
disable_notification=$2
shift 2
;;
-r|--reply_to_message_id)
# Tipo: inteiro
CheckArgType int "$1" "$2"
reply_to_message_id=$2
shift 2
;;
-k|--reply_markup)
reply_markup=$2
shift 2
;;
--)
shift
break
;;
esac
done
# Parâmetros obrigatórios.
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $latitude ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-l, --latitude]"
[[ $longitude ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-g, --longitude]"
[[ $title ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-i, --title]"
[[ $address ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-a, --address]"
# Chama o método
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-F chat_id="$chat_id"} \
${latitude:+-F latitude="$latitude"} \
${longitude:+-F longitude="$longitude"} \
${title:+-F title="$title"} \
${address:+-F address="$address"} \
${foursquare_id:+-F foursquare_id="$foursquare_id"} \
${disable_notification:+-F disable_notification="$disable_notification"} \
${reply_to_message_id:+-F reply_to_message_id="$reply_to_message_id"} \
${reply_markup:+-F reply_markup="$reply_markup"})
# Testa o retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
# Utilize essa função para enviar um contato + numero
ShellBot.sendContact()
{
# Variáveis locais
local chat_id phone_number first_name last_name disable_notification reply_to_message_id reply_markup jq_obj
# Lê os parâmetros da função
local param=$(getopt --name "$FUNCNAME" \
--options 'c:p:f:l:n:r:k:' \
--longoptions 'chat_id:,
phone_number:,
first_name:,
last_name:,
disable_notification:,
reply_to_message_id:,
reply_markup:' \
-- "$@")
# Define os parâmetros posicionais
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-p|--phone_number)
phone_number=$2
shift 2
;;
-f|--first_name)
first_name=$2
shift 2
;;
-l|--last_name)
last_name=$2
shift 2
;;
-n|--disable_notification)
# Tipo: boolean
CheckArgType bool "$1" "$2"
disable_notification=$2
shift 2
;;
-r|--reply_to_message_id)
# Tipo: inteiro
CheckArgType int "$1" "$2"
reply_to_message_id=$2
shift 2
;;
-k|--reply_markup)
reply_markup=$2
shift 2
;;
--)
shift
break
;;
esac
done
# Parâmetros obrigatórios.
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $phone_number ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-p, --phone_number]"
[[ $first_name ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-f, --first_name]"
# Chama o método
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-F chat_id="$chat_id"} \
${phone_number:+-F phone_number="$phone_number"} \
${first_name:+-F first_name="$first_name"} \
${last_name:+-F last_name="$last_name"} \
${disable_notification:+-F disable_notification="$disable_notification"} \
${reply_to_message_id:+-F reply_to_message_id="$reply_to_message_id"} \
${reply_markup:+-F reply_markup="$reply_markup"})
# Testa o retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
# Envia uma ação para bot.
ShellBot.sendChatAction()
{
# Variáveis locais
local chat_id action jq_obj
# Lê os parâmetros da função
local param=$(getopt --name "$FUNCNAME" \
--options 'c:a:' \
--longoptions 'chat_id:,
action:' \
-- "$@")
# Define os parâmetros posicionais
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-a|--action)
action=$2
shift 2
;;
--)
shift
break
;;
esac
done
# Parâmetros obrigatórios.
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $action ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-a, --action]"
# Chama o método
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-d chat_id="$chat_id"} \
${action:+-d action="$action"})
# Testa o retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
# Utilize essa função para obter as fotos de um determinado usuário.
ShellBot.getUserProfilePhotos()
{
# Variáveis locais
local user_id offset limit ind last index max item total jq_obj
# Lê os parâmetros da função
local param=$(getopt --name "$FUNCNAME" \
--options 'u:o:l:' \
--longoptions 'user_id:,
offset:,
limit:' \
-- "$@")
# Define os parâmetros posicionais
eval set -- "$param"
while :
do
case $1 in
-u|--user_id)
CheckArgType int "$1" "$2"
user_id=$2
shift 2
;;
-o|--offset)
CheckArgType int "$1" "$2"
offset=$2
shift 2
;;
-l|--limit)
CheckArgType int "$1" "$2"
limit=$2
shift 2
;;
--)
shift
break
;;
esac
done
# Parâmetros obrigatórios.
[[ $user_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-u, --user_id]"
# Chama o método
jq_obj=$(curl $_CURL_OPT_ GET $_API_TELEGRAM_/${FUNCNAME#*.} \
${user_id:+-d user_id="$user_id"} \
${offset:+-d offset="$offset"} \
${limit:+-d limit="$limit"})
# Verifica se ocorreu erros durante a chamada do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
# Função para listar informações do arquivo especificado.
ShellBot.getFile()
{
# Variáveis locais
local file_id jq_obj
# Lê os parâmetros da função
local param=$(getopt --name "$FUNCNAME" \
--options 'f:' \
--longoptions 'file_id:' \
-- "$@")
# Define os parâmetros posicionais
eval set -- "$param"
while :
do
case $1 in
-f|--file_id)
file_id=$2
shift 2
;;
--)
shift
break
;;
esac
done
# Parâmetros obrigatórios.
[[ $file_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-f, --file_id]"
# Chama o método.
jq_obj=$(curl $_CURL_OPT_ GET $_API_TELEGRAM_/${FUNCNAME#*.} ${file_id:+-d file_id="$file_id"})
# Testa o retorno do método.
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
# Essa função kicka o usuário do chat ou canal. (somente administradores)
ShellBot.kickChatMember()
{
# Variáveis locais
local chat_id user_id until_date jq_obj
# Lê os parâmetros da função
local param=$(getopt --name "$FUNCNAME" \
--options 'c:u:d:' \
--longoptions 'chat_id:,
user_id:,
until_date:' \
-- "$@")
# Define os parâmetros posicionais
eval set -- "$param"
# Trata os parâmetros
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-u|--user_id)
CheckArgType int "$1" "$2"
user_id=$2
shift 2
;;
-d|--until_date)
CheckArgType int "$1" "$2"
until_date=$2
shift 2
;;
--)
shift
break
;;
esac
done
# Parametros obrigatórios.
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $user_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-u, --user_id]"
# Chama o método
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-d chat_id="$chat_id"} \
${user_id:+-d user_id="$user_id"} \
${until_date:+-d until_date="$until_date"})
# Verifica se ocorreu erros durante a chamada do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
# Utilize essa função para remove o bot do grupo ou canal.
ShellBot.leaveChat()
{
# Variáveis locais
local chat_id jq_obj
# Lê os parâmetros da função
local param=$(getopt --name "$FUNCNAME" \
--options 'c:' \
--longoptions 'chat_id:' \
-- "$@")
# Define os parâmetros posicionais
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"})
# Verifica se ocorreu erros durante a chamada do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
return $?
}
ShellBot.unbanChatMember()
{
local chat_id user_id jq_obj
# Lê os parâmetros da função
local param=$(getopt --name "$FUNCNAME" \
--options 'c:u:' \
--longoptions 'chat_id:,
user_id:' \
-- "$@")
# Define os parâmetros posicionais
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-u|--user_id)
CheckArgType int "$1" "$2"
user_id=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $user_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-u, --user_id]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-d chat_id="$chat_id"} \
${user_id:+-d user_id="$user_id"})
# Verifica se ocorreu erros durante a chamada do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
return $?
}
ShellBot.getChat()
{
# Variáveis locais
local chat_id jq_obj
# Lê os parâmetros da função
local param=$(getopt --name "$FUNCNAME" \
--options 'c:' \
--longoptions 'chat_id:' \
-- "$@")
# Define os parâmetros posicionais
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
jq_obj=$(curl $_CURL_OPT_ GET $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"})
# Verifica se ocorreu erros durante a chamada do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.getChatAdministrators()
{
local chat_id total key index jq_obj
# Lê os parâmetros da função
local param=$(getopt --name "$FUNCNAME" \
--options 'c:' \
--longoptions 'chat_id:' \
-- "$@")
# Define os parâmetros posicionais
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
jq_obj=$(curl $_CURL_OPT_ GET $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"})
# Verifica se ocorreu erros durante a chamada do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.getChatMembersCount()
{
local chat_id jq_obj
# Lê os parâmetros da função
local param=$(getopt --name "$FUNCNAME" \
--options 'c:' \
--longoptions 'chat_id:' \
-- "$@")
# Define os parâmetros posicionais
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
jq_obj=$(curl $_CURL_OPT_ GET $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"})
# Verifica se ocorreu erros durante a chamada do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
return $?
}
ShellBot.getChatMember()
{
# Variáveis locais
local chat_id user_id jq_obj
# Lê os parâmetros da função
local param=$(getopt --name "$FUNCNAME" \
--options 'c:u:' \
--longoptions 'chat_id:,
user_id:' \
-- "$@")
# Define os parâmetros posicionais
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-u|--user_id)
CheckArgType int "$1" "$2"
user_id=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $user_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-u, --user_id]"
jq_obj=$(curl $_CURL_OPT_ GET $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-d chat_id="$chat_id"} \
${user_id:+-d user_id="$user_id"})
# Verifica se ocorreu erros durante a chamada do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
return $?
}
ShellBot.editMessageText()
{
local chat_id message_id inline_message_id text parse_mode disable_web_page_preview reply_markup jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'c:m:i:t:p:w:r:' \
--longoptions 'chat_id:,
message_id:,
inline_message_id:,
text:,
parse_mode:,
disable_web_page_preview:,
reply_markup:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-m|--message_id)
CheckArgType int "$1" "$2"
message_id=$2
shift 2
;;
-i|--inline_message_id)
CheckArgType int "$1" "$2"
inline_message_id=$2
shift 2
;;
-t|--text)
text=$(echo -e "$2")
shift 2
;;
-p|--parse_mode)
parse_mode=$2
shift 2
;;
-w|--disable_web_page_preview)
CheckArgType bool "$1" "$2"
disable_web_page_preview=$2
shift 2
;;
-r|--reply_markup)
reply_markup=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $text ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-t, --text]"
[[ $inline_message_id ]] && unset chat_id message_id || {
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $message_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-m, --message_id]"
}
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-d chat_id="$chat_id"} \
${message_id:+-d message_id="$message_id"} \
${inline_message_id:+-d inline_message_id="$inline_message_id"} \
${text:+-d text="$text"} \
${parse_mode:+-d parse_mode="$parse_mode"} \
${disable_web_page_preview:+-d disable_web_page_preview="$disable_web_page_preview"} \
${reply_markup:+-d reply_markup="$reply_markup"})
# Verifica se ocorreu erros durante a chamada do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
return $?
}
ShellBot.editMessageCaption()
{
local chat_id message_id inline_message_id
local parse_mode caption reply_markup jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'c:m:i:t:p:r:' \
--longoptions 'chat_id:,
message_id:,
inline_message_id:,
caption:,
parse_mode:,
reply_markup:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-m|--message_id)
CheckArgType int "$1" "$2"
message_id=$2
shift 2
;;
-i|--inline_message_id)
CheckArgType int "$1" "$2"
inline_message_id=$2
shift 2
;;
-t|--caption)
caption=$(echo -e "$2")
shift 2
;;
-p|--parse_mode)
parse_mode=$2
shift 2
;;
-r|--reply_markup)
reply_markup=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $message_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-m, --message_id]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-d chat_id="$chat_id"} \
${message_id:+-d message_id="$message_id"} \
${inline_message_id:+-d inline_message_id="$inline_message_id"} \
${caption:+-d caption="$caption"} \
${parse_mode:+-d parse_mode="$parse_mode"} \
${reply_markup:+-d reply_markup="$reply_markup"})
# Verifica se ocorreu erros durante a chamada do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
return $?
}
ShellBot.editMessageReplyMarkup()
{
local chat_id message_id inline_message_id reply_markup jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'c:m:i:r:' \
--longoptions 'chat_id:,
message_id:,
inline_message_id:,
reply_markup:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-m|--message_id)
CheckArgType int "$1" "$2"
message_id=$2
shift 2
;;
-i|--inline_message_id)
CheckArgType int "$1" "$2"
inline_message_id=$2
shift 2
;;
-r|--reply_markup)
reply_markup=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $inline_message_id ]] && unset chat_id message_id || {
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $message_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-m, --message_id]"
}
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-d chat_id="$chat_id"} \
${message_id:+-d message_id="$message_id"} \
${inline_message_id:+-d inline_message_id="$inline_message_id"} \
${reply_markup:+-d reply_markup="$reply_markup"})
# Verifica se ocorreu erros durante a chamada do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
return $?
}
ShellBot.deleteMessage()
{
local chat_id message_id jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'c:m:' \
--longoptions 'chat_id:,
message_id:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-m|--message_id)
CheckArgType int "$1" "$2"
message_id=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $message_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-m, --message_id]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-d chat_id="$chat_id"} \
${message_id:+-d message_id="$message_id"})
# Verifica se ocorreu erros durante a chamada do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
return $?
}
ShellBot.downloadFile()
{
local file_path dir ext file jq_obj
local uri="https://api.telegram.org/file/bot$_TOKEN_"
local param=$(getopt --name "$FUNCNAME" \
--options 'f:d:' \
--longoptions 'file_path:,
dir:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-f|--file_path)
[[ $2 =~ \.[^.]+$ ]]
ext=$BASH_REMATCH
file_path=$2
shift 2
;;
-d|--dir)
[[ -d $2 ]] || MessageError API "$_ERR_DIR_NOT_FOUND_" "$1" "$2"
[[ -w $2 ]] || MessageError API "$_ERR_DIR_WRITE_DENIED_" "$1" "$2"
dir=${2%/}
shift 2
;;
--)
shift
break
;;
esac
done
[[ $file_path ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-f, --file_path]"
[[ $dir ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-d, --dir]"
# Gera o nome do arquivo anexando o horário de criação.
file=file$(date +%d%m%Y%H%M%S%N)${ext:-.dat}
# Executa o download da uri especificada e retorna um objeto json
# com as informações do processo. Se tiver sucesso o diretório de
# destino é retornado, caso contrário uma mensagem de erro é apresentada.
if wget -qO "$dir/$file" "$uri/$file_path"; then
# Sucesso
printf -v jq_obj '{"ok":true,"result":{"file_path":"%s"}}' "$dir/$file"
else
# Falha
printf -v jq_obj '{"ok":false,"error_code":404,"description":"Bad Request: file not found"}'
rm -f "$dir/$file" 2>/dev/null # Remove arquivo inválido.
fi
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
return $?
}
ShellBot.editMessageLiveLocation()
{
local chat_id message_id inline_message_id
local latitude longitude reply_markup jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'c:m:i:l:g:r:' \
--longoptions 'chat_id:,
message_id:,
inline_message_id:,
latitude:,
longitude:,
reply_markup:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-m|--message_id)
CheckArgType int "$1" "$2"
message_id=$2
shift 2
;;
-i|--inline_message_id)
CheckArgType int "$1" "$2"
inline_message_id=$2
shift 2
;;
-l|--latitude)
# Tipo: float
CheckArgType float "$1" "$2"
latitude=$2
shift 2
;;
-g|--longitude)
# Tipo: float
CheckArgType float "$1" "$2"
longitude=$2
shift 2
;;
-r|--reply_markup)
reply_markup=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $inline_message_id ]] && unset chat_id message_id || {
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $message_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-m, --message_id]"
}
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-d chat_id="$chat_id"} \
${message_id:+-d message_id="$message_id"} \
${inline_message_id:+-d inline_message_id="$inline_message_id"} \
${latitude:+-d latitude="$latitude"} \
${longitude:+-d longitude="$longitude"} \
${reply_markup:+-d reply_markup="$reply_markup"})
# Testa o retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
return $?
}
ShellBot.stopMessageLiveLocation()
{
local chat_id message_id inline_message_id reply_markup jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'c:m:i:r:' \
--longoptions 'chat_id:,
message_id:,
inline_message_id:,
reply_markup:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-m|--message_id)
CheckArgType int "$1" "$2"
message_id=$2
shift 2
;;
-i|--inline_message_id)
CheckArgType int "$1" "$2"
inline_message_id=$2
shift 2
;;
-r|--reply_markup)
reply_markup=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $inline_message_id ]] && unset chat_id message_id || {
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $message_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-m, --message_id]"
}
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-d chat_id="$chat_id"} \
${message_id:+-d message_id="$message_id"} \
${inline_message_id:+-d inline_message_id="$inline_message_id"} \
${reply_markup:+-d reply_markup="$reply_markup"})
# Testa o retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
return $?
}
ShellBot.setChatStickerSet()
{
local chat_id sticker_set_name jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'c:s:' \
--longoptions 'chat_id:,
sticker_set_name:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-s|--sticker_set_name)
sticker_set_name=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $sticker_set_name ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-s, --sticker_set_name]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-d chat_id="$chat_id"} \
${sticker_set_name:+-d sticker_set_name="$sticker_set_name"})
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
return $?
}
ShellBot.deleteChatStickerSet()
{
local chat_id jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'c:' \
--longoptions 'chat_id:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"})
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
return $?
}
ShellBot.inputMedia()
{
local __type __input __media __caption __parse_mode __thumb __width
local __height __duration __supports_streaming __performer __title
local __param=$(getopt --name "$FUNCNAME" \
--options 't:i:m:c:p:b:w:h:d:s:f:e:' \
--longoptions 'type:,
input:,
media:,
caption:,
parse_mode:,
thumb:,
witdh:,
height:,
duration:,
supports_streaming:,
performer:,
title:' \
-- "$@")
eval set -- "$__param"
while :
do
case $1 in
-t|--type)
__type=$2
shift 2
;;
-i|--input)
CheckArgType var "$1" "$2"
__input=$2
shift 2
;;
-m|--media)
CheckArgType file "$1" "$2"
__media=$2
shift 2
;;
-c|--caption)
__caption=$(echo -e "$2")
shift 2
;;
-p|--parse_mode)
__parse_mode=$2
shift 2
;;
-b|--thumb)
CheckArgType file "$1" "$2"
__thumb=$2
shift 2
;;
-w|--width)
CheckArgType int "$1" "$2"
__width=$2
shift 2
;;
-h|--height)
CheckArgType int "$1" "$2"
__height=$2
shift 2
;;
-d|--duration)
CheckArgType int "$1" "$2"
__duration=$2
shift 2
;;
-s|--supports_streaming)
CheckArgType bool "$1" "$2"
__supports_streaming=$2
shift 2
;;
-f|--performer)
__performer=$2
shift 2
;;
-e|--title)
__title=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $__type ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-t, --type]"
[[ $__input ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-i, --input]"
[[ $__media ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-m, --media]"
local -n __input=$__input
__input=${__input:+$__input,}{\"type\":\"$__type\",
__input+=\"media\":\"$__media\"
__input+=${__caption:+,\"caption\":\"$__caption\"}
__input+=${__parse_mode:+,\"parse_mode\":\"$__parse_mode\"}
__input+=${__thumb:+,\"thumb\":\"$__thumb\"}
__input+=${__width:+,\"width\":$__width}
__input+=${__height:+,\"height\":$__height}
__input+=${__duration:+,\"duration\":$__duration}
__input+=${__supports_streaming:+,\"supports_streaming\":$__supports_streaming}
__input+=${__performer:+,\"performer\":\"$__performer\"}
__input+=${__title:+,\"title\":\"$__title\"}}
return $?
}
ShellBot.sendMediaGroup()
{
local chat_id media disable_notification reply_to_message_id jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'c:m:n:r:' \
--longoptions 'chat_id:,
media:,
disable_notification:,
reply_to_message_id:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-m|--media)
media=[$2]
shift 2
;;
-n|--disable_notification)
CheckArgType bool "$1" "$2"
disable_notification=$2
shift 2
;;
-r|--reply_to_message_id)
CheckArgType int "$1" "$2"
reply_to_message_id=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $media ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-m, --media]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-F chat_id="$chat_id"} \
${media:+-F media="$media"} \
${disable_notification:+-F disable_notification="$disable_notification"} \
${reply_to_message_id:+-F reply_to_message_id="$reply_to_message_id"})
# Retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.editMessageMedia()
{
local chat_id message_id inline_message_id media reply_markup jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'c:i:n:m:k:' \
--longoptions 'chat_id:,
message_id:,
inline_message_id:,
media:,
reply_markup:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-i|--message_id)
CheckArgType int "$1" "$2"
message_id=$2
shift 2
;;
-n|--inline_message_id)
CheckArgType int "$1" "$2"
inline_message_id=$2
shift 2
;;
-m|--media)
media=$2
shift 2
;;
-k|--reply_markup)
reply_markup=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $inline_message_id ]] || {
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $message_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-i, --message_id]"
}
[[ $media ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-m, --media]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-F chat_id="$chat_id"} \
${message_id:+-F message_id="$message_id"} \
${inline_message_id:+-F inline_message_id="$inline_message_id"} \
${media:+-F media="$media"} \
${reply_markup:+-F reply_markup="$reply_markup"})
# Retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.sendAnimation()
{
local chat_id animation duration width height
local thumb caption parse_mode disable_notification
local reply_to_message_id reply_markup jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'c:a:d:w:h:b:o:p:n:r:k:' \
--longoptions 'chat_id:,
animation:,
duration:,
width:,
height:,
thumb:,
caption:,
parse_mode:,
disable_notification:,
reply_to_message_id:,
reply_markup:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id)
chat_id=$2
shift 2
;;
-a|--animation)
CheckArgType file "$1" "$2"
animation=$2
shift 2
;;
-d|--duration)
CheckArgType int "$1" "$2"
duartion=$2
shift 2
;;
-w|--width)
CheckArgType int "$1" "$2"
width=$2
shift 2
;;
-h|--height)
CheckArgType int "$1" "$2"
height=$2
shift 2
;;
-b|--thumb)
CheckArgType file "$1" "$2"
thumb=$2
shift 2
;;
-o|--caption)
caption=$(echo -e "$2")
shift 2
;;
-p|--parse_mode)
parse_mode=$2
shift 2
;;
-n|--disable_notification)
CheckArgType bool "$1" "$2"
disable_notification=$2
shift 2
;;
-r|--reply_to_message_id)
CheckArgType int "$1" "$2"
reply_to_message_id=$2
shift 2
;;
-k|--reply_markup)
reply_markup=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $animation ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-a, --animation]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-F chat_id="$chat_id"} \
${animation:+-F animation="$animation"} \
${duration:+-F duration="$duration"} \
${width:+-F width="$width"} \
${height:+-F height="$height"} \
${thumb:+-F thumb="$thumb"} \
${caption:+-F caption="$caption"} \
${parse_mode:+-F parse_mode="$parse_mode"} \
${disable_notification:+-F disable_notification="$disable_notification"} \
${reply_to_message_id:+-F reply_to_message_id="$reply_to_message_id"} \
${reply_markup:+-F reply_markup="$reply_markup"})
# Retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.answerInlineQuery()
{
local inline_query_id results cache_time is_personal
local next_offset switch_pm_text switch_pm_parameter
local jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'i:r:c:p:o:s:m:' \
--longoptions 'inline_query_id:,
results:,
cache_time:,
is_personal:,
next_offset:,
switch_pm_text:,
switch_pm_parameter:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-i|--inline_query_id) inline_query_id=$2; shift 2;;
-r|--results) results=[$2]; shift 2;;
-c|--cache_time) cache_time=$2; shift 2;;
-p|--is_personal) cache_time=$2; shift 2;;
-o|--next_offset) next_offset=$2; shift 2;;
-s|--switch_pm_text) switch_pm_text=$2; shift 2;;
-m|--switch_pm_parameter) switch_pm_parameter=$2; shift 2;;
--) shift; break;;
esac
done
[[ $inline_query_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-i, --inline_query_id]"
[[ $results ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-r, --results]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${inline_query_id:+-F inline_query_id="$inline_query_id"} \
${results:+-F results="$results"} \
${cache_time:+-F cache_time="$cache_time"} \
${is_personal:+-F is_personal="$is_personal"} \
${next_offset:+-F next_offset="$next_offset"} \
${switch_pm_text:+-F switch_pm_text="$switch_pm_text"} \
${switch_pm_parameter:+-F switch_pm_parameter="$switch_pm_parameter"})
# Retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.InlineQueryResult()
{
local __input __type __title __caption __reply_markup __parse_mode
local __description __input_message_content __address __audio_duration
local __audio_file_id __audio_url __document_file_id __document_url
local __first_name __foursquare_id __foursquare_type __gif_duration
local __gif_file_id __gif_height __gif_url __gif_width __hide_url
local __last_name __latitude __live_period __longitude __mime_type
local __mpeg4_duration __mpeg4_file_id __mpeg4_height __mpeg4_url
local __mpeg4_width __performer __photo_file_id __photo_height
local __photo_url __photo_width __sticker_file_id __vcard __phone_number
local __thumb_height __thumb_url __thumb_width __url __id
local __video_duration __video_file_id __video_height __video_url
local __video_width __voice_duration __voice_file_id __voice_url
local __param=$(getopt --name "$FUNCNAME" \
--options 'i:t:l:c:k:p:r:d:m:b:s:x:w:v:z:y:q:a:f:u:g:o:n:h:j:e:
N:R:D:A:X:G:C:Q:L:Y:E:V:H:Z:T:F:U:M:S:O:I:K:B:P:J:W:' \
--longoptions 'input:,
type:,
title:,
caption:,
reply_markup:,
parse_mode:,
id:,
description:,
input_message_content:,
address:,
audio_duration:,
audio_file_id:,
audio_url:,
document_file_id:,
document_url:,
first_name:,
foursquare_id:,
foursquare_type:,
gif_duration:,
gif_file_id:,
gif_height:,
gif_url:,
gif_width:,
hide_url:,
last_name:,
latitude:,
live_period:,
longitude:,
mime_type:,
mpeg4_duration:,
mpeg4_file_id:,
mpeg4_height:,
mpeg4_url:,
mpeg4_width:,
performer:,
photo_file_id:,
photo_height:,
photo_url:,
photo_width:,
sticker_file_id:,
thumb_height:,
thumb_url:,
thumb_width:,
url:,
vcard:,
video_duration:,
video_file_id:,
video_height:,
video_url:,
video_width:,
voice_duration:,
voice_file_id:,
voice_url:,
phone_number:' \
-- "$@")
eval set -- "$__param"
while :
do
case $1 in
-i|--input) CheckArgType var "$1" "$2"
__input=$2; shift 2;;
-t|--type) __type=$2; shift 2;;
-l|--title) __title=$2; shift 2;;
-c|--caption) __caption=$2; shift 2;;
-k|--reply_markup) __reply_markup=$2; shift 2;;
-p|--parse_mode) __parse_mode=$2; shift 2;;
-r|--id) __id=$2; shift 2;;
-d|--description) __description=$2; shift 2;;
-m|--input_message_content) __input_message_content=$2; shift 2;;
-b|--address) __address=$2; shift 2;;
-s|--audio_duration) __audio_duration=$2; shift 2;;
-x|--audio_file_id) __audio_file_id=$2; shift 2;;
-w|--audio_url) __audio_url=$2; shift 2;;
-v|--document_file_id) __document_file_id=$2; shift 2;;
-z|--document_url) __document_url=$2; shift 2;;
-y|--first_name) __first_name=$2; shift 2;;
-q|--foursquare_id) __foursquare_id=$2; shift 2;;
-a|--foursquare_type) __foursquare_type=$2; shift 2;;
-f|--gif_duration) __gif_duration=$2; shift 2;;
-u|--gif_file_id) __gif_file_id=$2 shift 2;;
-g|--gif_height) __gif_height=$2; shift 2;;
-o|--gif_url) __gif_url=$2; shift 2;;
-n|--gif_width) __gif_width=$2; shift 2;;
-h|--hide_url) __hide_url=$2; shift 2;;
-j|--last_name) __last_name=$2; shift 2;;
-e|--latitude) __latitude=$2; shift 2;;
-N|--live_period) __live_period=$2; shift 2;;
-R|--longitude) __longitude=$2; shift 2;;
-D|--mime_type) __mime_type=$2; shift 2;;
-A|--mpeg4_duration) __mpeg4_duration=$2; shift 2;;
-X|--mpeg4_file_id) __mpeg4_file_id=$2; shift 2;;
-G|--mpeg4_height) __mpeg4_height=$2; shift 2;;
-C|--mpeg4_url) __mpeg4_url=$2; shift 2;;
-Q|--mpeg4_width) __mpeg4_width=$2; shift 2;;
-L|--performer) __performer=$2; shift 2;;
-Y|--photo_file_id) __photo_file_id=$2; shift 2;;
-E|--photo_height) __photo_height=$2; shift 2;;
-V|--photo_url) __photo_url=$2; shift 2;;
-H|--photo_width) __photo_width=$2; shift 2;;
-Z|--sticker_file_id) __sticker_file_id=$2; shift 2;;
-T|--thumb_height) __thumb_height=$2; shift 2;;
-F|--thumb_url) __thumb_url=$2; shift 2;;
-U|--thumb_width) __thumb_width=$2; shift 2;;
-M|--url) __url=$2; shift 2;;
-S|--vcard) __vcard=$2; shift 2;;
-O|--video_duration) __video_duration=$2; shift 2;;
-I|--video_file_id) __video_file_id=$2; shift 2;;
-K|--video_height) __video_height=$2; shift 2;;
-B|--video_url) __video_url=$2; shift 2;;
-P|--video_width) __video_width=$2; shift 2;;
-J|--voice_duration) __voice_duration=$2; shift 2;;
-W|--voice_file_id) __voice_file_id=$2; shift 2;;
--phone_number) __phone_number=$2; shift 2;;
--voice_url) __voice_url=$2; shift 2;;
--) shift; break;;
esac
done
[[ $__input ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-i, --input]"
local -n __input=$__input
__input=${__input:+$__input,}{\"type\":\"$__type\"
__input+=${__title:+,\"title\":\"$__title\"}
__input+=${__caption:+,\"caption\":\"$__caption\"}
__input+=${__reply_markup:+,\"reply_markup\":\"$__reply_markup\"}
__input+=${__parse_mode:+,\"parse_mode\":\"$__parse_mode\"}
__input+=${__id:+,\"id\":\"$__id\"}
__input+=${__description:+,\"description\":\"$__description\"}
__input+=${__input_message_content:+,\"input_message_content\":$__input_message_content}
__input+=${__address:+,\"address\":\"$__address\"}
__input+=${__audio_duration:+,\"audio_duration\":$__audio_duration}
__input+=${__audio_file_id:+,\"audio_file_id\":\"$__audio_file_id\"}
__input+=${__audio_url:+,\"audio_url\":\"$__audio_url\"}
__input+=${__document_file_id:+,\"document_file_id\":\"$__document_file_id\"}
__input+=${__document_url:+,\"document_url\":\"$__document_url\"}
__input+=${__first_name:+,\"first_name\":\"$__first_name\"}
__input+=${__foursquare_id:+,\"foursquare_id\":\"$__foursquare_id\"}
__input+=${__foursquare_type:+,\"foursquare_type\":\"$__foursquare_type\"}
__input+=${__gif_duration:+,\"gif_duration\":$__gif_duration}
__input+=${__gif_file_id:+,\"gif_file_id\":\"$__gif_file_id\"}
__input+=${__gif_height:+,\"gif_height\":$__gif_height}
__input+=${__gif_url:+,\"gif_url\":\"$__gif_url\"}
__input+=${__gif_width:+,\"gif_width\":$__gif_width}
__input+=${__hide_url:+,\"hide_url\":\"$__hide_url\"}
__input+=${__last_name:+,\"last_name\":\"$__last_name\"}
__input+=${__latitude:+,\"latitude\":$__latitude}
__input+=${__live_period:+,\"live_period\":$__live_period}
__input+=${__longitude:+,\"longitude\":$__longitude}
__input+=${__mime_type:+,\"mime_type\":\"$__mime_type\"}
__input+=${__mpeg4_duration:+,\"mpeg4_duration\":$__mpeg4_duration}
__input+=${__mpeg4_file_id:+,\"mpeg4_file_id\":\"$__mpeg4_file_id\"}
__input+=${__mpeg4_height:+,\"mpeg4_height\":$__mpeg4_height}
__input+=${__mpeg4_url:+,\"mpeg4_url\":\"$__mpeg4_url\"}
__input+=${__mpeg4_width:+,\"mpeg4_width\":$__mpeg4_width}
__input+=${__performer:+,\"performer\":\"$__performer\"}
__input+=${__photo_file_id:+,\"photo_file_id\":\"$__photo_file_id\"}
__input+=${__photo_height:+,\"photo_height\":$__photo_height}
__input+=${__photo_url:+,\"photo_url\":\"$__photo_url\"}
__input+=${__photo_width:+,\"photo_width\":$__photo_width}
__input+=${__sticker_file_id:+,\"sticker_file_id\":\"$__sticker_file_id\"}
__input+=${__thumb_height:+,\"thumb_height\":$__thumb_height}
__input+=${__thumb_url:+,\"thumb_url\":\"$__thumb_url\"}
__input+=${__thumb_width:+,\"thumb_width\":$__thumb_width}
__input+=${__url:+,\"url\":\"$__url\"}
__input+=${__vcard:+,\"vcard\":\"$__vcard\"}
__input+=${__video_duration:+,\"video_duration\":$__video_duration}
__input+=${__video_file_id:+,\"video_file_id\":\"$__video_file_id\"}
__input+=${__video_height:+,\"video_height\":$__video_height}
__input+=${__video_url:+,\"video_url\":\"$__video_url\"}
__input+=${__video_width:+,\"video_width\":$__video_width}
__input+=${__voice_duration:+,\"voice_duration\":$__voice_duration}
__input+=${__voice_file_id:+,\"voice_file_id\":\"$__voice_file_id\"}
__input+=${__voice_url:+,\"voice_url\":\"$__voice_url\"}
__input+=${__phone_number:+,\"phone_number\":\"$__phone_number\"}}
return $?
}
ShellBot.InputMessageContent()
{
local message_text parse_mode disable_web_page_preview json
local latitude longitude live_period title address foursquare_id
local foursquare_type phone_number first_name last_name vcard
local param=$(getopt --name "$FUNCNAME" \
--options 't:p:w:l:v:e:a:f:q:n:m:s:d:' \
--longoptions 'message_text:,
parse_mode:,
disable_web_page_preview:,
latitude:,
longitude:,
live_period:,
title:,
address:,
foursquare_id:,
foursquare_type:,
phone_number:,
first_name:,
last_name:,
vcard:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-t|--message_text) message_text=$(echo -e "$2"); shift 2;;
-p|--parse_mode) parse_mode=$2; shift 2;;
-w|--disable_web_page_preview) disable_web_page_preview=$2; shift 2;;
-l|--latitude) latitude=$2; shift 2;;
-g|--longitude) longitude=$2; shift 2;;
-v|--live_period) live_period=$2; shift 2;;
-e|--title) title=$2; shift 2;;
-a|--address) address=$2; shift 2;;
-f|--foursquare_id) foursquare_id=$2; shift 2;;
-q|--foursquare_type) foursquare_type=$2; shift 2;;
-n|--phone_number) phone_number=$2; shift 2;;
-m|--first_name) first_name=$2; shift 2;;
-s|--last_name) last_name=$2; shift 2;;
-d|--vcard) vcard=$2; shift 2;;
--) shift; break;;
esac
done
json=${message_text:+\"message_text\":\"$message_text\"}
json+=${parse_mode:+,\"parse_mode\":\"$parse_mode\"}
json+=${disable_web_page_preview:+,\"disable_web_page_preview\":$disable_web_page_preview}
json+=${latitude:+,\"latitude\":$latitude}
json+=${longitude:+,\"longtitude\":$longitude}
json+=${live_period:+,\"live_period\":$live_period}
json+=${title:+,\"title\":\"$title\"}
json+=${address:+,\"address\":\"$address\"}
json+=${foursquare_id:+,\"foursquare_id\":\"$foursquare_id\"}
json+=${foursquare_type:+,\"foursquare_type\":\"$foursquare_type\"}
json+=${phone_number:+,\"phone_number\":\"$phone_number\"}
json+=${first_name:+,\"first_name\":\"$first_name\"}
json+=${last_name:+,\"last_name\":\"$last_name\"}
json+=${vcard:+,\"vcard\":\"$vcard\"}
echo "{${json#,}}"
return $?
}
ShellBot.ChatPermissions()
{
local can_send_messages can_send_media_messages can_send_polls
local can_send_other_messages can_add_web_page_previews json
local can_change_info can_invite_users can_pin_messages
local param=$(getopt --name "$FUNCNAME" \
--options 'm:d:l:o:w:c:i:p:' \
--longoptions 'can_send_messages:,
can_send_media_messages:,
can_send_polls:,
can_send_other_messages:,
can_add_web_page_previews:,
can_change_info:,
can_invite_users:,
can_pin_messages:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-m|--can_send_messages) can_send_messages=$2;;
-d|--can_send_media_messages) can_send_media_messages=$2;;
-l|--can_send_polls) can_send_polls=$2;;
-o|--can_send_other_messages) can_send_other_messages=$2;;
-w|--can_add_web_page_previews) can_add_web_page_previews=$2;;
-c|--can_change_info) can_change_info=$2;;
-i|--can_invite_users) can_invite_users=$2;;
-p|--can_pin_messages) can_pin_messages=$2;;
--) shift; break;;
esac
shift 2
done
json=${can_send_messages:+\"can_send_messages\":$can_send_messages,}
json+=${can_send_media_messages:+\"can_send_media_messages\":$can_send_media_messages,}
json+=${can_send_polls:+\"can_send_polls\":$can_send_polls,}
json+=${can_send_other_messages:+\"can_send_other_messages\":$can_send_other_messages,}
json+=${can_add_web_page_previews:+\"can_add_web_page_previews\":$can_add_web_page_previews,}
json+=${can_change_info:+\"can_change_info\":$can_change_info,}
json+=${can_invite_users:+\"can_invite_users\":$can_invite_users,}
json+=${can_pin_messages:+\"can_pin_messages\":$can_pin_messages,}
# Retorna o objeto de permissões.
echo "{${json%,}}"
# Status
return $?
}
ShellBot.setChatPermissions()
{
local chat_id permissions jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'c:p:' \
--longoptions 'chat_id:,permissions:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id) chat_id=$2;;
-p|--permissions) permissions=$2;;
--) shift; break;;
esac
shift 2
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $permissions ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-p, --permissions]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-d chat_id="$chat_id"} \
${permissions:+-d permissions="$permissions"})
# Retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.setChatAdministratorCustomTitle()
{
local chat_id user_id custom_title jq_obj
local param=$(getopt --name "$FUNCNAME" \
--options 'c:u:t:' \
--longoptions 'chat_id:,
user_id:,
custom_title:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id) chat_id=$2;;
-u|--user_id) user_id=$2;;
-t|--custom_title) custom_title=$2;;
--) shift; break;;
esac
shift 2
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $user_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-u, --user_id]"
[[ $custom_title ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-t, --custom_title]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-d chat_id="$chat_id"} \
${user_id:+-d user_id="$user_id"} \
${custom_tilte:+-d custom_title="$custom_title"})
# Retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.sendPoll()
{
local chat_id question options is_anonymous reply_markup
local type allows_multiple_answers correct_option_id jq_obj
local is_closed disable_notification reply_to_message_id
local explanation explanation_parse_mode open_period close_date
local param=$(getopt --name "$FUNCNAME" \
--options 'c:q:o:a:k:t:m:i:x:z:p:d:l:n:r:' \
--longoptions 'chat_id:,
question:,
options:,
is_anonymous:,
reply_markup:,
type:,
allows_multiple_answers:,
correct_option_id:,
explanation:,
explanation_parse_mode:,
open_period:,
close_date:,
is_closed:,
disable_notification:,
reply_to_message_id:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id) chat_id=$2;;
-q|--question) question=$(echo -e "$2");;
-o|--options) options=$(echo -e "$2");;
-a|--is_anonymous) is_anonymous=$2;;
-k|--reply_markup) reply_markup=$2;;
-t|--type) type=$2;;
-m|--allows_multiple_answers) allows_multiple_answers=$2;;
-i|--correct_option_id) correct_option_id=$2;;
-x|--explanation) explanation=$2;;
-z|--explanation_parse_mode) explanation_parse_mode=$2;;
-p|--open_period) open_period=$2;;
-d|--close_date) close_date=$2;;
-l|--is_closed) is_closed=$2;;
-n|--disable_notification) disable_notification=$2;;
-r|--reply_to_message_id) reply_to_message_id=$2;;
--) shift; break;;
esac
shift 2
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
[[ $question ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-q, --question]"
[[ $options ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-o, --options]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-d chat_id="$chat_id"} \
${question:+-d question="$question"} \
${options:+-d options="$options"} \
${is_anonymous:+-d is_anonymous="$is_anonymous"} \
${reply_markup:+-d reply_markup="$reply_markup"} \
${type:+-d type="$type"} \
${allows_multiple_answers:+-d allows_multiple_answers="$allows_multiple_answers"} \
${correct_option_id:+-d correct_option_id="$correct_option_id"} \
${explanation:+-d explanation="$explanation"} \
${explanation_parse_mode:+-d explanation_parse_mode="$explanation_parse_mode"} \
${open_period:+-d open_period="$open_period"} \
${close_date:+-d close_date="$close_date"} \
${is_closed:+-d is_closed="$is_closed"} \
${disable_notification:+-d disable_notification="$disable_notification"} \
${reply_to_message_id:+-d reply_to_message_id="$reply_to_message_id"})
# Retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.KeyboardButtonPollType()
{
local type
local param=$(getopt --name "$FUNCNAME" --options 't:' --longoptions 'type:' -- "$@")
eval set -- "$param"
while :
do
case $1 in
-t|--type) type=$2;;
--) shift; break;;
esac
shift 2
done
[[ $type ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-t, --type]"
printf '{"type": "%s"}' "$type"
return 0
}
ShellBot.sendDice()
{
local chat_id disable_notification reply_to_message_id
local reply_markup jq_obj emoji
local param=$(getopt --name "$FUNCNAME" \
--options 'c:e:n:r:k:' \
--longoptions 'chat_id:,
emoji:,
disable_notification:,
reply_to_message_id:,
reply_markup:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--chat_id) chat_id=$2;;
-e|--emoji) emoji=$2;;
-n|--disable_notification) disable_notification=$2;;
-r|--reply_to_message_id) reply_to_message_id=$2;;
-k|--reply_markup) reply_markup=$2;;
--) shift; break;;
esac
shift 2
done
[[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${chat_id:+-d chat_id="$chat_id"} \
${emoji:+-d emoji="$emoji"} \
${disable_notification:+-d disable_notification="$disable_notification"} \
${reply_to_message_id:+-d reply_to_message_id="$reply_to_message_id"} \
${reply_markup:+-d reply_markup="$reply_markup"})
# Retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.getMyCommands()
{
local jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.})
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
return $?
}
ShellBot.setMyCommands()
{
local jq_obj commands
local param=$(getopt --name "$FUNCNAME" \
--options 'c:' \
--longoptions 'commands:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-c|--commands) commands=$2;;
--) break;;
esac
shift 2
done
[[ $commands ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --commands]"
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${commands:+-d commands="$commands"})
# Retorno do método
MethodReturn "$jq_obj" || MessageError TG "$jq_obj"
# Status
return $?
}
ShellBot.BotCommand()
{
local __command __description __list
local __param=$(getopt --name "$FUNCNAME" \
--options 'l:c:d:' \
--longoptions 'list:,
command:,
description:' \
-- "$@")
eval set -- "$__param"
while :
do
case $1 in
-l|--list) CheckArgType var "$1" "$2"; __list=$2;;
-c|--command) __command=$2;;
-d|--description) __description=$2;;
--) break;;
esac
shift 2
done
[[ $__list ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-l, --list]"
[[ $__command ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --command]"
[[ $__description ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-d, --description]"
printf -v $__list '%s' "${!__list#[}"
printf -v $__list '%s' "${!__list%]}"
printf -v $__list '%s{"command": "%s", "description": "%s"}' \
"${!__list:+${!__list},}" \
"$__command" \
"$__description"
printf -v $__list '%s' "[${!__list}]"
return $?
}
ShellBot.setMessageRules()
{
local action command user_id username chat_id
local chat_type time date language message_id
local is_bot text entities_type file_type name
local query_data query_id query_text send_message
local chat_member mime_type num_args exec rule
local action_args weekday user_status chat_name
local message_status reply_message parse_mode
local forward_message reply_markup continue i
local author_signature bot_action auth_file
local param=$(getopt --name "$FUNCNAME" \
--options 's:a:z:c:i:u:h:v:y:l:m:b:t:n:f:p:q:r:g:o:e:d:w:j:x:R:S:F:K:P:E:A:C:B:T:' \
--longoptions 'name:,
action:,
action_args:,
command:,
user_id:,
username:,
chat_id:,
chat_name:,
chat_type:,
language_code:,
message_id:,
is_bot:,
text:,
entitie_type:,
file_type:,
mime_type:,
query_data:,
query_id:,
chat_member:,
num_args:,
time:,
date:,
weekday:,
user_status:,
message_status:,
exec:,
auth_file:,
bot_reply_message:,
bot_send_message:,
bot_forward_message:,
bot_reply_markup:,
bot_parse_mode:,
bot_action:,
author_signature:,
continue' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-s|--name)
CheckArgType flag "$1" "$2"
name=$2
shift 2
;;
-a|--action)
CheckArgType func "$1" "$2"
action=$2
shift 2
;;
-z|--action_args)
action_args=$2
shift 2
;;
-c|--command)
CheckArgType cmd "$1" "$2"
command=$2
shift 2
;;
-i|--user_id)
user_id=${user_id:+$user_id|}${2//[,$'\n']/|}
shift 2
;;
-u|--username)
username=${username:+$username|}${2//[,$'\n']/|}
shift 2
;;
-h|--chat_id)
chat_id=${chat_id:+$chat_id|}${2//[,$'\n']/|}
shift 2
;;
-v|--chat_name)
chat_name=${chat_name:+$chat_name|}${2//[,$'\n']/|}
shift 2
;;
-y|--chat_type)
chat_type=${chat_type:+$chat_type|}${2//[,$'\n']/|}
shift 2
;;
-e|--time)
time=${time:+$time|}${2//[,$'\n']/|}
shift 2
;;
-d|--date)
date=${date:+$date|}${2//[,$'\n']/|}
shift 2
;;
-l|--laguage_code)
language=${language:+$language|}${2//[,$'\n']/|}
shift 2
;;
-m|--message_id)
message_id=${message_id:+$message_id|}${2//[,$'\n']/|}
shift 2
;;
-b|--is_bot)
is_bot=${is_bot:+$is_bot|}${2//[,$'\n']/|}
shift 2
;;
-t|--text)
text=${2//$'\n'/|}
shift 2
;;
-n|--entitie_type)
entities_type=${entities_type:+$entities_type|}${2//[,$'\n']/|}
shift 2
;;
-f|--file_type)
file_type=${file_type:+$file_type|}${2//[,$'\n']/|}
shift 2
;;
-p|--mime_type)
mime_type=${mime_type:+$mime_type|}${2//[,$'\n']/|}
shift 2
;;
-q|--query_data)
query_data=${query_data:+$query_data|}${2//[,$'\n']/|}
shift 2
;;
-r|--query_id)
query_id=${query_id:+$query_id|}${2//[,$'\n']/|}
shift 2
;;
-g|--chat_member)
chat_member=${chat_member:+$chat_member|}${2//[,$'\n']/|}
shift 2
;;
-o|--num_args)
num_args=${num_args:+$num_args|}${2//[,$'\n']/|}
shift 2
;;
-w|--weekday)
weekday=${weekday:+$weekday|}${2//[,$'\n']/|}
shift 2
;;
-j|--user_status)
user_status=${user_status:+$user_status|}${2//[,$'\n']/|}
shift 2
;;
-x|--message_status)
message_status=${message_status:+$message_status|}${2//[,$'\n']/|}
shift 2
;;
-T|--auth_file)
auth_file=${auth_file:+$auth_file|}${2//[,$'\n']/|}
shift 2
;;
-R|--bot_reply_message)
reply_message=$2
shift 2
;;
-S|--bot_send_message)
send_message=$2
shift 2
;;
-F|--bot_forward_message)
forward_message=${forward_message:+$forward_message|}${2//[,$'\n']/|}
shift 2
;;
-K|--bot_reply_markup)
reply_markup=$2
shift 2
;;
-P|--bot_parse_mode)
parse_mode=$2
shift 2
;;
-B|--bot_action)
bot_action=$2
shift 2
;;
-E|--exec)
exec=$2
shift 2
;;
-A|--author_signature)
author_signature=${author_signature:+$author_signature|}${2//[,$'\n']/|}
shift 2
;;
-C|--continue)
continue=true
shift
;;
--)
shift
break
;;
esac
done
[[ $name ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-s, --name]"
[[ ${_BOT_RULES_[$name]} ]] && MessageError API "$_ERR_RULE_ALREADY_EXISTS_" "[-s, --name]" "$name"
i=${_BOT_RULES_INDEX_:=0}
_BOT_RULES_[$i:source]=${BASH_SOURCE[1]##*/}
_BOT_RULES_[$i:line]=${BASH_LINENO}
_BOT_RULES_[$i:name]=${name}
_BOT_RULES_[$i:action]=${action}
_BOT_RULES_[$i:action_args]=${action_args}
_BOT_RULES_[$i:user_id]=${user_id}
_BOT_RULES_[$i:username]=${username}
_BOT_RULES_[$i:chat_id]=${chat_id}
_BOT_RULES_[$i:chat_name]=${chat_name}
_BOT_RULES_[$i:chat_type]=${chat_type}
_BOT_RULES_[$i:language_code]=${language}
_BOT_RULES_[$i:message_id]=${message_id}
_BOT_RULES_[$i:is_bot]=${is_bot}
_BOT_RULES_[$i:command]=${command}
_BOT_RULES_[$i:text]=${text}
_BOT_RULES_[$i:entities_type]=${entities_type}
_BOT_RULES_[$i:file_type]=${file_type}
_BOT_RULES_[$i:mime_type]=${mime_type}
_BOT_RULES_[$i:query_data]=${query_data}
_BOT_RULES_[$i:query_id]=${query_id}
_BOT_RULES_[$i:chat_member]=${chat_member}
_BOT_RULES_[$i:num_args]=${num_args}
_BOT_RULES_[$i:time]=${time}
_BOT_RULES_[$i:date]=${date}
_BOT_RULES_[$i:weekday]=${weekday}
_BOT_RULES_[$i:user_status]=${user_status}
_BOT_RULES_[$i:message_status]=${message_status}
_BOT_RULES_[$i:author_signature]=${author_signature}
_BOT_RULES_[$i:auth_file]=${auth_file}
_BOT_RULES_[$i:bot_reply_message]=${reply_message}
_BOT_RULES_[$i:bot_send_message]=${send_message}
_BOT_RULES_[$i:bot_forward_message]=${forward_message}
_BOT_RULES_[$i:bot_reply_markup]=${reply_markup}
_BOT_RULES_[$i:bot_parse_mode]=${parse_mode}
_BOT_RULES_[$i:bot_action]=${bot_action}
_BOT_RULES_[$i:exec]=${exec}
_BOT_RULES_[$i:continue]=${continue}
_BOT_RULES_[$name]=true
# Incrementa índice.
((_BOT_RULES_INDEX_++))
return $?
}
ShellBot.manageRules()
{
local uid rule botcmd err tm stime etime ctime mime_type weekday
local dt sdate edate cdate mem ent type args status out fwid
local stdout i re match file user line
local u_message_text u_message_id u_message_from_is_bot
local u_message_from_id u_message_from_username msgstatus argpos
local u_message_from_language_code u_message_chat_id message_status
local u_message_chat_type u_message_date u_message_entities_type
local u_message_mime_type u_message_author_signature
local param=$(getopt --name "$FUNCNAME" \
--options 'u:' \
--longoptions 'update_id:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-u|--update_id)
CheckArgType int "$1" "$2"
uid=$2
shift 2
;;
--)
shift
break
;;
esac
done
[[ $uid ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-u, --update_id]"
# Regras (somente-leitura)
readonly _BOT_RULES_ _BOT_RULES_INDEX_
[[ ${u_message_text:=${message_text[$uid]}} ]] ||
[[ ${u_message_text:=${edited_message_text[$uid]}} ]] ||
[[ ${u_message_text:=${callback_query_message_text[$uid]}} ]] ||
[[ ${u_message_text:=${inline_query_query[$uid]}} ]] ||
[[ ${u_message_text:=${chosen_inline_result_query[$uid]}} ]] ||
[[ ${u_message_text:=${channel_post_text[$uid]}} ]] ||
[[ ${u_message_text:=${edited_channel_post_text[$uid]}} ]]
[[ ${u_message_id:=${message_message_id[$uid]}} ]] ||
[[ ${u_message_id:=${edited_message_message_id[$uid]}} ]] ||
[[ ${u_message_id:=${callback_query_message_message_id[$uid]}} ]] ||
[[ ${u_message_id:=${inline_query_id[$uid]}} ]] ||
[[ ${u_message_id:=${chosen_inline_result_result_id[$uid]}} ]] ||
[[ ${u_message_id:=${channel_post_message_id[$uid]}} ]] ||
[[ ${u_message_id:=${edited_channel_post_message_id[$uid]}} ]] ||
[[ ${u_message_id:=${poll_answer_poll_id[$uid]}} ]]
[[ ${u_message_from_is_bot:=${message_from_is_bot[$uid]}} ]] ||
[[ ${u_message_from_is_bot:=${edited_message_from_is_bot[$uid]}} ]] ||
[[ ${u_message_from_is_bot:=${callback_query_from_is_bot[$uid]}} ]] ||
[[ ${u_message_from_is_bot:=${inline_query_from_is_bot[$uid]}} ]] ||
[[ ${u_message_from_is_bot:=${chosen_inline_result_from_is_bot[$uid]}} ]] ||
[[ ${u_message_from_is_bot:=${poll_answer_user_is_bot[$uid]}} ]]
[[ ${u_message_from_id:=${message_from_id[$uid]}} ]] ||
[[ ${u_message_from_id:=${edited_message_from_id[$uid]}} ]] ||
[[ ${u_message_from_id:=${callback_query_from_id[$uid]}} ]] ||
[[ ${u_message_from_id:=${inline_query_from_id[$uid]}} ]] ||
[[ ${u_message_from_id:=${chosen_inline_result_from_id[$uid]}} ]] ||
[[ ${u_message_from_id:=${poll_answer_user_id[$uid]}} ]]
[[ ${u_message_from_username:=${message_from_username[$uid]}} ]] ||
[[ ${u_message_from_username:=${edited_message_from_username[$uid]}} ]] ||
[[ ${u_message_from_username:=${callback_query_from_username[$uid]}} ]] ||
[[ ${u_message_from_username:=${inline_query_from_username[$uid]}} ]] ||
[[ ${u_message_from_username:=${chosen_inline_result_from_username[$uid]}} ]] ||
[[ ${u_message_from_username:=${poll_answer_user_username[$uid]}} ]]
[[ ${u_message_from_language_code:=${message_from_language_code[$uid]}} ]] ||
[[ ${u_message_from_language_code:=${edited_message_from_language_code[$uid]}} ]] ||
[[ ${u_message_from_language_code:=${callback_query_from_language_code[$uid]}} ]] ||
[[ ${u_message_from_language_code:=${inline_query_from_language_code[$uid]}} ]] ||
[[ ${u_message_from_language_code:=${chosen_inline_result_from_language_code[$uid]}} ]]
[[ ${u_message_chat_id:=${message_chat_id[$uid]}} ]] ||
[[ ${u_message_chat_id:=${edited_message_chat_id[$uid]}} ]] ||
[[ ${u_message_chat_id:=${callback_query_message_chat_id[$uid]}} ]] ||
[[ ${u_message_chat_id:=${channel_post_chat_id[$uid]}} ]] ||
[[ ${u_message_chat_id:=${edited_channel_post_chat_id[$uid]}} ]]
[[ ${u_message_chat_username:=${message_chat_username[$uid]}} ]] ||
[[ ${u_message_chat_username:=${edited_message_chat_username[$uid]}} ]] ||
[[ ${u_message_chat_username:=${callback_query_message_chat_username[$uid]}} ]]
[[ ${u_message_chat_type:=${message_chat_type[$uid]}} ]] ||
[[ ${u_message_chat_type:=${edited_message_chat_type[$uid]}} ]] ||
[[ ${u_message_chat_type:=${callback_query_message_chat_type[$uid]}} ]] ||
[[ ${u_message_chat_type:=${channel_post_chat_type[$uid]}} ]] ||
[[ ${u_message_chat_type:=${edited_channel_post_chat_type[$uid]}} ]]
[[ ${u_message_date:=${message_date[$uid]}} ]] ||
[[ ${u_message_date:=${edited_message_edit_date[$uid]}} ]] ||
[[ ${u_message_date:=${callback_query_message_date[$uid]}} ]] ||
[[ ${u_message_date:=${channel_post_date[$uid]}} ]] ||
[[ ${u_message_date:=${edited_channel_post_date[$uid]}} ]]
[[ ${u_message_entities_type:=${message_entities_type[$uid]}} ]] ||
[[ ${u_message_entities_type:=${edited_message_entities_type[$uid]}} ]] ||
[[ ${u_message_entities_type:=${callback_query_message_entities_type[$uid]}} ]] ||
[[ ${u_message_entities_type:=${channel_post_entities_type[$uid]}} ]] ||
[[ ${u_message_entities_type:=${edited_channel_post_entities_type[$uid]}} ]]
[[ ${u_message_mime_type:=${message_document_mime_type[$uid]}} ]] ||
[[ ${u_message_mime_type:=${message_video_mime_type[$uid]}} ]] ||
[[ ${u_message_mime_type:=${message_audio_mime_type[$uid]}} ]] ||
[[ ${u_message_mime_type:=${message_voice_mime_type[$uid]}} ]] ||
[[ ${u_message_mime_type:=${channel_post_document_mime_type[$uid]}} ]]
[[ ${u_message_author_signature:=${channel_post_author_signature[$uid]}} ]] ||
[[ ${u_message_author_signature:=${edited_channel_post_author_signature[$uid]}} ]]
# Regras
for ((i=0; i < _BOT_RULES_INDEX_; i++)); do
IFS=' ' read -ra args <<< $u_message_text
[[ ! ${_BOT_RULES_[$i:num_args]} || ${#args[@]} == @(${_BOT_RULES_[$i:num_args]}) ]] &&
[[ ! ${_BOT_RULES_[$i:command]} || ${u_message_text%% *} == @(${_BOT_RULES_[$i:command]})?(@${_BOT_INFO_[3]}) ]] &&
[[ ! ${_BOT_RULES_[$i:message_id]} || $u_message_id == @(${_BOT_RULES_[$i:message_id]}) ]] &&
[[ ! ${_BOT_RULES_[$i:is_bot]} || $u_message_from_is_bot == @(${_BOT_RULES_[$i:is_bot]}) ]] &&
[[ ! ${_BOT_RULES_[$i:user_id]} || $u_message_from_id == @(${_BOT_RULES_[$i:user_id]}) ]] &&
[[ ! ${_BOT_RULES_[$i:username]} || $u_message_from_username == @(${_BOT_RULES_[$i:username]}) ]] &&
[[ ! ${_BOT_RULES_[$i:language]} || $u_message_from_language_code == @(${_BOT_RULES_[$i:language]}) ]] &&
[[ ! ${_BOT_RULES_[$i:chat_id]} || $u_message_chat_id == @(${_BOT_RULES_[$i:chat_id]}) ]] &&
[[ ! ${_BOT_RULES_[$i:chat_name]} || $u_message_chat_username == @(${_BOT_RULES_[$i:chat_name]}) ]] &&
[[ ! ${_BOT_RULES_[$i:chat_type]} || $u_message_chat_type == @(${_BOT_RULES_[$i:chat_type]}) ]] &&
[[ ! ${_BOT_RULES_[$i:author_signature]} || $u_message_author_signature == @(${_BOT_RULES_[$i:author_signature]}) ]] &&
[[ ! ${_BOT_RULES_[$i:mime_type]} || $u_message_mime_type == @(${_BOT_RULES_[$i:mime_type]}) ]] &&
[[ ! ${_BOT_RULES_[$i:query_id]} || ${callback_query_id[$uid]} == @(${_BOT_RULES_[$i:query_id]}) ]] &&
[[ ! ${_BOT_RULES_[$i:query_data]} || ${callback_query_data[$uid]} == @(${_BOT_RULES_[$i:query_data]}) ]] &&
[[ ! ${_BOT_RULES_[$i:weekday]} || $(printf '%(%u)T' $u_message_date) == @(${_BOT_RULES_[$i:weekday]}) ]] &&
[[ ! ${_BOT_RULES_[$i:text]} || $u_message_text =~ ${_BOT_RULES_[$i:text]} ]] || continue
# Extrai os arquivos do conjunto negado. Caso esteja ausente
# define a expressão padrão.
# Captura os grupos contidos no padrão, separando o
# operador de negação '!' (se presente) para determinar o
# tratamento de valição do intervalo.
#
# Exemplo 1:
#
# BASH_REMATCH[2]
# __________|__________
# | |
# !(12:00-13:00,15:00-17:00)
# |
# |_ BASH_REMATCH[1]
#
re='^(!)\(([^)]+)\)$'
[[ ${_BOT_RULES_[$i:auth_file]} =~ $re ]]
match=${BASH_REMATCH[2]:-${_BOT_RULES_[$i:auth_file]}}
for file in ${match//|/ }; do
# Testa acesso ao arquivo.
if ! [[ -f "$file" && -r "$file" ]]; then
MessageError API "'$file' $_ERR_FILE_NOT_FOUND_" "${_BOT_RULES_[$i:name]}" '[-T, --auth_file]'
fi
# Lê os usuários removendo os comentários complementares
# e ignora a linha prefixada com hashtag '#'.
while read -r line; do
user=${line%%*( )#*}
[[ $user != *( )#* ]] &&
[[ $user == $u_message_from_id || $user == $u_message_from_username ]] && break 2
done < "$file"
done
((${BASH_REMATCH[1]} $?)) && continue
for msgstatus in ${_BOT_RULES_[$i:message_status]//|/ }; do
[[ $msgstatus == pinned && ${message_pinned_message_message_id[$uid]:-${channel_post_pinned_message_message_id[$uid]}} ]] ||
[[ $msgstatus == edited && ${edited_message_message_id[$uid]:-${edited_channel_post_message_id[$uid]}} ]] ||
[[ $msgstatus == forwarded && ${message_forward_from_id[$uid]:-${channel_post_forward_from_chat_id[$uid]}} ]] ||
[[ $msgstatus == reply && ${message_reply_to_message_message_id[$uid]:-${channel_post_reply_to_message_message_id[$uid]}} ]] ||
[[ $msgstatus == callback && ${callback_query_message_message_id[$uid]} ]] ||
[[ $msgstatus == inline && ${inline_query_id[$uid]} ]] ||
[[ $msgstatus == chosen && ${chosen_inline_result_result_id[$uid]} ]] ||
[[ $msgstatus == poll && ${poll_answer_poll_id[$uid]} ]] && break
done
(($?)) && continue
for ent in ${_BOT_RULES_[$i:entities_type]//|/ }; do
[[ $ent == @(${u_message_entities_type//$_BOT_DELM_/|}) ]] && break
done
(($?)) && continue
for mem in ${_BOT_RULES_[$i:chat_member]//|/ }; do
[[ $mem == new && ${message_new_chat_member_id[$uid]} ]] ||
[[ $mem == left && ${message_left_chat_member_id[$uid]} ]] && break
done
(($?)) && continue
for type in ${_BOT_RULES_[$i:file_type]//|/ }; do
[[ $type == document && ${message_document_file_id[$uid]:-${channel_post_document_file_id[$uid]}} &&
! ${message_document_thumb_file_id[$uid]:-${channel_post_document_thumb_file_id[$uid]}} ]] ||
[[ $type == gif && ${message_document_file_id[$uid]:-${channel_post_document_file_id[$uid]}} &&
${message_document_thumb_file_id[$uid]:-${channel_post_document_thumb_file_id[$uid]}} ]] ||
[[ $type == photo && ${message_photo_file_id[$uid]:-${channel_post_photo_file_id[$uid]}} ]] ||
[[ $type == sticker && ${message_sticker_file_id[$uid]:-${channel_post_sticker_file_id[$uid]}} ]] ||
[[ $type == video && ${message_video_file_id[$uid]:-${channel_post_video_file_id[$uid]}} ]] ||
[[ $type == audio && ${message_audio_file_id[$uid]:-${channel_post_audio_file_id[$uid]}} ]] ||
[[ $type == voice && ${message_voice_file_id[$uid]:-${channel_post_voice_file_id[$uid]}} ]] ||
[[ $type == contact && ${message_contact_user_id[$uid]:-${channel_post_contact_user_id[$uid]}} ]] ||
[[ $type == location && ${message_location_latitude[$uid]:-${channel_post_location_latitude[$uid]}} ]] && break
done
(($?)) && continue
[[ ${_BOT_RULES_[$i:time]} =~ $re ]]
match=${BASH_REMATCH[2]:-${_BOT_RULES_[$i:time]}}
for tm in ${match//|/ }; do
IFS='-' read stime etime <<< $tm
printf -v ctime '%(%H:%M)T' $u_message_date
[[ $ctime == @($stime|$etime) ]] ||
[[ $ctime > $stime && $ctime < $etime ]] && break
done
((${BASH_REMATCH[1]} $?)) && continue
[[ ${_BOT_RULES_[$i:date]} =~ $re ]]
match=${BASH_REMATCH[2]:-${_BOT_RULES_[$i:date]}}
for dt in ${match//|/ }; do
IFS='-' read sdate edate <<< $dt
IFS='/' read -a sdate <<< $sdate
IFS='/' read -a edate <<< $edate
sdate=${sdate[2]}/${sdate[1]}/${sdate[0]}
edate=${edate[2]}/${edate[1]}/${edate[0]}
printf -v cdate '%(%Y/%m/%d)T' $u_message_date
[[ $cdate == @($sdate|$edate) ]] ||
[[ $cdate > $sdate && $cdate < $edate ]] && break
done
((${BASH_REMATCH[1]} $?)) && continue
if [[ ${_BOT_RULES_[$i:user_status]} ]]; then
case $_BOT_TYPE_RETURN_ in
value)
out=$(ShellBot.getChatMember --chat_id $u_message_chat_id \
--user_id $u_message_from_id 2>/dev/null)
IFS=$_BOT_DELM_ read -a out <<< $out
[[ ${out[2]} == true ]]
status=${out[$(($? ? 6 : 5))]}
;;
json)
out=$(ShellBot.getChatMember --chat_id $u_message_chat_id \
--user_id $u_message_from_id 2>/dev/null)
status=$(Json '.result.status' $out)
;;
map)
ShellBot.getChatMember --chat_id $u_message_chat_id \
--user_id $u_message_from_id &>/dev/null
status=${return[status]}
;;
esac
[[ $status == @(${_BOT_RULES_[$i:user_status]}) ]] || continue
fi
# Monitor
[[ $_BOT_MONITOR_ ]] && printf '[%s]: %s: %s: %s: %s: %s: %s: %s: %s: %s: %s\n' \
"${FUNCNAME}" \
"$((uid+1))" \
"$(printf '%(%d/%m/%Y %H:%M:%S)T' ${u_message_date})" \
"${u_message_chat_type}" \
"${u_message_chat_username:--}" \
"${u_message_from_username:--}" \
"${_BOT_RULES_[$i:source]}" \
"${_BOT_RULES_[$i:line]}" \
"${_BOT_RULES_[$i:name]}" \
"${_BOT_RULES_[$i:action]:--}" \
"${_BOT_RULES_[$i:exec]:--}"
# Log
[[ $_BOT_LOG_FILE_ ]] && printf '%s: %s: %s: %s: %s: %s: %s\n' \
"$(printf '%(%d/%m/%Y %H:%M:%S)T')" \
"${FUNCNAME}" \
"${_BOT_RULES_[$i:source]}" \
"${_BOT_RULES_[$i:line]}" \
"${_BOT_RULES_[$i:name]}" \
"${_BOT_RULES_[$i:action]:--}" \
"${_BOT_RULES_[$i:exec]:--}" >> "$_BOT_LOG_FILE_"
# Anexa tipo da ação. (se presente)
if [[ ${_BOT_RULES_[$i:bot_action]} ]]; then
ShellBot.sendChatAction --chat_id $u_message_chat_id --action ${_BOT_RULES_[$i:bot_action]} &>/dev/null
fi
if [[ ${_BOT_RULES_[$i:bot_reply_message]} ]]; then
ShellBot.sendMessage --chat_id $u_message_chat_id \
--reply_to_message_id $u_message_id \
--text "$(FlagConv $uid "${_BOT_RULES_[$i:bot_reply_message]}")" \
${_BOT_RULES_[$i:bot_reply_markup]:+--reply_markup "${_BOT_RULES_[$i:bot_reply_markup]}"} \
${_BOT_RULES_[$i:bot_parse_mode]:+--parse_mode ${_BOT_RULES_[$i:bot_parse_mode]}} &>/dev/null
fi
if [[ ${_BOT_RULES_[$i:bot_send_message]} ]]; then
ShellBot.sendMessage --chat_id $u_message_chat_id \
--text "$(FlagConv $uid "${_BOT_RULES_[$i:bot_send_message]}")" \
${_BOT_RULES_[$i:bot_reply_markup]:+--reply_markup "${_BOT_RULES_[$i:bot_reply_markup]}"} \
${_BOT_RULES_[$i:bot_parse_mode]:+--parse_mode ${_BOT_RULES_[$i:bot_parse_mode]}} &>/dev/null
fi
for fwid in ${_BOT_RULES_[$i:bot_forward_message]//|/ }; do
ShellBot.forwardMessage --chat_id $fwid \
--from_chat_id $u_message_chat_id \
--message_id $u_message_id &>/dev/null
done
# Chama a função passando os argumentos posicionais. (se existir)
${_BOT_RULES_[$i:action]:+${_BOT_RULES_[$i:action]} ${_BOT_RULES_[$i:action_args]:-${args[*]}}}
# Executa a linha de comando e salva o retorno.
stdout=${_BOT_RULES_[$i:exec]:+$(set -- ${args[*]}; eval $(FlagConv $uid "${_BOT_RULES_[$i:exec]}") 2>&1)}
while [[ $stdout ]]; do
ShellBot.sendMessage --chat_id $u_message_chat_id \
--reply_to_message_id $u_message_id \
--text "${stdout:0:4096}" &>/dev/null
# Atualiza o buffer de saída.
stdout=${stdout:4096}
# Reenvia ação se ainda houver dados.
if [[ ${_BOT_RULES_[$i:bot_action]} && $stdout ]]; then
ShellBot.sendChatAction --chat_id $u_message_chat_id --action ${_BOT_RULES_[$i:bot_action]} &>/dev/null
fi
done
[[ ${_BOT_RULES_[$i:continue]} ]] || return 0
done
return 1
}
ShellBot.getUpdates()
{
local total_keys offset limit timeout allowed_updates jq_obj
local vet val var obj oldv bar vars vals i
# Define os parâmetros da função
local param=$(getopt --name "$FUNCNAME" \
--options 'o:l:t:a:' \
--longoptions 'offset:,
limit:,
timeout:,
allowed_updates:' \
-- "$@")
eval set -- "$param"
while :
do
case $1 in
-o|--offset)
CheckArgType int "$1" "$2"
offset=$2
shift 2
;;
-l|--limit)
CheckArgType int "$1" "$2"
limit=$2
shift 2
;;
-t|--timeout)
CheckArgType int "$1" "$2"
timeout=$2
shift 2
;;
-a|--allowed_updates)
allowed_updates=$2
shift 2
;;
--)
# Se não houver mais parâmetros
shift
break
;;
esac
done
# Seta os parâmetros
jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} \
${offset:+-d offset="$offset"} \
${limit:+-d limit="$limit"} \
${timeout:+-d timeout="$timeout"} \
${allowed_updates:+-d allowed_updates="$allowed_updates"})
# Limpa as variáveis inicializadas.
unset $_VAR_INIT_; _VAR_INIT_=
# Se há atualizações.
[[ $(jq -r '.result|length' <<< $jq_obj) -eq 0 ]] && return 0
# Se o método 'ShellBot.getUpdates' for invocado a partir de um subshell,
# as atualizações são retornadas em um estrutura de dados json, o método
# é finalizado e variáveis não são inicializadas.
[[ $BASH_SUBSHELL -gt 0 ]] && { echo "$jq_obj"; return 0; }
if [[ $_BOT_MONITOR_ ]]; then
printf -v bar '=%.s' {1..50}
printf "$bar\nData: %(%d/%m/%Y %T)T\n"
printf 'Script: %s\nBot (nome): %s\nBot (usuario): %s\nBot (id): %s\n' \
"${_BOT_SCRIPT_}" \
"${_BOT_INFO_[2]}" \
"${_BOT_INFO_[3]}" \
"${_BOT_INFO_[1]}"
fi
mapfile -t vars <<< $(GetAllKeys "$jq_obj")
mapfile -t vals <<< $(GetAllValues "$jq_obj")
for i in ${!vars[@]}; do
[[ ${vars[$i]} =~ [0-9]+ ]]
vet=${BASH_REMATCH:-0}
var=${vars[$i]//[0-9\[\]]/}
var=${var#result.}
var=${var//./_}
declare -g $var
local -n byref=$var # ponteiro
val=${vals[$i]}
val=${val#\"}
val=${val%\"}
byref[$vet]+=${byref[$vet]:+$_BOT_DELM_}${val}
if [[ $_BOT_MONITOR_ ]]; then
[[ $vet -ne ${oldv:--1} ]] && printf "$bar\nMensagem: %d\n$bar\n" $((vet+1))
printf "[%s]: %s = '%s'\n" "$FUNCNAME" "$var" "$val"
oldv=$vet
fi
unset -n byref
[[ $var != @(${_VAR_INIT_// /|}) ]] && _VAR_INIT_=${_VAR_INIT_:+$_VAR_INIT_ }${var}
done
# Log (thread)
[[ $_BOT_LOG_FILE_ ]] && CreateLog "${#update_id[@]}" "$jq_obj"
# Status
return $?
}
# Bot métodos (somente leitura)
readonly -f ShellBot.token \
ShellBot.id \
ShellBot.username \
ShellBot.first_name \
ShellBot.getConfig \
ShellBot.regHandleFunction \
ShellBot.regHandleExec \
ShellBot.watchHandle \
ShellBot.ListUpdates \
ShellBot.TotalUpdates \
ShellBot.OffsetEnd \
ShellBot.OffsetNext \
ShellBot.getMe \
ShellBot.getWebhookInfo \
ShellBot.deleteWebhook \
ShellBot.setWebhook \
ShellBot.init \
ShellBot.ReplyKeyboardMarkup \
ShellBot.ForceReply \
ShellBot.ReplyKeyboardRemove \
ShellBot.KeyboardButton \
ShellBot.sendMessage \
ShellBot.forwardMessage \
ShellBot.sendPhoto \
ShellBot.sendAudio \
ShellBot.sendDocument \
ShellBot.sendSticker \
ShellBot.sendVideo \
ShellBot.sendVideoNote \
ShellBot.sendVoice \
ShellBot.sendLocation \
ShellBot.sendVenue \
ShellBot.sendContact \
ShellBot.sendChatAction \
ShellBot.getUserProfilePhotos \
ShellBot.getFile \
ShellBot.kickChatMember \
ShellBot.leaveChat \
ShellBot.unbanChatMember \
ShellBot.getChat \
ShellBot.getChatAdministrators \
ShellBot.getChatMembersCount \
ShellBot.getChatMember \
ShellBot.editMessageText \
ShellBot.editMessageCaption \
ShellBot.editMessageReplyMarkup \
ShellBot.InlineKeyboardMarkup \
ShellBot.InlineKeyboardButton \
ShellBot.answerCallbackQuery \
ShellBot.deleteMessage \
ShellBot.exportChatInviteLink \
ShellBot.setChatPhoto \
ShellBot.deleteChatPhoto \
ShellBot.setChatTitle \
ShellBot.setChatDescription \
ShellBot.pinChatMessage \
ShellBot.unpinChatMessage \
ShellBot.promoteChatMember \
ShellBot.restrictChatMember \
ShellBot.getStickerSet \
ShellBot.uploadStickerFile \
ShellBot.createNewStickerSet \
ShellBot.addStickerToSet \
ShellBot.setStickerPositionInSet \
ShellBot.deleteStickerFromSet \
ShellBot.stickerMaskPosition \
ShellBot.downloadFile \
ShellBot.editMessageLiveLocation \
ShellBot.stopMessageLiveLocation \
ShellBot.setChatStickerSet \
ShellBot.deleteChatStickerSet \
ShellBot.sendMediaGroup \
ShellBot.editMessageMedia \
ShellBot.inputMedia \
ShellBot.sendAnimation \
ShellBot.answerInlineQuery \
ShellBot.InlineQueryResult \
ShellBot.InputMessageContent \
ShellBot.ChatPermissions \
ShellBot.setChatPermissions \
ShellBot.setChatAdministratorCustomTitle \
ShellBot.sendPoll \
ShellBot.KeyboardButtonPollType \
ShellBot.sendDice \
ShellBot.getMyCommands \
ShellBot.setMyCommands \
ShellBot.BotCommand \
ShellBot.setMessageRules \
ShellBot.manageRules \
ShellBot.getUpdates
offset=${_BOT_FLUSH_:+$(FlushOffset)} # flush
printf -v jq_obj '{"token":"%s","id":%d,"first_name":"%s","username":"%s","offset_start":%d,"offset_end":%d}' \
"${_BOT_INFO_[0]}" \
"${_BOT_INFO_[1]}" \
"${_BOT_INFO_[2]}" \
"${_BOT_INFO_[3]}" \
"${offset%|*}" \
"${offset#*|}"
# Retorna informações do bot.
MethodReturn "$jq_obj"
return $?
}
# Funções (somente leitura)
readonly -f MessageError \
Json \
FlushOffset \
CreateUnitService \
GetAllKeys \
GetAllValues \
SetDelmValues \
MethodReturn \
CheckArgType \
CreateLog \
FlagConv
# /* SHELLBOT */