-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbot.py
executable file
·154 lines (119 loc) · 3.83 KB
/
bot.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#!/usr/bin/env python3
"""Main bot file. It will communicate with Telegram API."""
import urllib
import json
import requests
import time
from dbhelper import DBHelper
from logger import Logger
__author__ = "S. Vahid Hosseini"
__copyright__ = "Copyright 2019, IOT Module Controller"
__credits__ = ["S. Vahid Hosseini"]
__license__ = "GPL-3.0"
__version__ = "0.1"
__maintainer__ = "S. Vahid Hosseini"
__email__ = "s.vahid.h@behmerd.ir"
__status__ = "Dev"
#global variables
TOKEN = "970592554:AAFMNLvMAShUMgjcw_XbKsN3ozI9psrEVAQ"
URL = "https://api.telegram.org/bot{}/".format(TOKEN)
database = DBHelper()
log = Logger()
#API handlers
def get_url(url):
response = requests.get(url)
content = response.content.decode("utf8")
return content
def get_json_from_url(url):
content = get_url(url)
js = json.loads(content)
return js
def get_updates(offset=None):
url = URL + "getUpdates?timeout=100"
if offset:
url += "&offset={}".format(offset)
js = get_json_from_url(url)
return js
def get_last_chat_id_and_text(updates):
num_updates = len(updates["result"])
last_update = num_updates -1
text = updates["result"][last_update]["message"]["text"]
chat_id = updates["result"][last_update]["message"]["chat"]["id"]
return (text, chat_id)
def send_message(text, chat_id, reply_markup=None):
text = urllib.parse.quote_plus(text)
url = URL + "sendMessage?text={}&chat_id={}&parse_mode=Markdown".format(text, chat_id)
if reply_markup:
url += "&reply_markup={}".format(reply_markup)
get_url(url)
def get_last_update_id(updates):
update_ids = []
for update in updates["result"]:
update_ids.append(int(update["update_id"]))
return max(update_ids)
def build_keyboard(items):
keyboard = [[item] for item in items]
reply_markup = {"keyboard":keyboard, "one_time_keyboard": True}
return json.dumps(reply_markup)
def handle_updates(updates):
for update in updates["result"]:
try:
text = update["message"]["text"]
chat = update["message"]["chat"]["id"]
user = update["message"]["from"]
args = {"sender":"main", "user":user["username"]}
log.out.info('update received: %s', text, extra=args)
if text.startswith("/"):
command = text.substing(1)
if command == "start":
start_bot(name, user, chat)
elif text.startswith("$"):
command = text.substing(1)
terminal(command, chat)
else:
pass
except KeyError:
pass
#internal commands
def terminal(command, chat):
response = "`"
if command in NA:
response += "'{}' is not supported!".format(command)
elif command in ROOT and login-check() == False:
response += "Unauthorized access! Please login first!"
else:
response += excecute(command)
response += "`"
send_message(response, chat)
def excecute(command):
try:
if command == "login":
args = command.split("=")
if args[1] in ACCOUNTS:
return "Insert your password:"
else:
return "Login failed!"
else:
pass
except Exception as e:
print(e)
return str(e)
def login(username):
send_message("**Login:**\n`Insert your password:`", chat)
#bot commands
def start_bot(name, user, chat):
send_message("IOT module controller.\nWelcome {}!".format(name), chat)
#login(chat)
#utils
#main
def main():
last_update_id = None
database.setup()
while True:
updates = get_updates(last_update_id)
if len(updates["result"]) > 0:
last_update_id = get_last_update_id(updates) + 1
handle_updates(updates)
time.sleep(0.5)
if __name__ == '__main__':
main()