mirror of
https://github.com/octoleo/telegram-bot-bash.git
synced 2024-11-21 23:25:08 +00:00
Added a license for the unfortunate souls whose governments don't allow public domain.
Removed JSON.sh and added the project as a submodule. Modified code referencing it accordingly. Added "attach" argument to attach to the tmux session and a default message if no argument is given. Other minor changes.
This commit is contained in:
parent
55bf7e35a9
commit
62c3d5eb84
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[submodule "JSON.sh"]
|
||||||
|
path = JSON.sh
|
||||||
|
url = http://github.com/dominictarr/JSON.sh
|
204
JSON.sh
204
JSON.sh
@ -1,204 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
throw () {
|
|
||||||
echo "$*" >&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
BRIEF=0
|
|
||||||
LEAFONLY=0
|
|
||||||
PRUNE=0
|
|
||||||
NO_HEAD=0
|
|
||||||
NORMALIZE_SOLIDUS=0
|
|
||||||
|
|
||||||
usage() {
|
|
||||||
echo
|
|
||||||
echo "Usage: JSON.sh [-b] [-l] [-p] [-s] [-h]"
|
|
||||||
echo
|
|
||||||
echo "-p - Prune empty. Exclude fields with empty values."
|
|
||||||
echo "-l - Leaf only. Only show leaf nodes, which stops data duplication."
|
|
||||||
echo "-b - Brief. Combines 'Leaf only' and 'Prune empty' options."
|
|
||||||
echo "-n - No-head. Do not show nodes that have no path (lines that start with [])."
|
|
||||||
echo "-s - Remove escaping of the solidus symbol (stright slash)."
|
|
||||||
echo "-h - This help text."
|
|
||||||
echo
|
|
||||||
}
|
|
||||||
|
|
||||||
parse_options() {
|
|
||||||
set -- "$@"
|
|
||||||
local ARGN=$#
|
|
||||||
while [ "$ARGN" -ne 0 ]
|
|
||||||
do
|
|
||||||
case $1 in
|
|
||||||
-h) usage
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
-b) BRIEF=1
|
|
||||||
LEAFONLY=1
|
|
||||||
PRUNE=1
|
|
||||||
;;
|
|
||||||
-l) LEAFONLY=1
|
|
||||||
;;
|
|
||||||
-p) PRUNE=1
|
|
||||||
;;
|
|
||||||
-n) NO_HEAD=1
|
|
||||||
;;
|
|
||||||
-s) NORMALIZE_SOLIDUS=1
|
|
||||||
;;
|
|
||||||
?*) echo "ERROR: Unknown option."
|
|
||||||
usage
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
shift 1
|
|
||||||
ARGN=$((ARGN-1))
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
awk_egrep () {
|
|
||||||
local pattern_string=$1
|
|
||||||
|
|
||||||
gawk '{
|
|
||||||
while ($0) {
|
|
||||||
start=match($0, pattern);
|
|
||||||
token=substr($0, start, RLENGTH);
|
|
||||||
print token;
|
|
||||||
$0=substr($0, start+RLENGTH);
|
|
||||||
}
|
|
||||||
}' pattern="$pattern_string"
|
|
||||||
}
|
|
||||||
|
|
||||||
tokenize () {
|
|
||||||
local GREP
|
|
||||||
local ESCAPE
|
|
||||||
local CHAR
|
|
||||||
|
|
||||||
if echo "test string" | egrep -ao --color=never "test" &>/dev/null
|
|
||||||
then
|
|
||||||
GREP='egrep -ao --color=never'
|
|
||||||
else
|
|
||||||
GREP='egrep -ao'
|
|
||||||
fi
|
|
||||||
|
|
||||||
if echo "test string" | egrep -o "test" &>/dev/null
|
|
||||||
then
|
|
||||||
ESCAPE='(\\[^u[:cntrl:]]|\\u[0-9a-fA-F]{4})'
|
|
||||||
CHAR='[^[:cntrl:]"\\]'
|
|
||||||
else
|
|
||||||
GREP=awk_egrep
|
|
||||||
ESCAPE='(\\\\[^u[:cntrl:]]|\\u[0-9a-fA-F]{4})'
|
|
||||||
CHAR='[^[:cntrl:]"\\\\]'
|
|
||||||
fi
|
|
||||||
|
|
||||||
local STRING="\"$CHAR*($ESCAPE$CHAR*)*\""
|
|
||||||
local NUMBER='-?(0|[1-9][0-9]*)([.][0-9]*)?([eE][+-]?[0-9]*)?'
|
|
||||||
local KEYWORD='null|false|true'
|
|
||||||
local SPACE='[[:space:]]+'
|
|
||||||
|
|
||||||
$GREP "$STRING|$NUMBER|$KEYWORD|$SPACE|." | egrep -v "^$SPACE$"
|
|
||||||
}
|
|
||||||
|
|
||||||
parse_array () {
|
|
||||||
local index=0
|
|
||||||
local ary=''
|
|
||||||
read -r token
|
|
||||||
case "$token" in
|
|
||||||
']') ;;
|
|
||||||
*)
|
|
||||||
while :
|
|
||||||
do
|
|
||||||
parse_value "$1" "$index"
|
|
||||||
index=$((index+1))
|
|
||||||
ary="$ary""$value"
|
|
||||||
read -r token
|
|
||||||
case "$token" in
|
|
||||||
']') break ;;
|
|
||||||
',') ary="$ary," ;;
|
|
||||||
*) throw "EXPECTED , or ] GOT ${token:-EOF}" ;;
|
|
||||||
esac
|
|
||||||
read -r token
|
|
||||||
done
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
[ "$BRIEF" -eq 0 ] && value=$(printf '[%s]' "$ary") || value=
|
|
||||||
:
|
|
||||||
}
|
|
||||||
|
|
||||||
parse_object () {
|
|
||||||
local key
|
|
||||||
local obj=''
|
|
||||||
read -r token
|
|
||||||
case "$token" in
|
|
||||||
'}') ;;
|
|
||||||
*)
|
|
||||||
while :
|
|
||||||
do
|
|
||||||
case "$token" in
|
|
||||||
'"'*'"') key=$token ;;
|
|
||||||
*) throw "EXPECTED string GOT ${token:-EOF}" ;;
|
|
||||||
esac
|
|
||||||
read -r token
|
|
||||||
case "$token" in
|
|
||||||
':') ;;
|
|
||||||
*) throw "EXPECTED : GOT ${token:-EOF}" ;;
|
|
||||||
esac
|
|
||||||
read -r token
|
|
||||||
parse_value "$1" "$key"
|
|
||||||
obj="$obj$key:$value"
|
|
||||||
read -r token
|
|
||||||
case "$token" in
|
|
||||||
'}') break ;;
|
|
||||||
',') obj="$obj," ;;
|
|
||||||
*) throw "EXPECTED , or } GOT ${token:-EOF}" ;;
|
|
||||||
esac
|
|
||||||
read -r token
|
|
||||||
done
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
[ "$BRIEF" -eq 0 ] && value=$(printf '{%s}' "$obj") || value=
|
|
||||||
:
|
|
||||||
}
|
|
||||||
|
|
||||||
parse_value () {
|
|
||||||
local jpath="${1:+$1,}$2" isleaf=0 isempty=0 print=0
|
|
||||||
case "$token" in
|
|
||||||
'{') parse_object "$jpath" ;;
|
|
||||||
'[') parse_array "$jpath" ;;
|
|
||||||
# At this point, the only valid single-character tokens are digits.
|
|
||||||
''|[!0-9]) throw "EXPECTED value GOT ${token:-EOF}" ;;
|
|
||||||
*) value=$token
|
|
||||||
# if asked, replace solidus ("\/") in json strings with normalized value: "/"
|
|
||||||
[ "$NORMALIZE_SOLIDUS" -eq 1 ] && value=${value//\\\//\/}
|
|
||||||
isleaf=1
|
|
||||||
[ "$value" = '""' ] && isempty=1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
[ "$value" = '' ] && return
|
|
||||||
[ "$NO_HEAD" -eq 1 ] && [ -z "$jpath" ] && return
|
|
||||||
|
|
||||||
[ "$LEAFONLY" -eq 0 ] && [ "$PRUNE" -eq 0 ] && print=1
|
|
||||||
[ "$LEAFONLY" -eq 1 ] && [ "$isleaf" -eq 1 ] && [ $PRUNE -eq 0 ] && print=1
|
|
||||||
[ "$LEAFONLY" -eq 0 ] && [ "$PRUNE" -eq 1 ] && [ "$isempty" -eq 0 ] && print=1
|
|
||||||
[ "$LEAFONLY" -eq 1 ] && [ "$isleaf" -eq 1 ] && \
|
|
||||||
[ $PRUNE -eq 1 ] && [ $isempty -eq 0 ] && print=1
|
|
||||||
[ "$print" -eq 1 ] && printf "[%s]\t%s\n" "$jpath" "$value"
|
|
||||||
:
|
|
||||||
}
|
|
||||||
|
|
||||||
parse () {
|
|
||||||
read -r token
|
|
||||||
parse_value
|
|
||||||
read -r token
|
|
||||||
case "$token" in
|
|
||||||
'') ;;
|
|
||||||
*) throw "EXPECTED EOF GOT $token" ;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
if ([ "$0" = "$BASH_SOURCE" ] || ! [ -n "$BASH_SOURCE" ]);
|
|
||||||
then
|
|
||||||
parse_options "$@"
|
|
||||||
tokenize | parse
|
|
||||||
fi
|
|
||||||
|
|
||||||
# vi: expandtab sw=2 ts=2
|
|
1
JSON.sh
Submodule
1
JSON.sh
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 2de457939e9b3fcf0d1e3f55b6072d060cb47a45
|
18
LICENSE
Normal file
18
LICENSE
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
This project is released to the public domain where applicable.
|
||||||
|
|
||||||
|
Otherwise, it is released under the terms of the WTFPLv2:
|
||||||
|
|
||||||
|
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||||
|
Version 2, December 2004
|
||||||
|
|
||||||
|
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
||||||
|
|
||||||
|
Everyone is permitted to copy and distribute verbatim or modified
|
||||||
|
copies of this license document, and changing it is allowed as long
|
||||||
|
as the name is changed.
|
||||||
|
|
||||||
|
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. You just DO WHAT THE FUCK YOU WANT TO.
|
||||||
|
|
@ -1,7 +1,11 @@
|
|||||||
#bashbot
|
#bashbot
|
||||||
A Telegram bot written in bash.
|
A Telegram bot written in bash.
|
||||||
|
|
||||||
Uses [json.sh](https://github.com/dominictarr/JSON.sh) and tmux (for interactive chats).
|
Depends on [tmux](http://github.com/tmux/tmux).
|
||||||
|
Uses [JSON.sh](http://github.com/dominictarr/JSON.sh).
|
||||||
|
|
||||||
|
Released to the public domain wherever applicable.
|
||||||
|
Elsewhere, consider it released under the [WTFPLv2](http://www.wtfpl.net/txt/copying/).
|
||||||
|
|
||||||
|
|
||||||
## Instructions
|
## Instructions
|
||||||
|
27
bashbot.sh
27
bashbot.sh
@ -1,16 +1,15 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# bashbot, the Telegram bot written in bash.
|
# bashbot, the Telegram bot written in bash.
|
||||||
# Written by @topkecleon, Juan Potato (@awkward_potato), Lorenzo Santina (BigNerd95) and Daniil Gentili (@danog)
|
# Written by Drew (@topkecleon) and Daniil Gentili (@danogentili).
|
||||||
|
# Also contributed: JuanPotato, BigNerd95, TiagoDanin, iicc1.
|
||||||
# https://github.com/topkecleon/telegram-bot-bash
|
# https://github.com/topkecleon/telegram-bot-bash
|
||||||
|
|
||||||
# Depends on ./JSON.sh (http://github.com/dominictarr/./JSON.sh),
|
# Depends on JSON.sh (http://github.com/dominictarr/JSON.sh) (MIT/Apache),
|
||||||
# which is MIT/Apache-licensed
|
# and on tmux (http://github.com/tmux/tmux) (BSD).
|
||||||
# And on tmux (https://github.com/tmux/tmux),
|
|
||||||
# which is BSD-licensed
|
|
||||||
|
|
||||||
|
|
||||||
# This file is public domain in the USA and all free countries.
|
# This file is public domain in the USA and all free countries.
|
||||||
# If you're in Europe, and public domain does not exist, then haha.
|
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
||||||
|
|
||||||
source commands.sh source
|
source commands.sh source
|
||||||
URL='https://api.telegram.org/bot'$TOKEN
|
URL='https://api.telegram.org/bot'$TOKEN
|
||||||
@ -30,7 +29,7 @@ ACTION_URL=$URL'/sendChatAction'
|
|||||||
FORWARD_URL=$URL'/forwardMessage'
|
FORWARD_URL=$URL'/forwardMessage'
|
||||||
INLINE_QUERY=$URL'/answerInlineQuery'
|
INLINE_QUERY=$URL'/answerInlineQuery'
|
||||||
ME_URL=$URL'/getMe'
|
ME_URL=$URL'/getMe'
|
||||||
ME=$(curl -s $ME_URL | ./JSON.sh -s | egrep '\["result","username"\]' | cut -f 2 | cut -d '"' -f 2)
|
ME=$(curl -s $ME_URL | ./JSON.sh/JSON.sh -s | egrep '\["result","username"\]' | cut -f 2 | cut -d '"' -f 2)
|
||||||
|
|
||||||
|
|
||||||
FILE_URL='https://api.telegram.org/file/bot'$TOKEN'/'
|
FILE_URL='https://api.telegram.org/file/bot'$TOKEN'/'
|
||||||
@ -185,7 +184,7 @@ send_keyboard() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get_file() {
|
get_file() {
|
||||||
[ "$1" != "" ] && echo $FILE_URL$(curl -s "$GET_URL" -F "file_id=$1" | ./JSON.sh -s | egrep '\["result","file_path"\]' | cut -f 2 | cut -d '"' -f 2)
|
[ "$1" != "" ] && echo $FILE_URL$(curl -s "$GET_URL" -F "file_id=$1" | ./JSON.sh/JSON.sh -s | egrep '\["result","file_path"\]' | cut -f 2 | cut -d '"' -f 2)
|
||||||
}
|
}
|
||||||
|
|
||||||
send_file() {
|
send_file() {
|
||||||
@ -321,7 +320,7 @@ process_client() {
|
|||||||
# 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
|
||||||
while [ "$1" == "startbot" ]; do {
|
while [ "$1" == "startbot" ]; do {
|
||||||
|
|
||||||
res=$(curl -s $UPD_URL$OFFSET | ./JSON.sh -s)
|
res=$(curl -s $UPD_URL$OFFSET | ./JSON.sh/JSON.sh -s)
|
||||||
|
|
||||||
# Offset
|
# Offset
|
||||||
OFFSET=$(echo "$res" | egrep '\["result",0,"update_id"\]' | cut -f 2)
|
OFFSET=$(echo "$res" | egrep '\["result",0,"update_id"\]' | cut -f 2)
|
||||||
@ -361,6 +360,12 @@ case "$1" in
|
|||||||
echo "Bot was killed successfully. "
|
echo "Bot was killed successfully. "
|
||||||
;;
|
;;
|
||||||
"help")
|
"help")
|
||||||
cat README.md
|
less README.md
|
||||||
|
;;
|
||||||
|
"attach")
|
||||||
|
tmux attach -t $ME
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Available arguments: outproc, count, broadcast, start, kill, help, attach"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
20
commands.sh
20
commands.sh
@ -1,6 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# Edit your commands in this file.
|
# Edit your commands in this file.
|
||||||
|
|
||||||
|
# This file is public domain in the USA and all free countries.
|
||||||
|
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
||||||
|
|
||||||
if [ "$1" = "source" ];then
|
if [ "$1" = "source" ];then
|
||||||
# Edit the token in here
|
# Edit the token in here
|
||||||
TOKEN='tokenhere'
|
TOKEN='tokenhere'
|
||||||
@ -53,16 +56,15 @@ else
|
|||||||
;;
|
;;
|
||||||
'/start')
|
'/start')
|
||||||
send_message "${USER[ID]}" "This is bashbot, the Telegram bot written entirely in bash.
|
send_message "${USER[ID]}" "This is bashbot, the Telegram bot written entirely in bash.
|
||||||
Features background tasks and interactive chats.
|
It features background tasks and interactive chats, and can serve as an interface for CLI programs.
|
||||||
Can serve as an interface for cli programs.
|
It currently can send, recieve and forward messages, custom keyboards, photos, audio, voice, documents, locations and video files.
|
||||||
Currently can send, recieve and forward messages, custom keyboards, photos, audio, voice, documents, locations and video files.
|
|
||||||
Available commands:
|
Available commands:
|
||||||
/start: Start bot and get this message.
|
• /start: Start bot and get this message.
|
||||||
/info: Get shorter info message about this bot.
|
• /info: Get shorter info message about this bot.
|
||||||
/question: Start interactive chat.
|
• /question: Start interactive chat.
|
||||||
/cancel: Cancel any currently running interactive chats.
|
• /cancel: Cancel any currently running interactive chats.
|
||||||
Written by @topkecleon, Juan Potato (@awkward_potato), Lorenzo Santina (BigNerd95) and Daniil Gentili (@danogentili)
|
Written by Drew (@topkecleon) and Daniil Gentili (@danogentili).
|
||||||
Contribute to the project: https://github.com/topkecleon/telegram-bot-bash
|
http://github.com/topkecleon/telegram-bot-bash
|
||||||
"
|
"
|
||||||
;;
|
;;
|
||||||
'/cancel')
|
'/cancel')
|
||||||
|
3
question
3
question
@ -1,5 +1,8 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
# This file is public domain in the USA and all free countries.
|
||||||
|
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
|
||||||
|
|
||||||
echo "Why hello there.
|
echo "Why hello there.
|
||||||
Would you like some tea (y/n)?"
|
Would you like some tea (y/n)?"
|
||||||
read answer
|
read answer
|
||||||
|
Loading…
Reference in New Issue
Block a user