import subprocess import shlex class MinecraftServerManager: allowed_properties: list[str] = ["difficulty", "gamemode", "force-gamemode", "hardcore", "generate-structures", "motd", "pvp", "online-mode", "max-players"] def __init__(self): self.servers: dict = {} self.servers_count: int = 0 def start_server(self, server_directory: str, port: int, java_executable='java', jar_file='server.jar', memory_size='2048M') -> int or None: if port in self.servers: return None command = f"{java_executable} -Xmx{memory_size} -Xms{memory_size} -jar {jar_file} > /dev/null" process = subprocess.Popen(shlex.split(command), cwd=server_directory, stdin=subprocess.PIPE) self.servers_count = len(self.servers) + 1 self.servers[port] = { 'process': process, 'directory': server_directory, 'port': port } return port def execute_server_command(self, port, command) -> bool: if port not in self.servers: return False process = self.servers[port]['process'] process.stdin.write(command.encode('utf-8') + b'\n') process.stdin.flush() return True def stop_server(self, port: int) -> bool: if port not in self.servers: return False process = self.servers[port]['process'] process.communicate(input=b"stop\n") del self.servers[port] return True def stop_server_forcefully(self, server_id) -> bool: if server_id not in self.servers: return False process = self.servers[server_id]['process'] process.terminate() del self.servers[server_id] return True def get_servers(self): return self.servers.values() def get_server_id_by_port(self, port): for server_id, server_info in self.servers.items(): if server_info['port'] == port: return server_id return None if __name__ == "__main__": pass