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
|
import telebot
import os
import logging
import traceback
import sys
from telebot.async_telebot import AsyncTeleBot
from persistence import *
class CommandHandler:
async def handle(self, message: telebot.types.Message):
pass
class TelegramBot:
__bot: AsyncTeleBot
__user_repository: UserRepository
def __init__(self, user_repository: UserRepository):
self.__user_repository = user_repository
# Check token in environment variables
if "TELEBOT_BOT_TOKEN" not in os.environ:
raise AssertionError("Please configure TELEBOT_BOT_TOKEN as environment variables")
self.__bot = telebot.async_telebot.AsyncTeleBot(
token=os.environ["TELEBOT_BOT_TOKEN"],
exception_handler=ExceptionHandler())
async def run(self):
await self.__bot.polling(
non_stop=True,
timeout=100
)
def register_command_handler(self, command: str, command_handler: CommandHandler):
self.__bot.register_message_handler(
command_handler.handle,
commands=[ command ])
async def send_message_to_all(self, message_text: str):
for user in self.__user_repository.get_all_users():
try:
await self.__bot.send_message(
user[0],
message_text,
parse_mode='MarkdownV2'
)
except Exception as error:
if 'bot was kicked from the group chat' in str(error):
self.__user_repository.remove_chat(user[0])
async def reply(self, message, message_text):
await self.__bot.reply_to(
message,
message_text,
parse_mode='MarkdownV2')
class ExceptionHandler(telebot.ExceptionHandler):
def handle(self, exception):
logging.error('Exception happened: {}'.format(str(exception)))
print(traceback.format_exc())
sys.exit('Exiting with telebot exception')
return True
|