1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
#!/usr/bin/python3
import fortnitepy
import json
import os
import typing
from DeviceAuth import DeviceAuth
from 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, fortniteClient) -> None:
pass
class FortniteClient(fortnitepy.Client):
__device_auth: DeviceAuth
__friendPresenceObserver: FriendPresenceObserver
__clientInitObserver: ClientInitObserver
def __init__(self, clientInitObserver: ClientInitObserver, friendPresenceObserver: FriendPresenceObserver):
self.__device_auth = DeviceAuth()
self.__clientInitObserver = clientInitObserver
self.__friendPresenceObserver = friendPresenceObserver
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.__clientInitObserver.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.__friendPresenceObserver)
class FriendPresenceEvent:
async def on_event(before, after: fortnitepy.Presence, friendPresenceObserver: 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 friendPresenceObserver.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()
|