2
2
from twisted.application import internet, service
3
3
from twisted.internet import protocol, reactor, defer
4
4
from twisted.protocols import basic
5
6
class FingerProtocol(basic.LineReceiver):
6
7
def lineReceived(self, user):
7
self.factory.getUser(user
8
).addErrback(lambda _: "Internal error in server"
9
).addCallback(lambda m:
10
(self.transport.write(m+"\r\n"),
11
self.transport.loseConnection()))
8
d = self.factory.getUser(user)
11
return 'Internal error in server'
14
def writeResponse(message):
15
self.transport.write(message + '\r\n')
16
self.transport.loseConnection()
17
d.addCallback(writeResponse)
13
19
class FingerFactory(protocol.ServerFactory):
14
20
protocol = FingerProtocol
15
def __init__(self, **kwargs): self.users = kwargs
22
def __init__(self, **kwargs):
16
25
def getUser(self, user):
17
26
return defer.succeed(self.users.get(user, "No such user"))
19
28
class FingerSetterProtocol(basic.LineReceiver):
20
def connectionMade(self): self.lines = []
21
def lineReceived(self, line): self.lines.append(line)
29
def connectionMade(self):
32
def lineReceived(self, line):
33
self.lines.append(line)
22
35
def connectionLost(self, reason):
23
self.factory.setUser(*self.lines[:2])
24
# first line: user second line: status
37
status = self.lines[1]
38
self.factory.setUser(user, status)
26
40
class FingerSetterFactory(protocol.ServerFactory):
27
41
protocol = FingerSetterProtocol
28
def __init__(self, ff): self.setUser = ff.users.__setitem__
43
def __init__(self, fingerFactory):
44
self.fingerFactory = fingerFactory
46
def setUser(self, user, status):
47
self.fingerFactory.users[user] = status
30
49
ff = FingerFactory(moshez='Happy and well')
31
50
fsf = FingerSetterFactory(ff)