summaryrefslogtreecommitdiff
path: root/fortnite_client
diff options
context:
space:
mode:
authorDmitrii Morozov <snoopdesigns@gmail.com>2024-05-07 18:35:51 +0200
committerDmitrii Morozov <snoopdesigns@gmail.com>2024-05-07 18:35:51 +0200
commit435c13fe93d5da72b1d4d3ff927b07c76eff01f6 (patch)
tree729c3dbbdc716e82e388f575b2ddf7a9237faa10 /fortnite_client
parent4a7ebc16bc3a7ac6343aafe7d6938dd136e262aa (diff)
Reject new friend if public stats are not enabled
Diffstat (limited to 'fortnite_client')
-rw-r--r--fortnite_client/__init__.py33
-rw-r--r--fortnite_client/fortnite_events.py19
2 files changed, 47 insertions, 5 deletions
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