mirror of
https://github.com/octoleo/telegram-bot-bash.git
synced 2024-11-26 17:26:27 +00:00
commit
792dde9a91
12
README.html
12
README.html
@ -11,14 +11,15 @@
|
|||||||
<div id="header">
|
<div id="header">
|
||||||
<h1 class="title">Bashbot README</h1>
|
<h1 class="title">Bashbot README</h1>
|
||||||
</div>
|
</div>
|
||||||
<h1 id="bashbot">bashbot</h1>
|
<h2>
|
||||||
<p>A Telegram bot written in bash.</p>
|
<img align="middle" src="https://raw.githubusercontent.com/odb/official-bash-logo/master/assets/Logos/Icons/PNG/64x64.png" > Bashbot - A Telegram bot written in bash.
|
||||||
|
</h2>
|
||||||
<p>Written by Drew (<span class="citation">@topkecleon</span>), Daniil Gentili (<span class="citation">@danogentili</span>), and Kay M (<span class="citation">@gnadelwartz</span>).</p>
|
<p>Written by Drew (<span class="citation">@topkecleon</span>), Daniil Gentili (<span class="citation">@danogentili</span>), and Kay M (<span class="citation">@gnadelwartz</span>).</p>
|
||||||
<p>Contributions by JuanPotato, BigNerd95, TiagoDanin, and iicc1.</p>
|
<p>Contributions by JuanPotato, BigNerd95, TiagoDanin, and iicc1.</p>
|
||||||
<p>Released to the public domain wherever applicable. Elsewhere, consider it released under the <a href="http://www.wtfpl.net/txt/copying/">WTFPLv2</a>.</p>
|
<p>Released to the public domain wherever applicable. Elsewhere, consider it released under the <a href="http://www.wtfpl.net/txt/copying/">WTFPLv2</a>.</p>
|
||||||
<h2 id="prerequisites">Prerequisites</h2>
|
<h2 id="prerequisites">Prerequisites</h2>
|
||||||
<p>Depends on <a href="http://github.com/tmux/tmux">tmux</a>. Uses <a href="http://github.com/dominictarr/JSON.sh">JSON.sh</a>.</p>
|
<p>Depends on <a href="http://github.com/tmux/tmux">tmux</a>. Uses <a href="http://github.com/dominictarr/JSON.sh">JSON.sh</a>.</p>
|
||||||
<p>Most complete <a href="doc/4_expert.md#Bashbot-UTF-8-Support">UTF-8 support for bashbot</a> is availible if phyton is installed (optional).</p>
|
<p>Even bashbot is written in bash, it depends on commands typically availible in a Unix/Linux Environment. More concret on the common commands provided by <a href="https://en.wikipedia.org/wiki/List_of_GNU_Core_Utilities_commands">coreutils</a>, <a href="https://en.wikipedia.org/wiki/BusyBox#Commands">busybox</a> or <a href="https://landley.net/toybox/help.html">toybox</a>, see <a href="doc/7_develop.md#common-commands">Developer Notes</a></p>
|
||||||
<p>Bashbot <a href="https://github.com/topkecleon/telegram-bot-bash">Documentation</a> and <a href="https://github.com/topkecleon/telegram-bot-bash/releases">Downloads</a> are availible on www.github.com</p>
|
<p>Bashbot <a href="https://github.com/topkecleon/telegram-bot-bash">Documentation</a> and <a href="https://github.com/topkecleon/telegram-bot-bash/releases">Downloads</a> are availible on www.github.com</p>
|
||||||
<h2 id="documentation">Documentation</h2>
|
<h2 id="documentation">Documentation</h2>
|
||||||
<ul>
|
<ul>
|
||||||
@ -78,6 +79,9 @@
|
|||||||
<li><a href="doc/8_custom.md">Customize bashbot environment</a></li>
|
<li><a href="doc/8_custom.md">Customize bashbot environment</a></li>
|
||||||
<li><a href="examples/README.md">Examples</a></li>
|
<li><a href="examples/README.md">Examples</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
<h4 id="you-dont-like-the-many-bashbot-files">You don’t like the many bashbot files?</h4>
|
||||||
|
<p>At the beginning bashbot was simply the file <code>bashbot.sh</code> I can copy everywhere and run the bot. Now we have ‘commands.sh’, ‘mycommands.sh’, ’modules/*.sh’ and much more.</p>
|
||||||
|
<p>Hey no Problem, if you are finished with your cool bot simply run <code>dev/make-standalone.sh</code> to create a stripped down Version containing only ‘bashbot.sh’ and ‘commands.sh’! For more information see <a href="doc/7_develop.md">Create a stripped down Version of your Bot</a></p>
|
||||||
<h2 id="security-considerations">Security Considerations</h2>
|
<h2 id="security-considerations">Security Considerations</h2>
|
||||||
<p>Running a Telegram Bot means it is connected to the public and you never know whats send to your Bot.</p>
|
<p>Running a Telegram Bot means it is connected to the public and you never know whats send to your Bot.</p>
|
||||||
<p>Bash scripts in general are not designed to be bullet proof, so consider this Bot as a proof of concept. Bash programmers often struggle with ‘quoting hell’ and globbing, see <a href="https://unix.stackexchange.com/questions/171346/security-implications-of-forgetting-to-quote-a-variable-in-bash-posix-shells">Implications of wrong quoting</a></p>
|
<p>Bash scripts in general are not designed to be bullet proof, so consider this Bot as a proof of concept. Bash programmers often struggle with ‘quoting hell’ and globbing, see <a href="https://unix.stackexchange.com/questions/171346/security-implications-of-forgetting-to-quote-a-variable-in-bash-posix-shells">Implications of wrong quoting</a></p>
|
||||||
@ -103,6 +107,6 @@
|
|||||||
<p><span class="citation">@Gnadelwartz</span></p>
|
<p><span class="citation">@Gnadelwartz</span></p>
|
||||||
<h2 id="thats-it">That’s it!</h2>
|
<h2 id="thats-it">That’s it!</h2>
|
||||||
<p>If you feel that there’s something missing or if you found a bug, feel free to submit a pull request!</p>
|
<p>If you feel that there’s something missing or if you found a bug, feel free to submit a pull request!</p>
|
||||||
<h4 id="version-v0.72-1-g67c47ac"><br /><span class="math display"><em>V</em><em>E</em><em>R</em><em>S</em><em>I</em><em>O</em><em>N</em></span><br /> v0.72-1-g67c47ac</h4>
|
<h4 id="version-v0.76-1-ge8a1fd0"><br /><span class="math display"><em>V</em><em>E</em><em>R</em><em>S</em><em>I</em><em>O</em><em>N</em></span><br /> v0.76-1-ge8a1fd0</h4>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
19
README.md
19
README.md
@ -1,6 +1,6 @@
|
|||||||
# bashbot
|
<h2><img align="middle" src="https://raw.githubusercontent.com/odb/official-bash-logo/master/assets/Logos/Icons/PNG/64x64.png" >
|
||||||
A Telegram bot written in bash.
|
Bashbot - A Telegram bot written in bash.
|
||||||
|
</h2>
|
||||||
Written by Drew (@topkecleon), Daniil Gentili (@danogentili), and Kay M (@gnadelwartz).
|
Written by Drew (@topkecleon), Daniil Gentili (@danogentili), and Kay M (@gnadelwartz).
|
||||||
|
|
||||||
Contributions by JuanPotato, BigNerd95, TiagoDanin, and iicc1.
|
Contributions by JuanPotato, BigNerd95, TiagoDanin, and iicc1.
|
||||||
@ -12,7 +12,9 @@ Elsewhere, consider it released under the [WTFPLv2](http://www.wtfpl.net/txt/cop
|
|||||||
Depends on [tmux](http://github.com/tmux/tmux).
|
Depends on [tmux](http://github.com/tmux/tmux).
|
||||||
Uses [JSON.sh](http://github.com/dominictarr/JSON.sh).
|
Uses [JSON.sh](http://github.com/dominictarr/JSON.sh).
|
||||||
|
|
||||||
Most complete [UTF-8 support for bashbot](doc/4_expert.md#Bashbot-UTF-8-Support) is availible if phyton is installed (optional).
|
Even bashbot is written in bash, it depends on commands typically availible in a Unix/Linux Environment.
|
||||||
|
More concret on the common commands provided by [coreutils](https://en.wikipedia.org/wiki/List_of_GNU_Core_Utilities_commands), [busybox](https://en.wikipedia.org/wiki/BusyBox#Commands) or [toybox](https://landley.net/toybox/help.html), see [Developer Notes](doc/7_develop.md#common-commands)
|
||||||
|
|
||||||
|
|
||||||
Bashbot [Documentation](https://github.com/topkecleon/telegram-bot-bash) and [Downloads](https://github.com/topkecleon/telegram-bot-bash/releases) are availible on www.github.com
|
Bashbot [Documentation](https://github.com/topkecleon/telegram-bot-bash) and [Downloads](https://github.com/topkecleon/telegram-bot-bash/releases) are availible on www.github.com
|
||||||
|
|
||||||
@ -57,6 +59,13 @@ Bashbot [Documentation](https://github.com/topkecleon/telegram-bot-bash) and [Do
|
|||||||
* [Customize bashbot environment](doc/8_custom.md)
|
* [Customize bashbot environment](doc/8_custom.md)
|
||||||
* [Examples](examples/README.md)
|
* [Examples](examples/README.md)
|
||||||
|
|
||||||
|
|
||||||
|
#### You don't like the many bashbot files?
|
||||||
|
At the beginning bashbot was simply the file ```bashbot.sh``` I can copy everywhere and run the bot. Now we have 'commands.sh', 'mycommands.sh', 'modules/*.sh' and much more.
|
||||||
|
|
||||||
|
Hey no Problem, if you are finished with your cool bot simply run ```dev/make-standalone.sh``` to create a stripped down Version containing only
|
||||||
|
'bashbot.sh' and 'commands.sh'! For more information see [Create a stripped down Version of your Bot](doc/7_develop.md)
|
||||||
|
|
||||||
## Security Considerations
|
## Security Considerations
|
||||||
Running a Telegram Bot means it is connected to the public and you never know whats send to your Bot.
|
Running a Telegram Bot means it is connected to the public and you never know whats send to your Bot.
|
||||||
|
|
||||||
@ -98,4 +107,4 @@ Well, thats a damn good question ... may be because I'm an Unix/Linux admin from
|
|||||||
|
|
||||||
If you feel that there's something missing or if you found a bug, feel free to submit a pull request!
|
If you feel that there's something missing or if you found a bug, feel free to submit a pull request!
|
||||||
|
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
32
README.txt
32
README.txt
@ -1,6 +1,8 @@
|
|||||||
# bashbot
|
<h2><img align="middle"
|
||||||
A Telegram bot written in bash.
|
src="https://raw.githubusercontent.com/odb/official-bash-logo/master/assets/Logo
|
||||||
|
s/Icons/PNG/64x64.png" >
|
||||||
|
Bashbot - A Telegram bot written in bash.
|
||||||
|
</h2>
|
||||||
Written by Drew (@topkecleon), Daniil Gentili (@danogentili), and Kay M
|
Written by Drew (@topkecleon), Daniil Gentili (@danogentili), and Kay M
|
||||||
(@gnadelwartz).
|
(@gnadelwartz).
|
||||||
|
|
||||||
@ -14,9 +16,14 @@ Elsewhere, consider it released under the
|
|||||||
Depends on [tmux](http://github.com/tmux/tmux).
|
Depends on [tmux](http://github.com/tmux/tmux).
|
||||||
Uses [JSON.sh](http://github.com/dominictarr/JSON.sh).
|
Uses [JSON.sh](http://github.com/dominictarr/JSON.sh).
|
||||||
|
|
||||||
Most complete [UTF-8 support for
|
Even bashbot is written in bash, it depends on commands typically availible in
|
||||||
bashbot](doc/4_expert.md#Bashbot-UTF-8-Support) is availible if phyton is
|
a Unix/Linux Environment.
|
||||||
installed (optional).
|
More concret on the common commands provided by
|
||||||
|
[coreutils](https://en.wikipedia.org/wiki/List_of_GNU_Core_Utilities_commands),
|
||||||
|
[busybox](https://en.wikipedia.org/wiki/BusyBox#Commands) or
|
||||||
|
[toybox](https://landley.net/toybox/help.html), see [Developer
|
||||||
|
Notes](doc/7_develop.md#common-commands)
|
||||||
|
|
||||||
|
|
||||||
Bashbot [Documentation](https://github.com/topkecleon/telegram-bot-bash) and
|
Bashbot [Documentation](https://github.com/topkecleon/telegram-bot-bash) and
|
||||||
[Downloads](https://github.com/topkecleon/telegram-bot-bash/releases) are
|
[Downloads](https://github.com/topkecleon/telegram-bot-bash/releases) are
|
||||||
@ -64,6 +71,17 @@ all](https://core.telegram.org/bots#3-how-do-i-create-a-bot)
|
|||||||
* [Customize bashbot environment](doc/8_custom.md)
|
* [Customize bashbot environment](doc/8_custom.md)
|
||||||
* [Examples](examples/README.md)
|
* [Examples](examples/README.md)
|
||||||
|
|
||||||
|
|
||||||
|
#### You don't like the many bashbot files?
|
||||||
|
At the beginning bashbot was simply the file ```bashbot.sh``` I can copy
|
||||||
|
everywhere and run the bot. Now we have 'commands.sh', 'mycommands.sh',
|
||||||
|
'modules/*.sh' and much more.
|
||||||
|
|
||||||
|
Hey no Problem, if you are finished with your cool bot simply run
|
||||||
|
```dev/make-standalone.sh``` to create a stripped down Version containing only
|
||||||
|
'bashbot.sh' and 'commands.sh'! For more information see [Create a stripped
|
||||||
|
down Version of your Bot](doc/7_develop.md)
|
||||||
|
|
||||||
## Security Considerations
|
## Security Considerations
|
||||||
Running a Telegram Bot means it is connected to the public and you never know
|
Running a Telegram Bot means it is connected to the public and you never know
|
||||||
whats send to your Bot.
|
whats send to your Bot.
|
||||||
@ -137,4 +155,4 @@ health status
|
|||||||
If you feel that there's something missing or if you found a bug, feel free to
|
If you feel that there's something missing or if you found a bug, feel free to
|
||||||
submit a pull request!
|
submit a pull request!
|
||||||
|
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# description: Start or stop telegram-bash-bot
|
# description: Start or stop telegram-bash-bot
|
||||||
#
|
#
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
# shellcheck disable=SC2009
|
# shellcheck disable=SC2009
|
||||||
# shellcheck disable=SC2181
|
# shellcheck disable=SC2181
|
||||||
|
|
||||||
|
359
bashbot.sh
359
bashbot.sh
@ -12,7 +12,7 @@
|
|||||||
# This file is public domain in the USA and all free countries.
|
# This file is public domain in the USA and all free countries.
|
||||||
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
||||||
#
|
#
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
#
|
#
|
||||||
# Exit Codes:
|
# Exit Codes:
|
||||||
# - 0 sucess (hopefully)
|
# - 0 sucess (hopefully)
|
||||||
@ -32,6 +32,7 @@ if [ -t 1 ] && [ "$TERM" != "" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# get location and name of bashbot.sh
|
# get location and name of bashbot.sh
|
||||||
|
export SCRIPT SCRIPTDIR MODULEDIR RUNDIR RUNUSER
|
||||||
SCRIPT="$0"
|
SCRIPT="$0"
|
||||||
SCRIPTDIR="$(dirname "$0")"
|
SCRIPTDIR="$(dirname "$0")"
|
||||||
MODULEDIR="${SCRIPTDIR}/modules"
|
MODULEDIR="${SCRIPTDIR}/modules"
|
||||||
@ -65,16 +66,6 @@ if [ ! -f "${TOKENFILE}" ]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
JSONSHFILE="${BASHBOT_JSONSH:-${RUNDIR}/JSON.sh/JSON.sh}"
|
|
||||||
[[ "${JSONSHFILE}" != *"/JSON.sh" ]] && echo -e "${RED}ERROR: \"${JSONSHFILE}\" ends not with \"JSONS.sh\".${NC}" && exit 3
|
|
||||||
|
|
||||||
if [ ! -f "${JSONSHFILE}" ]; then
|
|
||||||
echo "Seems to be first run, Downloading ${JSONSHFILE}..."
|
|
||||||
[[ "${JSONSHFILE}" = "${RUNDIR}/JSON.sh/JSON.sh" ]] && mkdir "JSON.sh" 2>/dev/null;
|
|
||||||
curl -sL -o "${JSONSHFILE}" "https://cdn.jsdelivr.net/gh/dominictarr/JSON.sh/JSON.sh"
|
|
||||||
chmod +x "${JSONSHFILE}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
BOTADMIN="${BASHBOT_ETC:-.}/botadmin"
|
BOTADMIN="${BASHBOT_ETC:-.}/botadmin"
|
||||||
if [ ! -f "${BOTADMIN}" ]; then
|
if [ ! -f "${BOTADMIN}" ]; then
|
||||||
if [ "${CLEAR}" = "" ]; then
|
if [ "${CLEAR}" = "" ]; then
|
||||||
@ -118,33 +109,17 @@ elif [ ! -w "${COUNTFILE}" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
BOTTOKEN="$(cat "${TOKENFILE}")"
|
BOTTOKEN="$(< "${TOKENFILE}")"
|
||||||
URL='https://api.telegram.org/bot'$BOTTOKEN
|
URL="${BASHBOT_URL:-https://api.telegram.org/bot}${BOTTOKEN}"
|
||||||
|
|
||||||
MSG_URL=$URL'/sendMessage'
|
|
||||||
LEAVE_URL=$URL'/leaveChat'
|
|
||||||
KICK_URL=$URL'/kickChatMember'
|
|
||||||
UNBAN_URL=$URL'/unbanChatMember'
|
|
||||||
PHO_URL=$URL'/sendPhoto'
|
|
||||||
AUDIO_URL=$URL'/sendAudio'
|
|
||||||
DOCUMENT_URL=$URL'/sendDocument'
|
|
||||||
STICKER_URL=$URL'/sendSticker'
|
|
||||||
VIDEO_URL=$URL'/sendVideo'
|
|
||||||
VOICE_URL=$URL'/sendVoice'
|
|
||||||
LOCATION_URL=$URL'/sendLocation'
|
|
||||||
VENUE_URL=$URL'/sendVenue'
|
|
||||||
ACTION_URL=$URL'/sendChatAction'
|
|
||||||
FORWARD_URL=$URL'/forwardMessage'
|
|
||||||
ME_URL=$URL'/getMe'
|
ME_URL=$URL'/getMe'
|
||||||
DELETE_URL=$URL'/deleteMessage'
|
|
||||||
GETMEMBER_URL=$URL'/getChatMember'
|
|
||||||
|
|
||||||
UPD_URL=$URL'/getUpdates?offset='
|
UPD_URL=$URL'/getUpdates?offset='
|
||||||
GETFILE_URL=$URL'/getFile'
|
GETFILE_URL=$URL'/getFile'
|
||||||
|
|
||||||
unset USER
|
unset USER
|
||||||
declare -A BOTSENT USER MESSAGE URLS CONTACT LOCATION CHAT FORWARD REPLYTO VENUE
|
declare -A BOTSENT USER MESSAGE URLS CONTACT LOCATION CHAT FORWARD REPLYTO VENUE iQUERY
|
||||||
export BOTSENT USER MESSAGE URLS CONTACT LOCATION CHAT FORWARD REPLYTO VENUE
|
export res BOTSENT USER MESSAGE URLS CONTACT LOCATION CHAT FORWARD REPLYTO VENUE iQUERY CAPTION NAME
|
||||||
|
|
||||||
COMMANDS="${BASHBOT_ETC:-.}/commands.sh"
|
COMMANDS="${BASHBOT_ETC:-.}/commands.sh"
|
||||||
if [ "$1" != "source" ]; then
|
if [ "$1" != "source" ]; then
|
||||||
@ -159,116 +134,36 @@ if [ "$1" != "source" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
send_normal_message() {
|
# returns true if command exist
|
||||||
local text="${2}"
|
_exists()
|
||||||
until [ -z "${text}" ]; do
|
{
|
||||||
sendJson "${1}" '"text":"'"${text:0:4096}"'"' "${MSG_URL}"
|
[ "$(LC_ALL=C type -t "$1")" = "file" ]
|
||||||
text="${text:4096}"
|
|
||||||
done
|
|
||||||
}
|
}
|
||||||
|
|
||||||
send_markdown_message() {
|
# returns true if function exist
|
||||||
local text="${2}"
|
_is_function()
|
||||||
until [ -z "${text}" ]; do
|
{
|
||||||
sendJson "${1}" '"text":"'"${text:0:4096}"'","parse_mode":"markdown"' "${MSG_URL}"
|
[ "$(LC_ALL=C type -t "$1")" = "function" ]
|
||||||
text="${text:4096}"
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
send_html_message() {
|
|
||||||
local text="${2}"
|
|
||||||
until [ -z "${text}" ]; do
|
|
||||||
sendJson "${1}" '"text":"'"${text:0:4096}"'","parse_mode":"html"' "${MSG_URL}"
|
|
||||||
text="${text:4096}"
|
|
||||||
done
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DELETE_URL=$URL'/deleteMessage'
|
||||||
delete_message() {
|
delete_message() {
|
||||||
sendJson "${1}" 'message_id: '"${2}"'' "${DELETE_URL}"
|
sendJson "${1}" 'message_id: '"${2}"'' "${DELETE_URL}"
|
||||||
}
|
}
|
||||||
|
|
||||||
# usage: status="$(get_chat_member_status "chat" "user")"
|
get_file() {
|
||||||
get_chat_member_status() {
|
[ "$1" = "" ] && return
|
||||||
sendJson "$1" 'user_id: '"$2"'' "$GETMEMBER_URL"
|
local JSON='"file_id": '"${1}"
|
||||||
JsonGetString '"result","status"' <<< "$res"
|
sendJson "" "${JSON}" "${GETFILE_URL}"
|
||||||
|
jsonGetString <<< "${URL}/""${res}" '"result","file_path"'
|
||||||
}
|
}
|
||||||
|
|
||||||
kick_chat_member() {
|
# curl is preffered, but may not availible on ebedded systems
|
||||||
sendJson "$1" 'user_id: '"$2"'' "$KICK_URL"
|
if [ "${BASHBOT_WGET}" = "" ] && _exists curl ; then
|
||||||
|
# simple curl or wget call, output to stdout
|
||||||
|
getJson(){
|
||||||
|
curl -sL "$1"
|
||||||
}
|
}
|
||||||
|
|
||||||
unban_chat_member() {
|
|
||||||
sendJson "$1" 'user_id: '"$2"'' "$UNBAN_URL"
|
|
||||||
}
|
|
||||||
|
|
||||||
leave_chat() {
|
|
||||||
sendJson "$1" "" "$LEAVE_URL"
|
|
||||||
}
|
|
||||||
|
|
||||||
user_is_creator() {
|
|
||||||
if [ "${1:--}" = "${2:-+}" ] || [ "$(get_chat_member_status "$1" "$2")" = "creator" ]; then return 0; fi
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
user_is_admin() {
|
|
||||||
local me; me="$(get_chat_member_status "$1" "$2")"
|
|
||||||
if [ "${me}" = "creator" ] || [ "${me}" = "administrator" ]; then return 0; fi
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
user_is_botadmin() {
|
|
||||||
local admin; admin="$(head -n 1 "${BOTADMIN}")"
|
|
||||||
[ "${admin}" = "${1}" ] && return 0
|
|
||||||
[[ "${admin}" = "@*" ]] && [[ "${admin}" = "${2}" ]] && return 0
|
|
||||||
if [ "${admin}" = "?" ]; then echo "${1:-?}" >"${BOTADMIN}"; return 0; fi
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
user_is_allowed() {
|
|
||||||
local acl="$1"
|
|
||||||
[ "$1" = "" ] && return 1
|
|
||||||
grep -F -xq "${acl}:*:*" <"${BOTACL}" && return 0
|
|
||||||
[ "$2" != "" ] && acl="${acl}:$2"
|
|
||||||
grep -F -xq "${acl}:*" <"${BOTACL}" && return 0
|
|
||||||
[ "$3" != "" ] && acl="${acl}:$3"
|
|
||||||
grep -F -xq "${acl}" <"${BOTACL}"
|
|
||||||
}
|
|
||||||
|
|
||||||
old_send_keyboard() {
|
|
||||||
local text='"text":"'"${2}"'"'
|
|
||||||
shift 2
|
|
||||||
local keyboard=init
|
|
||||||
OLDIFS=$IFS
|
|
||||||
IFS=$(echo -en "\"")
|
|
||||||
for f in "$@" ;do [ "$f" != " " ] && keyboard="$keyboard, [\"$f\"]";done
|
|
||||||
IFS=$OLDIFS
|
|
||||||
keyboard=${keyboard/init, /}
|
|
||||||
sendJson "${1}" "${text}"', "reply_markup": {"keyboard": [ '"${keyboard}"' ],"one_time_keyboard": true}' "$MSG_URL"
|
|
||||||
}
|
|
||||||
|
|
||||||
ISEMPTY="ThisTextIsEmptyAndWillBeDeleted"
|
|
||||||
send_keyboard() {
|
|
||||||
if [[ "$3" != *'['* ]]; then old_send_keyboard "$@"; return; fi
|
|
||||||
local text='"text":"'"${2}"'"'; [ "${2}" = "" ] && text='"text":"'"${ISEMPTY}"'"'
|
|
||||||
local one_time=', "one_time_keyboard":true' && [ "$4" != "" ] && one_time=""
|
|
||||||
sendJson "${1}" "${text}"', "reply_markup": {"keyboard": [ '"${3}"' ] '"${one_time}"'}' "$MSG_URL"
|
|
||||||
# '"text":"$2", "reply_markup": {"keyboard": [ ${3} ], "one_time_keyboard": true}'
|
|
||||||
}
|
|
||||||
|
|
||||||
remove_keyboard() {
|
|
||||||
local text='"text":"'"${2}"'"'; [ "${2}" = "" ] && text='"text":"'"${ISEMPTY}"'"'
|
|
||||||
sendJson "${1}" "${text}"', "reply_markup": {"remove_keyboard":true}' "$MSG_URL"
|
|
||||||
#JSON='"text":"$2", "reply_markup": {"remove_keyboard":true}'
|
|
||||||
}
|
|
||||||
send_inline_keyboard() {
|
|
||||||
local text='"text":"'"${2}"'"'; [ "${2}" = "" ] && text='"text":"'"${ISEMPTY}"'"'
|
|
||||||
sendJson "${1}" "${text}"', "reply_markup": {"inline_keyboard": [ '"${3}"' ]}' "$MSG_URL"
|
|
||||||
# JSON='"text":"$2", "reply_markup": {"inline_keyboard": [ $3->[{"text":"text", "url":"url"}]<- ]}'
|
|
||||||
}
|
|
||||||
send_button() {
|
|
||||||
send_inline_keyboard "${1}" "${2}" '[ {"text":"'"${3}"'", "url":"'"${4}"'"}]'
|
|
||||||
}
|
|
||||||
|
|
||||||
# usage: sendJson "chat" "JSON" "URL"
|
# usage: sendJson "chat" "JSON" "URL"
|
||||||
sendJson(){
|
sendJson(){
|
||||||
local chat="";
|
local chat="";
|
||||||
@ -277,8 +172,22 @@ sendJson(){
|
|||||||
-H "Content-Type: application/json" | "${JSONSHFILE}" -s -b -n )"
|
-H "Content-Type: application/json" | "${JSONSHFILE}" -s -b -n )"
|
||||||
BOTSENT[OK]="$(JsonGetLine '"ok"' <<< "$res")"
|
BOTSENT[OK]="$(JsonGetLine '"ok"' <<< "$res")"
|
||||||
BOTSENT[ID]="$(JsonGetValue '"result","message_id"' <<< "$res")"
|
BOTSENT[ID]="$(JsonGetValue '"result","message_id"' <<< "$res")"
|
||||||
[[ "${2}" = *"${ISEMPTY}"* ]] && delete_message "${1}" "${BOTSENT[ID]}"
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
# simple curl or wget call outputs result to stdout
|
||||||
|
getJson(){
|
||||||
|
wget -qO - "$1"
|
||||||
|
}
|
||||||
|
# usage: sendJson "chat" "JSON" "URL"
|
||||||
|
sendJson(){
|
||||||
|
local chat="";
|
||||||
|
[ "${1}" != "" ] && chat='"chat_id":'"${1}"','
|
||||||
|
res="$(wget -qO - --post-data='{'"${chat} $2"'}' \
|
||||||
|
--header='Content-Type:application/json' "${3}" | "${JSONSHFILE}" -s -b -n )"
|
||||||
|
BOTSENT[OK]="$(JsonGetLine '"ok"' <<< "$res")"
|
||||||
|
BOTSENT[ID]="$(JsonGetValue '"result","message_id"' <<< "$res")"
|
||||||
|
}
|
||||||
|
fi
|
||||||
|
|
||||||
# convert common telegram entities to JSON
|
# convert common telegram entities to JSON
|
||||||
# title caption description markup inlinekeyboard
|
# title caption description markup inlinekeyboard
|
||||||
@ -292,94 +201,37 @@ title2Json(){
|
|||||||
echo "${title}${caption}${desc}${markup}${keyboard}"
|
echo "${title}${caption}${desc}${markup}${keyboard}"
|
||||||
}
|
}
|
||||||
|
|
||||||
get_file() {
|
# get bot name
|
||||||
[ "$1" = "" ] && return
|
getBotName() {
|
||||||
local JSON='"file_id": '"${1}"
|
sendJson "" "" "$ME_URL"
|
||||||
sendJson "" "${JSON}" "${GETFILE_URL}"
|
JsonGetString '"result","username"' <<< "$res"
|
||||||
echo "${URL}/$(echo "${res}" | jsonGetString '"result","file_path"')"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
send_file() {
|
# pure bash implementaion, done by KayM (@gnadelwartz)
|
||||||
[ "$2" = "" ] && return
|
# see https://stackoverflow.com/a/55666449/9381171
|
||||||
local CAPTION
|
JsonDecode() {
|
||||||
local chat_id=$1
|
local out="$1" remain="" U=""
|
||||||
local file=$2
|
local regexp='(.*)\\u[dD]([0-9a-fA-F]{3})\\u[dD]([0-9a-fA-F]{3})(.*)'
|
||||||
echo "$file" | grep -qE "$FILE_REGEX" || return
|
while [[ "${out}" =~ $regexp ]] ; do
|
||||||
local ext="${file##*.}"
|
U=$(( ( (0xd${BASH_REMATCH[2]} & 0x3ff) <<10 ) | ( 0xd${BASH_REMATCH[3]} & 0x3ff ) + 0x10000 ))
|
||||||
case $ext in
|
remain="$(printf '\\U%8.8x' "${U}")${BASH_REMATCH[4]}${remain}"
|
||||||
mp3|flac)
|
out="${BASH_REMATCH[1]}"
|
||||||
CUR_URL=$AUDIO_URL
|
done
|
||||||
WHAT=audio
|
echo -e "${out}${remain}"
|
||||||
STATUS=upload_audio
|
|
||||||
CAPTION="$3"
|
|
||||||
;;
|
|
||||||
png|jpg|jpeg|gif)
|
|
||||||
CUR_URL=$PHO_URL
|
|
||||||
WHAT=photo
|
|
||||||
STATUS=upload_photo
|
|
||||||
CAPTION="$3"
|
|
||||||
;;
|
|
||||||
webp)
|
|
||||||
CUR_URL=$STICKER_URL
|
|
||||||
WHAT=sticker
|
|
||||||
STATUS=
|
|
||||||
;;
|
|
||||||
mp4)
|
|
||||||
CUR_URL=$VIDEO_URL
|
|
||||||
WHAT=video
|
|
||||||
STATUS=upload_video
|
|
||||||
CAPTION="$3"
|
|
||||||
;;
|
|
||||||
|
|
||||||
ogg)
|
|
||||||
CUR_URL=$VOICE_URL
|
|
||||||
WHAT=voice
|
|
||||||
STATUS=
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
CUR_URL=$DOCUMENT_URL
|
|
||||||
WHAT=document
|
|
||||||
STATUS=upload_document
|
|
||||||
CAPTION="$3"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
send_action "$chat_id" "$STATUS"
|
|
||||||
res="$(curl -s "$CUR_URL" -F "chat_id=$chat_id" -F "$WHAT=@$file" -F "caption=$CAPTION")"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# typing for text messages, upload_photo for photos, record_video or upload_video for videos, record_audio or upload_audio for audio files, upload_document for general files, find_location for location
|
JsonGetString() {
|
||||||
|
sed -n -e '0,/\['"$1"'\]/ s/\['"$1"'\][ \t]"\(.*\)"$/\1/p'
|
||||||
send_action() {
|
}
|
||||||
[ "$2" = "" ] && return
|
JsonGetLine() {
|
||||||
sendJson "${1}" '"action": "'"${2}"'"' "$ACTION_URL"
|
sed -n -e '0,/\['"$1"'\]/ s/\['"$1"'\][ \t]//p'
|
||||||
|
}
|
||||||
|
JsonGetValue() {
|
||||||
|
sed -n -e '0,/\['"$1"'\]/ s/\['"$1"'\][ \t]\([0-9.,]*\).*/\1/p'
|
||||||
}
|
}
|
||||||
|
|
||||||
send_location() {
|
################
|
||||||
[ "$3" = "" ] && return
|
# processing of updates starts here
|
||||||
sendJson "${1}" '"latitude": '"${2}"', "longitude": '"${3}"'' "$LOCATION_URL"
|
|
||||||
}
|
|
||||||
|
|
||||||
send_venue() {
|
|
||||||
local add=""
|
|
||||||
[ "$5" = "" ] && return
|
|
||||||
[ "$6" != "" ] && add=', "foursquare_id": '"$6"''
|
|
||||||
sendJson "${1}" '"latitude": '"${2}"', "longitude": '"${3}"', "address": "'"${5}"'", "title": "'"${4}"'"'"${add}" "$VENUE_URL"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
forward_message() {
|
|
||||||
[ "$3" = "" ] && return
|
|
||||||
sendJson "${1}" '"from_chat_id": '"${2}"', "message_id": '"${3}"'' "$FORWARD_URL"
|
|
||||||
}
|
|
||||||
forward() { # backward compatibility
|
|
||||||
forward_message "$@" || return
|
|
||||||
}
|
|
||||||
|
|
||||||
# returns true if function exist
|
|
||||||
_is_function()
|
|
||||||
{
|
|
||||||
[ "$(LC_ALL=C type -t "$1")" = "function" ]
|
|
||||||
}
|
|
||||||
process_updates() {
|
process_updates() {
|
||||||
MAX_PROCESS_NUMBER="$(sed <<< "${UPDATE}" '/\["result",[0-9]*\]/!d' | tail -1 | sed 's/\["result",//g;s/\].*//g')"
|
MAX_PROCESS_NUMBER="$(sed <<< "${UPDATE}" '/\["result",[0-9]*\]/!d' | tail -1 | sed 's/\["result",//g;s/\].*//g')"
|
||||||
for ((PROCESS_NUMBER=0; PROCESS_NUMBER<=MAX_PROCESS_NUMBER; PROCESS_NUMBER++)); do
|
for ((PROCESS_NUMBER=0; PROCESS_NUMBER<=MAX_PROCESS_NUMBER; PROCESS_NUMBER++)); do
|
||||||
@ -397,19 +249,19 @@ process_client() {
|
|||||||
fi
|
fi
|
||||||
# Tmux
|
# Tmux
|
||||||
copname="$ME"_"${CHAT[ID]}"
|
copname="$ME"_"${CHAT[ID]}"
|
||||||
source "${COMMANDS}"
|
# shellcheck source=./commands.sh
|
||||||
|
source "${COMMANDS}" "$1"
|
||||||
tmpcount="COUNT${CHAT[ID]}"
|
tmpcount="COUNT${CHAT[ID]}"
|
||||||
grep -q "$tmpcount" <"${COUNTFILE}" >/dev/null 2>&1 || echo "$tmpcount">>"${COUNTFILE}"
|
grep -q "$tmpcount" <"${COUNTFILE}" >/dev/null 2>&1 || echo "$tmpcount">>"${COUNTFILE}"
|
||||||
# To get user count execute bash bashbot.sh count
|
# To get user count execute bash bashbot.sh count
|
||||||
}
|
}
|
||||||
JsonGetString() {
|
process_inline() {
|
||||||
sed -n -e '0,/\['"$1"'\]/ s/\['"$1"'\][ \t]"\(.*\)"$/\1/p'
|
local num="${1}"
|
||||||
}
|
iQUERY[0]="$(JsonDecode "$(JsonGetString <<<"${UPDATE}" '"result",0,"inline_query","query"')")"
|
||||||
JsonGetLine() {
|
iQUERY[USER_ID]="$(JsonGetValue <<<"${UPDATE}" '"result",'"${num}"',"inline_query","from","id"')"
|
||||||
sed -n -e '0,/\['"$1"'\]/ s/\['"$1"'\][ \t]//p'
|
iQUERY[FIRST_NAME]="$(JsonDecode "$(JsonGetString <<<"${UPDATE}" '"result",'"${num}"',"inline_query","from","first_name"')")"
|
||||||
}
|
iQUERY[LAST_NAME]="$(JsonDecode "$(JsonGetString <<<"${UPDATE}" '"result",'"${num}"',"inline_query","from","last_name"')")"
|
||||||
JsonGetValue() {
|
iQUERY[USERNAME]="$(JsonDecode "$(JsonGetString <<<"${UPDATE}" '"result",'"${num}"',"inline_query","from","username"')")"
|
||||||
sed -n -e '0,/\['"$1"'\]/ s/\['"$1"'\][ \t]\([0-9.,]*\).*/\1/p'
|
|
||||||
}
|
}
|
||||||
process_message() {
|
process_message() {
|
||||||
local num="$1"
|
local num="$1"
|
||||||
@ -490,6 +342,8 @@ process_message() {
|
|||||||
rm "$TMP"
|
rm "$TMP"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#########################
|
||||||
# main get updates loop, should never terminate
|
# main get updates loop, should never terminate
|
||||||
start_bot() {
|
start_bot() {
|
||||||
local DEBUG="$1"
|
local DEBUG="$1"
|
||||||
@ -500,13 +354,12 @@ start_bot() {
|
|||||||
[[ "${DEBUG}" = *"debug" ]] && exec &>>"DEBUG.log"
|
[[ "${DEBUG}" = *"debug" ]] && exec &>>"DEBUG.log"
|
||||||
[ "${DEBUG}" != "" ] && date && echo "Start BASHBOT in Mode \"${DEBUG}\""
|
[ "${DEBUG}" != "" ] && date && echo "Start BASHBOT in Mode \"${DEBUG}\""
|
||||||
[[ "${DEBUG}" = "xdebug"* ]] && set -x
|
[[ "${DEBUG}" = "xdebug"* ]] && set -x
|
||||||
while true; do {
|
while true; do
|
||||||
|
UPDATE="$(getJson "$UPD_URL$OFFSET" | "${JSONSHFILE}" -s -b -n)"
|
||||||
UPDATE="$(curl -s "$UPD_URL$OFFSET" | "${JSONSHFILE}" -s -b -n)"
|
|
||||||
|
|
||||||
# Offset
|
# Offset
|
||||||
OFFSET="$(grep <<< "${UPDATE}" '\["result",[0-9]*,"update_id"\]' | tail -1 | cut -f 2)"
|
OFFSET="$(grep <<< "${UPDATE}" '\["result",[0-9]*,"update_id"\]' | tail -1 | cut -f 2)"
|
||||||
OFFSET=$((OFFSET+1))
|
((OFFSET++))
|
||||||
|
|
||||||
if [ "$OFFSET" != "1" ]; then
|
if [ "$OFFSET" != "1" ]; then
|
||||||
mysleep="100"
|
mysleep="100"
|
||||||
@ -514,21 +367,23 @@ start_bot() {
|
|||||||
fi
|
fi
|
||||||
# adaptive sleep in ms rounded to next lower second
|
# adaptive sleep in ms rounded to next lower second
|
||||||
[ "${mysleep}" -gt "999" ] && sleep "${mysleep%???}"
|
[ "${mysleep}" -gt "999" ] && sleep "${mysleep%???}"
|
||||||
mysleep=$((mysleep+addsleep)); [ "${mysleep}" -gt "${maxsleep}" ] && mysleep="${maxsleep}"
|
# bash aritmetic
|
||||||
}
|
((mysleep+= addsleep , mysleep= mysleep>maxsleep ?maxsleep:mysleep))
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
# initialize bot environment, user and permissions
|
# initialize bot environment, user and permissions
|
||||||
bot_init() {
|
bot_init() {
|
||||||
# move tmpdir to datadir
|
# upgrade from old version
|
||||||
local OLDTMP="${BASHBOT_VAR:-.}/tmp-bot-bash"
|
local OLDTMP="${BASHBOT_VAR:-.}/tmp-bot-bash"
|
||||||
[ -d "${OLDTMP}" ] && { mv -n "${OLDTMP}/"* "${TMPDIR}"; rmdir "${OLDTMP}"; }
|
[ -d "${OLDTMP}" ] && { mv -n "${OLDTMP}/"* "${TMPDIR}"; rmdir "${OLDTMP}"; }
|
||||||
|
[ -f "modules/inline.sh" ] && rm -f "modules/inline.sh"
|
||||||
|
#setup bashbot
|
||||||
[[ "$(id -u)" -eq "0" ]] && RUNUSER="nobody"
|
[[ "$(id -u)" -eq "0" ]] && RUNUSER="nobody"
|
||||||
echo -n "Enter User to run basbot [$RUNUSER]: "
|
echo -n "Enter User to run basbot [$RUNUSER]: "
|
||||||
read -r TOUSER
|
read -r TOUSER
|
||||||
[ "$TOUSER" = "" ] && TOUSER="$RUNUSER"
|
[ "$TOUSER" = "" ] && TOUSER="$RUNUSER"
|
||||||
if ! compgen -u "$TOUSER" >/dev/null 2>&1; then
|
if ! id "$TOUSER" >/dev/null 2>&1; then
|
||||||
echo -e "${RED}User \"$TOUSER\" not found!${NC}"
|
echo -e "${RED}User \"$TOUSER\" not found!${NC}"
|
||||||
exit 3
|
exit 3
|
||||||
else
|
else
|
||||||
@ -543,15 +398,19 @@ bot_init() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# get bot name
|
JSONSHFILE="${BASHBOT_JSONSH:-${RUNDIR}/JSON.sh/JSON.sh}"
|
||||||
getBotName() {
|
[[ "${JSONSHFILE}" != *"/JSON.sh" ]] && echo -e "${RED}ERROR: \"${JSONSHFILE}\" ends not with \"JSONS.sh\".${NC}" && exit 3
|
||||||
sendJson "" "" "$ME_URL"
|
|
||||||
JsonGetString '"result","username"' <<< "$res"
|
if [ ! -f "${JSONSHFILE}" ]; then
|
||||||
}
|
echo "Seems to be first run, Downloading ${JSONSHFILE}..."
|
||||||
|
[[ "${JSONSHFILE}" = "${RUNDIR}/JSON.sh/JSON.sh" ]] && mkdir "JSON.sh" 2>/dev/null && chmod +w "JSON.sh"
|
||||||
|
getJson "https://cdn.jsdelivr.net/gh/dominictarr/JSON.sh/JSON.sh" >"${JSONSHFILE}"
|
||||||
|
chmod +x "${JSONSHFILE}"
|
||||||
|
fi
|
||||||
|
|
||||||
ME="$(getBotName)"
|
ME="$(getBotName)"
|
||||||
if [ "$ME" = "" ]; then
|
if [ "$ME" = "" ]; then
|
||||||
if [ "$(cat "${TOKENFILE}")" = "bashbottestscript" ]; then
|
if [ "$(< "${TOKENFILE}")" = "bashbottestscript" ]; then
|
||||||
ME="bashbottestscript"
|
ME="bashbottestscript"
|
||||||
else
|
else
|
||||||
echo -e "${RED}ERROR: Can't connect to Telegram Bot! May be your TOKEN is invalid ...${NC}"
|
echo -e "${RED}ERROR: Can't connect to Telegram Bot! May be your TOKEN is invalid ...${NC}"
|
||||||
@ -559,30 +418,6 @@ if [ "$ME" = "" ]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# use phyton JSON to decode JSON UFT-8, provide bash implementaion as fallback
|
|
||||||
if [ "${BASHBOT_DECODE}" != "" ] && which python >/dev/null 2>&1 ; then
|
|
||||||
JsonDecode() {
|
|
||||||
printf '"%s\\n"' "${1//\"/\\\"}" | python -c 'import json, sys; sys.stdout.write(json.load(sys.stdin).encode("utf-8"))'
|
|
||||||
}
|
|
||||||
else
|
|
||||||
# pure bash implementaion, done by KayM (@gnadelwartz)
|
|
||||||
# see https://stackoverflow.com/a/55666449/9381171
|
|
||||||
JsonDecode() {
|
|
||||||
local out="$1"
|
|
||||||
local remain=""
|
|
||||||
local regexp='(.*)\\u[dD]([0-9a-fA-F]{3})\\u[dD]([0-9a-fA-F]{3})(.*)'
|
|
||||||
while [[ "${out}" =~ $regexp ]] ; do
|
|
||||||
# match 2 \udxxx hex values, calculate new U, then split and replace
|
|
||||||
local W1=$(( ( 0xd${BASH_REMATCH[2]} & 0x3ff) <<10 ))
|
|
||||||
local W2=$(( 0xd${BASH_REMATCH[3]} & 0x3ff ))
|
|
||||||
local U=$(( ( W1 | W2 ) + 0x10000 ))
|
|
||||||
remain="$(printf '\\U%8.8x' "${U}")${BASH_REMATCH[4]}${remain}"
|
|
||||||
out="${BASH_REMATCH[1]}"
|
|
||||||
done
|
|
||||||
echo -e "${out}${remain}"
|
|
||||||
}
|
|
||||||
fi
|
|
||||||
|
|
||||||
# source the script with source as param to use functions in other scripts
|
# source the script with source as param to use functions in other scripts
|
||||||
# do not execute if read from other scripts
|
# do not execute if read from other scripts
|
||||||
|
|
||||||
@ -592,6 +427,8 @@ if [ "$1" != "source" ]; then
|
|||||||
# internal options only for use from bashbot and developers
|
# internal options only for use from bashbot and developers
|
||||||
case "$1" in
|
case "$1" in
|
||||||
"outproc") # forward output from interactive and jobs to chat
|
"outproc") # forward output from interactive and jobs to chat
|
||||||
|
[ "$3" = "" ] && echo "No file to read from" && exit 3
|
||||||
|
[ "$2" = "" ] && echo "No chat to send to" && exit 3
|
||||||
until [ "$line" = "imprettydarnsuredatdisisdaendofdacmd" ];do
|
until [ "$line" = "imprettydarnsuredatdisisdaendofdacmd" ];do
|
||||||
line=""
|
line=""
|
||||||
read -r -t 10 line
|
read -r -t 10 line
|
||||||
@ -637,12 +474,10 @@ if [ "$1" != "source" ]; then
|
|||||||
tmux kill-session -t "$ME" &>/dev/null
|
tmux kill-session -t "$ME" &>/dev/null
|
||||||
tmux new-session -d -s "$ME" "bash $SCRIPT startbot" && echo -e "${GREEN}Bot started successfully.${NC}"
|
tmux new-session -d -s "$ME" "bash $SCRIPT startbot" && echo -e "${GREEN}Bot started successfully.${NC}"
|
||||||
echo "Tmux session name $ME" || echo -e "${RED}An error occurred while starting the bot. ${NC}"
|
echo "Tmux session name $ME" || echo -e "${RED}An error occurred while starting the bot. ${NC}"
|
||||||
send_markdown_message "${CHAT[ID]}" "*Bot started*"
|
|
||||||
;;
|
;;
|
||||||
"kill")
|
"kill")
|
||||||
${CLEAR}
|
${CLEAR}
|
||||||
tmux kill-session -t "$ME" &>/dev/null
|
tmux kill-session -t "$ME" &>/dev/null
|
||||||
send_markdown_message "${CHAT[ID]}" "*Bot stopped*"
|
|
||||||
echo -e "${GREEN}OK. Bot stopped successfully.${NC}"
|
echo -e "${GREEN}OK. Bot stopped successfully.${NC}"
|
||||||
;;
|
;;
|
||||||
"background" | "resumeback")
|
"background" | "resumeback")
|
||||||
|
47
commands.sh
47
commands.sh
@ -5,10 +5,8 @@
|
|||||||
# This file is public domain in the USA and all free countries.
|
# This file is public domain in the USA and all free countries.
|
||||||
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
||||||
#
|
#
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
#
|
#
|
||||||
# shellcheck disable=SC2154
|
|
||||||
# shellcheck disable=SC2034
|
|
||||||
|
|
||||||
# adjust your language setting here, e.g.when run from other user or cron.
|
# adjust your language setting here, e.g.when run from other user or cron.
|
||||||
# https://github.com/topkecleon/telegram-bot-bash#setting-up-your-environment
|
# https://github.com/topkecleon/telegram-bot-bash#setting-up-your-environment
|
||||||
@ -37,45 +35,40 @@ bashbot_help='*Available commands*:
|
|||||||
Written by Drew (@topkecleon), Daniil Gentili (@danogentili) and KayM(@gnadelwartz).
|
Written by Drew (@topkecleon), Daniil Gentili (@danogentili) and KayM(@gnadelwartz).
|
||||||
Get the code in my [GitHub](http://github.com/topkecleon/telegram-bot-bash)
|
Get the code in my [GitHub](http://github.com/topkecleon/telegram-bot-bash)
|
||||||
'
|
'
|
||||||
|
# we don't know whom we are ...
|
||||||
|
copname=""
|
||||||
|
|
||||||
if [ "${1}" != "source" ]; then
|
|
||||||
# load modules needed for commands.sh only
|
# load modues on startup and always on on debug
|
||||||
|
if [ "${1}" = "source" ] || [[ "${1}" = *"debug"* ]] ; then
|
||||||
|
# load all readable modules
|
||||||
|
for modules in ${MODULEDIR:-.}/*.sh ; do
|
||||||
# shellcheck source=./modules/aliases.sh
|
# shellcheck source=./modules/aliases.sh
|
||||||
[ -r "${MODULEDIR:-.}/aliases.sh" ] && source "${MODULEDIR:-.}/aliases.sh"
|
[ -r "${modules}" ] && source "${modules}" "${1}"
|
||||||
# shellcheck source=./modules/background.sh
|
done
|
||||||
[ -r "${MODULEDIR:-.}/background.sh" ] && source "${MODULEDIR:-.}/background.sh"
|
|
||||||
else
|
|
||||||
# defaults to no inline and nonsense home dir
|
|
||||||
INLINE="0"
|
|
||||||
FILE_REGEX='/home/user/allowed/.*'
|
|
||||||
|
|
||||||
# load modules needed for bashbot.sh also
|
|
||||||
# shellcheck source=./modules/background.sh
|
|
||||||
[ -r "${MODULEDIR:-.}/inline.sh" ] && source "${MODULEDIR:-.}/inline.sh"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# defaults to no inline and nonsense home dir
|
||||||
|
export INLINE="0"
|
||||||
|
export FILE_REGEX='/home/user/allowed/.*'
|
||||||
|
|
||||||
|
|
||||||
# load mycommands
|
# load mycommands
|
||||||
# shellcheck source=./commands.sh
|
# shellcheck source=./commands.sh
|
||||||
[ -r "${BASHBOT_ETC:-.}/mycommands.sh" ] && source "${BASHBOT_ETC:-.}/mycommands.sh" "${1}"
|
[ -r "${BASHBOT_ETC:-.}/mycommands.sh" ] && source "${BASHBOT_ETC:-.}/mycommands.sh" "${1}"
|
||||||
|
|
||||||
|
|
||||||
if [ "${1}" != "source" ];then
|
if [ "${1}" != "source" ];then
|
||||||
if ! tmux ls 2>/dev/null | grep -v send | grep -q "$copname"; then
|
# detect inline commands....
|
||||||
# interactive running?
|
# no default commands, all processing is done in myinlines()
|
||||||
[ ! -z "${URLS[*]}" ] && {
|
|
||||||
curl -s "${URLS[*]}" -o "$NAME"
|
|
||||||
send_file "${CHAT[ID]}" "$NAME" "$CAPTION"
|
|
||||||
rm -f "$NAME"
|
|
||||||
}
|
|
||||||
[ ! -z "${LOCATION[*]}" ] && send_location "${CHAT[ID]}" "${LOCATION[LATITUDE]}" "${LOCATION[LONGITUDE]}"
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$INLINE" != "0" ] && [ "${iQUERY[ID]}" != "" ]; then
|
if [ "$INLINE" != "0" ] && [ "${iQUERY[ID]}" != "" ]; then
|
||||||
if _is_function process_inline; then
|
if _is_function process_inline; then
|
||||||
# forward iinline query to optional dispatcher
|
# forward iinline query to optional dispatcher
|
||||||
_is_function myinlines && myinlines
|
_is_function myinlines && myinlines
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# regular (gobal) commands ...
|
||||||
|
# your commands are in mycommands()
|
||||||
else
|
else
|
||||||
|
|
||||||
case "${MESSAGE}" in
|
case "${MESSAGE}" in
|
||||||
|
@ -1,12 +1,16 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# this has to run once atfer git clone
|
# this has to run once atfer git clone
|
||||||
# and every time we create new hooks
|
# and every time we create new hooks
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
# magic to ensure that we're always inside the root of our application,
|
# magic to ensure that we're always inside the root of our application,
|
||||||
# no matter from which directory we'll run script
|
# no matter from which directory we'll run script
|
||||||
GIT_DIR=$(git rev-parse --git-dir)
|
GIT_DIR=$(git rev-parse --git-dir 2>/dev/null)
|
||||||
cd "${GIT_DIR}/.." || exit 1
|
if [ "$GIT_DIR" != "" ] ; then
|
||||||
|
cd "$GIT_DIR/.." || exit 1
|
||||||
|
else
|
||||||
|
echo "Sorry, no git repository $(pwd)" && exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# create test environment
|
# create test environment
|
||||||
TESTENV="/tmp/bashbot.test$$"
|
TESTENV="/tmp/bashbot.test$$"
|
||||||
|
@ -3,12 +3,16 @@
|
|||||||
#
|
#
|
||||||
# works together with git pre-push.sh and ADD all changed files since last push
|
# works together with git pre-push.sh and ADD all changed files since last push
|
||||||
|
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
# magic to ensure that we're always inside the root of our application,
|
# magic to ensure that we're always inside the root of our application,
|
||||||
# no matter from which directory we'll run script
|
# no matter from which directory we'll run script
|
||||||
GIT_DIR=$(git rev-parse --git-dir)
|
GIT_DIR=$(git rev-parse --git-dir 2>/dev/null)
|
||||||
|
if [ "$GIT_DIR" != "" ] ; then
|
||||||
cd "$GIT_DIR/.." || exit 1
|
cd "$GIT_DIR/.." || exit 1
|
||||||
|
else
|
||||||
|
echo "Sorry, no git repository $(pwd)" && exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
[ ! -f .git/.lastpush ] && echo "No push or hooks not installed, use \"git add\" instead ... Abort" && exit
|
[ ! -f .git/.lastpush ] && echo "No push or hooks not installed, use \"git add\" instead ... Abort" && exit
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
############
|
############
|
||||||
# NOTE: you MUST run install-hooks.sh again when updating this file!
|
# NOTE: you MUST run install-hooks.sh again when updating this file!
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
############
|
############
|
||||||
# NOTE: you MUST run install-hooks.sh again when updating this file!
|
# NOTE: you MUST run install-hooks.sh again when updating this file!
|
||||||
|
@ -1,12 +1,16 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# this has to run once atfer git clone
|
# this has to run once atfer git clone
|
||||||
# and every time we create new hooks
|
# and every time we create new hooks
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
# magic to ensure that we're always inside the root of our application,
|
# magic to ensure that we're always inside the root of our application,
|
||||||
# no matter from which directory we'll run script
|
# no matter from which directory we'll run script
|
||||||
GIT_DIR=$(git rev-parse --git-dir)
|
GIT_DIR=$(git rev-parse --git-dir 2>/dev/null)
|
||||||
|
if [ "$GIT_DIR" != "" ] ; then
|
||||||
cd "$GIT_DIR/.." || exit 1
|
cd "$GIT_DIR/.." || exit 1
|
||||||
|
else
|
||||||
|
echo "Sorry, no git repository $(pwd)" && exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
HOOKDIR="dev/hooks"
|
HOOKDIR="dev/hooks"
|
||||||
|
|
||||||
|
@ -1,12 +1,17 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# this has to run once atfer git clone
|
# file: make-distribution.sh
|
||||||
# and every time we create new hooks
|
# creates files and arcchives to dirtribute bashbot
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#
|
||||||
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
# magic to ensure that we're always inside the root of our application,
|
# magic to ensure that we're always inside the root of our application,
|
||||||
# no matter from which directory we'll run script
|
# no matter from which directory we'll run script
|
||||||
GIT_DIR=$(git rev-parse --git-dir)
|
GIT_DIR=$(git rev-parse --git-dir 2>/dev/null)
|
||||||
|
if [ "$GIT_DIR" != "" ] ; then
|
||||||
cd "$GIT_DIR/.." || exit 1
|
cd "$GIT_DIR/.." || exit 1
|
||||||
|
else
|
||||||
|
echo "Sorry, no git repository $(pwd)" && exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
VERSION="$(git describe --tags | sed -e 's/-[0-9].*//' -e 's/v//')"
|
VERSION="$(git describe --tags | sed -e 's/-[0-9].*//' -e 's/v//')"
|
||||||
|
|
||||||
@ -18,6 +23,7 @@ DISTFILES="bashbot.rc bashbot.sh commands.sh mycommands.sh doc examples modu
|
|||||||
|
|
||||||
for test in "dev/all-tests.sh"
|
for test in "dev/all-tests.sh"
|
||||||
do
|
do
|
||||||
|
[ ! -x ""${test} ] && continue
|
||||||
if ! "${test}" ; then
|
if ! "${test}" ; then
|
||||||
echo "Test ${test} failed, can't create dist!"
|
echo "Test ${test} failed, can't create dist!"
|
||||||
exit 1
|
exit 1
|
||||||
@ -31,6 +37,7 @@ cp -r ${DISTFILES} "${DISTDIR}"
|
|||||||
cd "${DISTDIR}" || exit 1
|
cd "${DISTDIR}" || exit 1
|
||||||
|
|
||||||
# additional stuff
|
# additional stuff
|
||||||
|
mv "bashbot.rc" "bashbot.rc.dist"
|
||||||
mv "commands.sh" "commands.sh.dist"
|
mv "commands.sh" "commands.sh.dist"
|
||||||
mv "mycommands.sh" "mycommands.sh.dist"
|
mv "mycommands.sh" "mycommands.sh.dist"
|
||||||
|
|
91
dev/make-standalone.sh
Executable file
91
dev/make-standalone.sh
Executable file
@ -0,0 +1,91 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# file: make-standalone.sh
|
||||||
|
# even after make-distribution.sh bashbot is not self contained as it was in the past.
|
||||||
|
#
|
||||||
|
# If you your bot is finished you can use make-standalone.sh to create the
|
||||||
|
# the old all-in-one bashbot: bashbot.sh and commands.sh only!
|
||||||
|
#
|
||||||
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
|
# magic to ensure that we're always inside the root of our application,
|
||||||
|
# no matter from which directory we'll run script
|
||||||
|
GIT_DIR=$(git rev-parse --git-dir 2>/dev/null)
|
||||||
|
if [ "$GIT_DIR" != "" ] ; then
|
||||||
|
cd "$GIT_DIR/.." || exit 1
|
||||||
|
else
|
||||||
|
[ ! -f "bashbot.sh" ] && echo "bashbot.sh not found in $(pwd)" && exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
#DISTNAME="telegram-bot-bash"
|
||||||
|
DISTDIR="./standalone/${DISTNAME}"
|
||||||
|
DISTFILES="bashbot.sh commands.sh mycommands.sh modules LICENSE README.txt token count botacl botadmin"
|
||||||
|
|
||||||
|
# run tests first!
|
||||||
|
|
||||||
|
for test in "dev/all-tests.sh"
|
||||||
|
do
|
||||||
|
[ ! -x "${test}" ] && continue
|
||||||
|
if ! "${test}" ; then
|
||||||
|
echo "Test ${test} failed, can't create standalone!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# create dir for distribution and copy files
|
||||||
|
mkdir -p "${DISTDIR}" 2>/dev/null
|
||||||
|
# shellcheck disable=SC2086
|
||||||
|
cp -r ${DISTFILES} "${DISTDIR}" 2>/dev/null
|
||||||
|
cd "${DISTDIR}" || exit 1
|
||||||
|
|
||||||
|
#######################
|
||||||
|
# here the magic starts
|
||||||
|
# create all in one bashbot.sh file
|
||||||
|
|
||||||
|
echo "OK, noe lets do the magic ..."
|
||||||
|
echo " ... create unified commands.sh"
|
||||||
|
|
||||||
|
{
|
||||||
|
# first head of commands.sh
|
||||||
|
sed -n '0,/^if / p' commands.sh | head -n -2 | grep -v 'mycommands.sh'
|
||||||
|
|
||||||
|
# then mycommands from first non comment line on
|
||||||
|
printf '\n##############################\n# my commands starts here ...\n'
|
||||||
|
sed -n '/^$/,$ p' mycommands.sh
|
||||||
|
|
||||||
|
# last tail of commands.sh
|
||||||
|
printf '\n##############################\n# default commands starts here ...\n'
|
||||||
|
sed -n '/\/mycommands.sh"/,$ p' commands.sh | tail -n +2
|
||||||
|
|
||||||
|
} >>$$commands.sh
|
||||||
|
|
||||||
|
mv $$commands.sh commands.sh
|
||||||
|
rm -f mycommands.sh
|
||||||
|
|
||||||
|
echo " ... create unified bashbot.sh"
|
||||||
|
|
||||||
|
{
|
||||||
|
# first head of bashbot.sh
|
||||||
|
sed -n '0,/\/commands.sh"/ p' bashbot.sh | head -n -2
|
||||||
|
|
||||||
|
# then mycommands from first non comment line on
|
||||||
|
printf '\n##############################\n# bashbot modules starts here ...\n'
|
||||||
|
cat modules/*.sh | sed -e 's/^#\!\/bin\/bash.*//'
|
||||||
|
|
||||||
|
# last tail of commands.sh
|
||||||
|
printf '\n##############################\n# bashbot internal functions starts here ...\n\n'
|
||||||
|
sed -n '/\/commands.sh"/,$ p' bashbot.sh
|
||||||
|
|
||||||
|
} >>$$bashbot.sh
|
||||||
|
|
||||||
|
mv $$bashbot.sh bashbot.sh
|
||||||
|
chmod +x bashbot.sh
|
||||||
|
|
||||||
|
rm -rf modules
|
||||||
|
|
||||||
|
echo "Done!"
|
||||||
|
|
||||||
|
cd .. || exit 1
|
||||||
|
|
||||||
|
echo -e "\\nStandalone bashbot files are now availible in \"${DISTDIR}\":\\n"
|
||||||
|
ls -l "${DISTDIR}"*
|
||||||
|
|
@ -1,3 +1,3 @@
|
|||||||
# list of additional files to check from shellcheck
|
# list of additional files to check from shellcheck
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
bashbot.rc
|
bashbot.rc
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
# shellcheck disable=SC2016
|
# shellcheck disable=SC2016
|
||||||
#
|
#
|
||||||
# Easy Versioning in git:
|
# Easy Versioning in git:
|
||||||
@ -36,8 +36,12 @@
|
|||||||
|
|
||||||
# magic to ensure that we're always inside the root of our application,
|
# magic to ensure that we're always inside the root of our application,
|
||||||
# no matter from which directory we'll run script
|
# no matter from which directory we'll run script
|
||||||
GIT_DIR=$(git rev-parse --git-dir)
|
GIT_DIR=$(git rev-parse --git-dir 2>/dev/null)
|
||||||
|
if [ "$GIT_DIR" != "" ] ; then
|
||||||
cd "$GIT_DIR/.." || exit 1
|
cd "$GIT_DIR/.." || exit 1
|
||||||
|
else
|
||||||
|
echo "Sorry, no git repository $(pwd)" && exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
unset IFS
|
unset IFS
|
||||||
# set -f # if you are paranoid use set -f to disable globbing
|
# set -f # if you are paranoid use set -f to disable globbing
|
||||||
|
@ -34,13 +34,20 @@ As an alternative to download the zip files, you can clone the github repository
|
|||||||
2. [Download latest release zip from github](https://github.com/topkecleon/telegram-bot-bash/releases)
|
2. [Download latest release zip from github](https://github.com/topkecleon/telegram-bot-bash/releases)
|
||||||
3. Extract all files to your existing bashbot dir
|
3. Extract all files to your existing bashbot dir
|
||||||
**Note: all files execpt 'mycommands.sh' and 'commands.sh' may overwritten!**
|
**Note: all files execpt 'mycommands.sh' and 'commands.sh' may overwritten!**
|
||||||
4. Run ```sudo ./bashbot.sh init``` to setup your environment after the update
|
4. Save your your current 'commands.sh' and run ```cp commands.sh.dist commands.sh```
|
||||||
|
5. Run ```sudo ./bashbot.sh init``` to setup your environment after the update
|
||||||
|
|
||||||
|
If you modified 'commands.sh' re apply all changes to the new 'commands.sh'. To avoid this all your modifications
|
||||||
|
must be done in 'mycommands.sh' only.
|
||||||
|
|
||||||
### Notes on Updates
|
### Notes on Updates
|
||||||
|
|
||||||
#### Location of tmp / data dir
|
#### Location of tmp / data dir
|
||||||
From version 0.70 on the tmp dir is renamed to 'data-bot-bash' to reflect the fact that not only temporary files are stored. an existing 'tmp-bot-bash' will be automatically renamed after update.
|
From version 0.70 on the tmp dir is renamed to 'data-bot-bash' to reflect the fact that not only temporary files are stored. an existing 'tmp-bot-bash' will be automatically renamed after update.
|
||||||
|
|
||||||
|
From version 0.60 on your commands must be placed in 'mycommands.sh'. If you update from a version with your commands
|
||||||
|
in 'commands.sh' move all your commands and functions to 'mycommands.sh'.
|
||||||
|
|
||||||
From version 0.50 on the temporary files are no more placed in '/tmp'. instead a dedicated tmp dir is used.
|
From version 0.50 on the temporary files are no more placed in '/tmp'. instead a dedicated tmp dir is used.
|
||||||
|
|
||||||
#### Changes to send_keyboard in v0.6
|
#### Changes to send_keyboard in v0.6
|
||||||
@ -63,5 +70,5 @@ The old format is supported for backward compatibility, but may fail for corner
|
|||||||
|
|
||||||
#### [Next Create Bot](1_firstbot.md)
|
#### [Next Create Bot](1_firstbot.md)
|
||||||
|
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
|
@ -65,5 +65,5 @@ group. This step is up to you actually.
|
|||||||
#### [Prev Installation](0_install.md)
|
#### [Prev Installation](0_install.md)
|
||||||
#### [Next Getting started](2_usage.md)
|
#### [Next Getting started](2_usage.md)
|
||||||
|
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
|
@ -182,5 +182,5 @@ send_action "${CHAT[ID]}" "action"
|
|||||||
#### [Prev Create Bot](1_firstbot.md)
|
#### [Prev Create Bot](1_firstbot.md)
|
||||||
#### [Next Advanced Usage](3_advanced.md)
|
#### [Next Advanced Usage](3_advanced.md)
|
||||||
|
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
|
@ -180,5 +180,5 @@ See also [answer_inline_multi, answer_inline_compose](6_reference.md#answer_inli
|
|||||||
#### [Prev Getting started](2_usage.md)
|
#### [Prev Getting started](2_usage.md)
|
||||||
#### [Next Expert Use](4_expert.md)
|
#### [Next Expert Use](4_expert.md)
|
||||||
|
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
|
@ -104,5 +104,5 @@ An example crontab is provided in ```examples/bashbot.cron```.
|
|||||||
#### [Prev Expert Use](4_expert.md)
|
#### [Prev Expert Use](4_expert.md)
|
||||||
#### [Next Best Practice](5_practice.md)
|
#### [Next Best Practice](5_practice.md)
|
||||||
|
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
|
@ -153,5 +153,5 @@ The second warning is about an unused variable, this is true because in our exam
|
|||||||
#### [Prev Best Practice](5_practice.md)
|
#### [Prev Best Practice](5_practice.md)
|
||||||
#### [Next Functions Reference](6_reference.md)
|
#### [Next Functions Reference](6_reference.md)
|
||||||
|
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
|
@ -592,5 +592,5 @@ Send Input from Telegram to waiting Interactive Chat.
|
|||||||
#### [Prev Best Practice](5_practice.md)
|
#### [Prev Best Practice](5_practice.md)
|
||||||
#### [Next Notes for Developers](7_develop.md)
|
#### [Next Notes for Developers](7_develop.md)
|
||||||
|
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ This section is about help and best practices for new bashbot developers. The ma
|
|||||||
|
|
||||||
bashbot development is done on github. If you want to provide fixes or new features [fork bashbot on githup](https://help.github.com/en/articles/fork-a-repo) and provide changes as [pull request on github](https://help.github.com/en/articles/creating-a-pull-request).
|
bashbot development is done on github. If you want to provide fixes or new features [fork bashbot on githup](https://help.github.com/en/articles/fork-a-repo) and provide changes as [pull request on github](https://help.github.com/en/articles/creating-a-pull-request).
|
||||||
|
|
||||||
### Debuging Bashbot
|
### Debugging Bashbot
|
||||||
In normal mode of operation all bashbot output is discarded one more correct sent to TMUX console.
|
In normal mode of operation all bashbot output is discarded one more correct sent to TMUX console.
|
||||||
To get these messages (and more) you can start bashbot in the current shell ```./bashbot.sh startbot```. Now you can see all output or erros from bashbot.
|
To get these messages (and more) you can start bashbot in the current shell ```./bashbot.sh startbot```. Now you can see all output or erros from bashbot.
|
||||||
In addition you can change the change the level of verbosity by adding a third argument after startbot.
|
In addition you can change the change the level of verbosity by adding a third argument after startbot.
|
||||||
@ -16,7 +16,19 @@ In addition you can change the change the level of verbosity by adding a third a
|
|||||||
"xdebugterm" same as xdebug but output and errors are sent to terminal
|
"xdebugterm" same as xdebug but output and errors are sent to terminal
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Create a stripped down Version of your Bot
|
||||||
|
Currently bashbot is more a bot development environment than a bot, containing examples, developer scripts, modules, documentation and more.
|
||||||
|
You don't need all these files after you're finished with your cool new bot.
|
||||||
|
|
||||||
|
Let's create a stripped down version:
|
||||||
|
|
||||||
|
- delete all modules you do not need from 'modules', e.g. 'modules/inline.sh' if you don't use inline queries
|
||||||
|
- delete not needed standard commands and messages from 'commands.sh'
|
||||||
|
- delete not needed commands and functions from 'mycommands.sh'
|
||||||
|
- run ```dev/make-standalone.sh``` to create a a stripped down version of your bo
|
||||||
|
|
||||||
|
Now have a look at the directory 'standalone', here you find the files 'bashbot.sh' and 'commands.sh' containing everything to run your bot.
|
||||||
|
[Download make-standalone.sh](https://github.com/topkecleon/telegram-bot-bash/blob/master/dev/make-standalone.sh) from github.
|
||||||
|
|
||||||
### Setup your develop environment
|
### Setup your develop environment
|
||||||
|
|
||||||
@ -39,6 +51,49 @@ A typical bashbot develop loop looks as follow:
|
|||||||
|
|
||||||
**If you setup your dev environment with hooks and use the scripts above, versioning, addding and testing is done automatically.**
|
**If you setup your dev environment with hooks and use the scripts above, versioning, addding and testing is done automatically.**
|
||||||
|
|
||||||
|
### common commands
|
||||||
|
We state bashbot is a bash only bot, but this is not true. bashbot is a bash script using bash features PLUS external commands.
|
||||||
|
Usually bash is used in a unix/linux environment where many (GNU) commands are availible, but if commands are missing, bashbot may not work.
|
||||||
|
|
||||||
|
To avoid this and make bashbot working on as many platforms as possible - from embedded linux to mainframe - I recommed to restrict
|
||||||
|
ourself to the common commands provided by bash and coreutils/busybox/toybox.
|
||||||
|
See [Bash Builtins](https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html),
|
||||||
|
[coreutils](https://en.wikipedia.org/wiki/List_of_GNU_Core_Utilities_commands),
|
||||||
|
[busybox](https://en.wikipedia.org/wiki/BusyBox#Commands) and [toybox](https://landley.net/toybox/help.html)
|
||||||
|
|
||||||
|
Availible commands in bash, coreutils, busybox and toybox. Do you find curl on the list?
|
||||||
|
```bash
|
||||||
|
.*, [*, [[*, basename, break, builtin*, bzcat, caller*, cat, cd*, chattr,
|
||||||
|
chgrp, chmod, chown, clear, command*, continue *, cp, cut, date, declare*,
|
||||||
|
dc, dd, df, diff, dirname, du, echo*, eval*, exec*, exit *, expr*, find,
|
||||||
|
fuser, getopt*, grep, hash*, head, hexdump, id, kill, killall, last, length,
|
||||||
|
less, let*, ln, local*, logname, ls, lsattr, lsmod, man, mapfile*, md5sum, mkdir,
|
||||||
|
mkfifo, mknod, more, mv, nice, nohup, passwd, patch, printf*, ps, pwd*, read*,
|
||||||
|
readarray*, readonly* return*, rm, rmdir, sed, seq, sha1sum, shift*, sleep,
|
||||||
|
source*, sort, split, stat, strings, su, sync, tail, tar, tee, test,
|
||||||
|
time, times*, timeout, touch, tr, trap*, true, umask*, usleep, uudecode,
|
||||||
|
uuencode, wc, wget, which, who, whoami, xargs, yes
|
||||||
|
```
|
||||||
|
commands marked with \* are bash builtins, all others are external programms. Calling an external programm is more expensive then using bulitins
|
||||||
|
or using an internal replacement. Here are some examples of internal replacement for external commands:
|
||||||
|
```bash
|
||||||
|
HOST="$(hostname)" -> HOST="$HOSTNAME"
|
||||||
|
|
||||||
|
seq 1 100 -> {0..100}
|
||||||
|
|
||||||
|
data="$(cat file)" -> data="$(<"file")"
|
||||||
|
|
||||||
|
DIR="$(dirname $0) -> DIR=""${0%/*}/""
|
||||||
|
|
||||||
|
IAM="($basename $0)" -> IAM="${0##*/}*
|
||||||
|
|
||||||
|
VAR="$(( 1 + 2 ))" -> (( var=1+2 ))
|
||||||
|
|
||||||
|
INDEX="$(( ${INDEX} + 1 ))" -> (( INDEX++ ))
|
||||||
|
|
||||||
|
```
|
||||||
|
For more examples see [Pure bash bible](https://github.com/dylanaraps/pure-bash-bible)
|
||||||
|
|
||||||
### Prepare a new version
|
### Prepare a new version
|
||||||
After some development it may time to create a new version for the users. a new version can be in sub version upgrade, e.g. for fixes and smaller additions or
|
After some development it may time to create a new version for the users. a new version can be in sub version upgrade, e.g. for fixes and smaller additions or
|
||||||
a new release version for new features. To mark a new version use ```git tag NEWVERSION``` and run ```dev/version.sh``` to update all version strings.
|
a new release version for new features. To mark a new version use ```git tag NEWVERSION``` and run ```dev/version.sh``` to update all version strings.
|
||||||
@ -48,6 +103,8 @@ Usually I start with pre versions and when everything looks good I push out a re
|
|||||||
v0.x-devx -> v0.x-prex -> v0.x-rc -> v0.x ... 0.x+1-dev ...
|
v0.x-devx -> v0.x-prex -> v0.x-rc -> v0.x ... 0.x+1-dev ...
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If you release a new Version run ```dev/make-distribution.sh``` to create the zip and tar.gz archives in the dist directory and attach them to the github release. Do not forget to delete directory dist afterwards.
|
||||||
|
|
||||||
### Versioning
|
### Versioning
|
||||||
|
|
||||||
Bashbot is tagged with version numbers. If you start a new development cycle you can tag your fork with a version higher than the current version.
|
Bashbot is tagged with version numbers. If you start a new development cycle you can tag your fork with a version higher than the current version.
|
||||||
@ -131,5 +188,5 @@ fi
|
|||||||
#### [Prev Function Reference](6_reference.md)
|
#### [Prev Function Reference](6_reference.md)
|
||||||
#### [Next Bashbot Environment](8_custom.md)
|
#### [Next Bashbot Environment](8_custom.md)
|
||||||
|
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
|
@ -48,17 +48,31 @@ Full path to JSON.sh script, default: './JSON.sh/JSON.sh', must end with '/JSON.
|
|||||||
|
|
||||||
### Change config values
|
### Change config values
|
||||||
|
|
||||||
#### BASHBOT_DECODE
|
#### BASHBOT_URL
|
||||||
Bashbot offers two variants for decoding JSON UTF format to UTF-8. By default bashbot uses 'json.encode' if python is installed.
|
Uses given URL instead of offical telegram API URL, useful if you have your own telegram server or for testing.
|
||||||
If 'BASHBOT_DECODE' is set to any value (not undefined or not empty) the bash only implementation will be used.
|
|
||||||
```bash
|
```bash
|
||||||
unset BASHBOT_DECODE # autodetect python (default)
|
unset BASHBOT_URL # use Telegram URL https://api.telegram.org/bot<token> (default)
|
||||||
export BASHBOT_DECODE "" # autodetect python
|
|
||||||
|
export BASHBOT_URL "" # use use Telegram https://api.telegram.org/bot<token>
|
||||||
|
|
||||||
|
export BASHBOT_URL "https://my.url.com/bot" # use your URL https://my.url.com/bot<token>
|
||||||
|
|
||||||
export BASHBOT_DECODE "yes" # force internal
|
|
||||||
export BASHBOT_DECODE "no" # also force internal!
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### BASHBOT_TOKEN
|
||||||
|
|
||||||
|
#### BASHBOT_WGET
|
||||||
|
Bashbot uses ```curl``` to communicate with telegram server. if ```curl``` is not availible ```wget``` is used.
|
||||||
|
If 'BASHBOT_WGET' is set to any value (not undefined or not empty) wget is used even is curl is availible.
|
||||||
|
```bash
|
||||||
|
unset BASHBOT_WGET # use curl (default)
|
||||||
|
export BASHBOT_WGET "" # use curl
|
||||||
|
|
||||||
|
export BASHBOT_WGET "yes" # use wget
|
||||||
|
export BASHBOT_WGET "no" # use wget!
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
#### BASHBOT_SLEEP
|
#### BASHBOT_SLEEP
|
||||||
Instead of polling permanently or with a fixed delay, bashbot offers a simple adaptive polling.
|
Instead of polling permanently or with a fixed delay, bashbot offers a simple adaptive polling.
|
||||||
@ -117,5 +131,5 @@ for every poll until the maximum of BASHBOT_SLEEP ms.
|
|||||||
|
|
||||||
#### [Prev Notes for Developers](7_develop.md)
|
#### [Prev Notes for Developers](7_develop.md)
|
||||||
|
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
|
@ -55,6 +55,6 @@ convert existing bots.
|
|||||||
|
|
||||||
**external-use** will contain some examples on how to send messages from external scripts to Telegram chats or users.
|
**external-use** will contain some examples on how to send messages from external scripts to Telegram chats or users.
|
||||||
|
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
# This file is public domain in the USA and all free countries.
|
# This file is public domain in the USA and all free countries.
|
||||||
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
# adjust your language setting here
|
# adjust your language setting here
|
||||||
# https://github.com/topkecleon/telegram-bot-bash#setting-up-your-environment
|
# https://github.com/topkecleon/telegram-bot-bash#setting-up-your-environment
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
# file: run_filename
|
# file: run_filename
|
||||||
# background job to display content of all new files in WATCHDIR
|
# background job to display content of all new files in WATCHDIR
|
||||||
#
|
#
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
# adjust your language setting here
|
# adjust your language setting here
|
||||||
# https://github.com/topkecleon/telegram-bot-bash#setting-up-your-environment
|
# https://github.com/topkecleon/telegram-bot-bash#setting-up-your-environment
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
# file: run_filename
|
# file: run_filename
|
||||||
# background job to display all new files in WATCHDIR
|
# background job to display all new files in WATCHDIR
|
||||||
#
|
#
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
# adjust your language setting here
|
# adjust your language setting here
|
||||||
# https://github.com/topkecleon/telegram-bot-bash#setting-up-your-environment
|
# https://github.com/topkecleon/telegram-bot-bash#setting-up-your-environment
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
# This file is public domain in the USA and all free countries.
|
# This file is public domain in the USA and all free countries.
|
||||||
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
# adjust your language setting here
|
# adjust your language setting here
|
||||||
# https://github.com/topkecleon/telegram-bot-bash#setting-up-your-environment
|
# https://github.com/topkecleon/telegram-bot-bash#setting-up-your-environment
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
# file. multibot.sh
|
# file. multibot.sh
|
||||||
# description: run multiple telegram bots from one installation
|
# description: run multiple telegram bots from one installation
|
||||||
#
|
#
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
if [ "${2}" = "" ] || [ "${2}" = "-h" ]; then
|
if [ "${2}" = "" ] || [ "${2}" = "-h" ]; then
|
||||||
echo "Usage: $0 botname command"
|
echo "Usage: $0 botname command"
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
# This file is public domain in the USA and all free countries.
|
# This file is public domain in the USA and all free countries.
|
||||||
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
||||||
#
|
#
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
|
|
||||||
SHELL=/bin/sh
|
SHELL=/bin/sh
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
# This file is public domain in the USA and all free countries.
|
# This file is public domain in the USA and all free countries.
|
||||||
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
||||||
|
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
# adjust your language setting here
|
# adjust your language setting here
|
||||||
# https://github.com/topkecleon/telegram-bot-bash#setting-up-your-environment
|
# https://github.com/topkecleon/telegram-bot-bash#setting-up-your-environment
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
# This file is public domain in the USA and all free countries.
|
# This file is public domain in the USA and all free countries.
|
||||||
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
# adjust your language setting here
|
# adjust your language setting here
|
||||||
# https://github.com/topkecleon/telegram-bot-bash#setting-up-your-environment
|
# https://github.com/topkecleon/telegram-bot-bash#setting-up-your-environment
|
||||||
@ -27,6 +27,7 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# output current time every $1 seconds
|
# output current time every $1 seconds
|
||||||
|
date "+* It's %k:%M:%S o' clock ..."
|
||||||
while sleep $SLEEP
|
while sleep $SLEEP
|
||||||
do
|
do
|
||||||
date "+* It's %k:%M:%S o' clock ..."
|
date "+* It's %k:%M:%S o' clock ..."
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
# This file is public domain in the USA and all free countries.
|
# This file is public domain in the USA and all free countries.
|
||||||
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
||||||
|
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
# adjust your language setting here
|
# adjust your language setting here
|
||||||
# https://github.com/topkecleon/telegram-bot-bash#setting-up-your-environment
|
# https://github.com/topkecleon/telegram-bot-bash#setting-up-your-environment
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# file: botacl
|
# file: botacl
|
||||||
# a user not listed here, will return false from 'user_is_allowed'
|
# a user not listed here, will return false from 'user_is_allowed'
|
||||||
#
|
#
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
# Format:
|
# Format:
|
||||||
# user:ressource:chat
|
# user:ressource:chat
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
# to show how you can customize bashbot by only editing mycommands.sh
|
# to show how you can customize bashbot by only editing mycommands.sh
|
||||||
# NOTE: this is not tested, simply copied from original source and reworked!
|
# NOTE: this is not tested, simply copied from original source and reworked!
|
||||||
#
|
#
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
#
|
#
|
||||||
# shellcheck disable=SC2154
|
# shellcheck disable=SC2154
|
||||||
# shellcheck disable=SC2034
|
# shellcheck disable=SC2034
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
# This file is public domain in the USA and all free countries.
|
# This file is public domain in the USA and all free countries.
|
||||||
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
||||||
#
|
#
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
#
|
#
|
||||||
# source from commands.sh to use the aliases
|
# source from commands.sh to use the aliases
|
||||||
|
|
||||||
|
@ -5,23 +5,11 @@
|
|||||||
# This file is public domain in the USA and all free countries.
|
# This file is public domain in the USA and all free countries.
|
||||||
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
||||||
#
|
#
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
# source from commands.sh to use the inline functions
|
# source from commands.sh to use the inline functions
|
||||||
|
|
||||||
INLINE_QUERY=$URL'/answerInlineQuery'
|
INLINE_QUERY=$URL'/answerInlineQuery'
|
||||||
declare -A iQUERY
|
|
||||||
export iQUERY
|
|
||||||
|
|
||||||
process_inline() {
|
|
||||||
local num="${1}"
|
|
||||||
iQUERY[0]="$(JsonDecode "$(JsonGetString <<<"${UPDATE}" '"result",0,"inline_query","query"')")"
|
|
||||||
iQUERY[USER_ID]="$(JsonGetValue <<<"${UPDATE}" '"result",'"${num}"',"inline_query","from","id"')"
|
|
||||||
iQUERY[FIRST_NAME]="$(JsonDecode "$(JsonGetString <<<"${UPDATE}" '"result",'"${num}"',"inline_query","from","first_name"')")"
|
|
||||||
iQUERY[LAST_NAME]="$(JsonDecode "$(JsonGetString <<<"${UPDATE}" '"result",'"${num}"',"inline_query","from","last_name"')")"
|
|
||||||
iQUERY[USERNAME]="$(JsonDecode "$(JsonGetString <<<"${UPDATE}" '"result",'"${num}"',"inline_query","from","username"')")"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
answer_inline_query() {
|
answer_inline_query() {
|
||||||
answer_inline_multi "${1}" "$(shift; inline_query_compose "$RANDOM" "$@")"
|
answer_inline_multi "${1}" "$(shift; inline_query_compose "$RANDOM" "$@")"
|
@ -5,78 +5,10 @@
|
|||||||
# This file is public domain in the USA and all free countries.
|
# This file is public domain in the USA and all free countries.
|
||||||
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
||||||
#
|
#
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
# source from commands.sh if you want ro use interactive or background jobs
|
# source from commands.sh if you want ro use interactive or background jobs
|
||||||
|
|
||||||
## to statisfy shellcheck
|
|
||||||
export res
|
|
||||||
|
|
||||||
####
|
|
||||||
# I placed send_message here because main use case is interactive chats and background jobs
|
|
||||||
send_message() {
|
|
||||||
[ "$2" = "" ] && return
|
|
||||||
local text keyboard btext burl no_keyboard file lat long title address sent
|
|
||||||
text="$(sed <<< "${2}" 's/ mykeyboardend.*//;s/ *my[kfltab][a-z]\{2,13\}startshere.*//')$(sed <<< "${2}" -n '/mytextstartshere/ s/.*mytextstartshere//p')"
|
|
||||||
text="$(sed <<< "${text}" 's/ *mynewlinestartshere */\r\n/g')"
|
|
||||||
[ "$3" != "safe" ] && {
|
|
||||||
no_keyboard="$(sed <<< "${2}" '/mykeyboardendshere/!d;s/.*mykeyboardendshere.*/mykeyboardendshere/')"
|
|
||||||
keyboard="$(sed <<< "${2}" '/mykeyboardstartshere /!d;s/.*mykeyboardstartshere *//;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
|
||||||
btext="$(sed <<< "${2}" '/mybtextstartshere /!d;s/.*mybtextstartshere //;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
|
||||||
burl="$(sed <<< "${2}" '/myburlstartshere /!d;s/.*myburlstartshere //;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//g;s/ *mykeyboardendshere.*//g')"
|
|
||||||
file="$(sed <<< "${2}" '/myfilelocationstartshere /!d;s/.*myfilelocationstartshere //;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
|
||||||
lat="$(sed <<< "${2}" '/mylatstartshere /!d;s/.*mylatstartshere //;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
|
||||||
long="$(sed <<< "${2}" '/mylongstartshere /!d;s/.*mylongstartshere //;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
|
||||||
title="$(sed <<< "${2}" '/mytitlestartshere /!d;s/.*mytitlestartshere //;s/ *my[kfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
|
||||||
address="$(sed <<< "${2}" '/myaddressstartshere /!d;s/.*myaddressstartshere //;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
|
||||||
}
|
|
||||||
if [ "$no_keyboard" != "" ]; then
|
|
||||||
remove_keyboard "$1" "$text"
|
|
||||||
sent=y
|
|
||||||
fi
|
|
||||||
if [ "$keyboard" != "" ]; then
|
|
||||||
if [[ "$keyboard" != *"["* ]]; then # pre 0.60 style
|
|
||||||
keyboard="[ ${keyboard//\" \"/\" \] , \[ \"} ]"
|
|
||||||
fi
|
|
||||||
send_keyboard "$1" "$text" "$keyboard"
|
|
||||||
sent=y
|
|
||||||
fi
|
|
||||||
if [ "$btext" != "" ] && [ "$burl" != "" ]; then
|
|
||||||
send_button "$1" "$text" "$btext" "$burl"
|
|
||||||
sent=y
|
|
||||||
fi
|
|
||||||
if [ "$file" != "" ]; then
|
|
||||||
send_file "$1" "$file" "$text"
|
|
||||||
sent=y
|
|
||||||
fi
|
|
||||||
if [ "$lat" != "" ] && [ "$long" != "" ]; then
|
|
||||||
if [ "$address" != "" ] && [ "$title" != "" ]; then
|
|
||||||
send_venue "$1" "$lat" "$long" "$title" "$address"
|
|
||||||
else
|
|
||||||
send_location "$1" "$lat" "$long"
|
|
||||||
fi
|
|
||||||
sent=y
|
|
||||||
fi
|
|
||||||
if [ "$sent" != "y" ];then
|
|
||||||
send_text "$1" "$text"
|
|
||||||
fi
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
send_text() {
|
|
||||||
case "$2" in
|
|
||||||
html_parse_mode*)
|
|
||||||
send_html_message "$1" "${2//html_parse_mode}"
|
|
||||||
;;
|
|
||||||
markdown_parse_mode*)
|
|
||||||
send_markdown_message "$1" "${2//markdown_parse_mode}"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
send_normal_message "$1" "$2"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
######
|
######
|
||||||
# interactive and background functions
|
# interactive and background functions
|
||||||
|
|
||||||
@ -99,7 +31,9 @@ checkback() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
checkproc() {
|
checkproc() {
|
||||||
tmux ls | grep -q "$1${copname}"; res=$?; return $?
|
tmux ls | grep -q "$1${copname}"
|
||||||
|
# shellcheck disable=SC2034
|
||||||
|
res=$?; return $?
|
||||||
}
|
}
|
||||||
|
|
||||||
killback() {
|
killback() {
|
||||||
|
63
modules/chatMember.sh
Normal file
63
modules/chatMember.sh
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# file: modules/chatMember.sh
|
||||||
|
# do not edit, this file will be overwritten on update
|
||||||
|
|
||||||
|
# This file is public domain in the USA and all free countries.
|
||||||
|
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
||||||
|
#
|
||||||
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
|
# source from commands.sh to use the member functions
|
||||||
|
|
||||||
|
LEAVE_URL=$URL'/leaveChat'
|
||||||
|
KICK_URL=$URL'/kickChatMember'
|
||||||
|
UNBAN_URL=$URL'/unbanChatMember'
|
||||||
|
GETMEMBER_URL=$URL'/getChatMember'
|
||||||
|
|
||||||
|
# usage: status="$(get_chat_member_status "chat" "user")"
|
||||||
|
get_chat_member_status() {
|
||||||
|
sendJson "$1" 'user_id: '"$2"'' "$GETMEMBER_URL"
|
||||||
|
# shellcheck disable=SC2154
|
||||||
|
JsonGetString '"result","status"' <<< "$res"
|
||||||
|
}
|
||||||
|
|
||||||
|
kick_chat_member() {
|
||||||
|
sendJson "$1" 'user_id: '"$2"'' "$KICK_URL"
|
||||||
|
}
|
||||||
|
|
||||||
|
unban_chat_member() {
|
||||||
|
sendJson "$1" 'user_id: '"$2"'' "$UNBAN_URL"
|
||||||
|
}
|
||||||
|
|
||||||
|
leave_chat() {
|
||||||
|
sendJson "$1" "" "$LEAVE_URL"
|
||||||
|
}
|
||||||
|
|
||||||
|
user_is_creator() {
|
||||||
|
if [ "${1:--}" = "${2:-+}" ] || [ "$(get_chat_member_status "$1" "$2")" = "creator" ]; then return 0; fi
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
user_is_admin() {
|
||||||
|
local me; me="$(get_chat_member_status "$1" "$2")"
|
||||||
|
if [ "${me}" = "creator" ] || [ "${me}" = "administrator" ]; then return 0; fi
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
user_is_botadmin() {
|
||||||
|
local admin; admin="$(head -n 1 "${BOTADMIN}")"
|
||||||
|
[ "${admin}" = "${1}" ] && return 0
|
||||||
|
[[ "${admin}" = "@*" ]] && [[ "${admin}" = "${2}" ]] && return 0
|
||||||
|
if [ "${admin}" = "?" ]; then echo "${1:-?}" >"${BOTADMIN}"; return 0; fi
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
user_is_allowed() {
|
||||||
|
local acl="$1"
|
||||||
|
[ "$1" = "" ] && return 1
|
||||||
|
grep -F -xq "${acl}:*:*" <"${BOTACL}" && return 0
|
||||||
|
[ "$2" != "" ] && acl="${acl}:$2"
|
||||||
|
grep -F -xq "${acl}:*" <"${BOTACL}" && return 0
|
||||||
|
[ "$3" != "" ] && acl="${acl}:$3"
|
||||||
|
grep -F -xq "${acl}" <"${BOTACL}"
|
||||||
|
}
|
232
modules/sendMessage.sh
Normal file
232
modules/sendMessage.sh
Normal file
@ -0,0 +1,232 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# file: modules/message.sh
|
||||||
|
# do not edit, this file will be overwritten on update
|
||||||
|
|
||||||
|
# This file is public domain in the USA and all free countries.
|
||||||
|
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
||||||
|
#
|
||||||
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
|
# source from commands.sh to use the sendMessage functions
|
||||||
|
|
||||||
|
MSG_URL=$URL'/sendMessage'
|
||||||
|
PHO_URL=$URL'/sendPhoto'
|
||||||
|
AUDIO_URL=$URL'/sendAudio'
|
||||||
|
DOCUMENT_URL=$URL'/sendDocument'
|
||||||
|
STICKER_URL=$URL'/sendSticker'
|
||||||
|
VIDEO_URL=$URL'/sendVideo'
|
||||||
|
VOICE_URL=$URL'/sendVoice'
|
||||||
|
LOCATION_URL=$URL'/sendLocation'
|
||||||
|
VENUE_URL=$URL'/sendVenue'
|
||||||
|
ACTION_URL=$URL'/sendChatAction'
|
||||||
|
FORWARD_URL=$URL'/forwardMessage'
|
||||||
|
|
||||||
|
send_normal_message() {
|
||||||
|
local text="${2}"
|
||||||
|
until [ -z "${text}" ]; do
|
||||||
|
sendJson "${1}" '"text":"'"${text:0:4096}"'"' "${MSG_URL}"
|
||||||
|
text="${text:4096}"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
send_markdown_message() {
|
||||||
|
local text="${2}"
|
||||||
|
until [ -z "${text}" ]; do
|
||||||
|
sendJson "${1}" '"text":"'"${text:0:4096}"'","parse_mode":"markdown"' "${MSG_URL}"
|
||||||
|
text="${text:4096}"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
send_html_message() {
|
||||||
|
local text="${2}"
|
||||||
|
until [ -z "${text}" ]; do
|
||||||
|
sendJson "${1}" '"text":"'"${text:0:4096}"'","parse_mode":"html"' "${MSG_URL}"
|
||||||
|
text="${text:4096}"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
old_send_keyboard() {
|
||||||
|
local text='"text":"'"${2}"'"'
|
||||||
|
shift 2
|
||||||
|
local keyboard=init
|
||||||
|
OLDIFS=$IFS
|
||||||
|
IFS=$(echo -en "\"")
|
||||||
|
for f in "$@" ;do [ "$f" != " " ] && keyboard="$keyboard, [\"$f\"]";done
|
||||||
|
IFS=$OLDIFS
|
||||||
|
keyboard=${keyboard/init, /}
|
||||||
|
sendJson "${1}" "${text}"', "reply_markup": {"keyboard": [ '"${keyboard}"' ],"one_time_keyboard": true}' "$MSG_URL"
|
||||||
|
}
|
||||||
|
|
||||||
|
ISEMPTY="ThisTextIsEmptyAndWillBeDeleted"
|
||||||
|
sendEmpty() {
|
||||||
|
sendJson "${@}"
|
||||||
|
[[ "${2}" = *"${ISEMPTY}"* ]] && delete_message "${1}" "${BOTSENT[ID]}"
|
||||||
|
}
|
||||||
|
send_keyboard() {
|
||||||
|
if [[ "$3" != *'['* ]]; then old_send_keyboard "${@}"; return; fi
|
||||||
|
local text='"text":"'"${2}"'"'; [ "${2}" = "" ] && text='"text":"'"${ISEMPTY}"'"'
|
||||||
|
local one_time=', "one_time_keyboard":true' && [ "$4" != "" ] && one_time=""
|
||||||
|
sendEmpty "${1}" "${text}"', "reply_markup": {"keyboard": [ '"${3}"' ] '"${one_time}"'}' "$MSG_URL"
|
||||||
|
# '"text":"$2", "reply_markup": {"keyboard": [ ${3} ], "one_time_keyboard": true}'
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_keyboard() {
|
||||||
|
local text='"text":"'"${2}"'"'; [ "${2}" = "" ] && text='"text":"'"${ISEMPTY}"'"'
|
||||||
|
sendEmpty "${1}" "${text}"', "reply_markup": {"remove_keyboard":true}' "$MSG_URL"
|
||||||
|
#JSON='"text":"$2", "reply_markup": {"remove_keyboard":true}'
|
||||||
|
}
|
||||||
|
send_inline_keyboard() {
|
||||||
|
local text='"text":"'"${2}"'"'; [ "${2}" = "" ] && text='"text":"'"${ISEMPTY}"'"'
|
||||||
|
sendEmpty "${1}" "${text}"', "reply_markup": {"inline_keyboard": [ '"${3}"' ]}' "$MSG_URL"
|
||||||
|
# JSON='"text":"$2", "reply_markup": {"inline_keyboard": [ $3->[{"text":"text", "url":"url"}]<- ]}'
|
||||||
|
}
|
||||||
|
send_button() {
|
||||||
|
send_inline_keyboard "${1}" "${2}" '[ {"text":"'"${3}"'", "url":"'"${4}"'"}]'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
UPLOADDIR="${BASHBOT_UPLOAD:-${TMPDIR}/upload}"
|
||||||
|
|
||||||
|
send_file() {
|
||||||
|
[ "$2" = "" ] && return
|
||||||
|
local file="$2"
|
||||||
|
local CAPTION=',"caption":"'$3'"'; [ "$3" = "" ] && CAPTION=""
|
||||||
|
# file access checks ...
|
||||||
|
[[ "$file" = *'..'* ]] && return # no directory traversal
|
||||||
|
[[ "$file" = '.'* ]] && return # no hidden or relative files
|
||||||
|
if [[ "$file" = '/'* ]] ; then
|
||||||
|
[[ "$file" =~ $FILE_REGEX ]] || return # absulute must match REGEX
|
||||||
|
else
|
||||||
|
file="${UPLOADDIR:-NOUPLOADDIR}/${file}" # othiers must be in UPLOADDIR
|
||||||
|
fi
|
||||||
|
[ -r "$file" ] || return # and file must exits of course
|
||||||
|
|
||||||
|
local ext="${file##*.}"
|
||||||
|
case $ext in
|
||||||
|
mp3|flac)
|
||||||
|
CUR_URL="$AUDIO_URL"
|
||||||
|
WHAT="audio"
|
||||||
|
STATUS="upload_audio"
|
||||||
|
;;
|
||||||
|
png|jpg|jpeg|gif)
|
||||||
|
CUR_URL="$PHO_URL"
|
||||||
|
WHAT="photo"
|
||||||
|
STATUS="upload_photo"
|
||||||
|
;;
|
||||||
|
webp)
|
||||||
|
CUR_URL="$STICKER_URL"
|
||||||
|
WHAT="sticker"
|
||||||
|
STATUS="upload_photo"
|
||||||
|
;;
|
||||||
|
mp4)
|
||||||
|
CUR_URL="$VIDEO_URL"
|
||||||
|
WHAT="video"
|
||||||
|
STATUS="upload_video"
|
||||||
|
;;
|
||||||
|
|
||||||
|
ogg)
|
||||||
|
CUR_URL="$VOICE_URL"
|
||||||
|
WHAT="voice"
|
||||||
|
STATUS="upload_audio"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
CUR_URL="$DOCUMENT_URL"
|
||||||
|
WHAT="document"
|
||||||
|
STATUS="upload_document"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
send_action "${1}" "$STATUS"
|
||||||
|
# shellcheck disable=SC2034
|
||||||
|
sendJson "${1}" '"'"$WHAT"'":"'"$2"'"'"$CAPTION"'"' "$CUR_URL"
|
||||||
|
}
|
||||||
|
|
||||||
|
# typing for text messages, upload_photo for photos, record_video or upload_video for videos, record_audio or upload_audio for audio files, upload_document for general files, find_location for location
|
||||||
|
send_action() {
|
||||||
|
[ "$2" = "" ] && return
|
||||||
|
sendJson "${1}" '"action": "'"${2}"'"' "$ACTION_URL"
|
||||||
|
}
|
||||||
|
|
||||||
|
send_location() {
|
||||||
|
[ "$3" = "" ] && return
|
||||||
|
sendJson "${1}" '"latitude": '"${2}"', "longitude": '"${3}"'' "$LOCATION_URL"
|
||||||
|
}
|
||||||
|
|
||||||
|
send_venue() {
|
||||||
|
local add=""
|
||||||
|
[ "$5" = "" ] && return
|
||||||
|
[ "$6" != "" ] && add=', "foursquare_id": '"$6"''
|
||||||
|
sendJson "${1}" '"latitude": '"${2}"', "longitude": '"${3}"', "address": "'"${5}"'", "title": "'"${4}"'"'"${add}" "$VENUE_URL"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
forward_message() {
|
||||||
|
[ "$3" = "" ] && return
|
||||||
|
sendJson "${1}" '"from_chat_id": '"${2}"', "message_id": '"${3}"'' "$FORWARD_URL"
|
||||||
|
}
|
||||||
|
forward() { # backward compatibility
|
||||||
|
forward_message "$@" || return
|
||||||
|
}
|
||||||
|
|
||||||
|
send_message() {
|
||||||
|
[ "$2" = "" ] && return
|
||||||
|
local text keyboard btext burl no_keyboard file lat long title address sent
|
||||||
|
text="$(sed <<< "${2}" 's/ mykeyboardend.*//;s/ *my[kfltab][a-z]\{2,13\}startshere.*//')$(sed <<< "${2}" -n '/mytextstartshere/ s/.*mytextstartshere//p')"
|
||||||
|
text="$(sed <<< "${text}" 's/ *mynewlinestartshere */\r\n/g')"
|
||||||
|
[ "$3" != "safe" ] && {
|
||||||
|
no_keyboard="$(sed <<< "${2}" '/mykeyboardendshere/!d;s/.*mykeyboardendshere.*/mykeyboardendshere/')"
|
||||||
|
keyboard="$(sed <<< "${2}" '/mykeyboardstartshere /!d;s/.*mykeyboardstartshere *//;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
||||||
|
btext="$(sed <<< "${2}" '/mybtextstartshere /!d;s/.*mybtextstartshere //;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
||||||
|
burl="$(sed <<< "${2}" '/myburlstartshere /!d;s/.*myburlstartshere //;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//g;s/ *mykeyboardendshere.*//g')"
|
||||||
|
file="$(sed <<< "${2}" '/myfilelocationstartshere /!d;s/.*myfilelocationstartshere //;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
||||||
|
lat="$(sed <<< "${2}" '/mylatstartshere /!d;s/.*mylatstartshere //;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
||||||
|
long="$(sed <<< "${2}" '/mylongstartshere /!d;s/.*mylongstartshere //;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
||||||
|
title="$(sed <<< "${2}" '/mytitlestartshere /!d;s/.*mytitlestartshere //;s/ *my[kfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
||||||
|
address="$(sed <<< "${2}" '/myaddressstartshere /!d;s/.*myaddressstartshere //;s/ *my[nkfltab][a-z]\{2,13\}startshere.*//;s/ *mykeyboardendshere.*//')"
|
||||||
|
}
|
||||||
|
if [ "$no_keyboard" != "" ]; then
|
||||||
|
remove_keyboard "$1" "$text"
|
||||||
|
sent=y
|
||||||
|
fi
|
||||||
|
if [ "$keyboard" != "" ]; then
|
||||||
|
if [[ "$keyboard" != *"["* ]]; then # pre 0.60 style
|
||||||
|
keyboard="[ ${keyboard//\" \"/\" \] , \[ \"} ]"
|
||||||
|
fi
|
||||||
|
send_keyboard "$1" "$text" "$keyboard"
|
||||||
|
sent=y
|
||||||
|
fi
|
||||||
|
if [ "$btext" != "" ] && [ "$burl" != "" ]; then
|
||||||
|
send_button "$1" "$text" "$btext" "$burl"
|
||||||
|
sent=y
|
||||||
|
fi
|
||||||
|
if [ "$file" != "" ]; then
|
||||||
|
send_file "$1" "$file" "$text"
|
||||||
|
sent=y
|
||||||
|
fi
|
||||||
|
if [ "$lat" != "" ] && [ "$long" != "" ]; then
|
||||||
|
if [ "$address" != "" ] && [ "$title" != "" ]; then
|
||||||
|
send_venue "$1" "$lat" "$long" "$title" "$address"
|
||||||
|
else
|
||||||
|
send_location "$1" "$lat" "$long"
|
||||||
|
fi
|
||||||
|
sent=y
|
||||||
|
fi
|
||||||
|
if [ "$sent" != "y" ];then
|
||||||
|
send_text "$1" "$text"
|
||||||
|
fi
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
send_text() {
|
||||||
|
case "$2" in
|
||||||
|
html_parse_mode*)
|
||||||
|
send_html_message "$1" "${2//html_parse_mode}"
|
||||||
|
;;
|
||||||
|
markdown_parse_mode*)
|
||||||
|
send_markdown_message "$1" "${2//markdown_parse_mode}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
send_normal_message "$1" "$2"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
@ -2,38 +2,35 @@
|
|||||||
# files: mycommands.sh.dist
|
# files: mycommands.sh.dist
|
||||||
# copy to mycommands.sh and add all your commands and functions here ...
|
# copy to mycommands.sh and add all your commands and functions here ...
|
||||||
#
|
#
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
#
|
#
|
||||||
# shellcheck disable=SC2154
|
|
||||||
# shellcheck disable=SC2034
|
|
||||||
|
|
||||||
|
|
||||||
# uncomment the following lines to overwrite info and help messages
|
# uncomment the following lines to overwrite info and help messages
|
||||||
# bashbot_info='This is bashbot, the Telegram bot written entirely in bash.
|
# bashbot_info='This is bashbot, the Telegram bot written entirely in bash.
|
||||||
#'
|
#'
|
||||||
# bashbot_help='*Available commands*:
|
# bashbot_help='*Available commands*:
|
||||||
#'
|
#'
|
||||||
|
res=""
|
||||||
|
|
||||||
if [ "$1" = "source" ];then
|
|
||||||
# Set INLINE to 1 in order to receive inline queries.
|
# Set INLINE to 1 in order to receive inline queries.
|
||||||
# To enable this option in your bot, send the /setinline command to @BotFather.
|
# To enable this option in your bot, send the /setinline command to @BotFather.
|
||||||
INLINE="0"
|
export INLINE="0"
|
||||||
# Set to .* to allow sending files from all locations
|
# Set to .* to allow sending files from all locations
|
||||||
FILE_REGEX='/home/user/allowed/.*'
|
export FILE_REGEX='/home/user/allowed/.*'
|
||||||
|
|
||||||
else
|
if [ "$1" != "source" ];then
|
||||||
# your additional bahsbot commands
|
# your additional bahsbot commands
|
||||||
# NOTE: command can have @botname attached, you must add * in case tests...
|
# NOTE: command can have @botname attached, you must add * in case tests...
|
||||||
mycommands() {
|
mycommands() {
|
||||||
|
|
||||||
case "$MESSAGE" in
|
case "${MESSAGE}" in
|
||||||
'/echo'*) # example echo command
|
'/echo'*) # example echo command
|
||||||
send_normal_message "${CHAT[ID]}" "$MESSAGE"
|
send_normal_message "${CHAT[ID]}" "$MESSAGE"
|
||||||
;;
|
;;
|
||||||
'/question'*) # start interactive questions
|
'/question'*) # start interactive questions
|
||||||
checkproc
|
checkproc
|
||||||
if [ "$res" -gt 0 ] ; then
|
if [ "$res" -gt 0 ] ; then
|
||||||
startproc "example/question"
|
startproc "examples/question.sh"
|
||||||
else
|
else
|
||||||
send_normal_message "${CHAT[ID]}" "$MESSAGE already running ..."
|
send_normal_message "${CHAT[ID]}" "$MESSAGE already running ..."
|
||||||
fi
|
fi
|
||||||
@ -42,7 +39,7 @@ else
|
|||||||
'/run_notify'*) # start notify background job
|
'/run_notify'*) # start notify background job
|
||||||
myback="notify"; checkback "$myback"
|
myback="notify"; checkback "$myback"
|
||||||
if [ "$res" -gt 0 ] ; then
|
if [ "$res" -gt 0 ] ; then
|
||||||
background "example/notify 60" "$myback" # notify every 60 seconds
|
background "examples/notify.sh 60" "$myback" # notify every 60 seconds
|
||||||
else
|
else
|
||||||
send_normal_message "${CHAT[ID]}" "Background command $myback already running ..."
|
send_normal_message "${CHAT[ID]}" "Background command $myback already running ..."
|
||||||
fi
|
fi
|
||||||
@ -64,6 +61,7 @@ else
|
|||||||
#######################
|
#######################
|
||||||
# Inline query examples, do not use them in production (exept image search ;-)
|
# Inline query examples, do not use them in production (exept image search ;-)
|
||||||
# shellcheck disable=SC2128
|
# shellcheck disable=SC2128
|
||||||
|
iQUERY="${iQUERY,,}" # all lowercase
|
||||||
case "${iQUERY}" in
|
case "${iQUERY}" in
|
||||||
"image "*) # search images with yahoo
|
"image "*) # search images with yahoo
|
||||||
local search="${iQUERY#* }"
|
local search="${iQUERY#* }"
|
||||||
@ -107,6 +105,7 @@ else
|
|||||||
answer_inline_query "${iQUERY[ID]}" "cached_gif" "BQADBAADIwYAAmwsDAABlIia56QGP0YC"
|
answer_inline_query "${iQUERY[ID]}" "cached_gif" "BQADBAADIwYAAmwsDAABlIia56QGP0YC"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
set +x
|
||||||
}
|
}
|
||||||
|
|
||||||
# place your processing functions here
|
# place your processing functions here
|
||||||
@ -116,7 +115,7 @@ else
|
|||||||
local image result sep="" count="1"
|
local image result sep="" count="1"
|
||||||
result="$(wget --user-agent 'Mozilla/5.0' -qO - "https://images.search.yahoo.com/search/images?p=$1" | sed 's/</\n</g' | grep "<img src=")"
|
result="$(wget --user-agent 'Mozilla/5.0' -qO - "https://images.search.yahoo.com/search/images?p=$1" | sed 's/</\n</g' | grep "<img src=")"
|
||||||
while read -r image; do
|
while read -r image; do
|
||||||
[ "$count" -gt "9" ] && break
|
[ "$count" -gt "20" ] && break
|
||||||
image="${image#* src=\'}"; image="${image%%&pid=*}"
|
image="${image#* src=\'}"; image="${image%%&pid=*}"
|
||||||
[[ "${image}" = *"src="* ]] && continue
|
[[ "${image}" = *"src="* ]] && continue
|
||||||
echo "${sep}"; inline_query_compose "$RANDOM" "photo" "${image}"; sep=","
|
echo "${sep}"; inline_query_compose "$RANDOM" "photo" "${image}"; sep=","
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# ADD a new test skeleton to test dir, but does not activate test
|
# ADD a new test skeleton to test dir, but does not activate test
|
||||||
#
|
#
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
# magic to ensure that we're always inside the root of our application,
|
# magic to ensure that we're always inside the root of our application,
|
||||||
# no matter from which directory we'll run script
|
# no matter from which directory we'll run script
|
||||||
@ -65,6 +65,7 @@ cd "\${TESTDIR}" || exit 1
|
|||||||
# source bashbot.sh function, uncomment if you want to test functions
|
# source bashbot.sh function, uncomment if you want to test functions
|
||||||
# shellcheck source=./bashbot.sh
|
# shellcheck source=./bashbot.sh
|
||||||
# source "\\${TESTDIR}/bashbot.sh" source
|
# source "\\${TESTDIR}/bashbot.sh" source
|
||||||
|
# source "\\${TESTDIR}/commands.sh" source
|
||||||
|
|
||||||
# start writing your tests here ...
|
# start writing your tests here ...
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
# common variables
|
# common variables
|
||||||
export TESTME DIRME TESTDIR LOGFILE REFDIR TESTNAME
|
export TESTME DIRME TESTDIR LOGFILE REFDIR TESTNAME
|
||||||
@ -11,12 +11,13 @@ export TESTME DIRME TESTDIR LOGFILE REFDIR TESTNAME
|
|||||||
TESTNAME="${REFDIR//-/ }"
|
TESTNAME="${REFDIR//-/ }"
|
||||||
|
|
||||||
# common filenames
|
# common filenames
|
||||||
export TOKENFILE ACLFILE COUNTFILE ADMINFILE DATADIR
|
export TOKENFILE ACLFILE COUNTFILE ADMINFILE DATADIR JSONSHFILE
|
||||||
TOKENFILE="token"
|
TOKENFILE="token"
|
||||||
ACLFILE="botacl"
|
ACLFILE="botacl"
|
||||||
COUNTFILE="count"
|
COUNTFILE="count"
|
||||||
ADMINFILE="botadmin"
|
ADMINFILE="botadmin"
|
||||||
DATADIR="data-bot-bash"
|
DATADIR="data-bot-bash"
|
||||||
|
JSONSHFILE="JSON.sh/JSON.sh"
|
||||||
|
|
||||||
# SUCCESS NOSUCCES
|
# SUCCESS NOSUCCES
|
||||||
export SUCCESS NOSUCCESS
|
export SUCCESS NOSUCCESS
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
../dev/hooks/pre-commit.sh
|
../dev/hooks/pre-commit.sh
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# file: b-example-test.sh
|
# file: b-example-test.sh
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
# include common functions and definitions
|
# include common functions and definitions
|
||||||
# shellcheck source=test/ALL-tests.inc.sh
|
# shellcheck source=test/ALL-tests.inc.sh
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
# include common functions and definitions
|
# include common functions and definitions
|
||||||
# shellcheck source=test/ALL-tests.inc.sh
|
# shellcheck source=test/ALL-tests.inc.sh
|
||||||
@ -24,18 +24,22 @@ export FAIL="0"
|
|||||||
for file in ${TESTFILES}
|
for file in ${TESTFILES}
|
||||||
do
|
do
|
||||||
ls -d "${TESTDIR}/${file}" >>"${LOGFILE}"
|
ls -d "${TESTDIR}/${file}" >>"${LOGFILE}"
|
||||||
if ! diff -q "${TESTDIR}/${file}" "${REFDIR}/${file}" >>"${LOGFILE}"; then echo "${NOSUCCESS} Fail diff ${file}!"; FAIL="1"; fi
|
diff -q "${TESTDIR}/${file}" "${REFDIR}/${file}" >>"${LOGFILE}" || { echo "${NOSUCCESS} Fail diff ${file}!"; FAIL="1"; }
|
||||||
|
|
||||||
done
|
done
|
||||||
[ "${FAIL}" != "0" ] && exit "${FAIL}"
|
[ "${FAIL}" != "0" ] && exit "${FAIL}"
|
||||||
echo "${SUCCESS}"
|
echo "${SUCCESS}"
|
||||||
|
|
||||||
echo "Test Sourcing of bashbot.sh ..."
|
|
||||||
trap exit 1 EXIT
|
trap exit 1 EXIT
|
||||||
cd "${TESTDIR}" || exit
|
cd "${TESTDIR}" || exit
|
||||||
|
|
||||||
|
echo "Test if $JSONSHFILE exists ..."
|
||||||
|
[ ! -x "$JSONSHFILE" ] && { echo "${NOSUCCESS} Fail diff ${file}!"; exit 1; }
|
||||||
|
|
||||||
|
echo "Test Sourcing of bashbot.sh ..."
|
||||||
# shellcheck source=./bashbot.sh
|
# shellcheck source=./bashbot.sh
|
||||||
source "${TESTDIR}/bashbot.sh" source
|
source "${TESTDIR}/bashbot.sh" source
|
||||||
|
source "${TESTDIR}/commands.sh" source
|
||||||
|
|
||||||
trap '' EXIT
|
trap '' EXIT
|
||||||
cd "${DIRME}" || exit 1
|
cd "${DIRME}" || exit 1
|
||||||
echo "${SUCCESS}"
|
echo "${SUCCESS}"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
# include common functions and definitions
|
# include common functions and definitions
|
||||||
# shellcheck source=test/ALL-tests.inc.sh
|
# shellcheck source=test/ALL-tests.inc.sh
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
# include common functions and definitions
|
# include common functions and definitions
|
||||||
# shellcheck source=test/ALL-tests.inc.sh
|
# shellcheck source=test/ALL-tests.inc.sh
|
||||||
@ -12,7 +12,7 @@ cd "${TESTDIR}" || exit 1
|
|||||||
# shellcheck source=./bashbot.sh
|
# shellcheck source=./bashbot.sh
|
||||||
source "${TESTDIR}/bashbot.sh" source
|
source "${TESTDIR}/bashbot.sh" source
|
||||||
# shellcheck source=./bashbot.sh
|
# shellcheck source=./bashbot.sh
|
||||||
source "${TESTDIR}/modules/inline.sh" source
|
source "${TESTDIR}/modules/answerInline.sh" source
|
||||||
|
|
||||||
# overwrite get_file for test
|
# overwrite get_file for test
|
||||||
get_file() {
|
get_file() {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
# include common functions and definitions
|
# include common functions and definitions
|
||||||
# shellcheck source=test/ALL-tests.inc.sh
|
# shellcheck source=test/ALL-tests.inc.sh
|
||||||
@ -11,6 +11,8 @@ set -e
|
|||||||
cd "${TESTDIR}" || exit 1
|
cd "${TESTDIR}" || exit 1
|
||||||
# shellcheck source=./bashbot.sh
|
# shellcheck source=./bashbot.sh
|
||||||
source "${TESTDIR}/bashbot.sh" source
|
source "${TESTDIR}/bashbot.sh" source
|
||||||
|
# shellcheck source=./bashbot.sh
|
||||||
|
source "${TESTDIR}/commands.sh" source
|
||||||
|
|
||||||
# overwrite get_file for test
|
# overwrite get_file for test
|
||||||
get_file() {
|
get_file() {
|
||||||
@ -21,13 +23,8 @@ get_file() {
|
|||||||
export UPDATE
|
export UPDATE
|
||||||
UPDATE="$(cat "${INPUTFILE}")"
|
UPDATE="$(cat "${INPUTFILE}")"
|
||||||
|
|
||||||
# run process_message with and without phyton
|
# run process_message
|
||||||
echo "Check process_message ..."
|
echo "Check process_message ..."
|
||||||
for i in 1 2
|
|
||||||
do
|
|
||||||
[ "${i}" = "1" ] && ! which python >/dev/null 2>&1 && continue
|
|
||||||
[ "${i}" = "1" ] && echo " ... with JsonDecode Phyton" && unset BASHBOT_DECODE
|
|
||||||
[ "${i}" = "2" ] && echo " ... with JsonDecode Bash" && export BASHBOT_DECODE="yes"
|
|
||||||
set -x
|
set -x
|
||||||
{ process_message "0"; set +x; } >>"${LOGFILE}" 2>&1;
|
{ process_message "0"; set +x; } >>"${LOGFILE}" 2>&1;
|
||||||
|
|
||||||
@ -35,6 +32,5 @@ do
|
|||||||
print_array "USER" "CHAT" "REPLYTO" "FORWARD" "URLS" "CONTACT" "CAPTION" "LOCATION" "MESSAGE" "VENUE" >"${OUTPUTFILE}"
|
print_array "USER" "CHAT" "REPLYTO" "FORWARD" "URLS" "CONTACT" "CAPTION" "LOCATION" "MESSAGE" "VENUE" >"${OUTPUTFILE}"
|
||||||
diff -c "${REFFILE}" "${OUTPUTFILE}" || exit 1
|
diff -c "${REFFILE}" "${OUTPUTFILE}" || exit 1
|
||||||
echo "${SUCCESS}"
|
echo "${SUCCESS}"
|
||||||
done
|
|
||||||
|
|
||||||
cd "${DIRME}" || exit 1
|
cd "${DIRME}" || exit 1
|
||||||
|
@ -1,34 +1,42 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
# include common functions and definitions
|
# include common functions and definitions
|
||||||
# shellcheck source=test/ALL-tests.inc.sh
|
# shellcheck source=test/ALL-tests.inc.sh
|
||||||
source "./ALL-tests.inc.sh"
|
source "./ALL-tests.inc.sh"
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
set +f
|
||||||
|
|
||||||
cd "${TESTDIR}" || exit 1
|
cd "${TESTDIR}" || exit 1
|
||||||
|
|
||||||
# source bashbot.sh function, uncomment if you want to test functions
|
# source bashbot.sh function, uncomment if you want to test functions
|
||||||
# shellcheck source=./bashbot.sh
|
# shellcheck source=./bashbot.sh
|
||||||
source "${TESTDIR}/bashbot.sh" source
|
source "${TESTDIR}/bashbot.sh" source
|
||||||
source "${TESTDIR}/modules/background.sh"
|
# shellcheck source=./bashbot.sh
|
||||||
|
source "${TESTDIR}/commands.sh" source
|
||||||
|
|
||||||
|
_is_function send_message || echo "Send Message not found!"
|
||||||
|
|
||||||
# start writing your tests here ...
|
# start writing your tests here ...
|
||||||
|
|
||||||
# over write sendJson to output parameter only
|
# over write sendJson to output parameter only
|
||||||
|
sendEmpty() {
|
||||||
|
printf 'chat:%s\tJSON:%s\nURL:%s\n\n' "${1}" "${2}" "${3}"
|
||||||
|
}
|
||||||
|
|
||||||
sendJson() {
|
sendJson() {
|
||||||
printf 'chat:%s\tJSON:%s\nURL:%s\n\n' "${1}" "${2}" "${3}"
|
printf 'chat:%s\tJSON:%s\nURL:%s\n\n' "${1}" "${2}" "${3}"
|
||||||
}
|
}
|
||||||
|
|
||||||
# send text input to send_message
|
# send text input to send_message
|
||||||
|
|
||||||
#set -x
|
|
||||||
echo -n " Send line ..."
|
echo -n " Send line ..."
|
||||||
while IFS='' read -r line || [[ -n "$line" ]]; do
|
|
||||||
|
while read -r line ; do
|
||||||
echo -n "."
|
echo -n "."
|
||||||
send_message "123456" "$line" >>"${OUTPUTFILE}"
|
send_message "123456" "$line" >>"${OUTPUTFILE}"
|
||||||
done < "${INPUTFILE}" 2>>"${LOGFILE}"
|
done < "${INPUTFILE}" #2>>"${LOGFILE}"
|
||||||
echo " done."
|
echo " done."
|
||||||
|
|
||||||
{ diff -c "${REFFILE}" "${OUTPUTFILE}" || exit 1; } | cat -v
|
{ diff -c "${REFFILE}" "${OUTPUTFILE}" || exit 1; } | cat -v
|
||||||
|
@ -8,10 +8,8 @@ markdown_parse_mode This is a *MARKDOWN* text mynewlinestartshere with a line br
|
|||||||
|
|
||||||
# test for keyboard, file, venue output
|
# test for keyboard, file, venue output
|
||||||
Text plus keyboard will appear in chat mykeyboardstartshere [ "Yep, sure" , "No, highly unlikely" ]
|
Text plus keyboard will appear in chat mykeyboardstartshere [ "Yep, sure" , "No, highly unlikely" ]
|
||||||
Text plus file will appear in chat myfilelocationstartshere /home/user/doge.jpg
|
|
||||||
Text plus location will appear in chat mylatstartshere la10 mylongstartshere lo20
|
Text plus location will appear in chat mylatstartshere la10 mylongstartshere lo20
|
||||||
Text plus vuene will appear in chat mylatstartshere la10 mylongstartshere lo20 mytitlestartshere my home myaddressstartshere Diagon Alley N. 37
|
Text plus vuene will appear in chat mylatstartshere la10 mylongstartshere lo20 mytitlestartshere my home myaddressstartshere Diagon Alley N. 37
|
||||||
All in one will appear in chat mykeyboardstartshere [ "Yep, sure" , "No, highly unlikely" ] myfilelocationstartshere /home/user/doge.jpg mylatstartshere la10 mylongstartshere lo20
|
|
||||||
|
|
||||||
# test for new inline button
|
# test for new inline button
|
||||||
Text plus keyboard will appear in chat mybtextstartshere Button Text myburlstartshere https://www...
|
Text plus keyboard will appear in chat mybtextstartshere Button Text myburlstartshere https://www...
|
||||||
|
@ -28,24 +28,12 @@ URL:https://api.telegram.org/botbashbottestscript/sendMessage
|
|||||||
chat:123456 JSON:"text":"Text plus keyboard will appear in chat", "reply_markup": {"keyboard": [ [ "Yep, sure" , "No, highly unlikely" ] ] , "one_time_keyboard":true}
|
chat:123456 JSON:"text":"Text plus keyboard will appear in chat", "reply_markup": {"keyboard": [ [ "Yep, sure" , "No, highly unlikely" ] ] , "one_time_keyboard":true}
|
||||||
URL:https://api.telegram.org/botbashbottestscript/sendMessage
|
URL:https://api.telegram.org/botbashbottestscript/sendMessage
|
||||||
|
|
||||||
chat:123456 JSON:"action": "upload_photo"
|
|
||||||
URL:https://api.telegram.org/botbashbottestscript/sendChatAction
|
|
||||||
|
|
||||||
chat:123456 JSON:"latitude": la10, "longitude": lo20
|
chat:123456 JSON:"latitude": la10, "longitude": lo20
|
||||||
URL:https://api.telegram.org/botbashbottestscript/sendLocation
|
URL:https://api.telegram.org/botbashbottestscript/sendLocation
|
||||||
|
|
||||||
chat:123456 JSON:"latitude": la10, "longitude": lo20, "address": "Diagon Alley N. 37", "title": "my home"
|
chat:123456 JSON:"latitude": la10, "longitude": lo20, "address": "Diagon Alley N. 37", "title": "my home"
|
||||||
URL:https://api.telegram.org/botbashbottestscript/sendVenue
|
URL:https://api.telegram.org/botbashbottestscript/sendVenue
|
||||||
|
|
||||||
chat:123456 JSON:"text":"All in one will appear in chat", "reply_markup": {"keyboard": [ [ "Yep, sure" , "No, highly unlikely" ] ] , "one_time_keyboard":true}
|
|
||||||
URL:https://api.telegram.org/botbashbottestscript/sendMessage
|
|
||||||
|
|
||||||
chat:123456 JSON:"action": "upload_photo"
|
|
||||||
URL:https://api.telegram.org/botbashbottestscript/sendChatAction
|
|
||||||
|
|
||||||
chat:123456 JSON:"latitude": la10, "longitude": lo20
|
|
||||||
URL:https://api.telegram.org/botbashbottestscript/sendLocation
|
|
||||||
|
|
||||||
chat:123456 JSON:"text":"# test for new inline button"
|
chat:123456 JSON:"text":"# test for new inline button"
|
||||||
URL:https://api.telegram.org/botbashbottestscript/sendMessage
|
URL:https://api.telegram.org/botbashbottestscript/sendMessage
|
||||||
|
|
||||||
|
@ -1,17 +1,20 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
# include common functions and definitions
|
# include common functions and definitions
|
||||||
# shellcheck source=test/ALL-tests.inc.sh
|
# shellcheck source=test/ALL-tests.inc.sh
|
||||||
source "./ALL-tests.inc.sh"
|
source "./ALL-tests.inc.sh"
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
set +f
|
||||||
|
|
||||||
cd "${TESTDIR}" || exit 1
|
cd "${TESTDIR}" || exit 1
|
||||||
|
|
||||||
# source bashbot.sh function, uncomment if you want to test functions
|
# source bashbot.sh function, uncomment if you want to test functions
|
||||||
# shellcheck source=./bashbot.sh
|
# shellcheck source=./bashbot.sh
|
||||||
source "${TESTDIR}/bashbot.sh" source
|
source "${TESTDIR}/bashbot.sh" source
|
||||||
|
# shellcheck source=./bashbot.sh
|
||||||
|
source "${TESTDIR}/commands.sh" source
|
||||||
|
|
||||||
# start writing your tests here ...
|
# start writing your tests here ...
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
#### $$VERSION$$ v0.72-1-g67c47ac
|
#### $$VERSION$$ v0.76-1-ge8a1fd0
|
||||||
|
|
||||||
# include common functions and definitions
|
# include common functions and definitions
|
||||||
# shellcheck source=test/ALL-tests.inc.sh
|
# shellcheck source=test/ALL-tests.inc.sh
|
||||||
|
Loading…
Reference in New Issue
Block a user