4
4
from twisted.words.protocols import irc
5
5
from twisted.protocols import basic
6
6
from twisted.web import resource, server, static
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)
15
return 'Internal error in server'
18
def writeResponse(message):
19
self.transport.write(message + '\r\n')
20
self.transport.loseConnection()
21
d.addCallback(writeResponse)
19
24
class IRCReplyBot(irc.IRCClient):
20
25
def connectionMade(self):
21
26
self.nickname = self.factory.nickname
22
27
irc.IRCClient.connectionMade(self)
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)
35
return 'Internal error in server'
38
def writeResponse(message):
39
irc.IRCClient.msg(self, user, msg+': '+message)
40
d.addCallback(writeResponse)
30
42
class FingerService(service.Service):
31
43
def __init__(self, filename):
32
44
self.filename = filename
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)
42
57
def getUser(self, user):
43
58
return defer.succeed(self.users.get(user, "No such user"))
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
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")])),
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
80
f.getUser = self.getUser
63
83
application = service.Application('finger', uid=1, gid=1)