import socket
import struct
import json
class Minecraft:
def __init__(self, host="", port=25565):
self.host = host
self.port = port
def unpack_varint(self, s):
d = 0
for i in range(5):
b = ord(s.recv(1))
d |= (b & 0x7F) << 7*i
if not b & 0x80:
break
return d
def pack_varint(self, d):
o = ""
while True:
b = d & 0x7F
d >>= 7
o += struct.pack("B", b | (0x80 if d > 0 else 0))
if d == 0:
break
return o
def pack_data(self, d):
return self.pack_varint(len(d)) + d
def pack_port(self, i):
return struct.pack('>H', i)
def get_info(self):
# Connect
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((self.host, self.port))
except:
raise ValueError("No Server running")
try:
# Send handshake + status request
s.send(self.pack_data("\x00\x00" + self.pack_data(self.host.encode('utf8')) + self.pack_port(self.port) + "\x01"))
s.send(self.pack_data("\x00"))
# Read response
self.unpack_varint(s) # Packet length
self.unpack_varint(s) # Packet ID
l = self.unpack_varint(s) # String length
d = ""
while len(d) < l:
d += s.recv(1024)
# Close our socket
s.close()
except:
d = "{ 'success': 'false', 'msg': 'Unknown error while connect to Server, is the IP, Port or Type wrong?'}"
# Load json and return
return json.loads(d)
Comments