From 30ab3ef9aeb30dbe11f4645be31fb439fd139531 Mon Sep 17 00:00:00 2001 From: Dmitri Morozov Date: Fri, 2 Feb 2024 20:33:04 +0100 Subject: Fortnite status --- scripts/fortnite-status.py | 72 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 scripts/fortnite-status.py diff --git a/scripts/fortnite-status.py b/scripts/fortnite-status.py new file mode 100644 index 0000000..3c0e33b --- /dev/null +++ b/scripts/fortnite-status.py @@ -0,0 +1,72 @@ +# 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 + +class FortniteStatus: + """ + Instantiate a FortniteStatus class. + """ + + class Status: + 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 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) + status = self.Status() + 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 + status.serviceStatuses.append(self.ServiceStatus(name, statusCode)) + + return status + + 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.generateFortniteStatusReport()) + +# Example call +fortniteStatus = FortniteStatus() +print(fortniteStatus.getStatus().prettify()) \ No newline at end of file -- cgit v1.2.3