~ntt-pf-lab/nova/monkey_patch_notification

« back to all changes in this revision

Viewing changes to vendor/Twisted-10.0.0/doc/core/howto/tutorial/listings/finger/finger18.tac

  • Committer: Jesse Andrews
  • Date: 2010-05-28 06:05:26 UTC
  • Revision ID: git-v1:bf6e6e718cdc7488e2da87b21e258ccc065fe499
initial commit

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Do everything properly
 
2
from twisted.application import internet, service
 
3
from twisted.internet import protocol, reactor, defer
 
4
from twisted.words.protocols import irc
 
5
from twisted.protocols import basic
 
6
from twisted.web import resource, server, static, xmlrpc
 
7
import cgi
 
8
 
 
9
def catchError(err):
 
10
    return "Internal error in server"
 
11
 
 
12
class FingerProtocol(basic.LineReceiver):
 
13
 
 
14
    def lineReceived(self, user):
 
15
        d = self.factory.getUser(user)
 
16
        d.addErrback(catchError)
 
17
        def writeValue(value):
 
18
            self.transport.write(value+'\r\n')
 
19
            self.transport.loseConnection()
 
20
        d.addCallback(writeValue)
 
21
 
 
22
 
 
23
class IRCReplyBot(irc.IRCClient):
 
24
 
 
25
    def connectionMade(self):
 
26
        self.nickname = self.factory.nickname
 
27
        irc.IRCClient.connectionMade(self)
 
28
 
 
29
    def privmsg(self, user, channel, msg):
 
30
        user = user.split('!')[0]
 
31
        if self.nickname.lower() == channel.lower():
 
32
            d = self.factory.getUser(msg)
 
33
            d.addErrback(catchError)
 
34
            d.addCallback(lambda m: "Status of %s: %s" % (msg, m))
 
35
            d.addCallback(lambda m: self.msg(user, m))
 
36
 
 
37
 
 
38
class UserStatusTree(resource.Resource):
 
39
    def __init__(self, service):
 
40
        resource.Resource.__init__(self)
 
41
        self.service = service
 
42
 
 
43
    def render_GET(self, request):
 
44
        d = self.service.getUsers()
 
45
        def formatUsers(users):
 
46
            l = ['<li><a href="%s">%s</a></li>' % (user, user)
 
47
                 for user in users]
 
48
            return '<ul>'+''.join(l)+'</ul>'
 
49
        d.addCallback(formatUsers)
 
50
        d.addCallback(request.write)
 
51
        d.addCallback(lambda _: request.finish())
 
52
        return server.NOT_DONE_YET
 
53
 
 
54
    def getChild(self, path, request):
 
55
        if path=="":
 
56
            return UserStatusTree(self.service)
 
57
        else:
 
58
            return UserStatus(path, self.service)
 
59
 
 
60
class UserStatus(resource.Resource):
 
61
 
 
62
    def __init__(self, user, service):
 
63
        resource.Resource.__init__(self)
 
64
        self.user = user
 
65
        self.service = service
 
66
 
 
67
    def render_GET(self, request):
 
68
        d = self.service.getUser(self.user)
 
69
        d.addCallback(cgi.escape)
 
70
        d.addCallback(lambda m:
 
71
                      '<h1>%s</h1>'%self.user+'<p>%s</p>'%m)
 
72
        d.addCallback(request.write)
 
73
        d.addCallback(lambda _: request.finish())
 
74
        return server.NOT_DONE_YET
 
75
 
 
76
 
 
77
class UserStatusXR(xmlrpc.XMLRPC):
 
78
 
 
79
    def __init__(self, service):
 
80
        xmlrpc.XMLRPC.__init__(self)
 
81
        self.service = service
 
82
 
 
83
    def xmlrpc_getUser(self, user):
 
84
        return self.service.getUser(user)
 
85
 
 
86
 
 
87
class FingerService(service.Service):
 
88
 
 
89
    def __init__(self, filename):
 
90
        self.filename = filename
 
91
        self.users = {}
 
92
        self._read()
 
93
 
 
94
    def _read(self):
 
95
        self.users.clear()
 
96
        for line in file(self.filename):
 
97
            user, status = line.split(':', 1)
 
98
            user = user.strip()
 
99
            status = status.strip()
 
100
            self.users[user] = status
 
101
        self.call = reactor.callLater(30, self._read)
 
102
 
 
103
    def getUser(self, user):
 
104
        return defer.succeed(self.users.get(user, "No such user"))
 
105
 
 
106
    def getUsers(self):
 
107
        return defer.succeed(self.users.keys())
 
108
 
 
109
    def getFingerFactory(self):
 
110
        f = protocol.ServerFactory()
 
111
        f.protocol = FingerProtocol
 
112
        f.getUser = self.getUser
 
113
        return f
 
114
 
 
115
    def getResource(self):
 
116
        r = UserStatusTree(self)
 
117
        x = UserStatusXR(self)
 
118
        r.putChild('RPC2', x)
 
119
        return r
 
120
 
 
121
    def getIRCBot(self, nickname):
 
122
        f = protocol.ReconnectingClientFactory()
 
123
        f.protocol = IRCReplyBot
 
124
        f.nickname = nickname
 
125
        f.getUser = self.getUser
 
126
        return f
 
127
 
 
128
 
 
129
application = service.Application('finger', uid=1, gid=1)
 
130
f = FingerService('/etc/users')
 
131
serviceCollection = service.IServiceCollection(application)
 
132
internet.TCPServer(79, f.getFingerFactory()
 
133
                   ).setServiceParent(serviceCollection)
 
134
internet.TCPServer(8000, server.Site(f.getResource())
 
135
                   ).setServiceParent(serviceCollection)
 
136
internet.TCPClient('irc.freenode.org', 6667, f.getIRCBot('fingerbot')
 
137
                   ).setServiceParent(serviceCollection)