]> jfr.im git - irc/quakenet/qwebirc.git/blame - qwebirc/ircclient.py
Add command parsing and lots of other stuff...
[irc/quakenet/qwebirc.git] / qwebirc / ircclient.py
CommitLineData
4d256d41
CP
1import twisted, sys\r
2from twisted.words.protocols import irc\r
3from twisted.internet import reactor, protocol\r
4from twisted.web import resource, server\r
5from twisted.protocols import basic\r
6\r
7import hmac, time, config\r
8from config import HMACTEMPORAL\r
9HMACKEY = hmac.HMAC(key=config.HMACKEY)\r
10\r
11def 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
16class 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
65class 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
75def 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
80if __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()