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