diff --git a/dev/hooks/pre-commit.sh b/dev/hooks/pre-commit.sh index 502ec31..fcef4c8 100755 --- a/dev/hooks/pre-commit.sh +++ b/dev/hooks/pre-commit.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -#### $$VERSION$$ 0.99-0-g2775000 +#### $$VERSION$$ 0.99-13-g6a6410e ############ # NOTE: you MUST run install-hooks.sh again when updating this file! @@ -68,9 +68,9 @@ fi if which codespell &>/dev/null; then echo "Running codespell" echo "............................" - codespell -B 1 --skip="*.log,*.html,*.txt,.git*" -L "ba" + codespell -B 1 --skip="*.log,*.html,*.txt,.git*,jsonDB-keyboard" -L "ba" echo "if there are (to many) typo's shown, consider running:" - echo "codespell -i 3 -w --skip=\"*.log,*.html,*.txt,.git*\" -L \"ba\"" + echo "codespell -i 3 -w --skip=\"*.log,*.html,*.txt,.git*,examples\" -L \"ba\"" else echo "consider installing codespell: pip install codespell" fi diff --git a/examples/README.md b/examples/README.md index 358dd2d..b9e59e6 100644 --- a/examples/README.md +++ b/examples/README.md @@ -51,10 +51,11 @@ convert existing bots. /ifconfig *ifconfig output* /smart *sda* _smart status for sda drive_ ``` -### External scripts +### jsonDB and Keyboards -**external-use** will contain some examples on how to send messages from external scripts to Telegram chats or users. +**jsonDB-keybords** contains a stripped down real world example from my bot showing the usage of jsonDB to store and retrieve values +plus use of keyboards in private chats. It's an extended version of mycommands.sh.dist. Messages and help are in german. -#### $$VERSION$$ 0.99-0-g2775000 +#### $$VERSION$$ 0.99-13-g6a6410e diff --git a/examples/jsonDB-keyboard/mycommands.sh b/examples/jsonDB-keyboard/mycommands.sh new file mode 100644 index 0000000..82c967a --- /dev/null +++ b/examples/jsonDB-keyboard/mycommands.sh @@ -0,0 +1,716 @@ +#!/bin/bash +# files: mycommands.sh.dist +# copy to mycommands.sh and add all your commands and functions here ... +# +#### $$VERSION$$ 0.99-13-g6a6410e +# +# shellcheck disable=SC2154 +# shellcheck disable=SC2034 + +bashbot_title='*Hallo, ich bin der @Deal_O_Mat_bot . Ich suche und finde Dealz!*' + +bashbot_shelp="${bashbot_title}"' + +Schicke mir hier -> @Deal\\_O\\_Mat\\_bot <- einen Befehl mit *max. 50 Begriffen*. Ein Begriff muss mindesten 4 Zeichen lang sein. + +*Befehle zum Suchen / Tracken von Dealz:* + /search /suche _Suche in Deals der letzen 48h, + z.B.:_ /suche Apple mavic.\*air + + /newtrack _Tracking mit neuen Begriffen, + z.B.:_ /newtrack Apple mavic.\*air + /track /addkey _zusätzlicher Begriff zum Tracken_ + /addblack _Begriff darf nicht vorkommen_ + /delkey _lösche Begriff_ + /delblack _lösche Blacklist Begriff_ + + /listtrack _zeigt aktuell getrackte Begriffe_ + /delkey ALL _löscht alle Begriffe_ + /stattrack _Infos zum aktiven Tracking_ + +Kurzform: /such /sea /newt /tra /addk /addb /delk /delb /lst /statt + +*Platzhalter in Suchbegriffen:* + *.*\* = egal/alles: 1tb*.*\*ssd + ⇨ 1Tb-ssd, 1tb ssd, 1Tb Supi ssd + *.* = genau ein Zeichen: *.*tb + ⇨ 1Tb, 5TB, atb, ztb + *_* = Wortanfang/end: \\_Mavic\\_ + ⇨ das Wort _Mavic_ + +Die Suche ignoriert Gross und Klein Schreibung, Satzzeichen, Klammern und "-", ebenso Links und Bilder. Mehr zu Regular Expressions (RegEx) http://www.regexe.de/hilfe.jsp +' + +bashbot_whelp="${bashbot_title}"' + +Schicke mir hier -> @Deal\\_O\\_Mat\\_bot <- einen Befehl mit *max. 50 Artikeln (ASIN)* zum Beobachten. + +*Befehle zum Beobachten von Amzon Artikeln* + + /newwatch _Beobachten neuer Artikel_ + z.B.:_ /newwatch ASIN ASIN_ + /watch /addwatch _weiteren Artikel beobachten_ + /delwatch _löscht Artikel aus Beobachtung_ + + /listwatch _zeigt aktuell beobachtete Artikel_ + /delwatch ALL _löscht alle Artikel_ + + /notify _einmalig warten bis Verfügar_ + /listnotify _zeigt aktuell wartende Artikel_ + /delnotify _löscht alle wartenden Artikel_ + +Kurzform: /neww /wat /addw /delw /listw /noti /listn /deln +' + +bashbot_examples="${bashbot_title}"' + +' + +bashbot_group='*#MD Amazon Deutschland only Deals* +https://t.me/joinchat/IvvRtlEPhZKmWVVc8iTD2g + +*#MD Zuhause, Family & Kids und Empfehlungen* +https://t.me/joinchat/IvvRtlT4f8HuwFDiJDCWoQ ' + +bashbot_all="${bashbot_title}"' + +--------------------------------------------------------------------- +'"${bashbot_group}"' + +*#DL Amazon International* +https://t.me/joinchat/IvvRtkzPaMTHFZi3CjSX8g + +*#MD Amazon Warehouse Schnäppchen * +https://t.me/joinchat/IvvRthRhj5NVkcihTxDZwQ + +---------------------------------------------------------------------- +Was hier kommt, kommt nur hier! + +*#MD Kleidung, Accessoirs & Empfehlungen* +https://t.me/joinchat/IvvRthlJ8zwC7tHyhl63Fg + +*#MD Mobilfunk & Smartphones* +https://t.me/joinchat/IvvRthtqth9Svyyvnb5lAQ + +*#MD Gaming, Spiele & Konsolen* +https://t.me/joinchat/IvvRthRyrsmIyMFMc7189Q + +--------------------------------------------------------------------- +*#MD extrem - All Dealz über 100°* +https://t.me/joinchat/IvvRtk6ehHS4ZZmtoRFU2g + +*#MD Offtopic: Diskussion & Ankündigungen* +https://t.me/joinchat/IvvRthRhMcX6rDQU-pZrWw + +*Du willst Dealz suchen oder abbonieren?* +Klicke hier -> @Deal\\_O\\_Mat\\_bot <- und schicke /start +. +' + +# uncomment the following lines to overwrite info and help messages +bashbot_info="${bashbot_title}"' + +'"${bashbot_group}"' + +*#MD Offtopic: Diskussion & Ankündigungen* +Hier kannst Du dich austauschen und erfährst Neues. +https://t.me/joinchat/IvvRthRhMcX6rDQU-pZrWw + +*Du willst Dealz suchen oder tracken?* +Klicke hier -> @Deal\\_O\\_Mat\\_bot <- und schicke /start + +*Meine Befehle*: + /suche _- Suchen und Tracken von Dealz_ + /watch _- Beobachten von Amazon Artikeln_ + /gruppen _- Liste aller Dealz Gruppen_ + /hilfe _- Hilfe zu weiteren Befehlen_ + +*Dein Deal-O-Mat Bot* +https://dealz.rrr.de/amzdealz.html +' + +bashbot_help="${bashbot_title}"' + +Schicke mir einen Amazon Product oder Gebraucht Link und ich ermittle für Dich: + _Beschreibung | Preis | Bewertung und Produktbild_ + +Du hast eine eigene Telegram Dealgruppe? Lade mich ein und all in der Guppe können mich nutzen: + +*verfügbare Befehle*: + /amz http://... | ASIN | Text ... + _ - für Amazon, eBay, Saturn, Mediamarkt_ + /anref .... + _- wie /amz aber ohne Ref tag_ + + /suche _- Suchen und Tracken von Dealz_ + /watch _- Beobachten von Amazon Artikeln_ + /gruppen _- Liste aller Dealz Gruppen_ + + /info _- Info zum Bot_ + /help _- Zeigt diese Liste_ + +_https://dealz.rrr.de/assets/images/rdealomat.gif_ +' +SORRYADMIN="Du bist kein Gruppenadmin, diesen Befehl kannst Du nur im privaten Chat ausführen @Deal_O_Mat_bot <<- hier klicken" +SORRYADMIN2="Dieser Befehl ist dem Botadmin vorbehalten, sorry." + +# Set INLINE to 1 in order to receive inline queries. +# To enable this option in your bot, send the /setinline command to @BotFather. +INLINE="" +# Set to .* to allow sending files from all locations +FILE_REGEX='/home/deal-O-mat/.*' +# run curl over TOR or SOCKS +#export BASHBOT_CURL_ARGS="--socks5-hostname localhost" + +# unset BASHBOT_RETRY to enable retry in case of recoverable errors, e.g. throtteling +# see logs/ERROR.log for information why send_messages etc. fail +unset BOTSEND_RETRY + +# set value for adaptive sleeping while waitingnfor uodates in millisconds +# max slepp between polling updates 10s (default 5s) +export BASHBOT_SLEEP="10000" +# add 0.2s if no update available, up to BASHBOT_SLEEP (default 0.1s) +export BASHBOT_SLEEP_STEP="400" + +# uncomment if you use keyboards in your commands +# export REMOVEKEYBOARD="yes" +export REMOVEKEYBOARD_PRIVATE="yes" + +# uncomment if you want to say welcome to new chat members +export WELCOME_NEWMEMBER="yes" +WELCOME_MSG="Willkommen" + +# uncomment if you want to be informed about new/left chat members +export REPORT_NEWMEMBER="yes" +export REPORT_LEFTMEMBER="yes" + +export REMINDER="Del-O-Mat: https://dealz.rrr.de/amzdealz.html\n https://dealz.rrr.de/ebaydealz.html" + +TRACKFILE="${DATADIR}/0-dealtrack" +SEARCHFILE="${DATADIR}/0-dealsearch" +WATCHFILE="${DATADIR}/0-dealwatch" +NOTIFYFILE="${DATADIR}/0-dealnotify" + +if [ "$1" = "startbot" ];then + # run once after startup when the first message is received + my_startup(){ + # send reminder on startup, random delay + send_normal_message "-10011894xxxxx" "${REMINDER}" + } + setConfigKey "startupaction" "await" + # create KEYOFILE DB if not exist + jssh_newDB "${TRACKFILE}" + jssh_newDB "${SEARCHFILE}" + jssh_newDB "${WATCHFILE}" + jssh_newDB "${NOTIFYFILE}" +else + # things to do only at source, eg. after startup + if [[ "$(getConfigKey "startupaction")" != "done"* ]]; then + setConfigKey "startupaction" "done $(date)" + my_startup + fi + + # your additional bahsbot commands + # NOTE: command can have @botname attached, you must add * in case tests... + mycommands() { + # a service Message was received + local SILENCER="yes" + if [[ "${SERVICE}" != "" ]]; then + # example: dleted service messages + if [ "${SILENCER}" = "yes" ]; then + delete_message "${CHAT[ID]}" "${MESSAGE[ID]}" + fi + fi + + # remove keyboard if you use keyboards + [ -n "${REMOVEKEYBOARD}" ] && remove_keyboard "${CHAT[ID]}" "..." & + [[ -n "${REMOVEKEYBOARD_PRIVATE}" && "${CHAT[ID]}" == "${USER[ID]}" ]] && remove_keyboard "${CHAT[ID]}" "..." & + + ###################### + # default commands + # fix upper case first letter in commands + [[ "${MESSAGE}" =~ ^/[[:upper:]] ]] && MESSAGE="${MESSAGE:0:1}$(tr '[:upper:]' '[:lower:]' <<<"${MESSAGE:1:1}")${MESSAGE:2}" + + case "${MESSAGE}" in + '/info'*) + send_action "${CHAT[ID]}" "typing" + delete_message "${CHAT[ID]}" "${MESSAGE[ID]}" + return 0 # continue with default action + ;; + '/hel'*|'/hil'*) + send_action "${CHAT[ID]}" "typing" + delete_message "${CHAT[ID]}" "${MESSAGE[ID]}" + send_markdown_message "${CHAT[ID]}" "${bashbot_help}" + return 1 # break, do not continue + ;; + '/start'*) + send_markdown_message "${CHAT[ID]}" "${bashbot_info}" + return 1 # break, do not continue + ;; + '/gr'*) # list groups + delete_message "${CHAT[ID]}" "${MESSAGE[ID]}" + send_action "${CHAT[ID]}" "typing" + send_markdown_message "${CHAT[ID]}" "${bashbot_all}" + return + ;; + #'/test'*) + # send_normal_message "${CHAT[ID]}" "Start interactive" + # send_markdown_message "${CHAT[ID]}" "TEST: äöüß!^°_-\"-,§$%&/(){}#@?[]{}._" + # return + # ;; + # will we process edited messages also? + '/_edited_message'*) + #return 1 # no + # but if we do, remove /edited_message + MESSAGE="${MESSAGE#/* }" + ;; + '/_new_chat_member'*) + if [[ -n "${WELCOME_NEWMEMBER}" && "${NEWMEMBER[ISBOT]}" != "true" ]]; then + send_normal_message "${CHAT[ID]}"\ + "${WELCOME_MSG} ${NEWMEMBER[FIRST_NAME]} ${NEWMEMBER[LAST_NAME]} (@${NEWMEMBER[USERNAME]})" + MYSENTID="${BOTSENT[ID]}" + { sleep 5; delete_message "${CHAT[ID]}" "${MYSENTID}"; } & + fi + [ -n "${REPORT_NEWMEMBER}" ] && send_normal_message "$(getConfigKey "botadmin")"\ + "New member: ${CHAT[TITLE]} (${CHAT[ID]}): ${NEWMEMBER[FIRST_NAME]} ${NEWMEMBER[LAST_NAME]} (@${NEWMEMBER[USERNAME]})" + ;; + '/_left_chat_member'*) + [ -n "${REPORT_LEFTMEMBER}" ] && send_normal_message "$(getConfigKey "botadmin")"\ + "Left member: ${CHAT[TITLE]} (${CHAT[ID]}): ${LEFTMEMBER[FIRST_NAME]} ${LEFTMEMBER[LAST_NAME]} (@${LEFTMEMBER[USERNAME]})" + ;; + esac + + ########## + # pre test for admin only commands + case "${MESSAGE}" in + # must be in private chat, group admin, or botadmin + '/sea'*|'/su'*|'/add'*|'/new'*|'/del'*|'/tra'*|'/wat'*|'/noti'*|'/lista'*) + send_action "${CHAT[ID]}" "typing" + if ! user_is_admin "${CHAT[ID]}" "${USER[ID]}" ; then + delete_message "${CHAT[ID]}" "${MESSAGE[ID]}" + send_normal_message "${CHAT[ID]}" "${SORRYADMIN}" + MYSENTID="${BOTSENT[ID]}" + { sleep 5; delete_message "${CHAT[ID]}" "${MYSENTID}"; } & + return 1 + fi + ;;& + # must be botadmin + '/delu'*) + if ! user_is_botadmin "${USER[ID]}" ; then + delete_message "${CHAT[ID]}" "${MESSAGE[ID]}" + send_markdown_message "${CHAT[ID]}" "*${SORRYADMIN2}*"; + MYSENTID="${BOTSENT[ID]}" + { sleep 5; delete_message "${CHAT[ID]}" "${MYSENTID}"; } & + return 1 + fi + ;; + esac + + ################# + # search commands + local FINDKEYS OLDKEYS KEY MYSENTID + declare -a KEYARR + declare -A SEARCHVALUES + + ################# + # pre processing of search commands + case "${MESSAGE}" in + '/add'*|'/tra'*|'/noti'*) # add no arg + FINDKEYS="${MESSAGE#/* }" + if [ "${FINDKEYS}" = "${MESSAGE}" ]; then + send_normal_message "${CHAT[ID]}" "Kein Begriff angegeben!" + exit + fi + ;;& + '/addw'*|'/wat'*) OLDKEYS="$(jssh_getKeyDB "${CHAT[ID]}" "${WATCHFILE}")" + ;;& + '/add'[kbt]*|'/tra'*) OLDKEYS="$(jssh_getKeyDB "${CHAT[ID]}" "${TRACKFILE}")" + ;;& + '/noti'*) OLDKEYS="$(jssh_getKeyDB "${CHAT[ID]}" "${NOTIFYFILE}")" + ;;& + + '/addk'*|'/addt'*|'/tra'*) # add track + MESSAGE="/newtrack ${FINDKEYS} ${OLDKEYS}" + ;; + '/addb'*) # add black + [[ "${OLDKEYS}" != *'!'* ]] && FINDKEYS="!${FINDKEYS}" + MESSAGE="/newtrack ${OLDKEYS} ${FINDKEYS}" + ;; + '/addw'*|'/wat'*) # add watch + FINDKEYS="${MESSAGE#/* }" + if [ "${FINDKEYS}" = "${MESSAGE}" ]; then + delete_message "${CHAT[ID]}" "${MESSAGE[ID]}" + send_markdown_message "${CHAT[ID]}" "${bashbot_whelp}" + return + fi + MESSAGE="/newwatch ${FINDKEYS} ${OLDKEYS}" + ;; + '/noti'*) # add watch + MESSAGE="/newnotify ${FINDKEYS} ${OLDKEYS}" + ;; + '/delk'*|'/delb'*) # no user search + OLDKEYS="$(jssh_getKeyDB "${CHAT[ID]}" "${TRACKFILE}")" + if [ "${OLDKEYS}" = "" ]; then + send_markdown_message "${CHAT[ID]}" "*Kein Tracking aktiv!*" + return + fi + ;;& + '/delw'*) # no watch + OLDKEYS="$(jssh_getKeyDB "${CHAT[ID]}" "${WATCHFILE}")" + if [ "${OLDKEYS}" = "" ]; then + send_markdown_message "${CHAT[ID]}" "*Kein Product Watch aktiv!*" + return + fi + ;;& + '/deln'*) # no notify + OLDKEYS="$(jssh_getKeyDB "${CHAT[ID]}" "${NOTIFYFILE}")" + if [ "${OLDKEYS}" = "" ]; then + send_markdown_message "${CHAT[ID]}" "*Kein Product Notify aktiv!*" + return + fi + jssh_deleteKeyDB "${CHAT[ID]}" "${NOTIFYFILE}" + send_normal_message "${CHAT[ID]}" "Product Notify \"${OLDKEYS}\" gelöscht!" + ;; + '/delk'*) #delete key + KEY="${OLDKEYS%%|!*}" + FINDKEYS="${MESSAGE#/* }" + read -r -a KEYARR <<<"ALL ${KEY//|/ }" + if [ "${FINDKEYS}" = "ALL" ]; then + jssh_deleteKeyDB "${CHAT[ID]}" "${TRACKFILE}" + send_markdown_message "${CHAT[ID]}" "*Tracking gelöscht!*" + return + elif [[ "${FINDKEYS}" =~ ^[0-9]+$ ]]; then + if [ "${#KEYARR[@]}" -lt "${FINDKEYS}" ]; then + send_normal_message "${CHAT[ID]}" "Es gibt nur $((${#KEYARR[@]}-1)) Keys, bitte nochmal." + unset FINDKEYS + else + send_normal_message "${CHAT[ID]}" "Lösche Key ${KEYARR[${FINDKEYS}]}" + unset "KEYARR[0]" + unset "KEYARR[${FINDKEYS}]" + FINDKEYS="${KEYARR[*]}" + if [ -z "${FINDKEYS}" ]; then + jssh_deleteKeyDB "${CHAT[ID]}" "${TRACKFILE}" + send_markdown_message "${CHAT[ID]}" "*Tracking gelöscht!*" + return + else + KEY="${OLDKEYS#*!}" + [ "${KEY}" != "${OLDKEYS}" ] && FINDKEYS+="|!${KEY}" + MESSAGE="/newt ${FINDKEYS}" + fi + fi + else + OUT="Keys:\n$(printKeys "KEYARR")\n\nSchicke \"/delkey \" zum Löschen." + if [ "${CHAT[ID]}" != "${USER[ID]}" ]; then + send_normal_message "${CHAT[ID]}" "${OUT}" + else + send_keyboard "${CHAT[ID]}" "${OUT}"\ + '["/delkey 1","/delkey 2","/delkey 3"],["/delkey 4","/delkey 5","/delkey 6"],["/delkey 7","/delkey 8","/delkey 9"],["/delkey ALL","/delblack","/listtrack"]' + fi + fi + ;; + '/delb'*) #delete black + KEY="${OLDKEYS#*!}" + read -r -a KEYARR <<<"ALL ${KEY//|/ }" + FINDKEYS="${MESSAGE#/* }" + if [ "${KEY}" = "${OLDKEYS}" ]; then + unset FINDKEYS + unset KEYARR + KEYARR[0]="Keine Blacklist" + fi + if [[ "${FINDKEYS}" =~ ^[0-9]+$ ]]; then + if [ "${#KEYARR[@]}" -lt "${FINDKEYS}" ]; then + send_normal_message "${CHAT[ID]}" "Es gibt nur $((${#KEYARR[@]}-1)) Keys, bitte nochmal." + unset "KEYARR[${FINDKEYS}]" + else + send_normal_message "${CHAT[ID]}" "Lösche Black ${KEYARR[${FINDKEYS}]}" + unset "KEYARR[0]" + unset "KEYARR[${FINDKEYS}]" + FINDKEYS="|!${KEYARR[*]}" + [ "${FINDKEYS}" == "|!" ] && FINDKEYS="" + MESSAGE="/newt ${OLDKEYS%%|!*}${FINDKEYS}" + fi + fi + if [[ -z "${FINDKEYS}" || "${FINDKEYS:0:1}" == "/" ]]; then # output list + OUT="Blacklist:\n$(printKeys "KEYARR")\n\nSchicke \"/delblack \" zum Löschen." + if [ "${CHAT[ID]}" != "${USER[ID]}" ]; then + send_normal_message "${CHAT[ID]}" "${OUT}" + else + send_keyboard "${CHAT[ID]}" "${OUT}"\ + '["/delblack 1","/delblack 2","/delblack 3"],["/delblack 4","/delblack 5","/delblack 6"],["/delblack 7","/delblack 8","/delblack 9"],["/delblack ALL","/delkey","/listtrack"]' + fi + fi + ;; + '/delw'*) #delete watch + KEY="${OLDKEYS}" + FINDKEYS="${MESSAGE#/* }" + read -r -a KEYARR <<<"ALL ${KEY//|/ }" + if [ "${FINDKEYS}" = "ALL" ]; then + jssh_deleteKeyDB "${CHAT[ID]}" "${WATCHFILE}" + send_markdown_message "${CHAT[ID]}" "*Produkt Watch gelöscht!*" + return + elif [[ "${FINDKEYS}" =~ ^[0-9]+$ ]]; then + if [ "${#KEYARR[@]}" -lt "${FINDKEYS}" ]; then + send_normal_message "${CHAT[ID]}" "Es gibt nur $((${#KEYARR[@]}-1)) Keys, bitte nochmal." + unset FINDKEYS + else + send_normal_message "${CHAT[ID]}" "Lösche Key ${KEYARR[${FINDKEYS}]}" + unset "KEYARR[0]" + unset "KEYARR[${FINDKEYS}]" + FINDKEYS="${KEYARR[*]}" + if [ -z "${FINDKEYS}" ]; then + jssh_deleteKeyDB "${CHAT[ID]}" "${WATCHFILE}" + send_markdown_message "${CHAT[ID]}" "*Produkt Watch gelöscht!*" + return + else + MESSAGE="/neww ${FINDKEYS}" + fi + fi + else + OUT="Keys:\n$(printKeys "KEYARR")\n\nSchicke \"/delwatch \" zum Löschen." + if [ "${CHAT[ID]}" != "${USER[ID]}" ]; then + send_normal_message "${CHAT[ID]}" "${OUT}" + else + send_keyboard "${CHAT[ID]}" "${OUT}"\ + '["/delwatch 1","/delwatch 2","/delwatch 3"],["/delwatch 4","/delwatch 5","/delwatch 6"],["/delwatch 7","/delwatch 8","/delwatch 9"],["/delwatch ALL","/listwatch"]' + fi + fi + ;; + esac + + case "${MESSAGE}" in + ####################### + # deal search commands + '/such'*|'/sea'*) # suche + FINDKEYS="${MESSAGE#/* }" + if [ "${FINDKEYS}" = "${MESSAGE}" ]; then + delete_message "${CHAT[ID]}" "${MESSAGE[ID]}" + send_markdown_message "${CHAT[ID]}" "${bashbot_shelp}" + else + if user_is_admin "${CHAT[ID]}" "${USER[ID]}" ; then + set_keys "${FINDKEYS}" "${SEARCHFILE}" + else + send_normal_message "${CHAT[ID]}" "${SORRYADMIN}" + MYSENTID="${BOTSENT[ID]}" + { sleep 5; delete_message "${CHAT[ID]}" "${MYSENTID}"; } & + return 1 + fi + fi + return + ;; + + '/newt'*) # newtrack + FINDKEYS="${MESSAGE#/* }" + FINDKEYS="${FINDKEYS%[\" ]}" + FINDKEYS="${FINDKEYS#[\" ]}" + if [ "${FINDKEYS}" = "${MESSAGE}" ]; then + send_markdown_message "${CHAT[ID]}" "${bashbot_shelp}" + else + set_keys "${FINDKEYS}" "${TRACKFILE}" + fi + ;& + '/lst'*|'/listt'*) # listtrack + send_action "${CHAT[ID]}" "typing" + FINDKEYS="$(jssh_getKeyDB "${CHAT[ID]}" "${TRACKFILE}")" + if [ "${FINDKEYS}" = "" ]; then + send_markdown_message "${CHAT[ID]}" "*Kein Tracking aktiv!*" + return + fi + OUT="Tracking nach \"${FINDKEYS}\" ist aktiv." + if [[ "${CHAT[ID]}" != "${USER[ID]}" ]]; then + send_normal_message "${CHAT[ID]}" "${OUT}" + else + send_keyboard "${CHAT[ID]}" "${OUT}"\ + '["/delkey 1","/delkey 2","/delkey 3"],["/delkey 4","/delkey 5","/delblack 6"],["/delblack 1","/delblack 2","/delblack 3"],["/delkey","/delblack","/listtrack"]' + fi + return + ;; + '/neww'*) # newwatch + FINDKEYS="${MESSAGE#/* }" + FINDKEYS="${FINDKEYS%[\" ]}" + FINDKEYS="${FINDKEYS#[\" ]}" + if [ "${FINDKEYS}" = "${MESSAGE}" ]; then + send_markdown_message "${CHAT[ID]}" "${bashbot_shelp}" + else + set_keys "${FINDKEYS}" "${WATCHFILE}" + fi + ;& + '/listw'*) # listwatch + send_action "${CHAT[ID]}" "typing" + FINDKEYS="$(jssh_getKeyDB "${CHAT[ID]}" "${WATCHFILE}")" + if [ "${FINDKEYS}" = "" ]; then + send_markdown_message "${CHAT[ID]}" "*Kein Produkt Watch aktiv!*" + return + fi + OUT="Produkt Watch nach \"${FINDKEYS}\" ist aktiv." + send_normal_message "${CHAT[ID]}" "${OUT}" + return + ;; + '/newn'*) # newnotify + FINDKEYS="${MESSAGE#/* }" + FINDKEYS="${FINDKEYS%[\" ]}" + FINDKEYS="${FINDKEYS#[\" ]}" + if [ "${FINDKEYS}" = "${MESSAGE}" ]; then + send_markdown_message "${CHAT[ID]}" "${bashbot_shelp}" + else + set_keys "${FINDKEYS}" "${NOTIFYFILE}" + fi + ;& + '/listn'*) # listnotify + send_action "${CHAT[ID]}" "typing" + FINDKEYS="$(jssh_getKeyDB "${CHAT[ID]}" "${NOTIFYFILE}")" + if [ "${FINDKEYS}" = "" ]; then + send_markdown_message "${CHAT[ID]}" "*Kein Produkt Notify aktiv!*" + return + fi + OUT="Produkt Notify nach \"${FINDKEYS}\" ist aktiv." + send_normal_message "${CHAT[ID]}" "${OUT}" + return + ;; + + ############################# + # botadmin only commands + '/listat'*) # listalltrack + jssh_readDB "SEARCHVALUES" "${TRACKFILE}" + FINDKEYS="$(jssh_printDB "SEARCHVALUES")" + if [ "${FINDKEYS}" != "" ]; then + # shellcheck disable=SC2126 + send_action "${CHAT[ID]}" "typing" + send_normal_message "${CHAT[ID]}" "All Suchaufträge:\n${FINDKEYS}" + else + send_markdown_message "${CHAT[ID]}" "*Kein Tracking aktiv!*" + fi + ;; + '/listaw'*) # listall watch + jssh_readDB "SEARCHVALUES" "${WATCHFILE}" + FINDKEYS="$(jssh_printDB "SEARCHVALUES")" + if [ "${FINDKEYS}" != "" ]; then + send_action "${CHAT[ID]}" "typing" + send_normal_message "${CHAT[ID]}" "Alle Watchaufträge:\n${FINDKEYS}" + else + send_markdown_message "${CHAT[ID]}" "*Kein Produkt Watch aktiv!*" + fi + return + ;; + '/delu'*) # delusersearch + KEY="${MESSAGE#/* }"; KEY="${KEY#%% *}" + if [ "${KEY}" = "${MESSAGE}" ] || [ "${KEY}" = "" ] ; then + jssh_readDB "SEARCHVALUES" "${TRACKFILE}" + FINDKEYS="$(jssh_printDB "SEARCHVALUES")" + if [ "${FINDKEYS}" != "" ]; then + send_normal_message "${CHAT[ID]}"\ + "Aktive Suchaufträge:\n${FINDKEYS}\n\nSende \"/deluser ID\" zum Löschen eines Users" + else + send_markdown_message "${CHAT[ID]}" "*Kein Tracking aktiv!*"; exit + fi + exit + fi + jssh_deleteKeyDB "${KEY}" "${TRACKFILE}" + send_normal_message "${CHAT[ID]}" "Lösche Suchauftrag User ${KEY}" + jssh_readDB "SEARCHVALUES" "${TRACKFILE}" + FINDKEYS="$(jssh_printDB "SEARCHVALUES")" + if [ "${FINDKEYS}" != "" ]; then + send_normal_message "${CHAT[ID]}" "Verbliebene Suchaufträge:\n${FINDKEYS}" + else + send_markdown_message "${CHAT[ID]}" "*Kein Tracking aktiv!*"; exit + fi + return + ;; + + esac + + } + +fi + + # debug function called on start, stop of bot, interactive and background processes + # if your bot was started with debug as second argument + # $1 current date, $2 from where the function wqs called, $3 ... $n optional information + my_debug_checks() { + # example check because my bot creates a wrong file, this was becuase an empty variable + [ -f ".jssh" ] && printf "%s: %s\n" "${1}" "Ups, found file \"${PWD:-.}/.jssh\"! ==========" + } + + # called when bashbot sedn command failed because we can not connect to telegram + # return 0 to retry, return non 0 to give up + bashbotBlockRecover() { + # place your commnds to unblock here, e.g. change IP or simply wait + sleep 60 && return 0 # may be temporary + return 1 + } + + # place your processing functions here + set_keys(){ + local MYFIND MYKEY MYKEYF MINLEN MYCHECK MYSEARCH + declare -A KEYARR + MYFIND="$1" + MYKEYF="$2" + MINLEN="3" + # check len of keys + for MYKEY in ${MYFIND}; do [ "${#MYKEY}" -lt ${MINLEN} ] && break; done + if [ "${#MYKEY}" -lt ${MINLEN} ]; then + send_markdown_message "${CHAT[ID]}" "*Ein Suchbegriff ist kürzer als ${MINLEN} Zeichen!*" + else + MYFIND="$(create_pattern "${MYFIND}")" + MYCHECK="$(check_pattern "${MYFIND}")" + [[ "${MESSAGE}" == "/s"* ]] &&\ + send_normal_message "${CHAT[ID]}" "${MYCHECK}Suche nach \"${MYFIND//|/ }\" wird gestartet ..." + MYKEY="${MYFIND//[^|]}" + if [ "${#MYKEY}" -gt 49 ]; then + send_markdown_message "${CHAT[ID]}" "*Maximale Anzahl von 50 Begriffen erreicht!*" + elif [ "${MYFIND}" != "" ]; then + KEYARR["${CHAT[ID]}"]="${MYFIND}" + jssh_updateDB "KEYARR" "${MYKEYF}" + #jssh_insertDB "${CHAT[ID]}" "${MYFIND}" "${MYKEYF}" + else + send_markdown_message "${CHAT[ID]}" "*Ein Begriff ist ungültig, z.B. \" , oder leer!*" + fi + fi + } + # place your processing functions here + + + # $1 ARRAYNAME $2 command + printKeys() { + local key + declare -n ARRAY="$1" + for key in "${!ARRAY[@]}" + do + printf '%s - %s\n' "${key}" "${ARRAY[${key}]}" + done + } + + # create a regex from space sepeareted keywords + # $1 space separated words + create_pattern() { + local PATTERN KEY + set -f + for KEY in $1 + do + [ "${PATTERN}" != "" ] && PATTERN="${PATTERN}|" + PATTERN="${PATTERN}${KEY}" + done + # revome blank and " + PATTERN="${PATTERN//[\" ]}" + # remove * at start + PATTERN="${PATTERN//|\*/|}"; PATTERN="${PATTERN#\*}" + # remove unneeded | + PATTERN="${PATTERN//||/|}"; PATTERN="${PATTERN#|}"; PATTERN="${PATTERN%|}" + set +f + echo "${PATTERN}" + } + + # check regex for common errors + # ¤1 pattern + check_pattern() { + local WARN="" + if [[ "$1" =~ ([^.\)]\*)|(^\*) ]]; then + WARN+="Meintest du evtl. '.*' ? '*' ist vorheriges Zeichen beliebig oft. "$'\n\r' + fi + if [[ "$1" =~ (^\*)|(^.\*)|([^\)]\*\|)|(\|\*)|(\|\.\*)|([^\)]\*$) ]] ; then + WARN+="Ein '.*' oder '*' an Anfang oder End ist unnötig. "$'\n\r' + fi + if [[ "$1" =~ \([^|\)]*\| ]] ; then + WARN+="Öffnende '(' ohne ')' gefunden. Klammerausdruck muss vor '|' geschlossen sein. "$'\n\r' + fi + [ -n "${WARN}" ] && printf "Potentielle Fehlerquellen:\n\r%s\n\r" "${WARN}" + }