Skip to content

Commit

Permalink
Create python-app.yml
Browse files Browse the repository at this point in the history
  • Loading branch information
dsafxP committed Dec 14, 2024
1 parent 4a20267 commit 52946fc
Show file tree
Hide file tree
Showing 6 changed files with 96 additions and 38 deletions.
23 changes: 23 additions & 0 deletions .github/workflows/pylint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: Pylint

on: [push]

jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.8", "3.9", "3.10"]
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v3
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pylint
- name: Analysing the code with pylint
run: |
pylint $(git ls-files '*.py') --exit-zero
4 changes: 2 additions & 2 deletions app/fetcher.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# app/fetcher.py
import aiohttp
from .xml_parser import parse_servers_from_xml
from xml_parser import parse_servers_from_xml

async def fetch_game_servers(callback=None):
# Define the SOAP request body
Expand All @@ -27,7 +27,7 @@ async def fetch_game_servers(callback=None):
if response.status == 200:
response_text = await response.text()
servers = parse_servers_from_xml(response_text)

servers = [server for server in servers if server.version_nr != 0]

if callback:
Expand Down
6 changes: 4 additions & 2 deletions app/server.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# app/server.py
class Server:
def __init__(self, address_ipv4, address_ipv6, lip, port, game_name, game_mode, map_name, players, max_players, bots, has_password, description, version, version_nr, application_instance):
def __init__(self, address_ipv4, address_ipv6, lip, port, game_name,
game_mode, map_name, players, max_players, bots, has_password,
description, version, version_nr, application_instance):
self.address_ipv4 = address_ipv4
self.address_ipv6 = address_ipv6
self.lip = lip
Expand All @@ -19,7 +21,7 @@ def __init__(self, address_ipv4, address_ipv6, lip, port, game_name, game_mode,

def __repr__(self):
return f"Server({self.game_name}, {self.address_ipv4}, {self.port})"

def get_game_mode(self):
"""Returns a human-readable string for the game mode."""
game_modes = {
Expand Down
69 changes: 51 additions & 18 deletions app/xml_parser.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# app/xml_parser.py
import xml.etree.ElementTree as ET
from .server import Server
from server import Server

def parse_servers_from_xml(response_text):
"""
Expand All @@ -10,31 +10,64 @@ def parse_servers_from_xml(response_text):
root = ET.fromstring(response_text)

# Define namespaces to access elements
namespaces = {'soap': 'http://schemas.xmlsoap.org/soap/envelope/', 'sfd': 'https://mythologicinteractive.com/Games/SFD/'}
namespaces = {'soap': 'http://schemas.xmlsoap.org/soap/envelope/',
'sfd': 'https://mythologicinteractive.com/Games/SFD/'}

servers_element = root.find('.//sfd:GetGameServersResult/sfd:Servers', namespaces)

servers = []
if servers_element is not None:
for server_element in servers_element.findall('sfd:SFDGameServer', namespaces):
# Extract values for each field
address_ipv4 = server_element.findtext('sfd:AddressIPv4', default=None, namespaces=namespaces)
address_ipv6 = server_element.findtext('sfd:AddressIPv6', default=None, namespaces=namespaces)
lip = server_element.findtext('sfd:LIP', default=None, namespaces=namespaces)
port = int(server_element.findtext('sfd:Port', default=0, namespaces=namespaces))
game_name = server_element.findtext('sfd:GameName', default=None, namespaces=namespaces)
game_mode = int(server_element.findtext('sfd:GameMode', default=0, namespaces=namespaces))
map_name = server_element.findtext('sfd:MapName', default=None, namespaces=namespaces)
players = int(server_element.findtext('sfd:Players', default=0, namespaces=namespaces))
max_players = int(server_element.findtext('sfd:MaxPlayers', default=0, namespaces=namespaces))
bots = int(server_element.findtext('sfd:Bots', default=0, namespaces=namespaces))
has_password = server_element.findtext('sfd:HasPassword', default='false', namespaces=namespaces) == 'true'
description = server_element.findtext('sfd:Description', default=None, namespaces=namespaces)
version = server_element.findtext('sfd:Version', default=None, namespaces=namespaces)
version_nr = int(server_element.findtext('sfd:VersionNr', default=0, namespaces=namespaces))
application_instance = server_element.findtext('sfd:ApplicationInstance', default=None, namespaces=namespaces)
address_ipv4 = server_element.findtext('sfd:AddressIPv4', default=None,
namespaces=namespaces)

address_ipv6 = server_element.findtext('sfd:AddressIPv6', default=None,
namespaces=namespaces)

lip = server_element.findtext('sfd:LIP', default=None,
namespaces=namespaces)

port = int(server_element.findtext('sfd:Port', default=0,
namespaces=namespaces))

game_name = server_element.findtext('sfd:GameName', default=None,
namespaces=namespaces)

game_mode = int(server_element.findtext('sfd:GameMode', default=0,
namespaces=namespaces))

map_name = server_element.findtext('sfd:MapName', default=None,
namespaces=namespaces)

players = int(server_element.findtext('sfd:Players', default=0,
namespaces=namespaces))

max_players = int(server_element.findtext('sfd:MaxPlayers', default=0,
namespaces=namespaces))

bots = int(server_element.findtext('sfd:Bots', default=0,
namespaces=namespaces))

has_password = server_element.findtext('sfd:HasPassword', default='false',
namespaces=namespaces) == 'true'

description = server_element.findtext('sfd:Description', default=None,
namespaces=namespaces)

version = server_element.findtext('sfd:Version', default=None,
namespaces=namespaces)

version_nr = int(server_element.findtext('sfd:VersionNr', default=0,
namespaces=namespaces))

application_instance = server_element.findtext('sfd:ApplicationInstance',
default=None, namespaces=namespaces)

# Create a Server object and append it to the list
server = Server(address_ipv4, address_ipv6, lip, port, game_name, game_mode, map_name, players, max_players, bots, has_password, description, version, version_nr, application_instance)
server = Server(address_ipv4, address_ipv6, lip, port, game_name, game_mode, map_name,
players, max_players, bots, has_password, description, version,
version_nr, application_instance)
servers.append(server)

return servers
14 changes: 8 additions & 6 deletions gui.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
import tkinter as tk
from tkinter import messagebox
from app.fetcher import fetch_game_servers
import asyncio
import threading
from app.fetcher import fetch_game_servers

class GameServersApp:
def __init__(self, root):
self.root = root
self.root.title("Superfighters Deluxe Game Servers")
self.root.geometry("600x400")

# Set a custom icon
self.root.iconbitmap("img/SFDicon.ico") # Replace with your .ico file path

Expand All @@ -21,6 +20,8 @@ def __init__(self, root):
self.details_text = tk.Text(self.root, height=8, wrap=tk.WORD)
self.details_text.pack(fill=tk.X, padx=10, pady=10) # Fill horizontally, with padding

self.servers = None

# Set a fetch interval (in milliseconds), e.g., 30,000 ms = 30 seconds
self.fetch_interval = 30000 # 30 seconds

Expand Down Expand Up @@ -49,7 +50,7 @@ def update_server_list(self, servers):
for server in servers:
self.listbox.insert(tk.END, server.game_name)

def on_server_select(self, event):
def on_server_select(self):
"""Handle left-click on a server in the listbox."""
selected_index = self.listbox.curselection() # Get the index of the selected item
if selected_index:
Expand Down Expand Up @@ -80,12 +81,13 @@ def on_server_select(self, event):
def start_auto_fetch(self):
"""Start a periodic task to fetch game servers automatically."""
self.fetch_servers() # Fetch servers immediately
self.root.after(self.fetch_interval, self.start_auto_fetch) # Set the next fetch after the interval
self.root.after(self.fetch_interval,
self.start_auto_fetch) # Set the next fetch after the interval

def run_gui():
"""Set up the main Tkinter GUI window and start the application."""
root = tk.Tk()
app = GameServersApp(root)
GameServersApp(root)
root.mainloop()

if __name__ == '__main__':
Expand Down
18 changes: 8 additions & 10 deletions main.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
# main.py
import asyncio
import os
from app.fetcher import fetch_game_servers
from app.xml_parser import parse_servers_from_xml

def cls():
os.system('cls' if os.name=='nt' else 'clear')
Expand All @@ -23,15 +21,15 @@ def display_server_details(servers):
print(f" Map Name: {server.map_name}")
print(f" Players: {server.players}")
print(f" Max Players: {server.max_players}")

if server.bots > 0:
print(f" Bots: {server.bots}")

print(f" Has Password: {server.has_password}")

if server.description:
print(f" Description: {server.description}")

print(f" Version: {server.version}")
print(f" Version Number: {server.version_nr}")
print(f" Application Instance: {server.application_instance}")
Expand All @@ -40,15 +38,15 @@ def display_server_details(servers):
def main():
"""Main function to fetch and display servers."""
print("Fetching game servers...")

# Fetch servers asynchronously
servers = asyncio.run(fetch_game_servers())

cls()

print("\n--- Game Servers Details ---")
display_server_details(servers)

# Wait for the user to press any key to continue
input("\nPress any key to continue...")

Expand Down

0 comments on commit 52946fc

Please sign in to comment.