171 lines
6.7 KiB
Python
Executable File
171 lines
6.7 KiB
Python
Executable File
#!/usr/bin/python
|
|
from sys import argv
|
|
import tkinter as tk
|
|
from tkinter import ttk, messagebox
|
|
import socket
|
|
|
|
SERVER_SUFFIX = "-Master-1"
|
|
|
|
|
|
def gen_stream(region_name: str, ip_address: str = "127.0.0.1", port: int = 22023) -> bytearray:
|
|
server_name = region_name + SERVER_SUFFIX
|
|
|
|
if len(server_name) > 0xff:
|
|
raise ValueError("Region name too long")
|
|
if len(ip_address) > 0xff:
|
|
raise ValueError("IP-address too long")
|
|
if port > 0x7fff:
|
|
raise ValueError("Port too high")
|
|
|
|
data = bytearray(len(region_name).to_bytes(5, "big"))
|
|
data += region_name.encode("ascii")
|
|
|
|
data.append(len(ip_address))
|
|
data += ip_address.encode("ascii")
|
|
data.extend(0x1.to_bytes(4, "little"))
|
|
|
|
data.append(len(server_name))
|
|
data += server_name.encode("ascii")
|
|
|
|
try:
|
|
ip_address_bytes = bytearray()
|
|
for value in ip_address.split("."):
|
|
ip_address_bytes.append(int(value))
|
|
except (ValueError, AttributeError):
|
|
try:
|
|
resolved_ip = socket.gethostbyname(ip_address)
|
|
ip_address_bytes = bytearray()
|
|
for value in resolved_ip.split("."):
|
|
ip_address_bytes.append(int(value))
|
|
except socket.gaierror:
|
|
raise ValueError(f"Invalid IP address or hostname: {ip_address}")
|
|
|
|
data += ip_address_bytes
|
|
|
|
data.extend(port.to_bytes(2, "little"))
|
|
data.extend(0x0.to_bytes(4, "big"))
|
|
|
|
return data
|
|
|
|
|
|
def write_file(region_name: str, ip_address: str = "127.0.0.1", file_name: str = "regionInfo.dat", port: int = 22023, *, log_bytes=False):
|
|
data = gen_stream(region_name, ip_address, port)
|
|
with open(file_name, "wb") as file:
|
|
file.write(data)
|
|
|
|
if log_bytes:
|
|
print("Writing", content_from_stream(data), "to", file_name)
|
|
return content_from_stream(data)
|
|
return None
|
|
|
|
|
|
def content_from_stream(stream: bytearray) -> str:
|
|
hex_array = []
|
|
for byte in stream:
|
|
hex_array.append(hex(byte))
|
|
return f"{{{', '.join(hex_array)}}}"
|
|
|
|
|
|
class AmongUsRegionCreator:
|
|
def __init__(self):
|
|
self.window = tk.Tk()
|
|
self.window.title("Among Us Region Creator")
|
|
self.window.geometry("550x450")
|
|
self.window.resizable(False, False)
|
|
|
|
main_frame = ttk.Frame(self.window, padding="10")
|
|
main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
|
|
|
|
title_label = ttk.Label(main_frame, text="Among Us Custom Server Creator", font=("Arial", 14, "bold"))
|
|
title_label.grid(row=0, column=0, columnspan=2, pady=(0, 20))
|
|
|
|
ttk.Label(main_frame, text="Region Name:").grid(row=1, column=0, sticky=tk.W, pady=5)
|
|
self.region_entry = ttk.Entry(main_frame, width=30)
|
|
self.region_entry.grid(row=1, column=1, pady=5, padx=(10, 0))
|
|
self.region_entry.insert(0, "EU")
|
|
|
|
ttk.Label(main_frame, text="IP / Domain:").grid(row=2, column=0, sticky=tk.W, pady=5)
|
|
self.ip_entry = ttk.Entry(main_frame, width=30)
|
|
self.ip_entry.grid(row=2, column=1, pady=5, padx=(10, 0))
|
|
self.ip_entry.insert(0, "127.0.0.1")
|
|
|
|
ttk.Label(main_frame, text="Port:").grid(row=3, column=0, sticky=tk.W, pady=5)
|
|
self.port_entry = ttk.Entry(main_frame, width=30)
|
|
self.port_entry.grid(row=3, column=1, pady=5, padx=(10, 0))
|
|
self.port_entry.insert(0, "22023")
|
|
|
|
ttk.Label(main_frame, text="File Name:").grid(row=4, column=0, sticky=tk.W, pady=5)
|
|
self.file_entry = ttk.Entry(main_frame, width=30)
|
|
self.file_entry.grid(row=4, column=1, pady=5, padx=(10, 0))
|
|
self.file_entry.insert(0, "regionInfo.dat")
|
|
|
|
self.create_button = ttk.Button(main_frame, text="Create File", command=self.create_file, width=20)
|
|
self.create_button.grid(row=5, column=0, columnspan=2, pady=20)
|
|
|
|
ttk.Label(main_frame, text="Output:").grid(row=6, column=0, sticky=tk.W, pady=5)
|
|
self.output_text = tk.Text(main_frame, height=10, width=60, font=("Courier", 9))
|
|
self.output_text.grid(row=7, column=0, columnspan=2, pady=5)
|
|
self.output_text.config(state=tk.DISABLED)
|
|
|
|
self.status_label = ttk.Label(main_frame, text="Ready", foreground="green")
|
|
self.status_label.grid(row=8, column=0, columnspan=2, pady=10)
|
|
|
|
self.window.bind('<Return>', lambda event: self.create_file())
|
|
|
|
def create_file(self):
|
|
try:
|
|
region_name = self.region_entry.get().strip()
|
|
ip_address = self.ip_entry.get().strip()
|
|
port = int(self.port_entry.get().strip())
|
|
file_name = self.file_entry.get().strip()
|
|
|
|
if not region_name:
|
|
raise ValueError("Region name cannot be empty")
|
|
if not ip_address:
|
|
raise ValueError("IP address/Domain cannot be empty")
|
|
if not file_name:
|
|
raise ValueError("File name cannot be empty")
|
|
|
|
result = write_file(region_name, ip_address, file_name, port, log_bytes=True)
|
|
|
|
self.output_text.config(state=tk.NORMAL)
|
|
self.output_text.delete(1.0, tk.END)
|
|
self.output_text.insert(1.0, f"File created successfully!\n\nBytes written:\n{result}")
|
|
self.output_text.config(state=tk.DISABLED)
|
|
|
|
self.status_label.config(text=f"File '{file_name}' created successfully!", foreground="green")
|
|
messagebox.showinfo("Success", f"File '{file_name}' has been created successfully!")
|
|
|
|
except ValueError as e:
|
|
self.output_text.config(state=tk.NORMAL)
|
|
self.output_text.delete(1.0, tk.END)
|
|
self.output_text.insert(1.0, f"Error: {str(e)}")
|
|
self.output_text.config(state=tk.DISABLED)
|
|
|
|
self.status_label.config(text="Error occurred", foreground="red")
|
|
messagebox.showerror("Error", str(e))
|
|
|
|
except Exception as e:
|
|
self.output_text.config(state=tk.NORMAL)
|
|
self.output_text.delete(1.0, tk.END)
|
|
self.output_text.insert(1.0, f"Unexpected error: {str(e)}")
|
|
self.output_text.config(state=tk.DISABLED)
|
|
|
|
self.status_label.config(text="Error occurred", foreground="red")
|
|
messagebox.showerror("Error", f"An unexpected error occurred:\n{str(e)}")
|
|
|
|
def run(self):
|
|
self.window.mainloop()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if len(argv) > 1:
|
|
print(f"Creating file using arguments '{', '.join(argv[1:])}'")
|
|
try:
|
|
write_file(*argv[1:], log_bytes=True)
|
|
except Exception as error:
|
|
print("Error:", error)
|
|
exit(1)
|
|
else:
|
|
app = AmongUsRegionCreator()
|
|
app.run() |