128 lines
4.7 KiB
Python
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()
|