This repository has been archived by the owner on Aug 15, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathbot.py
122 lines (95 loc) · 4.23 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
import logging
import traceback
from telegram import ParseMode, TelegramError
from telegram.ext import CommandHandler, Dispatcher, Updater
from model import init_database
from modules.admin import Admin
from modules.block_stickerpack import BlockStickerpack
from modules.forward import Forward
from modules.kto_zloy import KtoZloy
from modules.pay_respect import pay_respect
from modules.reactions import Reactions
from modules.reply_to_pin import ReplyToPin
from modules.resolve import resolve
from modules.statistic import Statistic
from modules.user_join_captcha import UserJoinCaptcha
from settings import ADMIN_ID, CHAT_ID, ENV, PORT, TOKEN, URL
from settings import USER_JOIN_CAPTCHA_ENABLED
def process_update(obj, update):
if isinstance(update, TelegramError):
obj.dispatch_error(None, update)
else:
for group in obj.groups:
for handler in obj.handlers[group]:
try:
if handler.check_update(update):
handler.handle_update(update, obj)
except Exception as e:
try:
obj.dispatch_error(update, e)
except Exception:
obj.logger.exception(
'An uncaught error was raised while '
'handling the error')
class Bot:
def __init__(self):
Dispatcher.process_update = process_update
self._updater = Updater(TOKEN)
init_database()
self._init_handlers()
log_format = '%(asctime)s - %(levelname)s - %(name)s - %(message)s'
logging.basicConfig(format=log_format, level=logging.WARNING)
def run(self):
if ENV == "prod":
self._updater.start_webhook(listen='0.0.0.0', port=PORT,
url_path=TOKEN)
self._updater.bot.set_webhook(URL + TOKEN)
self._updater.idle()
else:
self._updater.start_polling(poll_interval=1)
def _init_handlers(self):
statistic = Statistic(CHAT_ID, ADMIN_ID)
statistic.add_handlers(self._updater.dispatcher.add_handler)
forward = Forward(CHAT_ID, ADMIN_ID)
forward.add_handlers(self._updater.dispatcher.add_handler)
kto_zloy = KtoZloy(CHAT_ID, ADMIN_ID)
kto_zloy.add_handlers(self._updater.dispatcher.add_handler)
self._updater.dispatcher.add_handler(
CommandHandler('resolve', resolve, pass_args=True))
self._updater.dispatcher.add_handler(
CommandHandler('r', resolve, pass_args=True))
self._updater.dispatcher.add_handler(
CommandHandler('f', pay_respect))
admin = Admin(CHAT_ID, ADMIN_ID)
admin.add_handlers(self._updater.dispatcher.add_handler)
reactions = Reactions(CHAT_ID)
reactions.add_handlers(self._updater.dispatcher.add_handler)
block_stickerpack = BlockStickerpack(CHAT_ID, ADMIN_ID)
block_stickerpack.add_handlers(self._updater.dispatcher.add_handler)
reply_to_pin = ReplyToPin(CHAT_ID, ADMIN_ID)
reply_to_pin.add_handlers(self._updater.dispatcher.add_handler)
if USER_JOIN_CAPTCHA_ENABLED:
user_join_captcha = UserJoinCaptcha(CHAT_ID, ADMIN_ID)
user_join_captcha.add_handlers(self._updater.dispatcher.add_handler)
self._updater.dispatcher.add_error_handler(self._error)
def _error(self, bot, update, error):
def parse_dict(dictionary, level):
text = []
for key in dictionary.keys():
value = dictionary[key]
if not value:
continue
if isinstance(value, dict):
value = parse_dict(value, level + 1)
text.append('\t' * level + '{0}: {1}'.format(key, value))
return '\n' + '\n'.join(text)
if not update:
return
text = parse_dict(update.to_dict(),
1) + '\n\n' + traceback.format_exc()
logging.warning(text)
bot.send_message(chat_id=ADMIN_ID, text='```' + text + '```',
parse_mode=ParseMode.MARKDOWN)
if __name__ == '__main__':
bot = Bot()
bot.run()