From b5c576633d3a2bdc6d1ea9567344fcb6e989fdba Mon Sep 17 00:00:00 2001 From: Daniil Gentili Date: Mon, 24 Oct 2016 22:13:52 +0000 Subject: [PATCH] Now the messages id can be accessed in MESSAGE[ID], all updates fetched with getUpdates are processed simultaneously and newlines and certain unicode codepoints are parsed correctly in messages (closes #21) --- .gitignore | 1 + JSON.sh | 2 +- README.md | 3 +++ bashbot.sh | 73 ++++++++++++++++++++++++++++++++--------------------- commands.sh | 4 +-- 5 files changed, 51 insertions(+), 32 deletions(-) diff --git a/.gitignore b/.gitignore index 9e00ce7..4c890d4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *~ count token +*.save diff --git a/JSON.sh b/JSON.sh index 2de4579..022ec33 160000 --- a/JSON.sh +++ b/JSON.sh @@ -1 +1 @@ -Subproject commit 2de457939e9b3fcf0d1e3f55b6072d060cb47a45 +Subproject commit 022ec337c3225d5857856fd924cef0ab20443088 diff --git a/README.md b/README.md index b74abf0..9c378dc 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,7 @@ Then start editing the commands. You can read incoming data using the following variables: * ```$MESSAGE```: Incoming messages +* ```$MESSAGE[ID]```: ID of incoming message * ```$CAPTION```: Captions * ```$USER```: This array contains the First name, last name, username and user id of the sender of the current message. * ```${USER[ID]}```: User id @@ -93,6 +94,8 @@ You can read incoming data using the following variables: * ```${CHAT[LAST_NAME]}```: Chat's last name * ```${CHAT[USERNAME]}```: Username * ```${CHAT[TITLE]}```: Title + * ```${CHAT[TYPE]}```: Type + * ```${CHAT[ALL_MEMBERS_ARE_ADMINISTRATORS]}```: All members are administrators (true if true) * ```$URLS```: This array contains documents, audio files, stickers, voice recordings and stickers stored in the form of URLs. * ```${URLS[AUDIO]}```: Audio files * ```${URLS[VIDEO]}```: Videos diff --git a/bashbot.sh b/bashbot.sh index 4b3f3b9..86fc44b 100755 --- a/bashbot.sh +++ b/bashbot.sh @@ -306,49 +306,61 @@ inproc() { tmux send-keys -t $copname "$MESSAGE ${URLS[*]} " } - +process_updates() { + MAX_PROCESS_NUMBER=$(echo "$UPDATE" | sed '/\["result",[0-9]*\]/!d' | tail -1 | sed 's/\["result",//g;s/\].*//g') + for ((PROCESS_NUMBER=0; PROCESS_NUMBER<=MAX_PROCESS_NUMBER; PROCESS_NUMBER++)); do + if [ "$1" == "test" ]; then + process_client "$1" + else + process_client "$1" & + fi + done +} process_client() { # Message - MESSAGE=$(echo "$res" | egrep '\["result",0,"message","text"\]' | cut -f 2 | cut -d '"' -f 2) - MESSAGE_ID=$(echo "$res" | egrep '\["result",0,"message","message_id"\]' | cut -f 2 | cut -d '"' -f 2) + MESSAGE[0]=$(echo -e $(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","text"\]' | cut -f 2 | cut -d '"' -f 2)) + MESSAGE[ID]=$(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","message_id"\]' | cut -f 2 | cut -d '"' -f 2) + # Chat - CHAT[ID]=$(echo "$res" | egrep '\["result",0,"message","chat","id"\]' | cut -f 2) - CHAT[FIRST_NAME]=$(echo "$res" | egrep '\["result",0,"message","chat","first_name"\]' | cut -f 2 | cut -d '"' -f 2) - CHAT[LAST_NAME]=$(echo "$res" | egrep '\["result",0,"message","chat","last_name"\]' | cut -f 2 | cut -d '"' -f 2) - CHAT[USERNAME]=$(echo "$res" | egrep '\["result",0,"message","chat","username"\]' | cut -f 2 | cut -d '"' -f 2) - CHAT[TITLE]=$(echo "$res" | egrep '\["result",0,"message","chat","title"\]' | cut -f 2 | cut -d '"' -f 2) + CHAT[ID]=$(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","chat","id"\]' | cut -f 2) + CHAT[FIRST_NAME]=$(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","chat","first_name"\]' | cut -f 2 | cut -d '"' -f 2) + CHAT[LAST_NAME]=$(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","chat","last_name"\]' | cut -f 2 | cut -d '"' -f 2) + CHAT[USERNAME]=$(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","chat","username"\]' | cut -f 2 | cut -d '"' -f 2) + CHAT[TITLE]=$(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","chat","title"\]' | cut -f 2 | cut -d '"' -f 2) + CHAT[TYPE]=$(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","chat","type"\]' | cut -f 2 | cut -d '"' -f 2) + CHAT[ALL_MEMBERS_ARE_ADMINISTRATORS]=$(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","chat","all_members_are_administrators"\]' | cut -f 2 | cut -d '"' -f 2) # User - USER[ID]=$(echo "$res" | egrep '\["result",0,"message","from","id"\]' | cut -f 2) - USER[FIRST_NAME]=$(echo "$res" | egrep '\["result",0,"message","from","first_name"\]' | cut -f 2 | cut -d '"' -f 2) - USER[LAST_NAME]=$(echo "$res" | egrep '\["result",0,"message","from","last_name"\]' | cut -f 2 | cut -d '"' -f 2) - USER[USERNAME]=$(echo "$res" | egrep '\["result",0,"message","from","username"\]' | cut -f 2 | cut -d '"' -f 2) + USER[ID]=$(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","from","id"\]' | cut -f 2) + USER[FIRST_NAME]=$(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","from","first_name"\]' | cut -f 2 | cut -d '"' -f 2) + USER[LAST_NAME]=$(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","from","last_name"\]' | cut -f 2 | cut -d '"' -f 2) + USER[USERNAME]=$(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","from","username"\]' | cut -f 2 | cut -d '"' -f 2) # Audio - URLS[AUDIO]=$(get_file $(echo "$res" | egrep '\["result",0,"message","audio","file_id"\]' | cut -f 2 | cut -d '"' -f 2)) + URLS[AUDIO]=$(get_file $(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","audio","file_id"\]' | cut -f 2 | cut -d '"' -f 2)) # Document - URLS[DOCUMENT]=$(get_file $(echo "$res" | egrep '\["result",0,"message","document","file_id"\]' | cut -f 2 | cut -d '"' -f 2)) + URLS[DOCUMENT]=$(get_file $(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","document","file_id"\]' | cut -f 2 | cut -d '"' -f 2)) # Photo - URLS[PHOTO]=$(get_file $(echo "$res" | egrep '\["result",0,"message","photo",.*,"file_id"\]' | cut -f 2 | cut -d '"' -f 2 | sed -n '$p')) + URLS[PHOTO]=$(get_file $(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","photo",.*,"file_id"\]' | cut -f 2 | cut -d '"' -f 2 | sed -n '$p')) # Sticker - URLS[STICKER]=$(get_file $(echo "$res" | egrep '\["result",0,"message","sticker","file_id"\]' | cut -f 2 | cut -d '"' -f 2)) + URLS[STICKER]=$(get_file $(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","sticker","file_id"\]' | cut -f 2 | cut -d '"' -f 2)) # Video - URLS[VIDEO]=$(get_file $(echo "$res" | egrep '\["result",0,"message","video","file_id"\]' | cut -f 2 | cut -d '"' -f 2)) + URLS[VIDEO]=$(get_file $(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","video","file_id"\]' | cut -f 2 | cut -d '"' -f 2)) # Voice - URLS[VOICE]=$(get_file $(echo "$res" | egrep '\["result",0,"message","voice","file_id"\]' | cut -f 2 | cut -d '"' -f 2)) + URLS[VOICE]=$(get_file $(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","voice","file_id"\]' | cut -f 2 | cut -d '"' -f 2)) # Contact - CONTACT[NUMBER]=$(echo "$res" | egrep '\["result",0,"message","contact","phone_number"\]' | cut -f 2 | cut -d '"' -f 2) - CONTACT[FIRST_NAME]=$(echo "$res" | egrep '\["result",0,"message","contact","first_name"\]' | cut -f 2 | cut -d '"' -f 2) - CONTACT[LAST_NAME]=$(echo "$res" | egrep '\["result",0,"message","contact","last_name"\]' | cut -f 2 | cut -d '"' -f 2) - CONTACT[USER_ID]=$(echo "$res" | egrep '\["result",0,"message","contact","user_id"\]' | cut -f 2 | cut -d '"' -f 2) + CONTACT[NUMBER]=$(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","contact","phone_number"\]' | cut -f 2 | cut -d '"' -f 2) + CONTACT[FIRST_NAME]=$(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","contact","first_name"\]' | cut -f 2 | cut -d '"' -f 2) + CONTACT[LAST_NAME]=$(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","contact","last_name"\]' | cut -f 2 | cut -d '"' -f 2) + CONTACT[USER_ID]=$(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","contact","user_id"\]' | cut -f 2 | cut -d '"' -f 2) # Caption - CAPTION=$(echo "$res" | egrep '\["result",0,"message","caption"\]' | cut -f 2 | cut -d '"' -f 2) + CAPTION=$(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","caption"\]' | cut -f 2 | cut -d '"' -f 2) # Location - LOCATION[LONGITUDE]=$(echo "$res" | egrep '\["result",0,"message","location","longitude"\]' | cut -f 2 | cut -d '"' -f 2) - LOCATION[LATITUDE]=$(echo "$res" | egrep '\["result",0,"message","location","latitude"\]' | cut -f 2 | cut -d '"' -f 2) + LOCATION[LONGITUDE]=$(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","location","longitude"\]' | cut -f 2 | cut -d '"' -f 2) + LOCATION[LATITUDE]=$(echo "$UPDATE" | egrep '\["result",'$PROCESS_NUMBER',"message","location","latitude"\]' | cut -f 2 | cut -d '"' -f 2) NAME="$(echo ${URLS[*]} | sed 's/.*\///g')" # Tmux @@ -364,17 +376,17 @@ process_client() { # source the script with source as param to use functions in other scripts while [ "$1" == "startbot" ]; do { - res=$(curl -s $UPD_URL$OFFSET | ./JSON.sh/JSON.sh -s) + UPDATE=$(curl -s $UPD_URL$OFFSET | ./JSON.sh/JSON.sh) # Offset - OFFSET=$(echo "$res" | egrep '\["result",0,"update_id"\]' | cut -f 2) + OFFSET=$(echo "$UPDATE" | egrep '\["result",[0-9]*,"update_id"\]' | tail -1 | cut -f 2) OFFSET=$((OFFSET+1)) if [ $OFFSET != 1 ]; then if [ "$2" == "test" ]; then - process_client + process_updates "$2" else - process_client& + process_updates "$2" & fi fi @@ -419,6 +431,9 @@ case "$1" in "attach") tmux attach -t $ME ;; + "source") + echo "OK" + ;; *) echo -e '\e[0;31mBAD REQUEST\e[0m' echo -e '\e[0;31mAvailable arguments: outproc, count, broadcast, start, kill, help, attach\e[0m' diff --git a/commands.sh b/commands.sh index 871ba59..844e2f7 100755 --- a/commands.sh +++ b/commands.sh @@ -15,7 +15,7 @@ if [ "$1" = "source" ];then else if ! tmux ls | grep -v send | grep -q $copname; then [ ! -z ${URLS[*]} ] && { - curl -s ${URLS[*]} -o $NAME + curl -s ${URLS[*]} -o $NAME send_file "${CHAT[ID]}" "$NAME" "$CAPTION" rm "$NAME" } @@ -45,7 +45,7 @@ else if [[ $iQUERY_MSG == web ]]; then answer_inline_query "$iQUERY_ID" "article" "GitHub" "http://github.com/topkecleon/telegram-bot-bash" fi - fi + fi & fi case $MESSAGE in '/question')