1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 import pickle
24 from StringIO import StringIO
25
26 import Network
27 import Engine
28 import Log
29 import World
30 import Task
31
32 try:
33 reversed
34 except:
36 seq = seq[:]
37 seq.reverse()
38 return seq
39
42 for key, value in args.items():
43 setattr(self, key, value)
44
46 return "<Message %s %s>" % (str(self.__class__), " ".join(["%s='%s'" % (k, v) for k, v in self.__dict__.items()]))
47
50 self.messageHandlers = []
51
53 if handler not in self.messageHandlers:
54 self.messageHandlers.append(handler)
55
57 if handler in self.messageHandlers:
58 self.messageHandlers.remove(handler)
59
61
62
63
64 for handler in reversed(self.messageHandlers):
65 try:
66 handler.handleMessage(sender, message)
67 except Exception, e:
68 import traceback
69 traceback.print_exc()
70
74
78
81 f = None
82 try:
83 n = "handle" + str(message.__class__).split(".")[-1]
84 f = getattr(self, n)
85 except AttributeError:
86 return None
87 return f(sender, **message.__dict__)
88
91
94
97 self.receivedClasses = {}
98 self.sentClasses = {}
99
101 s = StringIO()
102 pickle.Pickler(s, protocol = 2).dump(data)
103 return s.getvalue()
104 serialize = staticmethod(serialize)
105
107 return pickle.loads(data)
108 unserialize = staticmethod(unserialize)
109
111 data = self.unserialize(packet)
112 id = data[0]
113 if id < 0:
114 self.receivedClasses[-id] = data[1:]
115 Log.debug("Learned about %s, %d phrases now known." % (data[1], len(self.receivedClasses)))
116 elif id in self.receivedClasses:
117 message = self.receivedClasses[id][0]()
118 if len(data) > 1:
119 message.__dict__.update(dict(zip(self.receivedClasses[id][1], data[1:])))
120 return message
121 else:
122 Log.warn("Message with unknown class received: %d" % id)
123
125 packets = []
126
127 if not message.__class__ in self.sentClasses:
128 id = len(self.sentClasses) + 1
129 definition = [message.__class__, message.__dict__.keys()]
130 self.sentClasses[message.__class__] = [id] + definition
131 packets.append(self.serialize([-id] + definition))
132 Log.debug("%d phrases taught." % len(self.sentClasses))
133 else:
134 id = self.sentClasses[message.__class__][0]
135
136 data = [id] + [getattr(message, key) for key in self.sentClasses[message.__class__][2]]
137 packets.append(self.serialize(data))
138 return packets
139
140 -class BaseSession(Network.Connection, Task.Task, MessageHandler):
141 - def __init__(self, engine, broker, sock = None):
146
148 return "<Session #%s at %s>" % (self.id, self.addr)
149
152
153 - def run(self, ticks):
155
158
161
167
171
173 Log.debug("Connected as session #%d." % self.id)
174
176 return self.id is not None
177
180 BaseSession.__init__(self, engine = engine, broker = engine.server.broker, sock = sock)
181 self.server = engine.server
182 self.world = self.server.world
183
188
191
195
197
204
209
214
215 - def run(self, ticks):
217