Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class MCRcon(object):
- def __init__(self, host, port, password):
- self.host = host
- self.port = port
- self.password = password
- self.socket = None
- def connect(self):
- if self.socket is not None:
- raise MCRconException("Already connected")
- self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- self.socket.connect((self.host, self.port))
- self.send(3, self.password)
- self.socket.settimeout(0.1)
- def disconnect(self):
- if self.socket is None:
- raise MCRconException("Already disconnected")
- self.socket.close()
- self.socket = None
- def reconnect(self, retry=True):
- try:
- self.disconnect()
- self.connect()
- except ConnectionRefusedError:
- time.sleep(5)
- if retry: self.reconnect()
- def read_response(self):
- try:
- re = self.socket.recv(4096)
- if re == b'':
- self.reconnect()
- else:
- Packet = collections.namedtuple("Packet", ("ident", "kind", "payload"))
- length = struct.unpack("<i", re[:4])[0] + 4
- ident, kind = struct.unpack("<ii", re[4:12])
- payload, padding = re[12:length-2], re[length-2:length]
- assert padding == b"\x00\x00"
- return payload.decode("utf-8")
- except socket.timeout:
- return None
- except TimeoutError:
- return None
- def send(self, out_type, out_data):
- if self.socket is None:
- raise MCRconException("Must connect before sending data")
- out_payload = struct.pack('<ii', 0, out_type) + out_data.encode('utf8') + b'\x00\x00'
- out_length = struct.pack('<i', len(out_payload))
- self.socket.send(out_length + out_payload)
- return self.read_response()
- def listen(self):
- while True:
- yield self.read_response()
- def command(self, command):
- response = self.send(2, command)
- time.sleep(0.003)
- return response
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement