diff --git a/docs/api/steam.util.rst b/docs/api/steam.util.rst index a2585f3..759d9cb 100644 --- a/docs/api/steam.util.rst +++ b/docs/api/steam.util.rst @@ -6,6 +6,14 @@ util :undoc-members: :show-inheritance: +util.binary +----------- + +.. automodule:: steam.util.binary + :members: + :undoc-members: + :show-inheritance: + util.throttle ------------- @@ -21,11 +29,3 @@ util.web :members: :undoc-members: :show-inheritance: - -util.binary ------------ - -.. automodule:: steam.util.binary - :members: - :undoc-members: - :show-inheritance: diff --git a/steam/core/msg/structs.py b/steam/core/msg/structs.py index 9a88655..9322fb8 100644 --- a/steam/core/msg/structs.py +++ b/steam/core/msg/structs.py @@ -139,13 +139,13 @@ class ClientVACBanStatus(StructMessage): def load(self, data): buf = StructReader(data) - numBans, = buf.read_format("<I") + numBans, = buf.unpack("<I") for _ in range(numBans): m = self.VACBanRange() self.ranges.append(m) - m.start, m.end, _ = buf.read_format("<III") + m.start, m.end, _ = buf.unpack("<III") if m.start > m.end: m.start, m.end = m.end, m.start @@ -181,7 +181,7 @@ class ClientChatMsg(StructMessage): def load(self, data): buf = StructReader(data) - self.steamIdChatter, self.steamIdChatRoom, self.ChatMsgType = buf.read_format("<QQI") + self.steamIdChatter, self.steamIdChatRoom, self.ChatMsgType = buf.unpack("<QQI") self.text = buf.read_cstring().decode('utf-8') def __str__(self): @@ -269,15 +269,15 @@ class ClientMarketingMessageUpdate2(StructMessage): def load(self, data): buf = StructReader(data) - self.time, count = buf.read_format("<II") + self.time, count = buf.unpack("<II") for _ in range(count): m = self.MarketingMessage() self.messages.append(m) - length, m.id = buf.read_format("<IQ") + length, m.id = buf.unpack("<IQ") m.url = buf.read_cstring().decode('utf-8') - m.flags = buf.read_format("<I") + m.flags = buf.unpack("<I") def __str__(self): text = ["time: %s" % self.time, diff --git a/steam/util/binary.py b/steam/util/binary.py index 56043ad..9050d2c 100644 --- a/steam/util/binary.py +++ b/steam/util/binary.py @@ -12,18 +12,29 @@ class StructReader(object): self.data = data self.offset = 0 - def read_cstring(self): + def read(self, n=1): + """Return n bytes + + :param n: number of bytes to return + :type n: :class:`int` + :return: bytes + :rtype: :class:`bytes` + """ + self.offset += n + return self.data[self.offset - n:self.offset] + + def read_cstring(self, terminator=b'\x00'): """Reads a single null termianted string :return: string without bytes :rtype: :class:`bytes` """ - null_index = self.data.find(b'\x00', self.offset) - text = self.data[self.offset:null_index] # bytes without the null - self.offset = null_index + 1 # advanced past null - return text + null_index = self.data.find(terminator, self.offset) + result = self.data[self.offset:null_index] # bytes without the terminator + self.offset = null_index + len(terminator) # advance offset past terminator + return result - def read_format(self, format_text): + def unpack(self, format_text): """Unpack bytes using struct modules format :param format_text: struct's module format