summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitrii Morozov <snoopdesigns@gmail.com>2024-05-07 17:15:25 +0200
committerDmitrii Morozov <snoopdesigns@gmail.com>2024-05-07 17:15:25 +0200
commitee3e87a6ec19878d56e8f386b20c58e4d9b211b3 (patch)
treec111165b0310581abeea0cecbfd9dabe2933e0d9
parentcfa79cbbaf42a8f74a2cd4bca4d1d495b4d597f1 (diff)
Modules
-rw-r--r--.gitmodules3
-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__.py119
-rw-r--r--fortnite_status_notifier.py37
-rwxr-xr-xmain.py (renamed from tgbot.py)10
-rw-r--r--persistence/__init__.py (renamed from persistence.py)3
m---------pythonFortniteStatus0
-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
diff --git a/tgbot.py b/main.py
index 6fbd07c..f016f57 100755
--- a/tgbot.py
+++ b/main.py
@@ -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):