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
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
25 type = None
26 value = None
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
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