From 435c13fe93d5da72b1d4d3ff927b07c76eff01f6 Mon Sep 17 00:00:00 2001 From: Dmitrii Morozov Date: Tue, 7 May 2024 18:35:51 +0200 Subject: Reject new friend if public stats are not enabled --- fortnite_client/__init__.py | 33 +++++++++++++++++++++++++++++---- fortnite_client/fortnite_events.py | 19 ++++++++++++++++++- 2 files changed, 47 insertions(+), 5 deletions(-) (limited to 'fortnite_client') diff --git a/fortnite_client/__init__.py b/fortnite_client/__init__.py index bac4e5d..28cbf80 100644 --- a/fortnite_client/__init__.py +++ b/fortnite_client/__init__.py @@ -2,6 +2,7 @@ import fortnitepy import json import os import typing +import traceback from fortnite_client.device_auth import DeviceAuth from app_types import * @@ -16,16 +17,25 @@ class ClientInitObserver: async def on_event(self, fortnite_client) -> None: pass +class NewFriendObserver: + async def on_event(self, friend: User) -> None: + pass + + async def on_failure(self, display_name) -> None: + pass + class FortniteClient(fortnitepy.Client): __device_auth: DeviceAuth __friend_presence_observer: FriendPresenceObserver __client_init_observer: ClientInitObserver + __new_friend_observer: NewFriendObserver - def __init__(self, client_init_observer: ClientInitObserver, friend_presence_observer: FriendPresenceObserver): + def __init__(self, client_init_observer: ClientInitObserver, friend_presence_observer: FriendPresenceObserver, new_friend_observer: NewFriendObserver): self.__device_auth = DeviceAuth() self.__client_init_observer = client_init_observer self.__friend_presence_observer = friend_presence_observer + self.__new_friend_observer = new_friend_observer if self.__device_auth.device_auth_file_exists(): self.__auth_device_auth() else: @@ -78,7 +88,7 @@ class FortniteClient(fortnitepy.Client): await self.__client_init_observer.on_event(self) async def event_friend_request(self, request: typing.Union[fortnitepy.friend.IncomingPendingFriend, fortnitepy.friend.OutgoingPendingFriend]): - await IncomingFriendRequestEvent.on_event(request) + await IncomingFriendRequestEvent.on_event(request, self.__new_friend_observer) async def event_friend_presence(self, before, after: fortnitepy.Presence): await FriendPresenceEvent.on_event(before, after, self.__friend_presence_observer) @@ -99,8 +109,23 @@ class FriendPresenceEvent: party_size) class IncomingFriendRequestEvent: - async def on_event(request: typing.Union[fortnitepy.friend.IncomingPendingFriend, fortnitepy.friend.OutgoingPendingFriend]): + async def on_event(request: typing.Union[fortnitepy.friend.IncomingPendingFriend, fortnitepy.friend.OutgoingPendingFriend], new_friend_observer: NewFriendObserver): if isinstance(request, fortnitepy.friend.IncomingPendingFriend): incoming_request = typing.cast(fortnitepy.friend.IncomingPendingFriend, request) + print('Accepting friend request from {}'.format(incoming_request.display_name)) - #await incoming_request.accept() \ No newline at end of file + await incoming_request.accept() + accepted_friend = incoming_request.client.get_friend(request._id) + + # Try fetch stats + try: + await IncomingFriendRequestEvent.__try_get_stats(accepted_friend) + await new_friend_observer.on_event(User.from_fortnite_friend(accepted_friend)) + except: + print("An exception occurred while fetching user stats") + print(traceback.format_exc()) + await accepted_friend.remove() + await new_friend_observer.on_failure(accepted_friend.display_name) + + async def __try_get_stats(friend: fortnitepy.Friend): + await friend.fetch_br_stats() \ No newline at end of file diff --git a/fortnite_client/fortnite_events.py b/fortnite_client/fortnite_events.py index 2d252ad..d4fb2d0 100644 --- a/fortnite_client/fortnite_events.py +++ b/fortnite_client/fortnite_events.py @@ -32,4 +32,21 @@ class FriendPresenceObserverImpl(FriendPresenceObserver): self.__presence_repository.set_last_user_presence(display_name, time.time()) async def __notify_friend_playing(self, display_name: str, party_size: int): - await self.__telegram_bot.send_message_to_all(format_friend_online(display_name, party_size)) \ No newline at end of file + await self.__telegram_bot.send_message_to_all(format_friend_online(display_name, party_size)) + +class NewFriendObserverImpl(NewFriendObserver): + + __telegram_bot: TelegramBot + __stats_repository: StatsRepository + + def __init__(self, telegram_bot: TelegramBot, stats_repository: StatsRepository): + self.__telegram_bot = telegram_bot + self.__stats_repository = stats_repository + + async def on_event(self, friend: User) -> None: + print('Record new friend stats') + await self.__stats_repository.put_stats(friend) + await self.__telegram_bot.send_message_to_all(format_new_friend(friend.display_name)) + + async def on_failure(self, display_name) -> None: + await self.__telegram_bot.send_message_to_all(format_failed_new_friend(display_name)) \ No newline at end of file -- cgit v1.2.3