import getpass import argparse import os import socket import ssl import select import struct import time import platform #if platform.system() != "Windows": # import signal class MCRconException(Exception): pass def timeout_handler(signum, frame): raise MCRconException("Connection timeout error") class _MinecraftRcon(object): socket = None def __init__(self, host, password, port=25575, tlsmode=0, timeout=5): self.host = host self.password = password self.port = port self.tlsmode = tlsmode self.timeout = timeout #if platform.system() != "Windows": # signal.signal(signal.SIGALRM, timeout_handler) def __enter__(self): self.connect() return self def __exit__(self, type, value, tb): self.disconnect() def connect(self): self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) if self.tlsmode > 0: ctx = ssl.create_default_context() if self.tlsmode > 1: ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE self.socket = ctx.wrap_socket(self.socket, server_hostname=self.host) self.socket.connect((self.host, self.port)) self._send(3, self.password) def disconnect(self): if self.socket is not None: self.socket.close() self.socket = None def _read(self, length): #if platform.system() != "Windows": signal.alarm(self.timeout) data = b"" while len(data) < length: data += self.socket.recv(length - len(data)) #if platform.system() != "Windows": signal.alarm(0) return data def _send(self, out_type, out_data): if self.socket is None: raise MCRconException("Must connect before sending data") out_payload = ( struct.pack(" ") if cmd.strip() == "exit": break else: try: print(mcr.command(cmd)) except (ConnectionResetError, ConnectionAbortedError): print("The connection was terminated, the server may have been stopped.") break if cmd == "exit": break except ConnectionRefusedError: print("The connection could not be made as the server actively refused it.") except ConnectionError as e: print(e) except KeyboardInterrupt: pass