1
2
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
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
28 type = None
29 value = None
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
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