FinnWarsLauncher/main.py

128 lines
4.7 KiB
Python

from tkinter import *
import re
import subprocess
import pyautogui
import UserData
import ResourceManager
def save_preferences():
UserData.save_preferences({"server": server_address_field.get(), "username": username_field.get(), "windowed": windowed.get()})
save_preferences_button.config(state=DISABLED, text="Saved!")
root.after(5000, lambda: save_preferences_button.config(state=NORMAL, text="Save"))
def launch_exe():
# Check for valid server address (Currently only supports numerical addresses (not domains.))
if not validate_server_address(server_address_field.get()):
print(f"Invalid address \"{server_address_field.get()}\", please use a proper one...")
server_address_field.delete(0, END)
server_address_field.insert(0, UserData.default_server_address)
return
# Validate username by checking if username length is reasonable.
if not validate_username(username_field.get()):
print(f"Username \"{username_field.get()}\" is too long, please use a shorter one...")
username_field.delete(0, END)
username_field.insert(0, UserData.default_username)
return
# If game needs to be windowed then we use BF42Plus provided "workaround."
if windowed.get():
pyautogui.keyDown("shift")
root.after(5000, lambda: pyautogui.keyUp("shift"))
subprocess.call([
"./Battlefield 1942/Battlefield 1942/BF1942.exe",
"+game", "FinnWars",
"+restart", "1",
"+game", "FinnWars",
"+joinServer", server_address_field.get()
])
root.quit()
def validate_server_address(server_address):
ip_regex = r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$"
try:
if ":" in server_address:
ip, port = server_address.split(":")
if not re.match(ip_regex, ip):
return False
if not 1 <= int(port) <= 65535:
return False
else:
if not re.match(ip_regex, server_address):
return False
return True
except ValueError:
return False
def validate_username(username):
return len(username) <= 16
preferences = UserData.get_preferences()
# Create the main window
root = Tk()
root.title("FinnWarsLauncher | Koitelinkoski (v0.0.1)")
root.resizable(False, False)
#width = 720
#height = 360
scaling = 1
window_width = int(720*scaling)
window_height = int(360*scaling)
root.geometry(str(window_width) + "x" + str(window_height))
window_icon = ResourceManager.get_image_and_resize("assets/icon.png", 128, 128)
root.wm_iconphoto(False, window_icon)
background_image = ResourceManager.get_image_and_resize("assets/background.png", window_width, window_height)
background_label = Label(root, image=background_image)
background_label.pack(fill=BOTH, expand = YES)
# Create the text fields
font = ("arial", int(window_height/36))
box_width = int(window_width/24)
server_address_label = Label(root, text="Server Address:", font=font, fg="black", width=box_width)
server_address_field = Entry(root, font=font, width=box_width)
username_label = Label(root, text="Username:", font=font, fg="black", width=box_width)
username_field = Entry(root, font=font, width=box_width)
windowed = BooleanVar()
windowed.set(preferences["windowed"])
settings_label = Label(root, text="Settings", font=font, fg="black", width=int(window_width/11.3))
windowed_checkbutton = Checkbutton(root, text="Windowed", variable=windowed, font=font, width=int(window_width/26))
if "server" in preferences:
server_address_field.insert(0, preferences["server"])
else:
preferences["server"] = "23.88.63.235:14572"
server_address_field.insert(0, "23.88.63.235:14572")
if "username" in preferences:
username_field.insert(0, preferences["username"])
else:
preferences["username"] = "FinnWarsLauncher"
username_field.insert(0, "FinnWarsLauncher")
# Create the button and link it to the print_hello function
button_width = int(window_width/48)
save_preferences_button = Button(root, text="Save", command=save_preferences, width=button_width)
launch_game = Button(root, text="Launch", command=launch_exe, width=button_width)
# Place the widgets on the window
server_address_label.place(x=window_width/72, y=window_height/36)
server_address_field.place(x=window_width/72, y=int(window_height/7.2))
username_label.place(x=int(window_width/1.95), y=window_height/36)
username_field.place(x=int(window_width/1.95), y=int(window_height/7.2))
settings_label.place(x=int(window_width/72), y=int(window_height/3.2))
windowed_checkbutton.place(x=int(window_width/72), y=int(window_height/2.4))
save_preferences_button.place(x=int(window_width/2.4), y=int(window_height/1.16))
launch_game.place(x=int(window_width/1.4), y=int(window_height/1.16))
# Start the main event loop
root.mainloop()