summaryrefslogtreecommitdiff
path: root/telegram_bot
diff options
context:
space:
mode:
Diffstat (limited to 'telegram_bot')
-rw-r--r--telegram_bot/__init__.py59
-rw-r--r--telegram_bot/commands.py94
2 files changed, 153 insertions, 0 deletions
diff --git a/telegram_bot/__init__.py b/telegram_bot/__init__.py
new file mode 100644
index 0000000..ab9f61d
--- /dev/null
+++ b/telegram_bot/__init__.py
@@ -0,0 +1,59 @@
+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()
+
+ 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 \ No newline at end of file
diff --git a/telegram_bot/commands.py b/telegram_bot/commands.py
new file mode 100644
index 0000000..cafde03
--- /dev/null
+++ b/telegram_bot/commands.py
@@ -0,0 +1,94 @@
+import telebot
+from telegram_bot import *
+from formatter import *
+from persistence import *
+from fortnite_client import *
+from fortnite_status import *
+
+class StartCommand(CommandHandler):
+
+ __telegram_bot: TelegramBot
+ __user_repository: UserRepository
+
+ def __init__(self, telegram_bot: TelegramBot, user_repository: UserRepository):
+ self.__telegram_bot = telegram_bot
+ self.__user_repository = user_repository
+
+ async def handle(self, message: telebot.types.Message):
+ if message.chat.type == 'private':
+ alias = message.chat.username
+ else:
+ alias = message.chat.title
+ self.__user_repository.put_user(message.chat.id, alias)
+ await self.__telegram_bot.reply(message, 'This chat successfully registered to receive Fortnite updates')
+
+class GetStatusCommand(CommandHandler):
+
+ __telegram_bot: TelegramBot
+ __fortnite_status: FortniteStatus
+
+ def __init__(self, telegram_bot: TelegramBot):
+ self.__telegram_bot = telegram_bot
+ self.__fortnite_status = FortniteStatus()
+
+ async def handle(self, message: telebot.types.Message):
+ await self.__telegram_bot.reply(message, format_fortnite_status(self.__fortnite_status.getStatus()))
+
+class GetFriendsCommand(CommandHandler):
+
+ __telegram_bot: TelegramBot
+ __fortnite_client: FortniteClient
+
+ def __init__(self, telegram_bot: TelegramBot, fortnite_client: FortniteClient):
+ self.__telegram_bot = telegram_bot
+ self.__fortnite_client = fortnite_client
+
+ async def handle(self, message: telebot.types.Message):
+ friends = await self.__fortnite_client.get_friends()
+ await self.__telegram_bot.reply(message, format_users(friends))
+
+
+class GetStatsCommand(CommandHandler):
+
+ __telegram_bot: TelegramBot
+ __fortnite_client: FortniteClient
+
+ def __init__(self, telegram_bot: TelegramBot, fortnite_client: FortniteClient):
+ self.__telegram_bot = telegram_bot
+ self.__fortnite_client = fortnite_client
+
+ async def handle(self, message: telebot.types.Message):
+ friends = await self.__fortnite_client.get_friends()
+ stats = [await friend.fetch_stats() for friend in friends]
+ await self.__telegram_bot.reply(message, format_user_stats_list(stats))
+
+class GetTodayStatsCommand(CommandHandler):
+
+ __telegram_bot: TelegramBot
+ __fortnite_client: FortniteClient
+ __stats_repository: StatsRepository
+
+ def __init__(self, telegram_bot: TelegramBot, fortnite_client: FortniteClient, stats_repository: StatsRepository):
+ self.__telegram_bot = telegram_bot
+ self.__fortnite_client = fortnite_client
+ self.__stats_repository = stats_repository
+
+ async def handle(self, message: telebot.types.Message):
+ persisted_stats = self.__stats_repository.get_stats()
+ friends = await self.__fortnite_client.get_friends()
+ current_stats = [await friend.fetch_stats() for friend in friends]
+ await self.__telegram_bot.reply(message, format_user_stats_difference(persisted_stats, current_stats))
+
+class RecordStatsCommand(CommandHandler):
+
+ __fortnite_client: FortniteClient
+ __stats_repository: StatsRepository
+
+ def __init__(self, fortnite_client: FortniteClient, stats_repository: StatsRepository):
+ self.__fortnite_client = fortnite_client
+ self.__stats_repository = stats_repository
+
+ async def handle(self, message: telebot.types.Message):
+ friends = await self.__fortnite_client.get_friends()
+ for friend in friends:
+ await self.__stats_repository.put_stats(friend) \ No newline at end of file