]>
Commit | Line | Data |
---|---|---|
4d256d41 CP |
1 | import twisted, sys\r |
2 | from twisted.words.protocols import irc\r | |
3 | from twisted.internet import reactor, protocol\r | |
4 | from twisted.web import resource, server\r | |
5 | from twisted.protocols import basic\r | |
6 | \r | |
7 | import hmac, time, config\r | |
8 | from config import HMACTEMPORAL\r | |
9 | HMACKEY = hmac.HMAC(key=config.HMACKEY)\r | |
10 | \r | |
11 | def hmacfn(*args):\r | |
12 | h = HMACKEY.copy()\r | |
13 | h.update("%d %s" % (int(time.time() / HMACTEMPORAL), " ".join(args)))\r | |
14 | return h.hexdigest()\r | |
15 | \r | |
16 | class QWebIRCClient(basic.LineReceiver):\r | |
17 | delimiter = "\n"\r | |
18 | \r | |
19 | def dataReceived(self, data):\r | |
20 | basic.LineReceiver.dataReceived(self, data.replace("\r", ""))\r | |
21 | \r | |
22 | def lineReceived(self, line):\r | |
23 | line = irc.lowDequote(line)\r | |
24 | try:\r | |
25 | line = line.decode("utf-8")\r | |
26 | except UnicodeDecodeError:\r | |
27 | line = line.decode("iso-8859-1", "ignore")\r | |
28 | \r | |
29 | try:\r | |
30 | prefix, command, params = irc.parsemsg(line)\r | |
31 | self.handleCommand(command, prefix, params)\r | |
32 | except irc.IRCBadMessage:\r | |
33 | self.badMessage(line, *sys.exc_info())\r | |
34 | \r | |
35 | def badMessage(self, args):\r | |
36 | self("badmessage", args)\r | |
37 | \r | |
38 | def handleCommand(self, command, prefix, params):\r | |
39 | self("c", command, prefix, params)\r | |
40 | \r | |
41 | def __call__(self, *args):\r | |
42 | self.factory.publisher.event(args)\r | |
43 | \r | |
44 | def write(self, data):\r | |
45 | self.transport.write("%s\r\n" % irc.lowQuote(data.encode("utf-8")))\r | |
46 | \r | |
47 | def connectionMade(self):\r | |
48 | basic.LineReceiver.connectionMade(self)\r | |
49 | \r | |
50 | f = self.factory.ircinit\r | |
51 | nick, ident, ip, realname = f["nick"], f["ident"], f["ip"], f["realname"]\r | |
52 | \r | |
53 | hmac = hmacfn(ident, ip)\r | |
4d256d41 | 54 | self.write("USER %s bleh bleh %s %s :%s" % (ident, ip, hmac, realname))\r |
b15204e3 | 55 | self.write("NICK %s" % nick)\r |
4d256d41 CP |
56 | \r |
57 | self.factory.client = self\r | |
58 | self("connect")\r | |
59 | \r | |
60 | def connectionLost(self, reason):\r | |
61 | self.factory.client = None\r | |
62 | basic.LineReceiver.connectionLost(self, reason)\r | |
63 | self("disconnect")\r | |
64 | \r | |
65 | class QWebIRCFactory(protocol.ClientFactory):\r | |
66 | protocol = QWebIRCClient\r | |
67 | def __init__(self, publisher, **kwargs):\r | |
68 | self.client = None\r | |
69 | self.publisher = publisher\r | |
70 | self.ircinit = kwargs\r | |
71 | \r | |
72 | def write(self, data):\r | |
73 | self.client.write(data)\r | |
74 | \r | |
75 | def createIRC(*args, **kwargs):\r | |
76 | f = QWebIRCFactory(*args, **kwargs)\r | |
77 | reactor.connectTCP(config.IRCSERVER, config.IRCPORT, f)\r | |
78 | return f\r | |
79 | \r | |
80 | if __name__ == "__main__":\r | |
81 | e = createIRC(lambda x: 2, nick="slug__moo", ident="mooslug", ip="1.2.3.6", realname="mooooo")\r | |
82 | reactor.run() |