diff options
author | Dmitrii Morozov <snoopdesigns@gmail.com> | 2024-04-10 00:33:05 +0200 |
---|---|---|
committer | Dmitrii Morozov <snoopdesigns@gmail.com> | 2024-04-10 00:33:05 +0200 |
commit | 70c2e0df67e76f755db292a5a817c31770267a70 (patch) | |
tree | fd229743f3a51ba366ab678a6f3c94516f4757ea | |
parent | 750d65f4c7102d824cd842d64e4b9c2ca119f65f (diff) |
tmp
-rw-r--r-- | FortniteEvents.py | 4 | ||||
-rw-r--r-- | FortniteStatusWrapper.py | 23 | ||||
-rwxr-xr-x | 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 @@ -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 |