mirror of
https://gitlab.com/crafty-controller/crafty-4.git
synced 2024-08-30 18:23:09 +00:00
Remove bedrock naming ping scheme. Add raknet
This commit is contained in:
parent
a46a962c86
commit
78d27bbc13
@ -8,7 +8,7 @@ import logging.config
|
|||||||
import uuid
|
import uuid
|
||||||
import random
|
import random
|
||||||
|
|
||||||
from app.classes.minecraft.bedrock_ping import BedrockPing
|
from app.classes.minecraft.raknet_ping import RaknetPing
|
||||||
from app.classes.shared.console import Console
|
from app.classes.shared.console import Console
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@ -176,7 +176,7 @@ def ping(ip, port):
|
|||||||
|
|
||||||
|
|
||||||
# For the rest of requests see wiki.vg/Protocol
|
# For the rest of requests see wiki.vg/Protocol
|
||||||
def ping_bedrock(ip, port):
|
def ping_raknet(ip, port):
|
||||||
rand = random.Random()
|
rand = random.Random()
|
||||||
try:
|
try:
|
||||||
# pylint: disable=consider-using-f-string
|
# pylint: disable=consider-using-f-string
|
||||||
@ -185,7 +185,7 @@ def ping_bedrock(ip, port):
|
|||||||
except:
|
except:
|
||||||
client_guid = 0
|
client_guid = 0
|
||||||
try:
|
try:
|
||||||
brp = BedrockPing(ip, port, client_guid)
|
brp = RaknetPing(ip, port, client_guid)
|
||||||
return brp.ping()
|
return brp.ping()
|
||||||
except:
|
except:
|
||||||
logger.debug("Unable to get RakNet stats")
|
logger.debug("Unable to get RakNet stats")
|
@ -9,7 +9,7 @@ with redirect_stderr(NullWriter()):
|
|||||||
import psutil
|
import psutil
|
||||||
|
|
||||||
|
|
||||||
class BedrockPing:
|
class RaknetPing:
|
||||||
magic = b"\x00\xff\xff\x00\xfe\xfe\xfe\xfe\xfd\xfd\xfd\xfd\x12\x34\x56\x78"
|
magic = b"\x00\xff\xff\x00\xfe\xfe\xfe\xfe\xfd\xfd\xfd\xfd\x12\x34\x56\x78"
|
||||||
fields = { # (len, signed)
|
fields = { # (len, signed)
|
||||||
"byte": (1, False),
|
"byte": (1, False),
|
||||||
@ -25,19 +25,19 @@ class BedrockPing:
|
|||||||
}
|
}
|
||||||
byte_order = "big"
|
byte_order = "big"
|
||||||
|
|
||||||
def __init__(self, bedrock_addr, bedrock_port, client_guid=0, timeout=5):
|
def __init__(self, server_addr, server_port, client_guid=0, timeout=5):
|
||||||
self.addr = bedrock_addr
|
self.addr = server_addr
|
||||||
self.port = bedrock_port
|
self.port = server_port
|
||||||
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
self.sock.settimeout(timeout)
|
self.sock.settimeout(timeout)
|
||||||
self.proc = psutil.Process(os.getpid())
|
self.proc = psutil.Process(os.getpid())
|
||||||
self.guid = client_guid
|
self.guid = client_guid
|
||||||
self.guid_bytes = self.guid.to_bytes(8, BedrockPing.byte_order)
|
self.guid_bytes = self.guid.to_bytes(8, RaknetPing.byte_order)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def __byter(in_val, to_type):
|
def __byter(in_val, to_type):
|
||||||
f = BedrockPing.fields[to_type]
|
f = RaknetPing.fields[to_type]
|
||||||
return in_val.to_bytes(f[0], BedrockPing.byte_order, signed=f[1])
|
return in_val.to_bytes(f[0], RaknetPing.byte_order, signed=f[1])
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def __slice(in_bytes, pattern):
|
def __slice(in_bytes, pattern):
|
||||||
@ -46,7 +46,7 @@ class BedrockPing:
|
|||||||
pattern_index = 0
|
pattern_index = 0
|
||||||
while bytes_index < len(in_bytes):
|
while bytes_index < len(in_bytes):
|
||||||
try:
|
try:
|
||||||
field = BedrockPing.fields[pattern[pattern_index]]
|
field = RaknetPing.fields[pattern[pattern_index]]
|
||||||
except IndexError as index_error:
|
except IndexError as index_error:
|
||||||
raise IndexError(
|
raise IndexError(
|
||||||
"Ran out of pattern with additional bytes remaining"
|
"Ran out of pattern with additional bytes remaining"
|
||||||
@ -55,7 +55,7 @@ class BedrockPing:
|
|||||||
string_header_length = field[0]
|
string_header_length = field[0]
|
||||||
string_length = int.from_bytes(
|
string_length = int.from_bytes(
|
||||||
in_bytes[bytes_index : bytes_index + string_header_length],
|
in_bytes[bytes_index : bytes_index + string_header_length],
|
||||||
BedrockPing.byte_order,
|
RaknetPing.byte_order,
|
||||||
signed=field[1],
|
signed=field[1],
|
||||||
)
|
)
|
||||||
length = string_header_length + string_length
|
length = string_header_length + string_length
|
||||||
@ -75,7 +75,7 @@ class BedrockPing:
|
|||||||
ret.append(
|
ret.append(
|
||||||
int.from_bytes(
|
int.from_bytes(
|
||||||
in_bytes[bytes_index : bytes_index + length],
|
in_bytes[bytes_index : bytes_index + length],
|
||||||
BedrockPing.byte_order,
|
RaknetPing.byte_order,
|
||||||
signed=field[1],
|
signed=field[1],
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -89,10 +89,10 @@ class BedrockPing:
|
|||||||
return time.perf_counter_ns() // 1000000
|
return time.perf_counter_ns() // 1000000
|
||||||
|
|
||||||
def __sendping(self):
|
def __sendping(self):
|
||||||
pack_id = BedrockPing.__byter(0x01, "byte")
|
pack_id = RaknetPing.__byter(0x01, "byte")
|
||||||
now = BedrockPing.__byter(BedrockPing.__get_time(), "ulong")
|
now = RaknetPing.__byter(RaknetPing.__get_time(), "ulong")
|
||||||
guid = self.guid_bytes
|
guid = self.guid_bytes
|
||||||
d2s = pack_id + now + BedrockPing.magic + guid
|
d2s = pack_id + now + RaknetPing.magic + guid
|
||||||
# print("S:", d2s)
|
# print("S:", d2s)
|
||||||
self.sock.sendto(d2s, (self.addr, self.port))
|
self.sock.sendto(d2s, (self.addr, self.port))
|
||||||
|
|
||||||
@ -100,10 +100,10 @@ class BedrockPing:
|
|||||||
data = self.sock.recv(4096)
|
data = self.sock.recv(4096)
|
||||||
if data[0] == 0x1C:
|
if data[0] == 0x1C:
|
||||||
ret = {}
|
ret = {}
|
||||||
sliced = BedrockPing.__slice(
|
sliced = RaknetPing.__slice(
|
||||||
data, ["byte", "ulong", "ulong", "magic", "string"]
|
data, ["byte", "ulong", "ulong", "magic", "string"]
|
||||||
)
|
)
|
||||||
if sliced[3] != BedrockPing.magic:
|
if sliced[3] != RaknetPing.magic:
|
||||||
raise ValueError(f"Incorrect magic received ({sliced[3]})")
|
raise ValueError(f"Incorrect magic received ({sliced[3]})")
|
||||||
ret["server_guid"] = sliced[2]
|
ret["server_guid"] = sliced[2]
|
||||||
ret["server_string_raw"] = sliced[4]
|
ret["server_string_raw"] = sliced[4]
|
@ -6,7 +6,7 @@ import datetime
|
|||||||
import base64
|
import base64
|
||||||
import typing as t
|
import typing as t
|
||||||
|
|
||||||
from app.classes.minecraft.mc_ping import ping
|
from app.classes.minecraft.ping import ping
|
||||||
from app.classes.models.management import HostStats
|
from app.classes.models.management import HostStats
|
||||||
from app.classes.models.servers import HelperServers
|
from app.classes.models.servers import HelperServers
|
||||||
from app.classes.shared.null_writer import NullWriter
|
from app.classes.shared.null_writer import NullWriter
|
||||||
|
@ -19,7 +19,7 @@ from apscheduler.schedulers.background import BackgroundScheduler
|
|||||||
from apscheduler.jobstores.base import JobLookupError
|
from apscheduler.jobstores.base import JobLookupError
|
||||||
|
|
||||||
from app.classes.minecraft.stats import Stats
|
from app.classes.minecraft.stats import Stats
|
||||||
from app.classes.minecraft.mc_ping import ping, ping_bedrock
|
from app.classes.minecraft.ping import ping, ping_raknet
|
||||||
from app.classes.models.servers import HelperServers, Servers
|
from app.classes.models.servers import HelperServers, Servers
|
||||||
from app.classes.models.server_stats import HelperServerStats
|
from app.classes.models.server_stats import HelperServerStats
|
||||||
from app.classes.models.management import HelpersManagement
|
from app.classes.models.management import HelpersManagement
|
||||||
@ -1484,7 +1484,7 @@ class ServerInstance:
|
|||||||
|
|
||||||
logger.debug(f"Pinging server '{server}' on {internal_ip}:{server_port}")
|
logger.debug(f"Pinging server '{server}' on {internal_ip}:{server_port}")
|
||||||
if HelperServers.get_server_type_by_id(server_id) == "minecraft-bedrock":
|
if HelperServers.get_server_type_by_id(server_id) == "minecraft-bedrock":
|
||||||
int_mc_ping = ping_bedrock(internal_ip, int(server_port))
|
int_mc_ping = ping_raknet(internal_ip, int(server_port))
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
int_mc_ping = ping(internal_ip, int(server_port))
|
int_mc_ping = ping(internal_ip, int(server_port))
|
||||||
@ -1613,7 +1613,7 @@ class ServerInstance:
|
|||||||
|
|
||||||
logger.debug(f"Pinging server '{self.name}' on {internal_ip}:{server_port}")
|
logger.debug(f"Pinging server '{self.name}' on {internal_ip}:{server_port}")
|
||||||
if HelperServers.get_server_type_by_id(server_id) == "minecraft-bedrock":
|
if HelperServers.get_server_type_by_id(server_id) == "minecraft-bedrock":
|
||||||
int_mc_ping = ping_bedrock(internal_ip, int(server_port))
|
int_mc_ping = ping_raknet(internal_ip, int(server_port))
|
||||||
else:
|
else:
|
||||||
int_mc_ping = ping(internal_ip, int(server_port))
|
int_mc_ping = ping(internal_ip, int(server_port))
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user