From 70c2e0df67e76f755db292a5a817c31770267a70 Mon Sep 17 00:00:00 2001 From: Dmitrii Morozov Date: Wed, 10 Apr 2024 00:33:05 +0200 Subject: tmp --- FortniteEvents.py | 4 +-- FortniteStatusWrapper.py | 23 ++++++-------- tgbot.py | 82 +++++++++++++++++++++--------------------------- 3 files changed, 46 insertions(+), 63 deletions(-) diff --git a/FortniteEvents.py b/FortniteEvents.py index d8fac0d..6e7aa5e 100644 --- a/FortniteEvents.py +++ b/FortniteEvents.py @@ -20,7 +20,7 @@ class IncomingFriendRequest: await incoming_request.accept() class PresenceObserver: - def update(self, display_name: str, playing: bool) -> None: + async def update(self, display_name: str, playing: bool) -> None: pass class FriendPresence: @@ -31,4 +31,4 @@ class FriendPresence: print('FriendPresence changed for user {}, before {}, after {}'.format(after.friend.display_name, before.playing, after.playing)) for observer in observers: if isinstance(observer, PresenceObserver): - observer.update(after.friend.display_name, after.playing) + await observer.update(after.friend.display_name, after.playing) diff --git a/FortniteStatusWrapper.py b/FortniteStatusWrapper.py index 6a80348..aa7ee12 100644 --- a/FortniteStatusWrapper.py +++ b/FortniteStatusWrapper.py @@ -1,5 +1,5 @@ from telebot import formatting -import time, threading, schedule +import time from pythonFortniteStatus.FortniteStatus import * __polling_interval__ = 5 @@ -7,7 +7,7 @@ __polling_interval__ = 5 fortniteStatus = FortniteStatus() class Observer: - def update(self, fortniteStatus) -> None: + async def update(self, fortniteStatus) -> None: pass class FortniteStatusWrapper: @@ -15,26 +15,21 @@ class FortniteStatusWrapper: observers = [] fortniteStatus = None - def __init__(self): - schedule.every(__polling_interval__).seconds.do(self.__readStatus) - threading.Thread(target=self.__scheduleHandler, name='fortnite_status_scheduler', daemon=True).start() - self.fortniteStatus = fortniteStatus.getStatus() - - def __scheduleHandler(self): + async def run(self): while True: - schedule.run_pending() - time.sleep(1) + await self.__readStatus() + time.sleep(__polling_interval__) - def __readStatus(self): + async def __readStatus(self): serviceStatusTmp = fortniteStatus.getStatus() if serviceStatusTmp != self.fortniteStatus: - self.notify(serviceStatusTmp) + await self.__notify(serviceStatusTmp) self.fortniteStatus = serviceStatusTmp - def notify(self, fortniteStatus): + async def __notify(self, fortniteStatus): print("Fortnite status changed, notifying observers") for observer in self.observers: - observer.update(fortniteStatus) + await observer.update(fortniteStatus) def attach(self, observer: Observer): self.observers.append(observer) \ No newline at end of file diff --git a/tgbot.py b/tgbot.py index c8561cd..38b1789 100755 --- a/tgbot.py +++ b/tgbot.py @@ -24,21 +24,15 @@ fortniteClient = FortniteClient() @bot.message_handler(commands = ['start']) async def startCommand(message): userRepository.putUser(message.chat.id) - await bot.reply_to(message, "This chat successfully registered to receive Fortnite updates!") + await reply(message, 'This chat successfully registered to receive Fortnite updates') @bot.message_handler(commands = ['status']) async def getStatus(message): - await bot.reply_to( - message, - formatFortniteStatus(fortniteStatus.getStatus()), - parse_mode='MarkdownV2') + await reply(message, formatFortniteStatus(fortniteStatus.getStatus())) @bot.message_handler(commands = ['friends']) async def getFriends(message): - await bot.reply_to( - message, - formatFriends(fortniteClient.get_friends()), - parse_mode='MarkdownV2') + await reply(message, formatFriends(fortniteClient.get_friends())) @bot.message_handler(commands = ['find']) async def findUser(message): @@ -49,15 +43,9 @@ async def findUser(message): users: typing.List[fortnitepy.User] = await fortniteClient.fetch_users_by_display_name(search_user_display_name) for user in users: stats = await user.fetch_br_stats() - await bot.reply_to( - message, - formatUser(user, stats), - parse_mode='MarkdownV2') + await reply(message, formatUser(user, stats)) else: - await bot.reply_to( - message, - 'Usage: /find username', - parse_mode='MarkdownV2') + await reply(message, 'Usage: /find username') @bot.message_handler(commands = ['add']) async def addUser(message): @@ -66,35 +54,24 @@ async def addUser(message): user_id = arg[1] print('Adding user with ID as friend {}'.format(user_id)) await fortniteClient.add_friend(user_id) - await bot.reply_to( - message, - 'Send friend request successfully', - parse_mode='MarkdownV2') + await reply(message, 'Send friend request successfully') else: - await bot.reply_to( - message, - 'Usage: /add username', - parse_mode='MarkdownV2') + await reply(message, 'Usage: /add username') class FortniteStatusObserver(Observer): - def update(self, fortniteStatus) -> None: - for user in userRepository.getAllUsers(): - bot.send_message( - user[0], - formatFortniteStatus(fortniteStatus), - parse_mode='MarkdownV2' - ) + async def update(self, fortniteStatus) -> None: + await send_message_to_all(formatFortniteStatus(fortniteStatus)) class FortnitePresenceObserver(PresenceObserver): # Map name -> last seen not playing timestamp seconds statuses = {} - def update(self, display_name: str, playing: bool) -> None: + async def update(self, display_name: str, playing: bool) -> None: print('FortnitePresenceObserver: {} playing = {}'.format(display_name, playing)) if playing: if not display_name in self.statuses: - self.__notifyFriendPlaying(display_name) + await self.__notifyFriendPlaying(display_name) self.statuses[display_name] = time.time() else: diff = time.time() - self.statuses[display_name] @@ -103,18 +80,24 @@ class FortnitePresenceObserver(PresenceObserver): else: self.statuses[display_name] = time.time() - def __notifyFriendPlaying(self, display_name: str): - for user in userRepository.getAllUsers(): - bot.send_message( - user[0], - '{} is online'.format(display_name), - parse_mode='MarkdownV2' - ) + async def __notifyFriendPlaying(self, display_name: str): + await send_message_to_all('{} is online'.format(display_name)) -async def run_bot(): - await bot.polling() +async def send_message_to_all(message_text: str): + for user in userRepository.getAllUsers(): + await bot.send_message( + user[0], + message_text, + parse_mode='MarkdownV2' + ) -async def run_client(): +async def reply(message, message_text): + await bot.reply_to( + message, + message_text, + parse_mode='MarkdownV2') + +async def run_fortnite_client(): await fortniteClient.run() if __name__ == '__main__': @@ -122,6 +105,11 @@ if __name__ == '__main__': fortniteClient.attach(FortnitePresenceObserver()) loop = asyncio.get_event_loop() - loop.create_task(bot.polling()) - loop.create_task(fortniteClient.run()) - loop.run_forever() \ No newline at end of file + + tasks = [ + loop.create_task(bot.polling()), + loop.create_task(fortniteStatusWrapper.run()), + loop.create_task(run_fortnite_client()) + ] + loop.run_until_complete(asyncio.wait(tasks)) + loop.close() \ No newline at end of file -- cgit v1.2.3