1 from struct import Struct
2
3 from lacewing.baseloader import _BaseLoader, _EmptyLoader
4 from lacewing.bitdict import BitDict
5 from lacewing.packetloaders.common import (CONNECT, SET_NAME, JOIN_CHANNEL,
6 LEAVE_CHANNEL, CHANNEL_LIST)
7 from lacewing.packetloaders.common import (_BinaryMessageMixin,
8 _ObjectMessageMixin)
9
10 RESPONSE_DATA = Struct('<BB')
11 NAME_DATA = Struct('<B')
12 SUBCHANNEL_DATA = Struct('<B')
13 JOIN_CHANNEL_DATA = Struct('<BB')
14 CHANNEL_ID = Struct('<H')
15 YOUR_ID = Struct('<H')
16 PEER_DATA = Struct('<HBB')
17 CHANNEL_LIST_DATA = Struct('<HB')
18 CHANNEL_MESSAGE_DATA = Struct('<BH')
19 PEER_MESSAGE_DATA = Struct('<BHH')
20 NEW_PEER_DATA = Struct('<HHB')
21 PEER_LEAVE_DATA = Struct('<HH')
22
37
39 response = None
40 success = None
41 welcome = None
42 name = None
43 isMaster = None
44 channel = None
45 peers = None
46 channels = None
47 playerId = None
48 value = None
49
50 - def read(self, data):
51 self.response, self.success = RESPONSE_DATA.unpack_from(data)
52 data = buffer(data, 2)
53 if self.response == CONNECT and self.success:
54 self.playerId, = YOUR_ID.unpack_from(data)
55 self.welcome = str(buffer(data, 2))
56 elif self.response == SET_NAME:
57 size, = NAME_DATA.unpack_from(data)
58 self.name = str(buffer(data, 1, size))
59 data = buffer(data, 1 + size)
60 elif self.response == JOIN_CHANNEL:
61 self.isMaster, size = JOIN_CHANNEL_DATA.unpack_from(data)
62 self.name = str(buffer(data, JOIN_CHANNEL_DATA.size, size))
63 data = buffer(data, JOIN_CHANNEL_DATA.size + size)
64 if self.success:
65 self.channel, = CHANNEL_ID.unpack_from(data)
66 data = buffer(data, 2)
67 self.peers = peers = []
68 while data:
69 peer = ChannelPeer()
70 peers.append(peer)
71 bytesRead = peer.read(data)
72 data = buffer(data, bytesRead)
73 elif self.response == LEAVE_CHANNEL:
74 self.channel, = CHANNEL_ID.unpack_from(data)
75 data = buffer(data, 2)
76 elif self.response == CHANNEL_LIST and self.success:
77 self.channels = channels = []
78 while data:
79 count, size = CHANNEL_LIST_DATA.unpack_from(data)
80 name = buffer(data, CHANNEL_LIST_DATA.size, size)
81 data = buffer(data, CHANNEL_LIST_DATA.size + size)
82 channels.append((name, count))
83 if not self.success:
84 self.value = str(data)
85
86 - def addPeer(self, name, id, isMaster):
94
117
126
139
142
145
148
151
154
157
158 -class Peer(_BaseLoader):
178
181
182 -class Ping(_EmptyLoader):
184