fix for Context changes

This commit is contained in:
əlemi 2022-01-15 04:22:13 +01:00
parent 4a6b843c24
commit 416b545e46
3 changed files with 18 additions and 13 deletions

View file

@ -222,7 +222,7 @@ class Dispatcher:
buffer = io.BytesIO(data)
if self.compression is not None:
decompressed_size = VarInt.read(buffer, Context())
decompressed_size = VarInt.read(buffer, Context(_proto=self.proto))
if decompressed_size > 0:
decompressor = zlib.decompressobj()
decompressed_data = decompressor.decompress(buffer.read())
@ -230,7 +230,7 @@ class Dispatcher:
raise ValueError(f"Failed decompressing packet: expected size is {decompressed_size}, but actual size is {len(decompressed_data)}")
buffer = io.BytesIO(decompressed_data)
packet_id = VarInt.read(buffer, Context())
packet_id = VarInt.read(buffer, Context(_proto=self.proto))
if self.state == ConnectionState.PLAY and self._packet_id_whitelist \
and packet_id not in self._packet_id_whitelist:
self._logger.debug("[<--] Received | Packet(0x%02x) (ignored)", packet_id)
@ -269,12 +269,12 @@ class Dispatcher:
if self.compression is not None:
if length > self.compression:
new_buffer = io.BytesIO()
VarInt.write(length, new_buffer)
VarInt.write(length, new_buffer, Context(_proto=self.proto))
new_buffer.write(zlib.compress(buffer.read()))
buffer = new_buffer
else:
new_buffer = io.BytesIO()
VarInt.write(0, new_buffer)
VarInt.write(0, new_buffer, Context(_proto=self.proto))
new_buffer.write(buffer.read())
buffer = new_buffer
length = len(buffer.getvalue())

View file

@ -3,7 +3,7 @@ import json
from asyncio import Event
from typing import Tuple, Dict, Any
from .types import Type, VarInt
from .types import Type, VarInt, Context
class Packet:
__slots__ = 'id', 'definition', '_processed', '_proto', '_state'
@ -24,7 +24,7 @@ class Packet:
self.id = self._ids[proto]
for name, t in self.definition:
if name in kwargs and kwargs[name] is not None:
setattr(self, name, t.pytype(kwargs[name]))
setattr(self, name, kwargs[name])
@property
def processed(self) -> Event:
@ -33,18 +33,20 @@ class Packet:
@classmethod
def deserialize(cls, proto:int, buffer:io.BytesIO):
pkt = cls(proto)
ctx = Context(_proto=proto)
for k, t in cls._definitions[proto]:
setattr(pkt, k, t.read(buffer, ctx=pkt))
return pkt
setattr(ctx, k, t.read(buffer, ctx=ctx))
return cls(proto, **ctx.as_dict())
# return cls(proto, **{ name : t.read(buffer) for (name, t) in cls._definitions[proto] })
def serialize(self) -> io.BytesIO:
ctx = Context(_proto=self._proto)
buf = io.BytesIO()
VarInt.write(self.id, buf)
VarInt.write(self.id, buf, ctx=ctx)
for name, t in self.definition:
if getattr(self, name, None) is not None: # minecraft proto has no null type: this is an optional field left unset
t.write(getattr(self, name), buf, ctx=self)
setattr(ctx, name, getattr(self, name)) # TODO maybe **vars(self) in ctx constructor?
t.write(getattr(self, name), buf, ctx=ctx)
buf.seek(0)
return buf

View file

@ -13,14 +13,17 @@ from .definitions import Item
class Context(object):
def __init__(self, **kwargs):
for k, v in kwargs:
for k, v in kwargs.items():
setattr(self, k, v)
def as_dict(self) -> dict:
return vars(self) # is this reliable?
def __getattr__(self, name) -> Any:
return None # return None rather than raising an exc
def __str__(self) -> str:
return json.dumps(vars(self), indent=2, default=str, sort_keys=True)
return json.dumps(self.as_dict(), indent=2, default=str, sort_keys=True)
def __repr__(self) -> str:
values = ( f"{k}={repr(v)}" for k,v in vars(self).items() )