summaryrefslogtreecommitdiff
path: root/telegram_bot/__init__.py
blob: 5e3d45598cee7ca6e3dcf8bde17d0ce9c1a76e1c (plain)
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
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"])
    
    async def run(self):
        await self.__bot.polling(
            non_stop=True,
            timeout=500
        ) 
    
    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')