Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # responds to SAMP server query info
- # https://wiki.sa-mp.com/wiki/Query_Mechanism
- # yanir3
- import socket
- import struct
- import random
- # SAMP-0.3 related consts:
- OPCODE_INFO = "i"
- OPCODE_PING = "p"
- OPCODE_CLIENT_LIST = "c"
- HEADER_SIZE = 11
- # Server bindings:
- BIND_ADDRESS = "0.0.0.0" # all interfaces
- PORT = 7777 # samp default port
- RECV_BUFFER = 1024
- # Config:
- SERVER_NAME = "2016"
- GAMEMODE_NAME = "?"
- LANGUAGE = "=]"
- PLAYERS = 50
- MAX_PLAYERS = 500
- HAS_PASS = 0 # 1 = yes
- FAKE_PLAYER_NAMES = ["0x01", "0x02", "0x03", "0x04"]
- def make_client_list_response(players_amount):
- RESPONSE_TO_C = struct.pack("<H", players_amount)
- for i in range(players_amount + 1):
- name = random.choice(FAKE_PLAYER_NAMES)
- RESPONSE_TO_C += struct.pack(P_FORMAT % (len(name)), len(name), name, random.randint(1, 98999))
- return RESPONSE_TO_C
- I_FORMAT = "<BHHI%dsI%dsI%ds" # has_pass, players, maxplayers, strlen_hostname, hostname, strlen_gamemode, gamemode, strlen_lang, lang
- P_FORMAT = "<B%dsI" # len_of_name, name, score
- 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)
- DEFAULT_RESPONSE = struct.pack("H", 0)
- s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- s.bind((BIND_ADDRESS, PORT))
- while True:
- data, addr = s.recvfrom(RECV_BUFFER)
- if len(data) < HEADER_SIZE:
- continue
- if data[10] == OPCODE_INFO: # INFO
- s.sendto(data + RESPONSE_TO_I, addr)
- elif data[10] == OPCODE_PING:
- s.sendto(data, addr)
- elif data[10] == OPCODE_CLIENT_LIST:
- s.sendto(data + make_client_list_response(PLAYERS), addr)
- else:
- s.sendto(data + DEFAULT_RESPONSE, addr)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement