diff options
Diffstat (limited to 'fortnite_client')
| -rw-r--r-- | fortnite_client/__init__.py | 38 | ||||
| -rw-r--r-- | fortnite_client/fortnite_events.py | 64 | 
2 files changed, 75 insertions, 27 deletions
| diff --git a/fortnite_client/__init__.py b/fortnite_client/__init__.py index d44fee4..113f3d6 100644 --- a/fortnite_client/__init__.py +++ b/fortnite_client/__init__.py @@ -22,9 +22,10 @@ class ClientInitObserver:          pass  class NewFriendObserver: -    async def on_event(self, friend: User) -> None: +    async def on_new_friend_request(self, request_id: str, display_name: str, fortnite_client: any) -> None: +        pass +    async def on_friend_added(self, friend: User) -> None:          pass -      async def on_unavailable_public_stats(self, display_name) -> None:          pass @@ -121,28 +122,17 @@ class FriendPresenceEvent:  class IncomingFriendRequestEvent:      async def on_event(request: typing.Union[fortnitepy.friend.IncomingPendingFriend, fortnitepy.friend.OutgoingPendingFriend], new_friend_observer: NewFriendObserver): -        print('Do nothing on incoming friend request..') -        #if isinstance(request, fortnitepy.friend.IncomingPendingFriend): -            #incoming_request = typing.cast(fortnitepy.friend.IncomingPendingFriend, request) -            #await incoming_request.accept() -            #accepted_friend = incoming_request.client.get_friend(request._id) -         -        #if isinstance(request, fortnitepy.friend.OutgoingPendingFriend): -            #outgoing_request = typing.cast(fortnitepy.friend.OutgoingPendingFriend, request) -            #accepted_friend = outgoing_request.client.get_friend(request._id) +        if isinstance(request, fortnitepy.friend.IncomingPendingFriend): +            incoming_request = typing.cast(fortnitepy.friend.IncomingPendingFriend, request) +            await IncomingFriendRequestEvent.__handle_friend_request(incoming_request, new_friend_observer) -        #await IncomingFriendRequestEvent.__handle_new_friend(accepted_friend, new_friend_observer) +        if isinstance(request, fortnitepy.friend.OutgoingPendingFriend): +            outgoing_request = typing.cast(fortnitepy.friend.OutgoingPendingFriend, request) +            accepted_friend = outgoing_request.client.get_friend(request._id) +            await IncomingFriendRequestEvent.__handle_new_friend(accepted_friend, new_friend_observer) -    async def __handle_new_friend(accepted_friend: fortnitepy.friend.Friend, new_friend_observer: NewFriendObserver): -        # Try fetch stats -        try: -            await IncomingFriendRequestEvent.__try_get_stats(accepted_friend) -        except: -            print(traceback.format_exc()) -            await new_friend_observer.on_unavailable_public_stats(accepted_friend.display_name) - -        # Register new fried, fetch stats -        await new_friend_observer.on_event(User.from_fortnite_friend(accepted_friend)) +    async def __handle_friend_request(request: fortnitepy.friend.IncomingPendingFriend, new_friend_observer: NewFriendObserver): +        await new_friend_observer.on_new_friend_request(request._id, request.display_name, request.client)     -    async def __try_get_stats(friend: fortnitepy.Friend): -        await friend.fetch_br_stats()
\ No newline at end of file +    async def __handle_new_friend(accepted_friend: fortnitepy.friend.Friend, new_friend_observer: NewFriendObserver): +        await new_friend_observer.on_friend_added(accepted_friend)
\ No newline at end of file diff --git a/fortnite_client/fortnite_events.py b/fortnite_client/fortnite_events.py index 918b1e1..1efbc4e 100644 --- a/fortnite_client/fortnite_events.py +++ b/fortnite_client/fortnite_events.py @@ -7,6 +7,9 @@ from telegram_bot import *  from persistence import *  from formatter import * +__accept_keyword__ = "accept" +__decline_keyword__ = "decline" +  class ClientInitObserverImpl(ClientInitObserver):      async def on_event(self, fortnite_client: FortniteClient) -> None:          print('----------------') @@ -43,10 +46,65 @@ class NewFriendObserverImpl(NewFriendObserver):      def __init__(self, telegram_bot: TelegramBot, stats_repository: StatsRepository):          self.__telegram_bot = telegram_bot          self.__stats_repository = stats_repository +     +    async def on_new_friend_request(self, request_id: str, display_name: str, fortnite_client: FortniteClient) -> None: +        __new_friend_reply_markup = telebot.types.InlineKeyboardMarkup() +        __new_friend_reply_markup.add(telebot.types.InlineKeyboardButton('Accept', callback_data="{}:{}:{}".format(__accept_keyword__, request_id, display_name))) +        __new_friend_reply_markup.add(telebot.types.InlineKeyboardButton('Decline', callback_data="{}:{}:{}".format(__decline_keyword__, request_id, display_name))) + +        self.__telegram_bot.register_callback_query( +            NewFriendCallbackQueryHandler(self.__telegram_bot, fortnite_client, self),  +            lambda call: call.data.startswith(__accept_keyword__) or call.data.startswith(__decline_keyword__)) + +        await self.__telegram_bot.send_message_to_all(format_new_friend_request(display_name), reply_markup=__new_friend_reply_markup) -    async def on_event(self, friend: User) -> None: +    async def on_friend_added(self, fornite_friend: fortnitepy.friend.Friend) -> None: +        # Try fetch stats +        try: +            await self.__try_get_stats(fornite_friend) +        except: +            print(traceback.format_exc()) +            await self.__on_unavailable_public_stats(fornite_friend.display_name) + +        friend = User.from_fortnite_friend(fornite_friend)          await self.__stats_repository.put_stats(friend, datetime.datetime.now())          await self.__telegram_bot.send_message_to_all(format_new_friend(friend.display_name)) -    async def on_unavailable_public_stats(self, display_name) -> None: -        await self.__telegram_bot.send_message_to_all(format_friend_disabled_public_stats(display_name))
\ No newline at end of file +    async def __try_get_stats(self, friend: fortnitepy.friend.Friend): +        await friend.fetch_br_stats() + +    async def __on_unavailable_public_stats(self, display_name) -> None: +        await self.__telegram_bot.send_message_to_all(format_friend_disabled_public_stats(display_name)) + +class NewFriendCallbackQueryHandler(CallbackQueryHandler): +    __telegram_bot: TelegramBot +    __fortnite_client: FortniteClient +    __new_friend_observer: NewFriendObserver + +    def __init__(self, telegram_bot: TelegramBot, fortnite_client: FortniteClient, new_friend_observer: NewFriendObserver): +        self.__telegram_bot = telegram_bot +        self.__fortnite_client = fortnite_client +        self.__new_friend_observer = new_friend_observer + +    async def handle(self, call: telebot.types.CallbackQuery): +        if self.__fortnite_client.is_initialized(): +            answered: bool = False +            if call.data.startswith(__accept_keyword__) or call.data.startswith(__decline_keyword__): +                splitted = call.data.split(":") +                await self.__handle_request(splitted[0], splitted[1], splitted[2]) +             +        await self.__telegram_bot.answer_callback_query(callback_query_id=call.id) +     +    async def __handle_request(self, action: str, request_id: str, display_name: str): +        pending_friends = self.__fortnite_client.pending_friends +        for pending_friend in pending_friends: +            if isinstance(pending_friend, fortnitepy.friend.IncomingPendingFriend): +                incoming_request = typing.cast(fortnitepy.friend.IncomingPendingFriend, pending_friend) +                if incoming_request._id == request_id: +                    if action == __accept_keyword__: +                        await incoming_request.accept() +                        accepted_friend = incoming_request.client.get_friend(incoming_request._id) +                        await self.__new_friend_observer.on_friend_added(accepted_friend) +                    elif action == __decline_keyword__: +                        await incoming_request.decline() +                        await self.__telegram_bot.send_message_to_all(format_friend_declined(display_name))
\ No newline at end of file | 
