From 08cd4e0b8e6473dcf8dc18915b00aafc86f13215 Mon Sep 17 00:00:00 2001 From: Dmitrii Morozov Date: Wed, 10 Apr 2024 20:52:53 +0200 Subject: Fix notifications plus minor improvements --- Formatter.py | 17 ++++++++++++----- FortniteEvents.py | 15 ++++++++++----- FortniteStatusNotifier.py | 3 ++- tgbot.py | 11 +++++------ 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/Formatter.py b/Formatter.py index b87735b..5cd065d 100644 --- a/Formatter.py +++ b/Formatter.py @@ -36,28 +36,35 @@ async def __formatFriend(friend: fortnitepy.Friend): # User async def formatUser(user: fortnitepy.User): stats = await user.fetch_br_stats() + bp_level: float = await user.fetch_battlepass_level(season=29) combined_stats = stats.get_combined_stats() if 'keyboardmouse' in combined_stats: - return __formatUserDevice(user, combined_stats['keyboardmouse']) + return __formatUserDevice(user, combined_stats['keyboardmouse'], bp_level) else: - return __formatUserDevice(user, combined_stats['gamepad']) + return __formatUserDevice(user, combined_stats['gamepad'], bp_level) -def __formatUserDevice(user: fortnitepy.User, device_stats: dict): +def __formatUserDevice(user: fortnitepy.User, device_stats: dict, bp_level: float): return formatting.format_text( formatting.mbold("User: ") + user.display_name, formatting.mbold("External auth: ") + ', '.join([__formatExternalAuth(external_auth) for external_auth in user.external_auths]), formatting.mbold("ID: ") + user.id, + formatting.mbold("Level: ") + str(int(bp_level//1)), formatting.mbold("Matches played: ") + str(device_stats['matchesplayed']), formatting.mbold("Total kills: ") + str(device_stats['kills']), formatting.mbold("Wins: ") + str(device_stats['wins']), separator='\n') + def __formatExternalAuth(external_auth: fortnitepy.ExternalAuth): return '{} \({}\)'.format(external_auth.external_display_name, external_auth.type) -def formatFriendOnline(display_name: str): +def formatFriendOnline(display_name: str, party_size: int): + if party_size > 1: + text = 'is playing Fortnite with {} friends\!'.format(str(party_size - 1)) + else: + text = 'is playing Fortnite\!' return formatting.format_text( u'\u2b50', formatting.mbold('{}'.format(display_name)), - 'is playing Fortnite\!', + text, u'\u2b50', separator=' ') \ No newline at end of file diff --git a/FortniteEvents.py b/FortniteEvents.py index 5be03f2..b5ae91c 100644 --- a/FortniteEvents.py +++ b/FortniteEvents.py @@ -9,14 +9,19 @@ class IncomingFriendRequest: await incoming_request.accept() class PresenceObserver: - async def update(self, display_name: str, playing: bool) -> None: + async def update(self, display_name: str, playing: bool, party_size: int) -> None: pass class FriendPresence: - async def on_event(before, after: fortnitepy.Presence, observers): + async def on_event(before, after: fortnitepy.Presence, observer: PresenceObserver): if before is not None and after is not None: if before.playing != after.playing: print('FriendPresence changed for user {}, before {}, after {}'.format(after.friend.display_name, before.playing, after.playing)) - for observer in observers: - if isinstance(observer, PresenceObserver): - await observer.update(after.friend.display_name, after.playing) + party_size: int = 0 + if after.has_properties: + party: fortnitepy.PresenceParty = after.party + party_size = int(party.playercount) + await observer.update( + after.friend.display_name, + after.playing, + party_size) diff --git a/FortniteStatusNotifier.py b/FortniteStatusNotifier.py index 1c40ec0..81c7d12 100644 --- a/FortniteStatusNotifier.py +++ b/FortniteStatusNotifier.py @@ -3,7 +3,8 @@ import time import asyncio from pythonFortniteStatus.FortniteStatus import * -__polling_interval__ = 5 +# Polling interval in seconds +__polling_interval__ = 5 * 60 # 5 minutes fortniteStatus = FortniteStatus() diff --git a/tgbot.py b/tgbot.py index 5422cb6..539a1c5 100755 --- a/tgbot.py +++ b/tgbot.py @@ -19,21 +19,20 @@ class FortnitePresenceObserver(PresenceObserver): # Map name -> last seen not playing timestamp seconds statuses = {} - async def update(self, display_name: str, playing: bool) -> None: - print('FortnitePresenceObserver: {} playing = {}'.format(display_name, playing)) + async def update(self, display_name: str, playing: bool, party_size: int) -> None: if playing: if not display_name in self.statuses: - await self.__notifyFriendPlaying(display_name) + await self.__notifyFriendPlaying(display_name, party_size) self.statuses[display_name] = time.time() else: diff = time.time() - self.statuses[display_name] if diff > 60 * 60: # 60 minutes - self.__notifyFriendPlaying(display_name) + self.__notifyFriendPlaying(display_name, party_size) else: self.statuses[display_name] = time.time() - async def __notifyFriendPlaying(self, display_name: str): - await send_message_to_all(formatFriendOnline(display_name)) + async def __notifyFriendPlaying(self, display_name: str, party_size: int): + await send_message_to_all(formatFriendOnline(display_name, party_size)) bot = telebot.async_telebot.AsyncTeleBot(os.environ["TELEBOT_BOT_TOKEN"]) userRepository = UserRepository('db.sqlite') -- cgit v1.2.3