Package lacewing :: Package moo :: Package packetloaders :: Module server
[frames] | no frames]

Source Code for Module lacewing.moo.packetloaders.server

  1  from struct import unpack_from, pack 
  2   
  3  from lacewing.moo.packetloaders.common import (unpack_string, _MooLoader,  
  4      _ChannelMixin, _ConnectionMixin) 
  5   
  6  from lacewing.moo.packetloaders.message import Message 
  7   
8 -class MOTD(_MooLoader):
9 motd = None 10
11 - def _load(self, data):
12 motdSize, = unpack_from('<I', data) 13 self.motd = unpack_string(data, motdSize, 4) 14 return 4 + motdSize
15
16 - def generate(self):
17 return pack('<I', len(self.motd)) + self.motd
18
19 -class AssignedID(_MooLoader, _ConnectionMixin):
20 majorVersion = 3 # don't want our user to 21 minorVersion = 0 # fill these in 22 playerId = None 23
24 - def _load(self, data):
25 (self.majorVersion, 26 self.minorVersion, 27 self.playerId) = unpack_from('<BBI', data) 28 return 6
29
30 - def generate(self):
31 return pack('<BBI', self.majorVersion, self.minorVersion, 32 self.playerId)
33 34
35 -class _PlayerCommon(_MooLoader, _ChannelMixin, _ConnectionMixin):
36 playerId = None 37 channelId = None 38 masterId = None 39 playerName = None 40 playerIp = None 41
42 - def _load(self, data):
43 (self.playerId, 44 self.channelId, 45 self.masterId, 46 playerNameSize) = unpack_from('<IIII', data) 47 self.playerName = unpack_string(data, playerNameSize, 16) 48 offset = 16 + playerNameSize 49 playerIpSize, = unpack_from('<I', data, offset) 50 offset += 4 51 self.playerIp = unpack_string(data, playerIpSize, offset) 52 offset += playerIpSize 53 return offset
54
55 - def generate(self):
56 return ''.join([ 57 pack('<IIII', self.playerId, self.channelId, self.masterId, 58 len(self.playerName)), self.playerName, pack('<I', len(self.playerIp)), 59 self.playerIp 60 ])
61
62 -class PlayerExists(_PlayerCommon):
63 pass
64
65 -class PlayerJoined(_PlayerCommon):
66 pass
67
68 -class PlayerLeft(_MooLoader, _ChannelMixin, _ConnectionMixin):
69 playerId = None 70 channelId = None 71 masterId = None 72
73 - def _load(self, data):
74 (self.playerId, 75 self.channelId, 76 self.masterId) = unpack_from('<III', data) 77 return 12
78
79 - def generate(self):
80 return ''.join([ 81 pack('<III', self.playerId, self.channelId, self.masterId) 82 ])
83
84 -class PlayerChanged(_MooLoader, _ConnectionMixin):
85 playerId = None 86 playerName = None 87
88 - def _load(self, data):
89 (self.playerId, 90 playerNameSize) = unpack_from('<II', data) 91 self.playerName = unpack_string(data, playerNameSize, 8) 92 offset = 8 + playerNameSize 93 otherPlayerId, otherNameSize = unpack_from('<II', data, offset) 94 offset += 8 95 otherPlayerName = unpack_string(data, otherNameSize, offset) 96 offset += otherNameSize 97 if (self.playerName != otherPlayerName or 98 self.playerId != otherPlayerId): 99 raise NotImplementedError 100 101 return offset
102
103 - def generate(self):
104 return ''.join([ 105 pack('<II', self.playerId, len(self.playerName)), self.playerName, 106 pack('<II', self.playerId, len(self.playerName)), self.playerName 107 ])
108
109 -class ChannelJoined(_MooLoader, _ChannelMixin, _ConnectionMixin):
110 playerId = None 111 channelId = None 112 masterId = None 113 playerName = None 114 playerIp = None 115 channelName = None 116
117 - def _load(self, data):
118 (self.playerId, 119 self.channelId, 120 self.masterId, 121 playerNameSize) = unpack_from('<IIII', data) 122 self.playerName = unpack_string(data, playerNameSize, 16) 123 offset = 16 + playerNameSize 124 playerIpSize, = unpack_from('<I', data, offset) 125 offset += 4 126 self.playerIp = unpack_string(data, playerIpSize, offset) 127 offset += playerIpSize 128 channelSize, = unpack_from('<I', data, offset) 129 offset += 4 130 self.channelName = unpack_string(data, channelSize, offset) 131 offset += channelSize 132 return offset
133
134 - def generate(self):
135 return ''.join([ 136 pack('<IIII', self.playerId, self.channelId, self.masterId, 137 len(self.playerName)), self.playerName, pack('<I', len(self.playerIp)), 138 self.playerIp, pack('<I', len(self.channelName)), self.channelName 139 ])
140
141 -class FromChannelMessage(_MooLoader, _ChannelMixin, _ConnectionMixin):
142 subchannel = None 143 message = None 144 channelId = None 145 playerId = None 146
147 - def _load(self, data):
148 (self.subchannel, 149 self.channelId, 150 self.playerId, 151 messageSize) = unpack_from('<HIII', data) 152 153 message = Message(**self.settings) 154 message.load(unpack_string(data, messageSize, 14)) 155 self.message = message 156 157 return 14 + messageSize
158
159 - def isServer(self):
160 return (self.channelId == 0 and self.playerId == 0)
161
162 - def setServer(self):
163 self.channelId = 0 164 self.playerId = 0
165
166 - def generate(self):
167 messageData = self.message.generate() 168 169 return pack('<HIII', self.subchannel, self.channelId, 170 self.playerId, len(messageData)) + messageData
171 172 __all__ = ['MOTD', 'AssignedID', 'PlayerExists', 'PlayerJoined', 173 'PlayerLeft', 'PlayerChanged', 'ChannelJoined', 'FromChannelMessage'] 174