This repository has been archived on 2020-03-29. You can view files and clone it, but cannot push or open issues or pull requests.
sampy_archive/handlers/serverPingHandler.py

112 lines
2.6 KiB
Python

import struct
from objects import glob
from helpers import dataHelper
def handle(client, data):
ping_ip = ".".join((str(x) for x in struct.unpack(b"<BBBB", data[4:8])))
print("![{}] -> Pinging to {}".format(client.addr, ping_ip))
if len(data) == 11: # We should add our data ontop
if data[-1:] in RESPONSE:
data += RESPONSE[data[-1:]]()
return data
def query_i():
len_hostname = len(glob.config["server"]["hostname"])
len_mode = len(glob.config["server"]["mode"])
len_language = len(glob.config["server"]["language"])
packet = struct.pack(b"<?HHI%dsI%dsI%ds" % (len_hostname, len_mode, len_language),
False,
len(get_online_players()),
glob.config["server"]["max_players"],
len_hostname,
glob.config["server"]["hostname"].encode(),
len_mode,
glob.config["server"]["mode"].encode(),
len_language,
glob.config["server"]["language"].encode())
return packet
def query_r():
packet_data = []
rules = get_rules()
packet_data.append(len(rules)) # len_rules
for name, value in rules.items():
packet_data.append([
len(name), name,
len(value), value
])
flat_packet_data = dataHelper.flatten(packet_data)
packet = struct.pack(b"<H" + b"B%dsB%ds" * flat_packet_data[0] # using len_rules
% tuple(len(y) for x in rules.items() for y in x), # tuple of only rules entries
*flat_packet_data)
return packet
def query_c():
packet_data = []
players_scores = get_players_scores()
packet_data.append(len(players_scores))
for name, value in players_scores.items():
packet_data.append([
len(name), name,
value
])
flat_packet_data = dataHelper.flatten(packet_data)
packet = struct.pack(b"<H" + b"B%dsI" * flat_packet_data[0]
% tuple(len(x) for x in players_scores.keys()),
*flat_packet_data)
return packet
def query_d():
packet_data = []
players = get_online_players()
packet_data.append(len(players))
for player in players:
packet_data.append([
player["id"],
len(player["nick"]), player["nick"],
player["score"],
player["ping"]
])
flat_packet_data = dataHelper.flatten(packet_data)
packet = struct.pack(b"<H" + b"cc%dsII" * flat_packet_data[0]
% [len(player["nick"]) for player in players],
*flat_packet_data)
return packet
def get_online_players(): #TODO: Get data from server's client objects
return [
{"nick": b"Sunpy", "score": 64, "ping": 8, "id": 1} # replace id with function to get player's id
]
def get_rules(): #TODO
return {b"Rule name sample": b"Rule value"}
def get_players_scores(): #TODO
return {b"Sunpy": 64, b"username": 123}
RESPONSE = { #TODO: c, d & p (https://wiki.sa-mp.com/wiki/Query_Mechanism)
b"i": query_i,
b"r": query_r,
b"c": query_c,
b"d": query_d
}