From cfa79cbbaf42a8f74a2cd4bca4d1d495b4d597f1 Mon Sep 17 00:00:00 2001 From: Dmitrii Morozov Date: Tue, 7 May 2024 16:50:38 +0200 Subject: Python code style --- fortnite_client.py | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100755 fortnite_client.py (limited to 'fortnite_client.py') diff --git a/fortnite_client.py b/fortnite_client.py new file mode 100755 index 0000000..16b2652 --- /dev/null +++ b/fortnite_client.py @@ -0,0 +1,108 @@ +#!/usr/bin/python3 + +import fortnitepy +import json +import os +import typing +from 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