mirror of
https://github.com/octoleo/telegram-bot-bash.git
synced 2024-05-30 08:50:51 +00:00
basic infrastructure for addons ready
This commit is contained in:
parent
64b4055dda
commit
bee9f33022
|
@ -4,41 +4,66 @@
|
||||||
# Addons can register to bashbot events at statup
|
# Addons can register to bashbot events at statup
|
||||||
# by providing their name and a callback per event
|
# by providing their name and a callback per event
|
||||||
#
|
#
|
||||||
# If an event occours a subprocess is spawned and call
|
# If an event occours each registered event function is called.
|
||||||
# all registered event functions.
|
#
|
||||||
|
# Events run in the same context as the main bashbot event loop
|
||||||
|
# so variables set here are persistent as long bashbot is running.
|
||||||
|
#
|
||||||
|
# Note: For the same reason event function MUST return imideatly!
|
||||||
|
# compute intensive tasks must be run in a nonblocking subshell,
|
||||||
|
# e.g. "(long running) &"
|
||||||
|
#
|
||||||
|
|
||||||
# Availible events:
|
# Availible events:
|
||||||
|
# on events startbot and init, this file is sourced
|
||||||
#
|
#
|
||||||
# BASBOT_EVENT_INLINE inline query received
|
# BASBOT_EVENT_INLINE inline query received
|
||||||
# BASBOT_EVENT_MESSAGE any type of message received
|
# BASBOT_EVENT_MESSAGE any type of message received
|
||||||
# BASBOT_EVENT_REPLY reply to message received
|
# BASBOT_EVENT_REPLYTO reply to message received
|
||||||
# BASBOT_EVENT_FORWARD forwarded message received
|
# BASBOT_EVENT_FORWARD forwarded message received
|
||||||
# BASBOT_EVENT_CONTACT contact received
|
# BASBOT_EVENT_CONTACT contact received
|
||||||
# BASBOT_EVENT_LOCATION location or venue received
|
# BASBOT_EVENT_LOCATION location or venue received
|
||||||
# BASBOT_EVENT_FILE file received
|
# BASBOT_EVENT_FILE file received
|
||||||
#
|
#
|
||||||
# all global variables and functions can be used.
|
# all global variables and functions can be used in registered functions.
|
||||||
|
#
|
||||||
|
# parameters when loaded
|
||||||
|
# $1 event: init, startbot ...
|
||||||
|
# $2 debug: use "[[ "$2" = *"debug"* ]]" if you want to output extra diagnostic
|
||||||
|
#
|
||||||
|
# prameters on events
|
||||||
|
# $1 event: inline, message, ..., file
|
||||||
|
# $2 debug: use "[[ "$2" = *"debug"* ]]" if you want to output extra diagnostic
|
||||||
|
#
|
||||||
|
|
||||||
# any global variable defined by addons MUST be prefixed by addon name
|
# any global variable defined by addons MUST be prefixed by addon name
|
||||||
EXAMPLE_ME="example"
|
EXAMPLE_ME="example"
|
||||||
|
|
||||||
# register to inline
|
# initialize after installation or update
|
||||||
export BASBOT_EVENT_INLINE["${EXAMPLE_ME}"]="${EXAMPLE_ME}_inline"
|
if [[ "$1" = "init"* ]]; then
|
||||||
|
: # notihung to do
|
||||||
|
fi
|
||||||
|
|
||||||
# any function defined by addons MUST be prefixed by addon name
|
|
||||||
# function local variables can have any name, but must be LOCAL
|
# register on startbot
|
||||||
example_inline(){
|
if [[ "$1" = "start"* ]]; then
|
||||||
|
# register to inline
|
||||||
|
export BASBOT_EVENT_INLINE["${EXAMPLE_ME}"]="${EXAMPLE_ME}_inline"
|
||||||
|
|
||||||
|
# any function defined by addons MUST be prefixed by addon name
|
||||||
|
# function local variables can have any name, but must be LOCAL
|
||||||
|
example_inline(){
|
||||||
local msg="${MESSAGE}"
|
local msg="${MESSAGE}"
|
||||||
send_normal_message "${CHAT[ID]}" "Inline query received: ${msg}"
|
send_normal_message "${CHAT[ID]}" "Inline query received: ${msg}"
|
||||||
}
|
}
|
||||||
|
|
||||||
# register to reply
|
# register to reply
|
||||||
export BASBOT_EVENT_REPLY["${EXAMPLE_ME}"]="${EXAMPLE_ME}_reply"
|
export BASBOT_EVENT_REPLY["${EXAMPLE_ME}"]="${EXAMPLE_ME}_reply"
|
||||||
|
|
||||||
# any function defined by addons MUST be prefixed by addon name
|
# any function defined by addons MUST be prefixed by addon name
|
||||||
# function local variables can have any name, but must be LOCAL
|
# function local variables can have any name, but must be LOCAL
|
||||||
example_reply(){
|
example_reply(){
|
||||||
local msg="message"
|
local msg="message"
|
||||||
send_markdown_message "${CHAT[ID]}" "User *${USER[USERNAME]}* replied to ${msg} from *${REPLYTO[USERNAME]}*"
|
send_markdown_message "${CHAT[ID]}" "User *${USER[USERNAME]}* replied to ${msg} from *${REPLYTO[USERNAME]}*"
|
||||||
}
|
}
|
||||||
|
fi
|
||||||
|
|
110
bashbot.sh
110
bashbot.sh
|
@ -11,7 +11,7 @@
|
||||||
# This file is public domain in the USA and all free countries.
|
# This file is public domain in the USA and all free countries.
|
||||||
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
||||||
#
|
#
|
||||||
#### $$VERSION$$ v0.80-26-g9f74bcf
|
#### $$VERSION$$ v0.80-28-g64b4055
|
||||||
#
|
#
|
||||||
# Exit Codes:
|
# Exit Codes:
|
||||||
# - 0 sucess (hopefully)
|
# - 0 sucess (hopefully)
|
||||||
|
@ -54,7 +54,7 @@ if [ "$BASHBOT_HOME" != "" ]; then
|
||||||
[ "${BASHBOT_VAR}" = "" ] && BASHBOT_VAR="$BASHBOT_HOME"
|
[ "${BASHBOT_VAR}" = "" ] && BASHBOT_VAR="$BASHBOT_HOME"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
ADDONDIR="${BASHBOT_ETC:-./addons}"
|
||||||
|
|
||||||
RUNUSER="${USER}" # USER is overwritten by bashbot array
|
RUNUSER="${USER}" # USER is overwritten by bashbot array
|
||||||
|
|
||||||
|
@ -328,11 +328,87 @@ process_client() {
|
||||||
[[ "${debug}" = *"debug"* ]] && cat <<< "$UPDATE" >>"INLINE.log"
|
[[ "${debug}" = *"debug"* ]] && cat <<< "$UPDATE" >>"INLINE.log"
|
||||||
[ "$INLINE" != "0" ] && _is_function process_inline && process_inline "${num}" "${debug}"
|
[ "$INLINE" != "0" ] && _is_function process_inline && process_inline "${num}" "${debug}"
|
||||||
fi
|
fi
|
||||||
|
#####
|
||||||
|
# process inline and message events
|
||||||
|
# first classic commnad dispatcher
|
||||||
# shellcheck source=./commands.sh
|
# shellcheck source=./commands.sh
|
||||||
source "${COMMANDS}" "${debug}"
|
source "${COMMANDS}" "${debug}" &
|
||||||
|
|
||||||
|
# then all registered addons
|
||||||
|
if [ "${iQUERY[ID]}" = "" ]; then
|
||||||
|
_is_function process_inline && event_inline "${debug}"
|
||||||
|
else
|
||||||
|
event_message "${debug}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# last count users
|
||||||
tmpcount="COUNT${CHAT[ID]}"
|
tmpcount="COUNT${CHAT[ID]}"
|
||||||
grep -q "$tmpcount" <"${COUNTFILE}" &>/dev/null || cat <<< "$tmpcount" >>"${COUNTFILE}"
|
grep -q "$tmpcount" <"${COUNTFILE}" &>/dev/null || cat <<< "$tmpcount" >>"${COUNTFILE}"
|
||||||
# To get user count execute bash bashbot.sh count
|
}
|
||||||
|
|
||||||
|
event_inline() {
|
||||||
|
local event debug="$1"
|
||||||
|
# shellcheck disable=SC2153
|
||||||
|
for event in "${!BASHBOT_EVENT_INLINE[@]}"
|
||||||
|
do
|
||||||
|
"${BASHBOT_EVENT_INLINE[${event}]}" "inline" "${debug}"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
event_message() {
|
||||||
|
local event debug="$1"
|
||||||
|
# ${MESSAEG[*]} event_message
|
||||||
|
# shellcheck disable=SC2153
|
||||||
|
for event in "${!BASHBOT_EVENT_MESSAGE[@]}"
|
||||||
|
do
|
||||||
|
"${BASHBOT_EVENT_MESSAGE[${event}]}" "messsage" "${debug}"
|
||||||
|
done
|
||||||
|
|
||||||
|
# ${REPLYTO[*]} event_replyto
|
||||||
|
if [ "${REPLYTO[UID]}" != "" ]; then
|
||||||
|
# shellcheck disable=SC2153
|
||||||
|
for event in "${!BASHBOT_EVENT_REPLYTO[@]}"
|
||||||
|
do
|
||||||
|
"${BASHBOT_EVENT_REPLYTO[${event}]}" "replyto" "${debug}"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ${FORWARD[*]} event_forward
|
||||||
|
if [ "${FORWARD[UID]}" != "" ]; then
|
||||||
|
# shellcheck disable=SC2153
|
||||||
|
for event in "${!BASHBOT_EVENT_FORWARD[@]}"
|
||||||
|
do
|
||||||
|
"${BASHBOT_EVENT_FORWARD[${event}]}" "forward" "${debug}"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ${CONTACT[*]} event_contact
|
||||||
|
if [ "${CONTACT[FIRST_NAME]}" != "" ]; then
|
||||||
|
# shellcheck disable=SC2153
|
||||||
|
for event in "${!BASHBOT_EVENT_CONTACT[@]}"
|
||||||
|
do
|
||||||
|
"${BASHBOT_EVENT_CONTACT[${event}]}" "contact" "${debug}"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ${VENUE[*]} event_location
|
||||||
|
# ${LOCALTION[*]} event_location
|
||||||
|
if [ "${LOCATION[*]}" != "" ] || [ "${VENUE[TITLE]}" != "" ]; then
|
||||||
|
# shellcheck disable=SC2153
|
||||||
|
for event in "${!BASHBOT_EVENT_LOCATION[@]}"
|
||||||
|
do
|
||||||
|
"${BASHBOT_EVENT_LOCATION[${event}]}" "location" "${debug}"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ${URLS[*]} event_file
|
||||||
|
if [ "${URLS[*]}" = "" ]; then
|
||||||
|
# shellcheck disable=SC2153
|
||||||
|
for event in "${!BASHBOT_EVENT_FILE[@]}"
|
||||||
|
do
|
||||||
|
"${BASHBOT_EVENT_FILE[${event}]}" "file" "${debug}"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
}
|
}
|
||||||
process_inline() {
|
process_inline() {
|
||||||
local num="${1}"
|
local num="${1}"
|
||||||
|
@ -426,17 +502,6 @@ process_message() {
|
||||||
declare -A BASBOT_EVENT_INLINE BASBOT_EVENT_MESSAGE BASBOT_EVENT_REPLY BASBOT_EVENT_FORWARD BASBOT_EVENT_CONTACT BASBOT_EVENT_LOCATION BASBOT_EVENT_FILE
|
declare -A BASBOT_EVENT_INLINE BASBOT_EVENT_MESSAGE BASBOT_EVENT_REPLY BASBOT_EVENT_FORWARD BASBOT_EVENT_CONTACT BASBOT_EVENT_LOCATION BASBOT_EVENT_FILE
|
||||||
export BASBOT_EVENT_INLINE BASBOT_EVENT_MESSAGE BASBOT_EVENT_REPLY BASBOT_EVENT_FORWARD BASBOT_EVENT_CONTACT BASBOT_EVENT_LOCATION BASBOT_EVENT_FILE
|
export BASBOT_EVENT_INLINE BASBOT_EVENT_MESSAGE BASBOT_EVENT_REPLY BASBOT_EVENT_FORWARD BASBOT_EVENT_CONTACT BASBOT_EVENT_LOCATION BASBOT_EVENT_FILE
|
||||||
|
|
||||||
# event_inline() {
|
|
||||||
#}
|
|
||||||
# event_message() {
|
|
||||||
# # ${REPLYTO[*]} event_reply
|
|
||||||
# # ${FORWARD[*]} event_forward
|
|
||||||
# # ${CONTACT[*]} event_contact
|
|
||||||
# # ${VENUE[*]} event_location
|
|
||||||
# # ${LOCALTION[*]} event_location
|
|
||||||
# # ${URL[*]} event_file
|
|
||||||
#}
|
|
||||||
|
|
||||||
|
|
||||||
#########################
|
#########################
|
||||||
# main get updates loop, should never terminate
|
# main get updates loop, should never terminate
|
||||||
|
@ -452,6 +517,11 @@ start_bot() {
|
||||||
#cleaup old pipes and empty logfiles
|
#cleaup old pipes and empty logfiles
|
||||||
find "${TMPDIR}" -type p -delete
|
find "${TMPDIR}" -type p -delete
|
||||||
find "${TMPDIR}" -size 0 -name "*.log" -delete
|
find "${TMPDIR}" -size 0 -name "*.log" -delete
|
||||||
|
# load addons on startup
|
||||||
|
for addons in ${ADDONDIR:-.}/*.sh ; do
|
||||||
|
# shellcheck source=./modules/aliases.sh
|
||||||
|
[ -r "${addons}" ] && source "${addons}" "startbot" "${DEBUG}"
|
||||||
|
done
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
UPDATE="$(getJson "$UPD_URL$OFFSET" | "${JSONSHFILE}" -s -b -n)"
|
UPDATE="$(getJson "$UPD_URL$OFFSET" | "${JSONSHFILE}" -s -b -n)"
|
||||||
|
@ -462,7 +532,7 @@ start_bot() {
|
||||||
|
|
||||||
if [ "$OFFSET" != "1" ]; then
|
if [ "$OFFSET" != "1" ]; then
|
||||||
mysleep="100"
|
mysleep="100"
|
||||||
process_updates "${DEBUG}" &
|
process_updates "${DEBUG}"
|
||||||
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%???}"
|
||||||
|
@ -473,10 +543,16 @@ start_bot() {
|
||||||
|
|
||||||
# initialize bot environment, user and permissions
|
# initialize bot environment, user and permissions
|
||||||
bot_init() {
|
bot_init() {
|
||||||
|
local DEBUG="$1"
|
||||||
# upgrade from old version
|
# 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"
|
[ -f "modules/inline.sh" ] && rm -f "modules/inline.sh"
|
||||||
|
# load addons on startup
|
||||||
|
for addons in ${ADDONDIR:-.}/*.sh ; do
|
||||||
|
# shellcheck source=./modules/aliases.sh
|
||||||
|
[ -r "${addons}" ] && source "${addons}" "init" "${DEBUG}"
|
||||||
|
done
|
||||||
#setup bashbot
|
#setup bashbot
|
||||||
[[ "${UID}" -eq "0" ]] && RUNUSER="nobody"
|
[[ "${UID}" -eq "0" ]] && RUNUSER="nobody"
|
||||||
echo -n "Enter User to run basbot [$RUNUSER]: "
|
echo -n "Enter User to run basbot [$RUNUSER]: "
|
||||||
|
@ -542,7 +618,7 @@ if [ "${SOURCE}" != "yes" ]; then
|
||||||
exit
|
exit
|
||||||
;;
|
;;
|
||||||
"init") # adjust users and permissions
|
"init") # adjust users and permissions
|
||||||
bot_init
|
bot_init "$2"
|
||||||
exit
|
exit
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
Loading…
Reference in New Issue
Block a user