Guest User

Untitled

a guest
Jul 15th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.20 KB | None | 0 0
  1. # SA-MP query by Killerkid
  2. import socket, struct, random, datetime
  3. from cStringIO import StringIO
  4.  
  5. class Query:
  6. def __init__(self, ip, port):
  7. self.ip, self.port = socket.gethostbyname(ip), port
  8. self.data = StringIO("")
  9. self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  10. self.sock.connect((ip, port))
  11. self.sock.settimeout(1)
  12.  
  13. def CreatePacket(self, opcode):
  14. ips = self.ip.split('.');
  15. packet = "SAMP{0}{1}{2}{3}{4}{5}{6}".format(chr(int(ips[0])), chr(int(ips[1])), chr(int(ips[2])), chr(int(ips[3])), chr(self.port & 0xFF), chr(self.port >> 8 & 0xFF), opcode)
  16. if opcode == 'p':
  17. packet += struct.pack("BBBB", random.randint(0, 255), random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
  18. return packet
  19.  
  20. def GetInformation(self):
  21. try:
  22. self.sock.send(self.CreatePacket('i'))
  23. info = {}
  24. self.data = StringIO(self.sock.recv(2048))
  25. self.data.read(11)
  26. info['passworded'] = struct.unpack('?', self.data.read(1))[0]
  27. info['players'] = struct.unpack('h', self.data.read(2))[0]
  28. info['maxplayers'] = struct.unpack('h', self.data.read(2))[0]
  29.  
  30. info['hostname'] = self.data.read(struct.unpack('i', self.data.read(4))[0])
  31. info['gamemode'] = self.data.read(struct.unpack('i', self.data.read(4))[0])
  32. info['mapname'] = self.data.read(struct.unpack('i', self.data.read(4))[0])
  33. except socket.timeout:
  34. info['error'] = 1
  35. return info
  36.  
  37. def GetRules(self):
  38. try:
  39. self.sock.send(self.CreatePacket('r'))
  40. rules = {}
  41. self.data = StringIO(self.sock.recv(2048))
  42. self.data.read(11)
  43. rulecount = struct.unpack('h', self.data.read(2))[0]
  44. for i in range(rulecount):
  45. name = self.data.read(struct.unpack('b', self.data.read(1))[0])
  46. rules[name] = self.data.read(struct.unpack('b', self.data.read(1))[0])
  47. except socket.timeout:
  48. rules['error'] = 1
  49. return rules
  50.  
  51. def GetPlayers(self):
  52. try:
  53. self.sock.send(self.CreatePacket('c'))
  54. players = []
  55. self.data = StringIO(self.sock.recv(2048))
  56. self.data.read(11)
  57. playercount = struct.unpack('h', self.data.read(2))[0]
  58. for i in range(playercount):
  59. name = self.data.read(struct.unpack('b', self.data.read(1))[0])
  60. players.append([name, struct.unpack('i', self.data.read(4))[0]])
  61. except socket.timeout:
  62. players = {'error': 1}
  63. return players
  64.  
  65. def GetDetailedPlayers(self):
  66. try:
  67. self.sock.send(self.CreatePacket('d'))
  68. players = []
  69. self.data = StringIO(self.sock.recv(2048))
  70. self.data.read(11)
  71. playercount = struct.unpack('h', self.data.read(2))[0]
  72. for i in range(playercount):
  73. playerid = struct.unpack('b', self.data.read(1))[0]
  74. name = self.data.read(struct.unpack('b', self.data.read(1))[0])
  75. score = struct.unpack('i', self.data.read(4))[0]
  76. ping = struct.unpack('i', self.data.read(4))[0]
  77. players.append([playerid, name, score, ping])
  78. except socket.timeout:
  79. players = {'error': 1}
  80. return players
  81.  
  82. def Close(self):
  83. self.sock.close()
  84.  
  85. def Ping(self):
  86. packet = self.CreatePacket('p')
  87. a = datetime.datetime.now()
  88. self.sock.send(packet)
  89. self.sock.recv(2048)
  90. b = datetime.datetime.now()
  91. c = b - a
  92. return int((c.days * 24 * 60 * 60 + c.seconds) * 1000 + c.microseconds / 1000.0)
  93.  
  94. class Rcon:
  95. def __init__(self, ip, port, password):
  96. self.ip, self.port, self.password = socket.gethostbyname(ip), port, password
  97. self.data = StringIO("")
  98. self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  99. self.sock.connect((ip, port))
  100. self.sock.settimeout(0.5)
  101.  
  102. def CreatePacket(self, opcode, password, command):
  103. ips = self.ip.split('.');
  104. packet = "SAMP{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}{11}{12}".format(chr(int(ips[0])), chr(int(ips[1])), chr(int(ips[2])), chr(int(ips[3])), chr(self.port & 0xFF), chr(self.port >> 8 & 0xFF), opcode, chr(len(password) & 0xFF), chr(len(password) >> 8 & 0xFF), password, chr(len(command) & 0xFF), chr(len(command) >> 8 & 0xFF), command)
  105. return packet
  106.  
  107. def Send(self, command):
  108. self.sock.send(self.CreatePacket('x', self.password, command))
  109. output = []
  110. while 1:
  111. try:
  112. self.data = StringIO(self.sock.recv(2048))
  113. self.data.read(11)
  114. strlen = struct.unpack('h', self.data.read(2))[0]
  115. if strlen == 0: break
  116. output += [self.data.read(strlen)]
  117. except: break;
  118. return output
  119.  
  120. def Close(self):
  121. self.sock.close()
Add Comment
Please, Sign In to add comment