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

« back to all changes in this revision

Viewing changes to doc/howto/tutorial/listings/finger/finger16.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:
4
4
from twisted.words.protocols import irc
5
5
from twisted.protocols import basic
6
6
from twisted.web import resource, server, static
 
7
 
7
8
import cgi
 
9
 
8
10
class FingerProtocol(basic.LineReceiver):
9
11
    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])
 
12
        d = self.factory.getUser(user)
 
13
 
 
14
        def onError(err):
 
15
            return 'Internal error in server'
 
16
        d.addErrback(onError)
 
17
 
 
18
        def writeResponse(message):
 
19
            self.transport.write(message + '\r\n')
 
20
            self.transport.loseConnection()
 
21
        d.addCallback(writeResponse)
 
22
 
 
23
 
19
24
class IRCReplyBot(irc.IRCClient):
20
25
    def connectionMade(self):
21
26
        self.nickname = self.factory.nickname
22
27
        irc.IRCClient.connectionMade(self)
 
28
 
23
29
    def privmsg(self, user, channel, msg):
24
30
        user = user.split('!')[0]
25
31
        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))
 
32
            d = self.factory.getUser(msg)
 
33
 
 
34
            def onError(err):
 
35
                return 'Internal error in server'
 
36
            d.addErrback(onError)
 
37
 
 
38
            def writeResponse(message):
 
39
                irc.IRCClient.msg(self, user, msg+': '+message)
 
40
            d.addCallback(writeResponse)
29
41
 
30
42
class FingerService(service.Service):
31
43
    def __init__(self, filename):
32
44
        self.filename = filename
 
45
        self.users = {}
33
46
        self._read()
 
47
 
34
48
    def _read(self):
35
 
        self.users = {}
 
49
        self.users.clear()
36
50
        for line in file(self.filename):
37
51
            user, status = line.split(':', 1)
38
52
            user = user.strip()
39
53
            status = status.strip()
40
54
            self.users[user] = status
41
55
        self.call = reactor.callLater(30, self._read)
 
56
 
42
57
    def getUser(self, user):
43
58
        return defer.succeed(self.users.get(user, "No such user"))
 
59
 
44
60
    def getFingerFactory(self):
45
61
        f = protocol.ServerFactory()
46
 
        f.protocol, f.getUser = FingerProtocol, self.getUser
 
62
        f.protocol = FingerProtocol
 
63
        f.getUser = self.getUser
47
64
        return f
 
65
 
48
66
    def getResource(self):
49
67
        r = resource.Resource()
50
68
        r.getChild = (lambda path, request:
54
72
                      "No such user <p/> usage: site/user")])),
55
73
                      'text/html'))
56
74
        return r
57
 
    
 
75
 
58
76
    def getIRCBot(self, nickname):
59
77
        f = protocol.ReconnectingClientFactory()
60
 
        f.protocol,f.nickname,f.getUser = IRCReplyBot,nickname,self.getUser
 
78
        f.protocol = IRCReplyBot
 
79
        f.nickname = nickname
 
80
        f.getUser = self.getUser
61
81
        return f
62
82
 
63
83
application = service.Application('finger', uid=1, gid=1)