def handle_packet(self): packet = self.server.read_thread_to_main_packet() if packet is None: return packet_id = ord(packet[0]) offset = 1 if packet_id == PyRakLib.PACKET_ENCAPSULATED: offset += 1 length = ord(packet[offset]) identifier = packet[offset:length] offset += length flags = ord(packet[offset]) buffer = packet[offset] self.instance.handle_encapsulated( identifier, EncapsulatedPacket.from_internal_binary(buffer), flags) elif packet_id == PyRakLib.PACKET_RAW: length = ord(packet[offset + 1]) address = packet[offset:length] offset += length port = Binary.read_short(packet[offset:2]) offset += 2 payload = packet[offset:] self.instance.handle_raw(address, port, payload) elif packet_id == PyRakLib.PACKET_SET_OPTION: length = ord(packet[offset + 1]) name = packet[offset:length] offset += length value = packet[offset:] self.instance.handle_option(name, value) elif packet_id == PyRakLib.PACKET_OPEN_SESSION: length = ord(packet[offset + 1]) identifier = packet[offset:length] offset += length length = ord(packet[offset + 1]) address = packet[offset:length] offset += length port = Binary.read_short(packet[offset:2]) offset += 2 client_id = Binary.read_long(packet[offset:8]) self.instance.open_session(identifier, address, port, client_id) elif packet_id == PyRakLib.PACKET_CLOSE_SESSION: length = ord(packet[offset + 1]) identifier = packet[offset:length] offset += length length = ord(packet[offset + 1]) reason = packet[offset:length] self.instance.close_session(identifier, reason) elif packet_id == PyRakLib.PACKET_INVALID_SESSION: length = ord(packet[offset + 1]) identifier = packet[offset:length] self.instance.close_session(identifier, "Invalid session") elif packet_id == PyRakLib.PACKET_ACK_NOTIFICATION: length = ord(packet[offset + 1]) identifier = packet[offset:length] offset += length identifier_ack = Binary.read_int(packet[offset:4]) self.instance.notify_ack(identifier, identifier_ack) elif packet_id == PyRakLib.PACKET_REPORT_PING: length = ord(packet[offset + 1]) identifier = packet[offset:length] offset += length ping_ms = Binary.read_int(packet[offset:4]) self.instance.update_ping(identifier, ping_ms) return False
def get_long(self) -> int: return Binary.read_long(self.get(8))