#!/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('', 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()