Skip to content

Commit 17085ab

Browse files
committed
Clean up code redundancy in PacketBuilder/PacketReader
1 parent 029e03d commit 17085ab

File tree

4 files changed

+19
-61
lines changed

4 files changed

+19
-61
lines changed

bncs/packets.py

+1-18
Original file line numberDiff line numberDiff line change
@@ -113,15 +113,7 @@
113113

114114

115115
class BncsPacket(PacketBuilder):
116-
def __init__(self, packet_id):
117-
super().__init__(packet_id)
118-
119-
@property
120-
def length(self):
121-
return self.__len__()
122-
123-
def __len__(self):
124-
return super().__len__() + 4
116+
HEADER_SIZE = 4
125117

126118
def __str__(self):
127119
return "BNCS " + super().__str__()
@@ -150,17 +142,8 @@ def __init__(self, data):
150142
self.packet_id = self.get_byte()
151143
self.length = self.get_word()
152144

153-
def __len__(self):
154-
return self.length
155-
156145
def __str__(self):
157146
return "BNCS " + super().__str__()
158147

159148
def get_name(self):
160149
return get_packet_name(self, globals(), "SID_")
161-
162-
@classmethod
163-
async def read_from(cls, reader):
164-
packet = cls(await reader.readexactly(4))
165-
await packet.fill(reader)
166-
return packet

bncs/utils/packet.py

+16-4
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ def get_packet_name(packet, names, prefix=None):
1717

1818
class PacketBuilder(abc.ABC, DataBuffer):
1919
"""Helper class for creating and writing packets."""
20+
HEADER_SIZE = 0
21+
2022
def __init__(self, packet_id, data=None):
2123
"""Creates a new packet with the specified ID."""
2224
self.packet_id = packet_id
@@ -25,7 +27,10 @@ def __init__(self, packet_id, data=None):
2527

2628
@property
2729
def length(self):
28-
return super().__len__()
30+
return len(self)
31+
32+
def __len__(self):
33+
return super().__len__() + self.HEADER_SIZE
2934

3035
def __str__(self):
3136
if str_id := self.get_name():
@@ -82,7 +87,7 @@ def get_name(self):
8287

8388
@property
8489
def data_len(self):
85-
"""The actual number of bytes in the packet."""
90+
"""The actual length of the data in the buffer."""
8691
return super().__len__()
8792

8893
@property
@@ -104,10 +109,17 @@ def reset(self):
104109
self.position = self.HEADER_SIZE
105110

106111
@classmethod
107-
@abc.abstractmethod
108112
async def read_from(cls, stream):
109113
"""Reads a full packet from the stream"""
110-
pass
114+
from asyncio import IncompleteReadError
115+
116+
try:
117+
packet = cls(await stream.readexactly(cls.HEADER_SIZE))
118+
except IncompleteReadError:
119+
return None
120+
121+
await packet.fill(stream)
122+
return packet
111123

112124
async def fill(self, stream):
113125
"""Reads the remaining packet data from a stream."""

bnls/packets.py

+1-20
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,7 @@
3434

3535

3636
class BnlsPacket(PacketBuilder):
37-
def __init__(self, packet_id):
38-
super().__init__(packet_id)
39-
40-
def __len__(self):
41-
return super().__len__() + 3
37+
HEADER_SIZE = 3
4238

4339
def __str__(self):
4440
return "BNLS " + super().__str__()
@@ -62,23 +58,8 @@ def __init__(self, data):
6258
self.length = self.get_word()
6359
self.packet_id = self.get_byte()
6460

65-
def __len__(self):
66-
return self.length
67-
6861
def __str__(self):
6962
return "BNLS " + super().__str__()
7063

7164
def get_name(self):
7265
return get_packet_name(self, globals(), "BNLS_")
73-
74-
@classmethod
75-
async def read_from(cls, reader):
76-
from asyncio import IncompleteReadError
77-
78-
try:
79-
packet = BnlsReader(await reader.readexactly(3))
80-
except IncompleteReadError:
81-
return None
82-
83-
await packet.fill(reader)
84-
return packet

botnet/packets.py

+1-19
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,7 @@
2626

2727

2828
class BotNetPacket(PacketBuilder):
29-
def __init__(self, packet_id):
30-
super().__init__(packet_id)
31-
32-
def __len__(self):
33-
return super().__len__() + 4
29+
HEADER_SIZE = 4
3430

3531
def __str__(self):
3632
return "BotNet " + super().__str__()
@@ -59,22 +55,8 @@ def __init__(self, data):
5955
self.packet_id = self.get_byte()
6056
self.length = self.get_word()
6157

62-
def __len__(self):
63-
return self.length
64-
6558
def __str__(self):
6659
return "BotNet " + super().__str__()
6760

6861
def get_name(self):
6962
return get_packet_name(self, globals(), "BOTNET_")
70-
71-
@classmethod
72-
async def read_from(cls, stream):
73-
from asyncio import IncompleteReadError
74-
try:
75-
packet = cls(await stream.readexactly(4))
76-
except IncompleteReadError:
77-
return None
78-
79-
await packet.fill(stream)
80-
return packet

0 commit comments

Comments
 (0)