From ee3e87a6ec19878d56e8f386b20c58e4d9b211b3 Mon Sep 17 00:00:00 2001 From: Dmitrii Morozov Date: Tue, 7 May 2024 17:15:25 +0200 Subject: Modules --- fortnite_client/__init__.py | 106 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 fortnite_client/__init__.py (limited to 'fortnite_client/__init__.py') diff --git a/fortnite_client/__init__.py b/fortnite_client/__init__.py new file mode 100644 index 0000000..bac4e5d --- /dev/null +++ b/fortnite_client/__init__.py @@ -0,0 +1,106 @@ +import fortnitepy +import json +import os +import typing +from fortnite_client.device_auth import DeviceAuth +from app_types import * + +__fortnite_account_key__ = 'fornite-account-key' + +# Intefaces for events +class FriendPresenceObserver: + async def update(self, display_name: str, playing: bool, party_size: int) -> None: + pass + +class ClientInitObserver: + async def on_event(self, fortnite_client) -> None: + pass + +class FortniteClient(fortnitepy.Client): + + __device_auth: DeviceAuth + __friend_presence_observer: FriendPresenceObserver + __client_init_observer: ClientInitObserver + + def __init__(self, client_init_observer: ClientInitObserver, friend_presence_observer: FriendPresenceObserver): + self.__device_auth = DeviceAuth() + self.__client_init_observer = client_init_observer + self.__friend_presence_observer = friend_presence_observer + if self.__device_auth.device_auth_file_exists(): + self.__auth_device_auth() + else: + self.__auth_authorization_code() + + async def get_friends(self) -> typing.List[User]: + return [User.from_fortnite_friend(friend) for friend in self.friends] + + async def find_user(self, display_name: str): + user: fortnitepy.User = await self.fetch_user_by_display_name(display_name) + return User.from_fortnite_friend(user) + + def __auth_authorization_code(self): + code = input("Enter authorization code (https://www.epicgames.com/id/api/redirect?clientId=3446cd72694c4a4485d81b77adbb2141&responseType=code):") + super().__init__( + auth=fortnitepy.AuthorizationCodeAuth( + code = code + ) + ) + + def __auth_device_auth(self): + device_auth_details = self.__device_auth.get_device_auth_details().get(__fortnite_account_key__, {}) + super().__init__( + auth=fortnitepy.DeviceAuth( + **device_auth_details + ) + ) + + # Generate auth details if none were supplied yet + async def __generate_auth_details(self): + if not self.__device_auth.device_auth_file_exists(): + device_auth_data = await self.auth.generate_device_auth() + details = { + 'device_id': device_auth_data['deviceId'], + 'account_id': device_auth_data['accountId'], + 'secret': device_auth_data['secret'], + } + self.auth.__dict__.update(details) + self.dispatch_event( + 'device_auth_generate', + details, + __fortnite_account_key__ + ) + + async def event_device_auth_generate(self, details, email): + self.__device_auth.store_device_auth_details(email, details) + + async def event_ready(self): + await self.__generate_auth_details() + 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) + + async def event_friend_presence(self, before, after: fortnitepy.Presence): + await FriendPresenceEvent.on_event(before, after, self.__friend_presence_observer) + +class FriendPresenceEvent: + async def on_event(before, after: fortnitepy.Presence, friend_presence_observer: FriendPresenceObserver): + 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)) + party_size: int = 1 + if after.has_properties: + party: fortnitepy.PresenceParty = after.party + if party is not None and party.playercount is not None: + party_size = int(party.playercount) + await friend_presence_observer.update( + after.friend.display_name, + after.playing, + party_size) + +class IncomingFriendRequestEvent: + async def on_event(request: typing.Union[fortnitepy.friend.IncomingPendingFriend, fortnitepy.friend.OutgoingPendingFriend]): + 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 -- cgit v1.2.3