From 750d65f4c7102d824cd842d64e4b9c2ca119f65f Mon Sep 17 00:00:00 2001 From: ue86388 Date: Tue, 9 Apr 2024 17:54:45 +0200 Subject: Find users and add friends --- FortniteStatusFormatter.py | 27 ++++++++++++++++++- tgbot.py | 67 ++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 82 insertions(+), 12 deletions(-) diff --git a/FortniteStatusFormatter.py b/FortniteStatusFormatter.py index be87f0c..4aacd63 100644 --- a/FortniteStatusFormatter.py +++ b/FortniteStatusFormatter.py @@ -1,4 +1,7 @@ from telebot import formatting +import fortnitepy +import json +# TODO rename def __formatStatus(status): if (status == True): @@ -29,4 +32,26 @@ def formatFriends(friends): formatting.mbold("Registered friends:"), "", '\n'.join(friends_formatted), - separator='\n') \ No newline at end of file + separator='\n') + +def formatUser(user: fortnitepy.User, stats: fortnitepy.StatsV2): + combined_stats = stats.get_combined_stats() + if 'keyboardmouse' in combined_stats: + return __formatUserDevice(user, combined_stats['keyboardmouse']) + else: + return __formatUserDevice(user, combined_stats['gamepad']) + +def __formatUserDevice(user: fortnitepy.User, device_stats: dict): + return formatting.format_text( + formatting.mbold("User: ") + user.display_name, + formatting.mbold("ID: ") + user.id, + formatting.mbold("Matches played: ") + __numToStrSafe(device_stats['matchesplayed']), + formatting.mbold("Total kills: ") + __numToStrSafe(device_stats['kills']), + formatting.mbold("Wins: ") + __numToStrSafe(device_stats['wins']), + separator='\n') + +def __numToStrSafe(num): + if num is not None: + return str(num) + else: + return 'Not available' \ No newline at end of file diff --git a/tgbot.py b/tgbot.py index ad72f00..c8561cd 100755 --- a/tgbot.py +++ b/tgbot.py @@ -3,6 +3,8 @@ import os import time, threading, schedule import telebot +import asyncio +import telebot.async_telebot from FortniteStatusWrapper import * from FortniteStatusFormatter import * from FortniteClient import * @@ -13,30 +15,67 @@ from datetime import datetime if "TELEBOT_BOT_TOKEN" not in os.environ: raise AssertionError("Please configure TELEBOT_BOT_TOKEN as environment variables") -bot = telebot.TeleBot(os.environ["TELEBOT_BOT_TOKEN"]) +#bot = telebot.TeleBot(os.environ["TELEBOT_BOT_TOKEN"]) +bot = telebot.async_telebot.AsyncTeleBot(os.environ["TELEBOT_BOT_TOKEN"]) userRepository = UserRepository('db.sqlite') fortniteStatusWrapper = FortniteStatusWrapper() fortniteClient = FortniteClient() @bot.message_handler(commands = ['start']) -def startCommand(message): +async def startCommand(message): userRepository.putUser(message.chat.id) - bot.reply_to(message, "This chat successfully registered to receive Fortnite updates!") + await bot.reply_to(message, "This chat successfully registered to receive Fortnite updates!") @bot.message_handler(commands = ['status']) -def getStatus(message): - bot.reply_to( +async def getStatus(message): + await bot.reply_to( message, formatFortniteStatus(fortniteStatus.getStatus()), parse_mode='MarkdownV2') @bot.message_handler(commands = ['friends']) -def getFriends(message): - bot.reply_to( +async def getFriends(message): + await bot.reply_to( message, formatFriends(fortniteClient.get_friends()), parse_mode='MarkdownV2') +@bot.message_handler(commands = ['find']) +async def findUser(message): + arg = message.text.split() + if len(arg) > 1: + search_user_display_name = arg[1] + print('Searching users by name {}'.format(search_user_display_name)) + users: typing.List[fortnitepy.User] = await fortniteClient.fetch_users_by_display_name(search_user_display_name) + for user in users: + stats = await user.fetch_br_stats() + await bot.reply_to( + message, + formatUser(user, stats), + parse_mode='MarkdownV2') + else: + await bot.reply_to( + message, + 'Usage: /find username', + parse_mode='MarkdownV2') + +@bot.message_handler(commands = ['add']) +async def addUser(message): + arg = message.text.split() + if len(arg) > 1: + user_id = arg[1] + print('Adding user with ID as friend {}'.format(user_id)) + await fortniteClient.add_friend(user_id) + await bot.reply_to( + message, + 'Send friend request successfully', + parse_mode='MarkdownV2') + else: + await bot.reply_to( + message, + 'Usage: /add username', + parse_mode='MarkdownV2') + class FortniteStatusObserver(Observer): def update(self, fortniteStatus) -> None: for user in userRepository.getAllUsers(): @@ -72,11 +111,17 @@ class FortnitePresenceObserver(PresenceObserver): parse_mode='MarkdownV2' ) +async def run_bot(): + await bot.polling() + +async def run_client(): + await fortniteClient.run() + if __name__ == '__main__': fortniteStatusWrapper.attach(FortniteStatusObserver()) fortniteClient.attach(FortnitePresenceObserver()) - main_thread = threading.Thread(target=bot.infinity_polling, name='bot_infinity_polling', daemon=True) - main_thread.start() - #main_thread.join() - fortniteClient.run() \ No newline at end of file + loop = asyncio.get_event_loop() + loop.create_task(bot.polling()) + loop.create_task(fortniteClient.run()) + loop.run_forever() \ No newline at end of file -- cgit v1.2.3