diff options
-rw-r--r-- | FortniteEvents.py | 35 | ||||
-rw-r--r-- | FortniteStatusNotifier.py | 37 | ||||
-rw-r--r-- | app_types.py (renamed from Types.py) | 8 | ||||
-rw-r--r-- | commands.py | 12 | ||||
-rw-r--r-- | formatter.py (renamed from Formatter.py) | 2 | ||||
-rwxr-xr-x | fortnite_client.py (renamed from FortniteClient.py) | 22 | ||||
-rw-r--r-- | fortnite_events.py | 35 | ||||
-rw-r--r-- | fortnite_status_notifier.py | 37 | ||||
-rw-r--r-- | persistence.py | 68 | ||||
-rw-r--r-- | telegram_bot.py (renamed from TelegramBot.py) | 10 | ||||
-rwxr-xr-x | tgbot.py | 10 |
11 files changed, 138 insertions, 138 deletions
diff --git a/FortniteEvents.py b/FortniteEvents.py deleted file mode 100644 index c096818..0000000 --- a/FortniteEvents.py +++ /dev/null @@ -1,35 +0,0 @@ -import fortnitepy -import typing -import time -from FortniteClient import * -from TelegramBot import * -from persistence import PresenceRepository -from Formatter import * - -class ClientInitObserverImpl(ClientInitObserver): - async def on_event(self, fortniteClient: FortniteClient) -> None: - print('----------------') - print('FortniteClient ready as:') - print(fortniteClient.user.display_name) - print(fortniteClient.user.id) - print('----------------') - -class FriendPresenceObserverImpl(FriendPresenceObserver): - - __telegramBot: TelegramBot - __presenceRepository: PresenceRepository - - def __init__(self, telegramBot: TelegramBot, presenceRepository: PresenceRepository): - self.__telegramBot = telegramBot - self.__presenceRepository = presenceRepository - - async def update(self, display_name: str, playing: bool, party_size: int) -> None: - if playing: - last_presence = self.__presenceRepository.getLastUserPresence(display_name) - diff = time.time() - last_presence - if diff > 60 * 60: # 60 minutes - await self.__notifyFriendPlaying(display_name, party_size) - self.__presenceRepository.setLastUserPresence(display_name, time.time()) - - async def __notifyFriendPlaying(self, display_name: str, party_size: int): - await self.__telegramBot.send_message_to_all(format_friend_online(display_name, party_size))
\ No newline at end of file diff --git a/FortniteStatusNotifier.py b/FortniteStatusNotifier.py deleted file mode 100644 index 7932380..0000000 --- a/FortniteStatusNotifier.py +++ /dev/null @@ -1,37 +0,0 @@ -from telebot import formatting -import time -import asyncio -from pythonFortniteStatus.FortniteStatus import * - -# Polling interval in seconds -__polling_interval__ = 5 * 60 # 5 minutes - -class FortniteStatusObserver: - async def update(self, fortnite_status) -> None: - pass - -class FortniteStatusNotifier: - - __fortniteStatusObserver: FortniteStatusObserver - __fortniteStatus: FortniteStatus - __lastFortniteStatus: any - - def __init__(self, fortniteStatusObserver: FortniteStatusObserver): - self.__fortniteStatusObserver = fortniteStatusObserver - self.__fortniteStatus = FortniteStatus() - - async def run(self): - # Initialize status - self.__lastFortniteStatus = self.__fortniteStatus.getStatus() - while True: - await self.__readStatus() - await asyncio.sleep(__polling_interval__) - - async def __readStatus(self): - serviceStatusTmp = self.__fortniteStatus.getStatus() - if serviceStatusTmp != self.__lastFortniteStatus: - await self.__notify(serviceStatusTmp) - self.__lastFortniteStatus = serviceStatusTmp - - async def __notify(self, fortniteStatus): - await self.__fortniteStatusObserver.update(fortniteStatus)
\ No newline at end of file @@ -13,7 +13,7 @@ class User: id: str display_name: str - __fortniteUser: fortnitepy.user.UserBase + __fortnite_user: fortnitepy.user.UserBase def from_fortnite_friend(user: fortnitepy.user.UserBase): @@ -24,13 +24,13 @@ class User: instance.id = user.id instance.display_name = user.display_name - instance.__fortniteUser = user + instance.__fortnite_user = user return instance async def fetch_stats(self) -> UserStats: - stats = await self.__fortniteUser.fetch_br_stats() - bp_level: float = await self.__fortniteUser.fetch_battlepass_level(season=29) # TODO + stats = await self.__fortnite_user.fetch_br_stats() + bp_level: float = await self.__fortnite_user.fetch_battlepass_level(season=29) # TODO combined_stats = stats.get_combined_stats() device_stats = {} if 'keyboardmouse' in combined_stats: diff --git a/commands.py b/commands.py index 4cf330b..feba4b8 100644 --- a/commands.py +++ b/commands.py @@ -1,8 +1,8 @@ import telebot -from TelegramBot import * -from Formatter import * +from telegram_bot import * +from formatter import * from persistence import * -from FortniteClient import FortniteClient +from fortnite_client import FortniteClient from pythonFortniteStatus.FortniteStatus import * class StartCommand(CommandHandler): @@ -19,7 +19,7 @@ class StartCommand(CommandHandler): alias = message.chat.username else: alias = message.chat.title - self.__user_repository.putUser(message.chat.id, alias) + self.__user_repository.put_user(message.chat.id, alias) await self.__telegram_bot.reply(message, 'This chat successfully registered to receive Fortnite updates') class GetStatusCommand(CommandHandler): @@ -74,7 +74,7 @@ class GetTodayStatsCommand(CommandHandler): self.__stats_repository = stats_repository async def handle(self, message: telebot.types.Message): - persisted_stats = self.__stats_repository.getStats() + persisted_stats = self.__stats_repository.get_stats() friends = await self.__fortnite_client.get_friends() current_stats = [await friend.fetch_stats() for friend in friends] await self.__telegram_bot.reply(message, format_user_stats_difference(persisted_stats, current_stats)) @@ -91,4 +91,4 @@ class RecordStatsCommand(CommandHandler): async def handle(self, message: telebot.types.Message): friends = await self.__fortnite_client.get_friends() for friend in friends: - await self.__stats_repository.putStats(friend)
\ No newline at end of file + await self.__stats_repository.put_stats(friend)
\ No newline at end of file diff --git a/Formatter.py b/formatter.py index fa7a316..9efc249 100644 --- a/Formatter.py +++ b/formatter.py @@ -1,6 +1,6 @@ from telebot import formatting import typing -from Types import * +from app_types import * # Status def format_fortnite_status(fortnite_status): diff --git a/FortniteClient.py b/fortnite_client.py index c52aacb..16b2652 100755 --- a/FortniteClient.py +++ b/fortnite_client.py @@ -5,7 +5,7 @@ import json import os import typing from device_auth import DeviceAuth -from Types import * +from app_types import * __fortnite_account_key__ = 'fornite-account-key' @@ -15,19 +15,19 @@ class FriendPresenceObserver: pass class ClientInitObserver: - async def on_event(self, fortniteClient) -> None: + async def on_event(self, fortnite_client) -> None: pass class FortniteClient(fortnitepy.Client): __device_auth: DeviceAuth - __friendPresenceObserver: FriendPresenceObserver - __clientInitObserver: ClientInitObserver + __friend_presence_observer: FriendPresenceObserver + __client_init_observer: ClientInitObserver - def __init__(self, clientInitObserver: ClientInitObserver, friendPresenceObserver: FriendPresenceObserver): + def __init__(self, client_init_observer: ClientInitObserver, friend_presence_observer: FriendPresenceObserver): self.__device_auth = DeviceAuth() - self.__clientInitObserver = clientInitObserver - self.__friendPresenceObserver = friendPresenceObserver + 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: @@ -77,16 +77,16 @@ class FortniteClient(fortnitepy.Client): async def event_ready(self): await self.__generate_auth_details() - await self.__clientInitObserver.on_event(self) + 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.__friendPresenceObserver) + await FriendPresenceEvent.on_event(before, after, self.__friend_presence_observer) class FriendPresenceEvent: - async def on_event(before, after: fortnitepy.Presence, friendPresenceObserver: FriendPresenceObserver): + 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)) @@ -95,7 +95,7 @@ class FriendPresenceEvent: party: fortnitepy.PresenceParty = after.party if party is not None and party.playercount is not None: party_size = int(party.playercount) - await friendPresenceObserver.update( + await friend_presence_observer.update( after.friend.display_name, after.playing, party_size) diff --git a/fortnite_events.py b/fortnite_events.py new file mode 100644 index 0000000..d9e143f --- /dev/null +++ b/fortnite_events.py @@ -0,0 +1,35 @@ +import fortnitepy +import typing +import time +from fortnite_client import * +from telegram_bot import * +from persistence import PresenceRepository +from formatter import * + +class ClientInitObserverImpl(ClientInitObserver): + async def on_event(self, fortnite_client: FortniteClient) -> None: + print('----------------') + print('FortniteClient ready as:') + print(fortnite_client.user.display_name) + print(fortnite_client.user.id) + print('----------------') + +class FriendPresenceObserverImpl(FriendPresenceObserver): + + __telegram_bot: TelegramBot + __presence_repository: PresenceRepository + + def __init__(self, telegram_bot: TelegramBot, presence_repository: PresenceRepository): + self.__telegram_bot = telegram_bot + self.__presence_repository = presence_repository + + async def update(self, display_name: str, playing: bool, party_size: int) -> None: + if playing: + last_presence = self.__presence_repository.get_last_user_presence(display_name) + diff = time.time() - last_presence + if diff > 60 * 60: # 60 minutes + await self.__notify_friend_playing(display_name, party_size) + self.__presence_repository.set_last_user_presence(display_name, time.time()) + + async def __notify_friend_playing(self, display_name: str, party_size: int): + await self.__telegram_bot.send_message_to_all(format_friend_online(display_name, party_size))
\ No newline at end of file diff --git a/fortnite_status_notifier.py b/fortnite_status_notifier.py new file mode 100644 index 0000000..edf3009 --- /dev/null +++ b/fortnite_status_notifier.py @@ -0,0 +1,37 @@ +from telebot import formatting +import time +import asyncio +from pythonFortniteStatus.FortniteStatus import * + +# Polling interval in seconds +__polling_interval__ = 5 * 60 # 5 minutes + +class FortniteStatusObserver: + async def update(self, fortnite_status) -> None: + pass + +class FortniteStatusNotifier: + + __fortnite_status_observer: FortniteStatusObserver + __fortnite_status: FortniteStatus + __last_fortnite_status: any + + def __init__(self, fortnite_status_observer: FortniteStatusObserver): + self.__fortnite_status_observer = fortnite_status_observer + self.__fortnite_status = FortniteStatus() + + async def run(self): + # Initialize status + self.__last_fortnite_status = self.__fortniteStatus.getStatus() + while True: + await self.__read_status() + await asyncio.sleep(__polling_interval__) + + async def __read_status(self): + service_status_tmp = self.__fortniteStatus.getStatus() + if service_status_tmp != self.__last_fortnite_status: + await self.__notify(service_status_tmp) + self.__last_fortnite_status = service_status_tmp + + async def __notify(self, fortnite_status): + await self.__fortnite_status_observer.update(fortnite_status)
\ No newline at end of file diff --git a/persistence.py b/persistence.py index f8d7097..512836e 100644 --- a/persistence.py +++ b/persistence.py @@ -1,5 +1,5 @@ import sqlite3, typing -from Types import * +from app_types import * class UserRepository: @@ -7,29 +7,29 @@ class UserRepository: self.__initialize() def __initialize(self): - cur = self.__getConnection().cursor() + cur = self.__get_connection().cursor() cur.execute("CREATE TABLE IF NOT EXISTS user(chat_id INT, alias TEXT)") cur.execute("CREATE UNIQUE INDEX IF NOT EXISTS chat_id_idx ON user(chat_id)") - def __getConnection(self): + def __get_connection(self): return sqlite3.connect('db.sqlite') - def getUser(self, chat_id): - connection = self.__getConnection() + def get_user(self, chat_id): + connection = self.__get_connection() cur = connection.cursor() query = "select * from user where chat_id = {chat_id}".format(chat_id = chat_id) cur.execute(query) return cur.fetchone() - def getAllUsers(self): - connection = self.__getConnection() + def get_all_users(self): + connection = self.__get_connection() cur = connection.cursor() query = "select * from user" cur.execute(query) return cur.fetchall() - def removeChat(self, chat_id): - connection = self.__getConnection() + def remove_chat(self, chat_id): + connection = self.__get_connection() cur = connection.cursor() query = "DELETE FROM user where chat_id = {chat_id}".format( chat_id = chat_id) @@ -37,9 +37,9 @@ class UserRepository: connection.commit() - def putUser(self, chat_id, alias): - if not self.getUser(chat_id): - connection = self.__getConnection() + def put_user(self, chat_id, alias): + if not self.get_user(chat_id): + connection = self.__get_connection() cur = connection.cursor() query = "INSERT INTO user(chat_id, alias) VALUES({chat_id}, '{text}')".format( chat_id = chat_id, @@ -52,18 +52,18 @@ class StatsRepository: def __init__(self): self.__initialize() - def __getConnection(self): + def __get_connection(self): return sqlite3.connect('db.sqlite') def __initialize(self): - cur = self.__getConnection().cursor() + cur = self.__get_connection().cursor() cur.execute("CREATE TABLE IF NOT EXISTS stats(user_id TEXT, display_name TEXT, level INT, matches_played INT, kills INT, wins INT)") cur.execute("CREATE UNIQUE INDEX IF NOT EXISTS user_id_idx ON stats(user_id)") - async def putStats(self, user: User): + async def put_stats(self, user: User): stats: UserStats = await user.fetch_stats() - connection = self.__getConnection() + connection = self.__get_connection() cur = connection.cursor() query = "INSERT OR REPLACE INTO stats(user_id, display_name, level, matches_played, kills, wins) VALUES('{user_id}', '{display_name}', {level}, {matches_played}, {kills}, {wins})".format( user_id = user.id, @@ -75,39 +75,39 @@ class StatsRepository: cur.execute(query) connection.commit() - def getStats(self) -> typing.List[UserStats]: - connection = self.__getConnection() + def get_stats(self) -> typing.List[UserStats]: + connection = self.__get_connection() cur = connection.cursor() query = "SELECT * FROM stats" cur.execute(query) result = cur.fetchall() - return [self.__mapFromDb(stats) for stats in result] + return [self.__map_from_db(stats) for stats in result] - def __mapFromDb(self, record): - userStats = UserStats() - userStats.user_id = str(record[0]) - userStats.user_display_name = str(record[1]) - userStats.level = int(record[2]) - userStats.matches_played = int(record[3]) - userStats.kills = int(record[4]) - userStats.wins = int(record[5]) - return userStats + def __map_from_db(self, record): + user_stats = UserStats() + user_stats.user_id = str(record[0]) + user_stats.user_display_name = str(record[1]) + user_stats.level = int(record[2]) + user_stats.matches_played = int(record[3]) + user_stats.kills = int(record[4]) + user_stats.wins = int(record[5]) + return user_stats class PresenceRepository: def __init__(self): self.__initialize() - def __getConnection(self): + def __get_connection(self): return sqlite3.connect('db.sqlite') def __initialize(self): - cur = self.__getConnection().cursor() + cur = self.__get_connection().cursor() cur.execute("CREATE TABLE IF NOT EXISTS user_presence(display_name TEXT, last_online INT)") cur.execute("CREATE UNIQUE INDEX IF NOT EXISTS display_name_idx ON user_presence(display_name)") - def getLastUserPresence(self, display_name): - connection = self.__getConnection() + def get_last_user_presence(self, display_name): + connection = self.__get_connection() cur = connection.cursor() query = "select last_online from user_presence where display_name = '{display_name}'".format(display_name = display_name) cur.execute(query) @@ -118,8 +118,8 @@ class PresenceRepository: else: return 0 - def setLastUserPresence(self, display_name: str, last_online: int): - connection = self.__getConnection() + def set_last_user_presence(self, display_name: str, last_online: int): + connection = self.__get_connection() cur = connection.cursor() query = "INSERT OR REPLACE INTO user_presence(display_name, last_online) VALUES('{display_name}', {last_online})".format( display_name = display_name, diff --git a/TelegramBot.py b/telegram_bot.py index 50db950..26d3071 100644 --- a/TelegramBot.py +++ b/telegram_bot.py @@ -12,10 +12,10 @@ class CommandHandler: class TelegramBot: __bot: AsyncTeleBot - __userRepository: UserRepository + __user_repository: UserRepository - def __init__(self, userRepository: UserRepository): - self.__userRepository = userRepository + def __init__(self, user_repository: UserRepository): + self.__user_repository = user_repository # Check token in environment variables if "TELEBOT_BOT_TOKEN" not in os.environ: @@ -34,7 +34,7 @@ class TelegramBot: commands=[ command ]) async def send_message_to_all(self, message_text: str): - for user in self.__userRepository.getAllUsers(): + for user in self.__user_repository.get_all_users(): try: await self.__bot.send_message( user[0], @@ -43,7 +43,7 @@ class TelegramBot: ) except Exception as error: if 'bot was kicked from the group chat' in str(error): - self.__userRepository.removeChat(user[0]) + self.__user_repository.remove_chat(user[0]) async def reply(self, message, message_text): await self.__bot.reply_to( @@ -1,12 +1,12 @@ #!/usr/bin/python3 import os, time, telebot, asyncio, telebot.async_telebot, nest_asyncio, sys -from FortniteStatusNotifier import * -from Formatter import * -from FortniteClient import * -from FortniteEvents import * +from fortnite_status_notifier import * +from formatter import * +from fortnite_client import * +from fortnite_events import * from persistence import UserRepository, StatsRepository, PresenceRepository -from TelegramBot import TelegramBot, CommandHandler +from telegram_bot import TelegramBot, CommandHandler from commands import * class FortniteStatusObserverImpl(FortniteStatusObserver): |