diff options
-rw-r--r-- | .gitmodules | 3 | ||||
-rw-r--r-- | app_types/__init__.py (renamed from app_types.py) | 0 | ||||
-rw-r--r-- | formatter/__init__.py (renamed from formatter.py) | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | fortnite_client/__init__.py (renamed from fortnite_client.py) | 4 | ||||
-rw-r--r-- | fortnite_client/device_auth.py (renamed from device_auth.py) | 0 | ||||
-rw-r--r-- | fortnite_client/fortnite_events.py (renamed from fortnite_events.py) | 2 | ||||
-rw-r--r-- | fortnite_status/__init__.py | 119 | ||||
-rw-r--r-- | fortnite_status_notifier.py | 37 | ||||
-rwxr-xr-x | main.py (renamed from tgbot.py) | 10 | ||||
-rw-r--r-- | persistence/__init__.py (renamed from persistence.py) | 3 | ||||
m--------- | pythonFortniteStatus | 0 | ||||
-rw-r--r-- | telegram_bot/__init__.py (renamed from telegram_bot.py) | 2 | ||||
-rw-r--r-- | telegram_bot/commands.py (renamed from commands.py) | 4 |
13 files changed, 130 insertions, 54 deletions
diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 136e707..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "pythonFortniteStatus"] - path = pythonFortniteStatus - url = https://git.snoopdesigns.site/python-fortnite-status.git diff --git a/app_types.py b/app_types/__init__.py index 699928a..699928a 100644 --- a/app_types.py +++ b/app_types/__init__.py diff --git a/formatter.py b/formatter/__init__.py index 9efc249..9efc249 100644 --- a/formatter.py +++ b/formatter/__init__.py diff --git a/fortnite_client.py b/fortnite_client/__init__.py index 16b2652..bac4e5d 100755..100644 --- a/fortnite_client.py +++ b/fortnite_client/__init__.py @@ -1,10 +1,8 @@ -#!/usr/bin/python3 - import fortnitepy import json import os import typing -from device_auth import DeviceAuth +from fortnite_client.device_auth import DeviceAuth from app_types import * __fortnite_account_key__ = 'fornite-account-key' diff --git a/device_auth.py b/fortnite_client/device_auth.py index 4d46918..4d46918 100644 --- a/device_auth.py +++ b/fortnite_client/device_auth.py diff --git a/fortnite_events.py b/fortnite_client/fortnite_events.py index d9e143f..2d252ad 100644 --- a/fortnite_events.py +++ b/fortnite_client/fortnite_events.py @@ -3,7 +3,7 @@ import typing import time from fortnite_client import * from telegram_bot import * -from persistence import PresenceRepository +from persistence import * from formatter import * class ClientInitObserverImpl(ClientInitObserver): diff --git a/fortnite_status/__init__.py b/fortnite_status/__init__.py new file mode 100644 index 0000000..244502b --- /dev/null +++ b/fortnite_status/__init__.py @@ -0,0 +1,119 @@ +# Simple utility class which provides an access to Fortnite service status report. +# Usage: ForniteStatus().getStatus() + +import requests as req +import html5lib +from bs4 import BeautifulSoup + +# Polling interval in seconds +__polling_interval__ = 5 * 60 # 5 minutes + +class FortniteStatusObserver: + async def update(self, fortnite_status) -> None: + pass + +class FortniteStatus: + """ + Instantiate a FortniteStatus class. + """ + + class Status: + serviceStatuses = [] + + def __init__(self, serviceStatuses): + self.serviceStatuses = serviceStatuses + + def __eq__(self, other): + if not isinstance(other, FortniteStatus.Status): + return NotImplemented + return sorted(self.serviceStatuses) == sorted(other.serviceStatuses) + + def prettify(self): + return 'Fortnite services status:\n' + '\n'.join([serviceStatus.prettify() for serviceStatus in self.serviceStatuses]) + + class ServiceStatus: + serviceName = '' + status = False + + def __init__(self, serviceName, status): + self.serviceName = serviceName + self.status = status + + def __lt__(self, other): + if not isinstance(other, FortniteStatus.ServiceStatus): + return NotImplemented + return self.serviceName < other.serviceName + + def __eq__(self, other): + if not isinstance(other, FortniteStatus.ServiceStatus): + return NotImplemented + return self.serviceName == other.serviceName and self.status == other.status + + + def prettify(self): + return f'{self.serviceName}, {self.status}' + + def __findFortniteStatusHtmlComponent(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'}): + 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 + else: + statusCode = False + serviceStatuses.append(self.ServiceStatus(name, statusCode)) + return self.Status(serviceStatuses) + + def getStatus(self): + webContent = req.get("https://status.epicgames.com/") + parsedHtml = BeautifulSoup(webContent.text, 'html5lib') + + return self.__parseFortniteStatus(parsedHtml) + + + + def printStatus(self): + """ + Prints a current Fortnite services status in stdout. + Example: + + """ + print(self.getStatus().prettify()) + +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.__fortnite_status.getStatus() + while True: + await self.__read_status() + await asyncio.sleep(__polling_interval__) + + async def __read_status(self): + service_status_tmp = self.__fortnite_status.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/fortnite_status_notifier.py b/fortnite_status_notifier.py deleted file mode 100644 index edf3009..0000000 --- a/fortnite_status_notifier.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: - - __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 @@ -1,13 +1,13 @@ #!/usr/bin/python3 import os, time, telebot, asyncio, telebot.async_telebot, nest_asyncio, sys -from fortnite_status_notifier import * +from fortnite_status import * from formatter import * from fortnite_client import * -from fortnite_events import * -from persistence import UserRepository, StatsRepository, PresenceRepository -from telegram_bot import TelegramBot, CommandHandler -from commands import * +from fortnite_client.fortnite_events import * +from persistence import * +from telegram_bot import * +from telegram_bot.commands import * class FortniteStatusObserverImpl(FortniteStatusObserver): diff --git a/persistence.py b/persistence/__init__.py index 512836e..9d9220e 100644 --- a/persistence.py +++ b/persistence/__init__.py @@ -125,5 +125,4 @@ class PresenceRepository: display_name = display_name, last_online = last_online) cur.execute(query) - connection.commit() -
\ No newline at end of file + connection.commit()
\ No newline at end of file diff --git a/pythonFortniteStatus b/pythonFortniteStatus deleted file mode 160000 -Subproject 657eff0289301ece411b07751113b6a36c6ce79 diff --git a/telegram_bot.py b/telegram_bot/__init__.py index 26d3071..ab9f61d 100644 --- a/telegram_bot.py +++ b/telegram_bot/__init__.py @@ -4,7 +4,7 @@ import logging import traceback import sys from telebot.async_telebot import AsyncTeleBot -from persistence import UserRepository +from persistence import * class CommandHandler: async def handle(self, message: telebot.types.Message): diff --git a/commands.py b/telegram_bot/commands.py index feba4b8..cafde03 100644 --- a/commands.py +++ b/telegram_bot/commands.py @@ -2,8 +2,8 @@ import telebot from telegram_bot import * from formatter import * from persistence import * -from fortnite_client import FortniteClient -from pythonFortniteStatus.FortniteStatus import * +from fortnite_client import * +from fortnite_status import * class StartCommand(CommandHandler): |