diff --git a/bashbot.sh b/bashbot.sh index e0209cb..b5775a0 100755 --- a/bashbot.sh +++ b/bashbot.sh @@ -11,7 +11,7 @@ # This file is public domain in the USA and all free countries. # Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying) # -#### $$VERSION$$ v0.94-pre-1-g4aa7561 +#### $$VERSION$$ v0.94-pre-2-gc0a633f # # Exit Codes: # - 0 sucess (hopefully) @@ -23,7 +23,7 @@ # shellcheck disable=SC2140 # are we runnig in a terminal? -if [ -t 1 ] && [ "$TERM" != "" ]; then +if [ -t 1 ] && [ -n "$TERM" ]; then CLEAR='clear' RED='\e[31m' GREEN='\e[32m' @@ -47,17 +47,17 @@ else MODULEDIR="./$(basename "${MODULEDIR}")" fi -if [ "$BASHBOT_HOME" != "" ]; then +if [ -n "$BASHBOT_HOME" ]; then SCRIPTDIR="$BASHBOT_HOME" - [ "${BASHBOT_ETC}" = "" ] && BASHBOT_ETC="$BASHBOT_HOME" - [ "${BASHBOT_VAR}" = "" ] && BASHBOT_VAR="$BASHBOT_HOME" + [ -z "${BASHBOT_ETC}" ] && BASHBOT_ETC="$BASHBOT_HOME" + [ -z "${BASHBOT_VAR}" ] && BASHBOT_VAR="$BASHBOT_HOME" fi ADDONDIR="${BASHBOT_ETC:-./addons}" RUNUSER="${USER}" # USER is overwritten by bashbot array -if [ "${SOURCE}" != "yes" ] && [ "$BASHBOT_HOME" = "" ] && ! cd "${RUNDIR}" ; then +if [ "${SOURCE}" != "yes" ] && [ -z "$BASHBOT_HOME" ] && ! cd "${RUNDIR}" ; then echo -e "${RED}ERROR: Can't change to ${RUNDIR} ...${NC}" exit 1 else @@ -69,62 +69,71 @@ if [ ! -w "." ]; then ls -ld . fi -# if BOTTOKEN is empty read from file +##################### +# Setup and check environment if BOTTOKEN is NOT set TOKENFILE="${BASHBOT_ETC:-.}/token" -if [ -z "${BOTTOKEN}" ] && [ ! -f "${TOKENFILE}" ]; then - if [ "${CLEAR}" = "" ] && [ "$1" != "init" ]; then +BOTADMIN="${BASHBOT_ETC:-.}/botadmin" +BOTACL="${BASHBOT_ETC:-.}/botacl" +DATADIR="${BASHBOT_VAR:-.}/data-bot-bash" +# !!!!! DEPRECATED !!!!! +COUNTFILE="${BASHBOT_VAR:-.}/count" + +# we assume everthing is already set up correctly if we have TOKEN +if [ -n "${BOTTOKEN}" ]; then + # BOTTOKEN empty read from file + if [ ! -f "${TOKENFILE}" ]; then + if [ -z "${CLEAR}" ] && [ "$1" != "init" ]; then echo "Running headless, set BOTTOKEN or run ${SCRIPT} init first!" exit 2 - else + else ${CLEAR} echo -e "${RED}TOKEN MISSING.${NC}" echo -e "${ORANGE}PLEASE WRITE YOUR TOKEN HERE OR PRESS CTRL+C TO ABORT${NC}" read -r BOTTOKEN printf '%s\n' "${BOTTOKEN}" > "${TOKENFILE}" - fi -fi -[ -z "${BOTTOKEN}" ] && BOTTOKEN="$(< "${TOKENFILE}")" - -BOTADMIN="${BASHBOT_ETC:-.}/botadmin" -if [ ! -f "${BOTADMIN}" ]; then - if [ "${CLEAR}" = "" ]; then + fi + fi + [ -z "${BOTTOKEN}" ] && BOTTOKEN="$(< "${TOKENFILE}")" + # setup botadmin file + if [ ! -f "${BOTADMIN}" ]; then + if [ -z "${CLEAR}" ]; then echo "Running headless, set botadmin to AUTO MODE!" printf '%s\n' '?' > "${BOTADMIN}" - else + else ${CLEAR} echo -e "${RED}BOTADMIN MISSING.${NC}" echo -e "${ORANGE}PLEASE WRITE YOUR TELEGRAM ID HERE OR ENTER '?'${NC}" echo -e "${ORANGE}TO MAKE FIRST USER TYPING '/start' TO BOTADMIN${NC}" read -r admin - [ "${admin}" = "" ] && admin='?' + [ -z "${admin}" ] && admin='?' printf '%s\n' "${admin}" > "${BOTADMIN}" - fi -fi - -BOTACL="${BASHBOT_ETC:-.}/botacl" -if [ ! -f "${BOTACL}" ]; then + fi + fi + # setup botacl file + if [ ! -f "${BOTACL}" ]; then echo -e "${ORANGE}Create empty ${BOTACL} file.${NC}" printf '\n' >"${BOTACL}" -fi - -DATADIR="${BASHBOT_VAR:-.}/data-bot-bash" -if [ ! -d "${DATADIR}" ]; then + fi + # setup data dir file + if [ ! -d "${DATADIR}" ]; then mkdir "${DATADIR}" -elif [ ! -w "${DATADIR}" ]; then + elif [ ! -w "${DATADIR}" ]; then echo -e "${RED}ERROR: Can't write to ${DATADIR}!.${NC}" ls -ld "${DATADIR}" exit 2 -fi - -COUNTFILE="${BASHBOT_VAR:-.}/count" -if [ ! -f "${COUNTFILE}" ]; then + fi + # setup count file !!!!! DEPRECATED !!!!! + if [ ! -f "${COUNTFILE}" ]; then printf '\n' >"${COUNTFILE}" -elif [ ! -w "${COUNTFILE}" ]; then + elif [ ! -w "${COUNTFILE}" ]; then echo -e "${RED}ERROR: Can't write to ${COUNTFILE}!.${NC}" ls -l "${COUNTFILE}" exit 2 + fi fi +################## +# here we start with the real stuff URL="${BASHBOT_URL:-https://api.telegram.org/bot}${BOTTOKEN}" ME_URL=$URL'/getMe' @@ -140,6 +149,8 @@ declare -Ax UPD BOTSENT USER MESSAGE URLS CONTACT LOCATION CHAT FORWARD REPLYTO export res CAPTION +#################EW# +# read commamds file if we are not sourced COMMANDS="${BASHBOT_ETC:-.}/commands.sh" if [ "${SOURCE}" != "yes" ]; then if [ ! -f "${COMMANDS}" ] || [ ! -r "${COMMANDS}" ]; then @@ -186,13 +197,13 @@ proclist() { # $1 sting to search for proramm to kill killallproc() { local procid; procid="$(proclist "$1")" - if [ "${procid}" != "" ] ; then + if [ -n "${procid}" ] ; then # shellcheck disable=SC2046 kill $(proclist "$1") sleep 1 procid="$(proclist "$1")" # shellcheck disable=SC2046 - [ "${procid}" != "" ] && kill $(proclist -9 "$1") + [ -n "${procid}" ] && kill $(proclist -9 "$1") fi } @@ -219,7 +230,7 @@ delete_message() { } get_file() { - [ "$1" = "" ] && return + [ -z "$1" ] && return sendJson "" '"file_id": "'"${1}"'"' "${GETFILE_URL}" printf '%s\n' "${URL}"/"$(JsonGetString <<< "${res}" '"result","file_path"')" } @@ -228,7 +239,7 @@ get_file() { TIMEOUT="${BASHBOT_TIMEOUT}" [[ "$TIMEOUT" =~ ^[0-9]+$ ]] || TIMEOUT="20" -if [ "${BASHBOT_WGET}" = "" ] && _exists curl ; then +if [ -z "${BASHBOT_WGET}" ] && _exists curl ; then # simple curl or wget call, output to stdout getJson(){ # shellcheck disable=SC2086 @@ -237,18 +248,18 @@ if [ "${BASHBOT_WGET}" = "" ] && _exists curl ; then # usage: sendJson "chat" "JSON" "URL" sendJson(){ local chat=""; - [ "${1}" != "" ] && chat='"chat_id":'"${1}"',' + [ -n "${1}" ] && chat='"chat_id":'"${1}"',' # shellcheck disable=SC2086 res="$(curl -s -k ${BASHBOT_CURL_ARGS} -m "${TIMEOUT}" -d '{'"${chat} $(iconv -f utf-8 -t utf-8 -c <<<$2)"'}' -X POST "${3}" \ -H "Content-Type: application/json" | "${JSONSHFILE}" -s -b -n )" BOTSENT[OK]="$(JsonGetLine '"ok"' <<< "$res")" BOTSENT[ID]="$(JsonGetValue '"result","message_id"' <<< "$res")" - [ "${SOURCE}" != "yes" ] && [ "${BASHBOT_EVENT_SEND[*]}" != "" ] && event_send "send" "$@" & + [ "${SOURCE}" != "yes" ] && [ -n "${BASHBOT_EVENT_SEND[*]}" ] && event_send "send" "$@" & } #$1 Chat, $2 what , $3 file, $4 URL, $5 caption sendUpload() { [ "$#" -lt 4 ] && return - if [ "$5" != "" ]; then + if [ -n "$5" ]; then # shellcheck disable=SC2086 res="$(curl -s -k ${BASHBOT_CURL_ARGS} "$4" -F "chat_id=$1" -F "$2=@$3;${3##*/}" -F "caption=$5" | "${JSONSHFILE}" -s -b -n )" else @@ -256,7 +267,7 @@ if [ "${BASHBOT_WGET}" = "" ] && _exists curl ; then res="$(curl -s -k ${BASHBOT_CURL_ARGS} "$4" -F "chat_id=$1" -F "$2=@$3;${3##*/}" | "${JSONSHFILE}" -s -b -n )" fi BOTSENT[OK]="$(JsonGetLine '"ok"' <<< "$res")" - [ "${SOURCE}" != "yes" ] && [ "${BASHBOT_EVENT_SEND[*]}" != "" ] && event_send "upload" "$@" & + [ "${SOURCE}" != "yes" ] && [ -n "${BASHBOT_EVENT_SEND[*]}" ] && event_send "upload" "$@" & } else # simple curl or wget call outputs result to stdout @@ -267,18 +278,18 @@ else # usage: sendJson "chat" "JSON" "URL" sendJson(){ local chat=""; - [ "${1}" != "" ] && chat='"chat_id":'"${1}"',' + [ -n "${1}" ] && chat='"chat_id":'"${1}"',' # shellcheck disable=SC2086 res="$(wget --no-check-certificate -t 2 -T "${TIMEOUT}" ${BASHBOT_WGET_ARGS} -qO - --post-data='{'"${chat} $(iconv -f utf-8 -t utf-8 -c <<<$2)"'}' \ --header='Content-Type:application/json' "${3}" | "${JSONSHFILE}" -s -b -n )" BOTSENT[OK]="$(JsonGetLine '"ok"' <<< "$res")" BOTSENT[ID]="$(JsonGetValue '"result","message_id"' <<< "$res")" - [ "${SOURCE}" != "yes" ] && [ "${BASHBOT_EVENT_SEND[*]}" != "" ] && event_send "send" "$@" & + [ "${SOURCE}" != "yes" ] && [ -n "${BASHBOT_EVENT_SEND[*]}" ] && event_send "send" "$@" & } sendUpload() { sendJson "$1" '"text":"Sorry, wget does not support file upload"' "${MSG_URL}" BOTSENT[OK]="false" - [ "${SOURCE}" != "yes" ] && [ "${BASHBOT_EVENT_SEND[*]}" != "" ] && event_send "upload" "$@" & + [ "${SOURCE}" != "yes" ] && [ -n "${BASHBOT_EVENT_SEND[*]}" ] && event_send "upload" "$@" & } fi @@ -293,11 +304,11 @@ JsonEscape() { # title caption description markup inlinekeyboard title2Json(){ local title caption desc markup keyboard - [ "$1" != "" ] && title=',"title":"'$(JsonEscape "$1")'"' - [ "$2" != "" ] && caption=',"caption":"'$(JsonEscape "$2")'"' - [ "$3" != "" ] && desc=',"description":"'$(JsonEscape "$3")'"' - [ "$4" != "" ] && markup=',"parse_mode":"'$(JsonEscape "$4")'"' - [ "$5" != "" ] && keyboard=',"reply_markup":"'$(JsonEscape "$5")'"' + [ -n "$1" ] && title=',"title":"'$(JsonEscape "$1")'"' + [ -n "$2" ] && caption=',"caption":"'$(JsonEscape "$2")'"' + [ -n "$3" ] && desc=',"description":"'$(JsonEscape "$3")'"' + [ -n "$4" ] && markup=',"parse_mode":"'$(JsonEscape "$4")'"' + [ -n "$5" ] && keyboard=',"reply_markup":"'$(JsonEscape "$5")'"' echo "${title}${caption}${desc}${markup}${keyboard}" } @@ -332,7 +343,7 @@ JsonGetValue() { # $1 ARRAY name, must be declared with "declare -A ARRAY" before calling Json2Array() { # shellcheck source=./commands.sh - [ "$1" = "" ] || source <( printf "$1"'=( %s )' "$(sed -E -n -e '/\["[-0-9a-zA-Z_,."]+"\]\t/ s/\t/=/gp' -e 's/=(true|false)/="\1"/')" ) + [ -z "$1" ] || source <( printf "$1"'=( %s )' "$(sed -E -n -e '/\["[-0-9a-zA-Z_,."]+"\]\t/ s/\t/=/gp' -e 's/=(true|false)/="\1"/')" ) } # output ARRAY as JSON.sh style data # $1 ARRAY name, must be declared with "declare -A ARRAY" before calling @@ -360,7 +371,7 @@ process_client() { CMD=( ); iQUERY=( ) iQUERY[ID]="${UPD["result",${num},"inline_query","id"]}" [[ "${debug}" = *"debug"* ]] && cat <<< "$UPDATE" >>"MESSAGE.log" - if [ "${iQUERY[ID]}" = "" ]; then + if [ -z "${iQUERY[ID]}" ]; then process_message "${num}" "${debug}" else process_inline "${num}" "${debug}" @@ -372,13 +383,14 @@ process_client() { source "${COMMANDS}" "${debug}" & # then all registered addons - if [ "${iQUERY[ID]}" = "" ]; then + if [ -z "${iQUERY[ID]}" ]; then event_message "${debug}" else event_inline "${debug}" fi # last count users + # !!!!! DEPRECATED !!!!! tmpcount="COUNT${CHAT[ID]}" grep -q "$tmpcount" <"${COUNTFILE}" &>/dev/null || cat <<< "$tmpcount" >>"${COUNTFILE}" } @@ -440,7 +452,7 @@ event_message() { done # ${TEXT[*]} event_text - if [ "${MESSAGE[0]}" != "" ]; then + if [ -n "${MESSAGE[0]}" ]; then # shellcheck disable=SC2153 for key in "${!BASHBOT_EVENT_TEXT[@]}" do @@ -448,7 +460,7 @@ event_message() { done # ${CMD[*]} event_cmd - if [ "${CMD[0]}" != "" ]; then + if [ -n "${CMD[0]}" ]; then # shellcheck disable=SC2153 for key in "${!BASHBOT_EVENT_CMD[@]}" do @@ -457,7 +469,7 @@ event_message() { fi fi # ${REPLYTO[*]} event_replyto - if [ "${REPLYTO[UID]}" != "" ]; then + if [ -n "${REPLYTO[UID]}" ]; then # shellcheck disable=SC2153 for key in "${!BASHBOT_EVENT_REPLYTO[@]}" do @@ -466,7 +478,7 @@ event_message() { fi # ${FORWARD[*]} event_forward - if [ "${FORWARD[UID]}" != "" ]; then + if [ -n "${FORWARD[UID]}" ]; then # shellcheck disable=SC2153 for key in "${!BASHBOT_EVENT_FORWARD[@]}" do @@ -475,7 +487,7 @@ event_message() { fi # ${CONTACT[*]} event_contact - if [ "${CONTACT[FIRST_NAME]}" != "" ]; then + if [ -n "${CONTACT[FIRST_NAME]}" ]; then # shellcheck disable=SC2153 for key in "${!BASHBOT_EVENT_CONTACT[@]}" do @@ -485,7 +497,7 @@ event_message() { # ${VENUE[*]} event_location # ${LOCALTION[*]} event_location - if [ "${LOCATION[LONGITUDE]}" != "" ] || [ "${VENUE[TITLE]}" != "" ]; then + if [ -n "${LOCATION[LONGITUDE]}" ] || [ -n "${VENUE[TITLE]}" ]; then # shellcheck disable=SC2153 for key in "${!BASHBOT_EVENT_LOCATION[@]}" do @@ -537,7 +549,7 @@ process_message() { # in reply to message from REPLYTO=( ) REPLYTO[UID]="${UPD["result",${num},"message","reply_to_message","from","id"]}" - if [ "${REPLYTO[UID]}" != "" ]; then + if [ -n "${REPLYTO[UID]}" ]; then REPLYTO[0]="$(JsonDecode "${UPD["result",${num},"message","reply_to_message","text"]}")" REPLYTO[ID]="${UPD["result",${num},"message","reply_to_message","message_id"]}" REPLYTO[FIRST_NAME]="$(JsonDecode "${UPD["result",${num},"message","reply_to_message","from","first_name"]}")" @@ -548,7 +560,7 @@ process_message() { # forwarded message from FORWARD=( ) FORWARD[UID]="${UPD["result",${num},"message","forward_from","id"]}" - if [ "${FORWARD[UID]}" != "" ]; then + if [ -n "${FORWARD[UID]}" ]; then FORWARD[ID]="${MESSAGE[ID]}" # same as message ID FORWARD[FIRST_NAME]="$(JsonDecode "${UPD["result",${num},"message","forward_from","first_name"]}")" FORWARD[LAST_NAME]="$(JsonDecode "${UPD["result",${num},"message","forward_from","last_name"]}")" @@ -571,7 +583,7 @@ process_message() { # Contact CONTACT=( ) CONTACT[FIRST_NAME]="$(JsonDecode "${UPD["result",${num},"message","contact","first_name"]}")" - if [ "${CONTACT[FIRST_NAME]}" != "" ]; then + if [ -n "${CONTACT[FIRST_NAME]}" ]; then CONTACT[USER_ID]="$(JsonDecode "${UPD["result",${num},"message","contact","user_id"]}")" CONTACT[LAST_NAME]="$(JsonDecode "${UPD["result",${num},"message","contact","last_name"]}")" CONTACT[NUMBER]="${UPD["result",${num},"message","contact","phone_number"]}" @@ -581,7 +593,7 @@ process_message() { # vunue VENUE=( ) VENUE[TITLE]="$(JsonDecode "${UPD["result",${num},"message","venue","title"]}")" - if [ "${VENUE[TITLE]}" != "" ]; then + if [ -n "${VENUE[TITLE]}" ]; then VENUE[ADDRESS]="$(JsonDecode "${UPD["result",${num},"message","venue","address"]}")" VENUE[LONGITUDE]="${UPD["result",${num},"message","venue","location","longitude"]}" VENUE[LATITUDE]="${UPD["result",${num},"message","venue","location","latitude"]}" @@ -598,7 +610,7 @@ process_message() { # service messages SERVICE=( ); NEWMEMBER=( ) SERVICE[NEWMEMBER]="${UPD["result",${num},"message","new_chat_member","id"]}" - if [ "${SERVICE[NEWMEMBER]}" != "" ]; then + if [ -n "${SERVICE[NEWMEMBER]}" ]; then NEWMEMBER[ID]="${SERVICE[NEWMEMBER]}" NEWMEMBER[FIRSTNAME]="${UPD["result",${num},"message","new_chat_member","first_name"]}" NEWMEMBER[LASTNAME]="${UPD["result",${num},"message","new_chat_member","last_name"]}" @@ -633,7 +645,7 @@ start_bot() { local addsleep="100" local maxsleep="$(( ${BASHBOT_SLEEP:-5000} + 100 ))" [[ "${DEBUG}" = *"debug" ]] && exec &>>"DEBUG.log" - [ "${DEBUG}" != "" ] && date && echo "Start BASHBOT in Mode \"${DEBUG}\"" + [ -n "${DEBUG}" ] && date && echo "Start BASHBOT in Mode \"${DEBUG}\"" [[ "${DEBUG}" = "xdebug"* ]] && set -x #cleaup old pipes and empty logfiles find "${DATADIR}" -type p -delete @@ -688,14 +700,14 @@ bot_init() { [[ "${UID}" -eq "0" ]] && RUNUSER="nobody" echo -n "Enter User to run basbot [$RUNUSER]: " read -r TOUSER - [ "$TOUSER" = "" ] && TOUSER="$RUNUSER" + [ -z "$TOUSER" ] && TOUSER="$RUNUSER" if ! id "$TOUSER" &>/dev/null; then echo -e "${RED}User \"$TOUSER\" not found!${NC}" exit 3 else # shellcheck disable=SC2009 oldbot="$(ps -fu "$TOUSER" | grep startbot | grep -v -e 'grep' -e '\-startbot' )" - [ "${oldbot}" != "" ] && \ + [ -n "${oldbot}" ] && \ echo -e "${ORANGE}Warning: At least one not upgraded TMUX bot is running! You must stop it with kill command:${NC}\\n${oldbot}" echo "Adjusting user \"${TOUSER}\" files and permissions ..." [ -w "bashbot.rc" ] && sed -i '/^[# ]*runas=/ s/runas=.*$/runas="'$TOUSER'"/' "bashbot.rc" @@ -727,7 +739,7 @@ fi if [ "${SOURCE}" != "yes" ] && [ "$1" != "init" ] && [ "$1" != "help" ]; then ME="$(getBotName)" - if [ "$ME" = "" ]; then + if [ -z "$ME" ]; then echo -e "${RED}ERROR: Can't connect to Telegram! Your TOKEN is invalid or you are blocked by ${URL%/*} ...${NC}" case "$1" in "" | "stop" | "kill"* | "suspendb"* ) # warn, but do not exit @@ -746,10 +758,10 @@ if [ "${SOURCE}" != "yes" ]; then # internal options only for use from bashbot and developers case "$1" in "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 + [ -z "$3" ] && echo "No file to read from" && exit 3 + [ -z "$2" ] && echo "No chat to send to" && exit 3 while read -r line ;do - [ "$line" != "" ] && send_message "$2" "$line" + [ -n "$line" ] && send_message "$2" "$line" done rm -f -r "${DATADIR:-.}/$3" [ -s "${DATADIR:-.}/$3.log" ] || rm -f "${DATADIR:-.}/$3.log" @@ -772,11 +784,11 @@ if [ "${SOURCE}" != "yes" ]; then BOTPID="$(proclist "${SESSION}")" case "$1" in - "count") + "count") # !!!!! DEPRECATED !!!!! echo "A total of $(wc -l <"${COUNTFILE}") users used me." exit ;; - "broadcast") + "broadcast") # !!!!! DEPRECATED !!!!! NUMCOUNT="$(wc -l <"${COUNTFILE}")" echo "Sending the broadcast $* to $NUMCOUNT users." [ "$NUMCOUNT" -gt "300" ] && sleep="sleep 0.5" @@ -784,7 +796,7 @@ if [ "${SOURCE}" != "yes" ]; then while read -r f; do send_markdown_message "${f//COUNT}" "$*"; $sleep; done <"${COUNTFILE}" ;; "status") - if [ "${BOTPID}" != "" ]; then + if [ -n "${BOTPID}" ]; then echo -e "${GREEN}Bot is running.${NC}" exit else @@ -795,10 +807,10 @@ if [ "${SOURCE}" != "yes" ]; then "start") # shellcheck disable=SC2086 - [ "${BOTPID}" != "" ] && kill ${BOTPID} + [ -n "${BOTPID}" ] && kill ${BOTPID} nohup "$SCRIPT" "startbot" "$2" "${SESSION}" &>/dev/null & echo "Session Name: ${SESSION}" - if [ "$(proclist "${SESSION}")" != "" ]; then + if [ -n "$(proclist "${SESSION}")" ]; then echo -e "${GREEN}Bot started successfully.${NC}" else echo -e "${RED}An error occurred while starting the bot.${NC}" @@ -806,7 +818,7 @@ if [ "${SOURCE}" != "yes" ]; then fi ;; "kill"|"stop") - if [ "${BOTPID}" != "" ]; then + if [ -n "${BOTPID}" ]; then # shellcheck disable=SC2086 if kill ${BOTPID}; then echo -e "${GREEN}OK. Bot stopped successfully.${NC}" diff --git a/commands.sh b/commands.sh index e48f35e..8944243 100644 --- a/commands.sh +++ b/commands.sh @@ -15,7 +15,7 @@ # This file is public domain in the USA and all free countries. # Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying) # -#### $$VERSION$$ v0.94-pre-1-g4aa7561 +#### $$VERSION$$ v0.94-pre-2-gc0a633f # # adjust your language setting here, e.g.when run from other user or cron. diff --git a/modules/aliases.sh b/modules/aliases.sh index 853c1b7..4997383 100644 --- a/modules/aliases.sh +++ b/modules/aliases.sh @@ -5,7 +5,7 @@ # This file is public domain in the USA and all free countries. # Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying) # -#### $$VERSION$$ v0.94-pre-1-g4aa7561 +#### $$VERSION$$ v0.94-pre-2-gc0a633f # # source from commands.sh to use the aliases diff --git a/modules/answerInline.sh b/modules/answerInline.sh index 339a688..7f529ee 100644 --- a/modules/answerInline.sh +++ b/modules/answerInline.sh @@ -5,7 +5,7 @@ # This file is public domain in the USA and all free countries. # Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying) # -#### $$VERSION$$ v0.94-pre-1-g4aa7561 +#### $$VERSION$$ v0.94-pre-2-gc0a633f # source from commands.sh to use the inline functions @@ -36,15 +36,15 @@ inline_query_compose(){ JSON='{"type":"article","id":"'$ID'","input_message_content": {"message_text":"'$4'"} '$(title2Json "$3" "" "$5" "$6" "$7")'}' ;; "photo") # photo ID photoURL (thumbURL title description caption) - [ "$4" = "" ] && tumb="$3" + [ -z "$4" ] && tumb="$3" JSON='{"type":"photo","id":"'$ID'","photo_url":"'$3'","thumb_url":"'$4${tumb}'"'$(title2Json "$5" "$7" "$6" "$7" "$8")'}' ;; "gif") # gif ID photoURL (thumbURL title caption) - [ "$4" = "" ] && tumb="$3" + [ -z "$4" ] && tumb="$3" JSON='{"type":"gif","id":"'$ID'","gif_url":"'$3'", "thumb_url":"'$4${tumb}'"'$(title2Json "$5" "$6" "$7" "$8" "$9")'}' ;; "mpeg4_gif") # mpeg4_gif ID mpegURL (thumbURL title caption) - [ "$4" != "" ] && tumb='","thumb_url":"'$4'"' + [ -n "$4" ] && tumb='","thumb_url":"'$4'"' JSON='{"type":"mpeg4_gif","id":"'$ID'","mpeg4_url":"'$3'"'${tumb}$(title2Json "$5" "$6" "" "$7" "$8")'}' ;; "video") # video ID videoURL mime thumbURL title (caption) @@ -63,13 +63,13 @@ inline_query_compose(){ JSON='{"type":"location","id":"'$ID'","latitude":"'$3'","longitude":"'$4'","title":"'$5'"}' ;; "venue") # venue ID lat long title (adress forsquare) - [ "$6" = "" ] && addr="$5" - [ "$7" != "" ] && fours=',"foursquare_id":"'$7'"' + [ -z "$6" ] && addr="$5" + [ -n "$7" ] && fours=',"foursquare_id":"'$7'"' JSON='{"type":"venue","id":"'$ID'","latitude":"'$3'","longitude":"'$4'","title":"'$5'","address":"'$6${addr}'"'${fours}'}' ;; "contact") # contact ID phone first (last thumb) - [ "$5" != "" ] && last=',"last_name":"'$5'"' - [ "$6" != "" ] && tumb='","thumb_url":"'$6'"' + [ -n "$5" ] && last=',"last_name":"'$5'"' + [ -n "$6" ] && tumb='","thumb_url":"'$6'"' JSON='{"type":"contact","id":"'$ID'","phone_number":"'$3'","first_name":"'$4'"'${last}'"}' ;; # title2Json title caption description markup inlinekeyboard diff --git a/modules/background.sh b/modules/background.sh index b5f85ba..8ef64ba 100644 --- a/modules/background.sh +++ b/modules/background.sh @@ -5,7 +5,7 @@ # This file is public domain in the USA and all free countries. # Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying) # -#### $$VERSION$$ v0.94-pre-1-g4aa7561 +#### $$VERSION$$ v0.94-pre-2-gc0a633f # source from commands.sh if you want ro use interactive or background jobs @@ -50,7 +50,7 @@ start_back() { # $2 program # $3 prefix start_proc() { - [ "$2" = "" ] && return + [ -z "$2" ] && return [ -x "${2%% *}" ] || return 1 local fifo; fifo="${DATADIR:-.}/$(procname "$1" "$3")" kill_proc "$1" "$3" @@ -69,7 +69,7 @@ check_back() { # $1 chatid # $2 prefix check_proc() { - [ "$(proclist "$(procname "$1" "$2")")" != "" ] + [ -n "$(proclist "$(procname "$1" "$2")")" ] # shellcheck disable=SC2034 res=$?; return $? } @@ -90,7 +90,7 @@ kill_proc() { prid="$(proclist "${fifo}")" fifo="${DATADIR:-.}/${fifo}" # shellcheck disable=SC2086 - [ "${prid}" != "" ] && kill ${prid} + [ -n "${prid}" ] && kill ${prid} [ -s "${fifo}.log" ] || rm -f "${fifo}.log" [ -p "${fifo}" ] && rm -f "${fifo}"; } diff --git a/modules/chatMember.sh b/modules/chatMember.sh index 5053164..a0794ed 100644 --- a/modules/chatMember.sh +++ b/modules/chatMember.sh @@ -5,7 +5,7 @@ # This file is public domain in the USA and all free countries. # Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying) # -#### $$VERSION$$ v0.94-pre-1-g4aa7561 +#### $$VERSION$$ v0.94-pre-2-gc0a633f # source once magic, function named like file eval "$(basename "${BASH_SOURCE[0]}")(){ :; }" @@ -58,10 +58,10 @@ user_is_botadmin() { user_is_allowed() { local acl="$1" - [ "$1" = "" ] && return 1 + [ -z "$1" ] && return 1 grep -F -xq "${acl}:*:*" <"${BOTACL}" && return 0 - [ "$2" != "" ] && acl="${acl}:$2" + [ -n "$2" ] && acl="${acl}:$2" grep -F -xq "${acl}:*" <"${BOTACL}" && return 0 - [ "$3" != "" ] && acl="${acl}:$3" + [ -n "$3" ] && acl="${acl}:$3" grep -F -xq "${acl}" <"${BOTACL}" } diff --git a/modules/jsonDB.sh b/modules/jsonDB.sh index b304cd3..5d18e14 100644 --- a/modules/jsonDB.sh +++ b/modules/jsonDB.sh @@ -5,7 +5,7 @@ # This file is public domain in the USA and all free countries. # Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying) # -#### $$VERSION$$ v0.94-pre-1-g4aa7561 +#### $$VERSION$$ v0.94-pre-2-gc0a633f # # source from commands.sh to use jsonDB functions # @@ -20,7 +20,7 @@ eval "$(basename "${BASH_SOURCE[0]}")(){ :; }" # $2 filename, must be relative to BASHBOT_ETC, and not contain '..' jssh_readDB() { local DB; DB="$(jssh_checkDB "$2")" - [ "${DB}" = "" ] && return 1 + [ -z "${DB}" ] && return 1 [ ! -f "${DB}" ] && return 2 Json2Array "$1" <"${DB}" } @@ -31,7 +31,7 @@ jssh_readDB() { # $2 filename (must exist!), must be relative to BASHBOT_ETC, and not contain '..' jssh_writeDB() { local DB; DB="$(jssh_checkDB "$2")" - [ "${DB}" = "" ] && return 1 + [ -z "${DB}" ] && return 1 [ ! -f "${DB}" ] && return 2 Array2Json "$1" >"${DB}" } @@ -41,10 +41,10 @@ jssh_writeDB() { # $2 filename (must exist!), must be relative to BASHBOT_ETC, and not contain '..' jssh_updateDB() { declare -n ARRAY="$1" - [ "${ARRAY[*]}" = "" ] && return 1 + [ -z "${ARRAY[*]}" ] && return 1 declare -A oldARR newARR jssh_readDB "oldARR" "$2" || return "$?" - if [ "${oldARR[*]}" = "" ]; then + if [ -z "${oldARR[*]}" ]; then # no old content jssh_writeDB "$1" "$2" else @@ -68,7 +68,7 @@ jssh_insertDB() { [[ "$1" =~ ^[-a-zA-Z0-9,._]+$ ]] || return 3 local key="$1" value="$2" local DB; DB="$(jssh_checkDB "$3")" - [ "${DB}" = "" ] && return 1 + [ -z "${DB}" ] && return 1 [ ! -f "${DB}" ] && return 2 # its append, but last one counts, its a simple DB ... printf '["%s"]\t"%s"\n' "${key//,/\",\"}" "${value//\"/\\\"}" >>"${DB}" @@ -90,7 +90,7 @@ jssh_getDB() { # $1 filename (must exist!), must be relative to BASHBOT_ETC, and not contain '..' jssh_newDB() { local DB; DB="$(jssh_checkDB "$1")" - [ "${DB}" = "" ] && return 1 + [ -z "${DB}" ] && return 1 [ -f "${DB}" ] && return 2 # already exist, do not zero out printf '\n' >"${DB}" } @@ -98,7 +98,7 @@ jssh_newDB() { # $1 filename, check filename, it must be relative to BASHBOT_ETC, and not contain '..' # returns real path to DB file if everything is ok jssh_checkDB(){ - [ "$1" = "" ] && return 1 + [ -z "$1" ] && return 1 local DB="${BASHBOT_ETC:-.}/$1.jssh" [[ "$1" = "${BASHBOT_ETC:-.}"* ]] && DB="$1.jssh" [[ "$1" = *'..'* ]] && return 2 diff --git a/modules/sendMessage.sh b/modules/sendMessage.sh index eeadfbc..87ea7a0 100644 --- a/modules/sendMessage.sh +++ b/modules/sendMessage.sh @@ -5,7 +5,7 @@ # This file is public domain in the USA and all free countries. # Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying) # -#### $$VERSION$$ v0.94-pre-1-g4aa7561 +#### $$VERSION$$ v0.94-pre-2-gc0a633f # source once magic, function named like file eval "$(basename "${BASH_SOURCE[0]}")(){ :; }" @@ -67,19 +67,19 @@ sendEmpty() { } send_keyboard() { if [[ "$3" != *'['* ]]; then old_send_keyboard "${@}"; return; fi - local text; text='"text":"'$(JsonEscape "${2}")'"'; [ "${2}" = "" ] && text='"text":"'"${ISEMPTY}"'"' - local one_time=', "one_time_keyboard":true' && [ "$4" != "" ] && one_time="" + local text; text='"text":"'$(JsonEscape "${2}")'"'; [ -z "${2}" ] && text='"text":"'"${ISEMPTY}"'"' + local one_time=', "one_time_keyboard":true' && [ -n "$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='"text":"'$(JsonEscape "${2}")'"'; [ "${2}" = "" ] && text='"text":"'"${ISEMPTY}"'"' + local text; text='"text":"'$(JsonEscape "${2}")'"'; [ -z "${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='"text":"'$(JsonEscape "${2}")'"'; [ "${2}" = "" ] && text='"text":"'"${ISEMPTY}"'"' + local text; text='"text":"'$(JsonEscape "${2}")'"'; [ -z "${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"}]<- ]}' } @@ -93,7 +93,7 @@ UPLOADDIR="${BASHBOT_UPLOAD:-${DATADIR}/upload}" # for now this can only send local files with curl! # extend to allow send files by URL or telegram ID send_file() { - [ "$2" = "" ] && return + [ -z "$2" ] && return [[ "$2" = "http"* ]] && return # currently we do not support URL upload_file "${@}" } @@ -150,25 +150,25 @@ upload_file(){ # 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 + [ -z "$2" ] && return sendJson "${1}" '"action": "'"${2}"'"' "$ACTION_URL" } send_location() { - [ "$3" = "" ] && return + [ -z "$3" ] && return sendJson "${1}" '"latitude": '"${2}"', "longitude": '"${3}"'' "$LOCATION_URL" } send_venue() { local add="" - [ "$5" = "" ] && return - [ "$6" != "" ] && add=', "foursquare_id": '"$6"'' + [ -z "$5" ] && return + [ -n "$6" ] && add=', "foursquare_id": '"$6"'' sendJson "${1}" '"latitude": '"${2}"', "longitude": '"${3}"', "address": "'"${5}"'", "title": "'"${4}"'"'"${add}" "$VENUE_URL" } forward_message() { - [ "$3" = "" ] && return + [ -z "$3" ] && return sendJson "${1}" '"from_chat_id": '"${2}"', "message_id": '"${3}"'' "$FORWARD_URL" } forward() { # backward compatibility @@ -176,7 +176,7 @@ forward() { # backward compatibility } send_message() { - [ "$2" = "" ] && return + [ -z "$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')" @@ -191,27 +191,27 @@ send_message() { 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 + if [ -n "$no_keyboard" ]; then remove_keyboard "$1" "$text" sent=y fi - if [ "$keyboard" != "" ]; then + if [ -n "$keyboard" ]; then if [[ "$keyboard" != *"["* ]]; then # pre 0.60 style keyboard="[ ${keyboard//\" \"/\" \] , \[ \"} ]" fi send_keyboard "$1" "$text" "$keyboard" sent=y fi - if [ "$btext" != "" ] && [ "$burl" != "" ]; then + if [ -n "$btext" ] && [ -n "$burl" ]; then send_button "$1" "$text" "$btext" "$burl" sent=y fi - if [ "$file" != "" ]; then + if [ -n "$file" ]; then send_file "$1" "$file" "$text" sent=y fi - if [ "$lat" != "" ] && [ "$long" != "" ]; then - if [ "$address" != "" ] && [ "$title" != "" ]; then + if [ -n "$lat" ] && [ -n "$long" ]; then + if [ -n "$address" ] && [ -n "$title" ]; then send_venue "$1" "$lat" "$long" "$title" "$address" else send_location "$1" "$lat" "$long"