/
hubclient.py
64 lines (47 loc) · 1.63 KB
/
hubclient.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
from twisted.internet import reactor
from twisted.spread import pb
from louie import dispatcher
import logging
log = logging.getLogger()
_root = None
class LocalSignal(pb.Referenceable):
def remote_send(self, **kw):
log.debug("received signal %r from hub", kw['signal'])
# see below for the reason for this translation
kw2 = {}
for k,v in kw.items():
if v == (None, "Anonymous"):
v = dispatcher.Anonymous
kw2[k] = v
dispatcher.send(_remoteSignal=True, **kw)
_localSignal = LocalSignal()
def connect(host="bang", port=2012):
global _root
fact = pb.PBClientFactory()
reactor.connectTCP(host, port, fact)
_root = fact.getRootObject()
def reg(r):
r.callRemote("addClient", _localSignal)
return r
_root.addCallback(reg)
def listenAll(sender=None, **kw):
#kw['sender'] = sender
if kw.get('_remoteSignal', False):
log.debug("not retransmitting remote signal")
return
log.debug("send away %r", kw)
# this dumb Anonymous handling is because i can't figure out pb's
# jelly stuff. What i want is to say that dispatcher.Anonymous can
# be transmitted, and that the transmission is just the type name
if sender is dispatcher.Anonymous:
sender = (None, "Anonymous")
kw2 = {'sender': sender}
for k,v in kw.items():
if v is dispatcher.Anonymous:
v = (None, "Anonymous")
kw2[k] = v
def cr(r, kw):
r.callRemote("send", _localSignal, **kw)
return r
_root.addCallback(cr, kw2)
dispatcher.connect(listenAll)