~certify-web-dev/twisted/certify-staging

« back to all changes in this revision

Viewing changes to doc/howto/tutorial/listings/finger/finger17.tac

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2010-01-02 19:38:17 UTC
  • mfrom: (2.2.4 sid)
  • Revision ID: james.westby@ubuntu.com-20100102193817-jphp464ppwh7dulg
Tags: 9.0.0-1
* python-twisted: Depend on the python-twisted-* 9.0 packages.
* python-twisted: Depend on python-zope.interface only. Closes: #557781.

Show diffs side-by-side

added added

removed removed

Lines of Context:
5
5
from twisted.protocols import basic
6
6
from twisted.web import resource, server, static, xmlrpc
7
7
import cgi
 
8
 
8
9
class FingerProtocol(basic.LineReceiver):
9
10
    def lineReceived(self, user):
10
 
        self.factory.getUser(user
11
 
        ).addErrback(lambda _: "Internal error in server"
12
 
        ).addCallback(lambda m:
13
 
                      (self.transport.write(m+"\r\n"),
14
 
                       self.transport.loseConnection()))
15
 
class FingerSetterProtocol(basic.LineReceiver):
16
 
    def connectionMade(self): self.lines = []
17
 
    def lineReceived(self, line): self.lines.append(line)
18
 
    def connectionLost(self,reason): self.factory.setUser(*self.lines[:2])
 
11
        d = self.factory.getUser(user)
 
12
 
 
13
        def onError(err):
 
14
            return 'Internal error in server'
 
15
        d.addErrback(onError)
 
16
 
 
17
        def writeResponse(message):
 
18
            self.transport.write(message + '\r\n')
 
19
            self.transport.loseConnection()
 
20
        d.addCallback(writeResponse)
 
21
 
19
22
class IRCReplyBot(irc.IRCClient):
20
23
    def connectionMade(self):
21
24
        self.nickname = self.factory.nickname
22
25
        irc.IRCClient.connectionMade(self)
 
26
 
23
27
    def privmsg(self, user, channel, msg):
24
28
        user = user.split('!')[0]
25
29
        if self.nickname.lower() == channel.lower():
26
 
            self.factory.getUser(msg
27
 
            ).addErrback(lambda _: "Internal error in server"
28
 
            ).addCallback(lambda m: irc.IRCClient.msg(self, user, msg+': '+m))
 
30
            d = self.factory.getUser(msg)
 
31
 
 
32
            def onError(err):
 
33
                return 'Internal error in server'
 
34
            d.addErrback(onError)
 
35
 
 
36
            def writeResponse(message):
 
37
                irc.IRCClient.msg(self, user, msg+': '+message)
 
38
            d.addCallback(writeResponse)
29
39
 
30
40
class FingerService(service.Service):
31
41
    def __init__(self, filename):
32
42
        self.filename = filename
 
43
        self.users = {}
33
44
        self._read()
 
45
 
34
46
    def _read(self):
35
 
        self.users = {}
 
47
        self.users.clear()
36
48
        for line in file(self.filename):
37
49
            user, status = line.split(':', 1)
38
50
            user = user.strip()
39
51
            status = status.strip()
40
52
            self.users[user] = status
41
53
        self.call = reactor.callLater(30, self._read)
 
54
 
42
55
    def getUser(self, user):
43
56
        return defer.succeed(self.users.get(user, "No such user"))
 
57
 
44
58
    def getFingerFactory(self):
45
59
        f = protocol.ServerFactory()
46
 
        f.protocol, f.getUser = FingerProtocol, self.getUser
 
60
        f.protocol = FingerProtocol
 
61
        f.getUser = self.getUser
47
62
        return f
 
63
 
48
64
    def getResource(self):
49
65
        r = resource.Resource()
50
66
        r.getChild = (lambda path, request:
56
72
        x.xmlrpc_getUser = self.getUser
57
73
        r.putChild('RPC2', x)
58
74
        return r
 
75
 
59
76
    def getIRCBot(self, nickname):
60
77
        f = protocol.ReconnectingClientFactory()
61
 
        f.protocol,f.nickname,f.getUser = IRCReplyBot,nickname,self.getUser
 
78
        f.protocol = IRCReplyBot
 
79
        f.nickname = nickname
 
80
        f.getUser = self.getUser
62
81
        return f
63
82
 
64
83
application = service.Application('finger', uid=1, gid=1)