From 4a7ebc16bc3a7ac6343aafe7d6938dd136e262aa Mon Sep 17 00:00:00 2001 From: Dmitrii Morozov Date: Tue, 7 May 2024 17:21:26 +0200 Subject: Refactoring --- README.md | 2 +- formatter/__init__.py | 4 +-- fortnite_status/__init__.py | 72 ++++++++++++++++++++++----------------------- telegram_bot/commands.py | 2 +- 4 files changed, 39 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index f29c7ff..34a2090 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ pip install -r requirements.txt Build and execute using python environment: ``` -TELEBOT_BOT_TOKEN= python tgbot.py +TELEBOT_BOT_TOKEN= python main.py ``` On first run you wil be asked for a Fortnite API token, which can be obtained by accessing [this URL](https://www.epicgames.com/id/api/redirect?clientId=3446cd72694c4a4485d81b77adbb2141&responseType=code). Note: you need to be logged to Epic Games account in browser used to access token. diff --git a/formatter/__init__.py b/formatter/__init__.py index 9efc249..259a881 100644 --- a/formatter/__init__.py +++ b/formatter/__init__.py @@ -4,7 +4,7 @@ from app_types import * # Status def format_fortnite_status(fortnite_status): - statuses = [__format_fortnite_service_status(service_status) for service_status in fortnite_status.serviceStatuses] + statuses = [__format_fortnite_service_status(service_status) for service_status in fortnite_status.service_statuses] return formatting.format_text( formatting.mbold("Fortnite status"), "", @@ -19,7 +19,7 @@ def __format_status(status): def __format_fortnite_service_status(fortnite_service_status): return formatting.format_text( - formatting.mbold(fortnite_service_status.serviceName), + formatting.mbold(fortnite_service_status.service_name), __format_status(fortnite_service_status.status), separator=': ') diff --git a/fortnite_status/__init__.py b/fortnite_status/__init__.py index 244502b..b736ee5 100644 --- a/fortnite_status/__init__.py +++ b/fortnite_status/__init__.py @@ -18,79 +18,77 @@ class FortniteStatus: """ class Status: - serviceStatuses = [] + service_statuses = [] - def __init__(self, serviceStatuses): - self.serviceStatuses = serviceStatuses + def __init__(self, service_statuses): + self.service_statuses = service_statuses def __eq__(self, other): if not isinstance(other, FortniteStatus.Status): return NotImplemented - return sorted(self.serviceStatuses) == sorted(other.serviceStatuses) + return sorted(self.service_statuses) == sorted(other.service_statuses) def prettify(self): - return 'Fortnite services status:\n' + '\n'.join([serviceStatus.prettify() for serviceStatus in self.serviceStatuses]) + return 'Fortnite services status:\n' + '\n'.join([service_status.prettify() for service_status in self.service_statuses]) class ServiceStatus: - serviceName = '' + service_name = '' status = False - def __init__(self, serviceName, status): - self.serviceName = serviceName + def __init__(self, service_name, status): + self.service_name = service_name self.status = status def __lt__(self, other): if not isinstance(other, FortniteStatus.ServiceStatus): return NotImplemented - return self.serviceName < other.serviceName + return self.service_name < other.service_name def __eq__(self, other): if not isinstance(other, FortniteStatus.ServiceStatus): return NotImplemented - return self.serviceName == other.serviceName and self.status == other.status + return self.service_name == other.service_name and self.status == other.status def prettify(self): - return f'{self.serviceName}, {self.status}' + return f'{self.service_name}, {self.status}' - def __findFortniteStatusHtmlComponent(self, html): + def __find_fortnite_status_html_component(self, html): for component in html.findAll('div', {'class': 'component-container'}): - innerContainers = component.findAll('div', {'class': 'component-inner-container'}) - for innerContainer in innerContainers: - for names in innerContainer.findAll('span', {'class': 'name'}): + inner_containers = component.findAll('div', {'class': 'component-inner-container'}) + for inner_container in inner_containers: + for names in inner_container.findAll('span', {'class': 'name'}): for name in names.findAll('span'): if 'class' not in name.attrs and 'Fortnite' in name.text: return component - def __parseFortniteStatus(self, html): - component = self.__findFortniteStatusHtmlComponent(html) - serviceStatuses = [] - childContainer = component.find('div', {'class': 'child-components-container'}) - for innerContainer in childContainer.findAll('div', {'class': 'component-inner-container'}): - name = innerContainer.find('span', {'class': 'name'}).text.strip() - statusString = innerContainer.find('span', {'class': 'component-status'}).text.strip() - if statusString == 'Operational': - statusCode = True + def __parse_fortnite_status(self, html): + component = self.__find_fortnite_status_html_component(html) + service_statuses = [] + child_container = component.find('div', {'class': 'child-components-container'}) + for inner_container in child_container.findAll('div', {'class': 'component-inner-container'}): + name = inner_container.find('span', {'class': 'name'}).text.strip() + status_string = inner_container.find('span', {'class': 'component-status'}).text.strip() + if status_string == 'Operational': + status_code = True else: - statusCode = False - serviceStatuses.append(self.ServiceStatus(name, statusCode)) - return self.Status(serviceStatuses) + status_code = False + service_statuses.append(self.ServiceStatus(name, status_code)) + return self.Status(service_statuses) - def getStatus(self): - webContent = req.get("https://status.epicgames.com/") - parsedHtml = BeautifulSoup(webContent.text, 'html5lib') + def get_status(self): + web_content = req.get("https://status.epicgames.com/") + parsed_html = BeautifulSoup(web_content.text, 'html5lib') - return self.__parseFortniteStatus(parsedHtml) + return self.__parse_fortnite_status(parsed_html) - - - def printStatus(self): + def print_status(self): """ Prints a current Fortnite services status in stdout. Example: """ - print(self.getStatus().prettify()) + print(self.get_status().prettify()) class FortniteStatusNotifier: @@ -104,13 +102,13 @@ class FortniteStatusNotifier: async def run(self): # Initialize status - self.__last_fortnite_status = self.__fortnite_status.getStatus() + self.__last_fortnite_status = self.__fortnite_status.get_status() while True: await self.__read_status() await asyncio.sleep(__polling_interval__) async def __read_status(self): - service_status_tmp = self.__fortnite_status.getStatus() + service_status_tmp = self.__fortnite_status.get_status() if service_status_tmp != self.__last_fortnite_status: await self.__notify(service_status_tmp) self.__last_fortnite_status = service_status_tmp diff --git a/telegram_bot/commands.py b/telegram_bot/commands.py index cafde03..cba5d5f 100644 --- a/telegram_bot/commands.py +++ b/telegram_bot/commands.py @@ -32,7 +32,7 @@ class GetStatusCommand(CommandHandler): self.__fortnite_status = FortniteStatus() async def handle(self, message: telebot.types.Message): - await self.__telegram_bot.reply(message, format_fortnite_status(self.__fortnite_status.getStatus())) + await self.__telegram_bot.reply(message, format_fortnite_status(self.__fortnite_status.get_status())) class GetFriendsCommand(CommandHandler): -- cgit v1.2.3