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

Source Code for Module lacewing.moo.packetloaders.message

  1  # Copyright (c) 2011 Mathias Kaerlev. 
  2  # See LICENSE for details. 
  3   
  4  import struct 
  5  from struct import unpack_from, pack 
  6   
  7  from lacewing.moo.packetloaders.common import _MooLoader 
  8   
  9  STRING = 7 
 10  NUMBER = 8 
 11  BINARY = 9 
 12  SET_NUMBER = 11 
 13  SET_STRING = 12 
 14  GET_NUMBER = 13 
 15  GET_STRING = 14 
 16  NUMBER_LOADED = 15 
 17  STRING_LOADED = 16 
 18   
19 -def detectType(value):
20 if isinstance(value, str): 21 return STRING 22 elif isinstance(value, int): 23 return NUMBER 24 else: 25 raise NotImplementedError('could not detect type for %r' % value)
26
27 -class Message(_MooLoader):
28 type = None 29 value = None
30 - def _load(self, data):
31 mooGame = self.settings.get('mooGame', True) 32 type = None 33 if mooGame: 34 try: 35 type, = unpack_from('<B', data) 36 self.type = type 37 if type in (STRING, BINARY, STRING_LOADED): 38 self.value = data[1:] 39 elif type in (NUMBER, NUMBER_LOADED): 40 self.value, = unpack_from('<I', data, 1) 41 elif type in (SET_NUMBER, SET_STRING, GET_NUMBER, GET_STRING): 42 value = {} 43 self.value = value 44 filenameSize = unpack_from('<H', data, 1) 45 value['Filename'] = str(buffer(data, 3, filenameSize)) 46 offset = 3 + filenameSize 47 groupSize = unpack_from('<H', data, offset) 48 offset += 2 49 value['Group'] = str(buffer(data, offset, groupSize)) 50 offset += groupSize 51 itemSize = unpack_from('<H', data, offset) 52 offset += 2 53 value['Item'] = str(buffer(data, offset, itemSize)) 54 offset += itemSize 55 if type == SET_NUMBER: 56 value['Value'] = unpack_from('<I', data, offset) 57 elif type == SET_STRING: 58 valueSize = unpack_from('<H', data, offset) 59 offset += 2 60 value['Value'] = str(buffer(data, offset, valueSize)) 61 else: 62 raise NotImplementedError('datatype %s not implemented' % type) 63 except struct.error: 64 raise NotImplementedError('data (%r) for type %s invalid' % (data, type)) 65 66 else: 67 self.type = STRING 68 self.value = data
69
70 - def generate(self):
71 type = self.type 72 mooGame = self.settings.get('mooGame', True) 73 if mooGame: 74 if type in (STRING, BINARY, STRING_LOADED): 75 return pack('<B', type) + self.value 76 elif type in (NUMBER, NUMBER_LOADED): 77 return pack('<BI', type, self.value) 78 elif type in (SET_NUMBER, SET_STRING, GET_NUMBER, GET_STRING): 79 value = self.value 80 filename = value['Filename'] 81 group = value['Group'] 82 item = value['Item'] 83 84 data = ''.join([ 85 pack('<H', len(filename)), filename, 86 pack('<H', len(group)), group, 87 pack('<H', len(item)), item 88 ]) 89 90 if type == SET_NUMBER: 91 return data + pack('<I', value['Value']) 92 elif type == SET_STRING: 93 valueString = value['Value'] 94 return data + pack('<H', len(valueString)) + valueString 95 return data 96 else: 97 raise NotImplementedError('datatype %s not implemented' % type) 98 else: 99 return self.value
100 101 __all__ = ['Message', 'STRING', 'NUMBER', 'BINARY', 'SET_NUMBER', 'SET_STRING', 102 'GET_NUMBER', 'GET_STRING', 'NUMBER_LOADED', 'STRING_LOADED', 'detectType'] 103