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

Source Code for Module lacewing.moo.packetloaders.server

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