1# Read username, output from non-empty factory, drop connections
2# Use deferreds, to minimize synchronicity assumptions
3
4from twisted.internet import defer, endpoints, protocol, reactor
5from twisted.protocols import basic
6
7
8class FingerProtocol(basic.LineReceiver):
9    def lineReceived(self, user):
10        d = self.factory.getUser(user)
11
12        def onError(err):
13            return "Internal error in server"
14
15        d.addErrback(onError)
16
17        def writeResponse(message):
18            self.transport.write(message + b"\r\n")
19            self.transport.loseConnection()
20
21        d.addCallback(writeResponse)
22
23
24class FingerFactory(protocol.ServerFactory):
25    protocol = FingerProtocol
26
27    def __init__(self, users):
28        self.users = users
29
30    def getUser(self, user):
31        return defer.succeed(self.users.get(user, b"No such user"))
32
33
34fingerEndpoint = endpoints.serverFromString(reactor, "tcp:1079")
35fingerEndpoint.listen(FingerFactory({b"moshez": b"Happy and well"}))
36reactor.run()
37