Advertisement
yanirx

SAMP 0.3 query info faker

Mar 22nd, 2016
372
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.73 KB | None | 0 0
  1. # responds to SAMP server query info
  2. # https://wiki.sa-mp.com/wiki/Query_Mechanism
  3. # yanir3
  4.  
  5. import socket
  6. import struct
  7. import random
  8.  
  9. # SAMP-0.3 related consts:
  10. OPCODE_INFO = "i"
  11. OPCODE_PING = "p"
  12. OPCODE_CLIENT_LIST = "c"
  13. HEADER_SIZE = 11
  14.  
  15. # Server bindings:
  16. BIND_ADDRESS = "0.0.0.0" # all interfaces
  17. PORT = 7777 # samp default port
  18. RECV_BUFFER = 1024
  19.  
  20.  
  21. # Config:
  22. SERVER_NAME = "2016"
  23. GAMEMODE_NAME = "?"
  24. LANGUAGE = "=]"
  25. PLAYERS = 50
  26. MAX_PLAYERS = 500
  27. HAS_PASS = 0 # 1 = yes
  28. FAKE_PLAYER_NAMES = ["0x01", "0x02", "0x03", "0x04"]
  29.  
  30. def make_client_list_response(players_amount):
  31.     RESPONSE_TO_C = struct.pack("<H", players_amount)
  32.     for i in range(players_amount + 1):
  33.         name = random.choice(FAKE_PLAYER_NAMES)
  34.         RESPONSE_TO_C += struct.pack(P_FORMAT % (len(name)), len(name), name, random.randint(1, 98999))
  35.     return RESPONSE_TO_C
  36.  
  37. I_FORMAT = "<BHHI%dsI%dsI%ds" # has_pass, players, maxplayers, strlen_hostname, hostname, strlen_gamemode, gamemode, strlen_lang, lang
  38. P_FORMAT = "<B%dsI" # len_of_name, name, score
  39.  
  40. RESPONSE_TO_I = struct.pack(I_FORMAT % (len(SERVER_NAME), len(GAMEMODE_NAME), len(LANGUAGE)), HAS_PASS, PLAYERS, MAX_PLAYERS, len(SERVER_NAME), SERVER_NAME, len(GAMEMODE_NAME), GAMEMODE_NAME, len(LANGUAGE), LANGUAGE)
  41. DEFAULT_RESPONSE = struct.pack("H", 0)
  42.  
  43. s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  44. s.bind((BIND_ADDRESS, PORT))
  45.  
  46. while True:
  47.     data, addr = s.recvfrom(RECV_BUFFER)
  48.     if len(data) < HEADER_SIZE:
  49.         continue
  50.     if data[10] == OPCODE_INFO: # INFO
  51.         s.sendto(data + RESPONSE_TO_I, addr)
  52.     elif data[10] == OPCODE_PING:
  53.         s.sendto(data, addr)
  54.     elif data[10] == OPCODE_CLIENT_LIST:
  55.         s.sendto(data + make_client_list_response(PLAYERS), addr)
  56.     else:
  57.         s.sendto(data + DEFAULT_RESPONSE, addr)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement