Advertisement
Guest User

Untitled

a guest
Aug 24th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.14 KB | None | 0 0
  1. class MCRcon(object):
  2.     def __init__(self, host, port, password):
  3.         self.host = host
  4.         self.port = port
  5.         self.password = password
  6.         self.socket = None
  7.  
  8.     def connect(self):
  9.         if self.socket is not None:
  10.             raise MCRconException("Already connected")
  11.         self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  12.         self.socket.connect((self.host, self.port))
  13.         self.send(3, self.password)
  14.         self.socket.settimeout(0.1)
  15.  
  16.     def disconnect(self):
  17.         if self.socket is None:
  18.             raise MCRconException("Already disconnected")
  19.         self.socket.close()
  20.         self.socket = None
  21.  
  22.     def reconnect(self, retry=True):
  23.         try:
  24.             self.disconnect()
  25.             self.connect()
  26.         except ConnectionRefusedError:
  27.             time.sleep(5)
  28.             if retry: self.reconnect()
  29.  
  30.     def read_response(self):
  31.         try:
  32.             re = self.socket.recv(4096)
  33.             if re == b'':
  34.                 self.reconnect()
  35.                
  36.             else:
  37.                 Packet = collections.namedtuple("Packet", ("ident", "kind", "payload"))
  38.                 length = struct.unpack("<i", re[:4])[0] + 4
  39.  
  40.                 ident, kind = struct.unpack("<ii", re[4:12])
  41.                 payload, padding = re[12:length-2], re[length-2:length]
  42.                 assert padding == b"\x00\x00"
  43.                 return payload.decode("utf-8")
  44.  
  45.         except socket.timeout:
  46.             return None
  47.         except TimeoutError:
  48.             return None
  49.  
  50.     def send(self, out_type, out_data):
  51.         if self.socket is None:
  52.             raise MCRconException("Must connect before sending data")
  53.  
  54.         out_payload = struct.pack('<ii', 0, out_type) + out_data.encode('utf8') + b'\x00\x00'
  55.         out_length = struct.pack('<i', len(out_payload))
  56.         self.socket.send(out_length + out_payload)
  57.  
  58.         return self.read_response()
  59.  
  60.     def listen(self):
  61.         while True:
  62.             yield self.read_response()
  63.  
  64.     def command(self, command):
  65.         response = self.send(2, command)
  66.         time.sleep(0.003)
  67.         return response
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement