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

Source Code for Module lacewing.moo.packetloaders.message

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