annotate a/d/DCPUToolBot-master/irc.py @ 2768:730e97409041

<ThatOtherPerson> mv d a
author HackBot
date Mon, 22 Apr 2013 15:44:16 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2768
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
1 import socket
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
2 import re
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
3 import threading
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
4 import sys
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
5
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
6 command_handlers = []
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
7 privmsg_handlers = []
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
8 msgtome_handlers = []
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
9
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
10 def command(command, params):
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
11 print "Command: (\"" + command + "\", \"" + params + ")"
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
12 msg = command + " " + params
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
13 print msg
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
14 server.sendall(msg + "\r\n")
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
15
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
16 def privmsg(nickIn, chan, msg):
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
17
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
18 lines = msg.split("\n")
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
19 if len(lines) > 1:
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
20 for line in lines:
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
21 privmsg(nickIn, chan, line)
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
22 elif msg != "":
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
23 response = ""
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
24
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
25 if chan == nick:
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
26 response += nickIn + " :" + msg
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
27 else:
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
28 response += chan + " :" + nickIn + ": " + msg
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
29
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
30 command("PRIVMSG", response)
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
31
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
32 def handlePing(nick, user, host, chan, params):
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
33 print params
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
34 command('PONG', params)
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
35
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
36 def handleMsgToMe(nick, user, host, chan, params):
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
37 for regex, callback in msgtome_handlers:
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
38 matches = regex.match(params)
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
39 if matches:
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
40 callback(nick, user, host, chan, params)
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
41
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
42 def handlePrivmsg(nickIn, user, host, chan, params):
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
43 for regex, callback in privmsg_handlers:
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
44 matches = regex.match(params)
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
45 if matches:
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
46 callback(nickIn, user, host, chan, matches)
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
47
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
48 global nick
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
49 matches = re.match("^" + nick + "[:, ]?(.*)", params)
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
50 if matches:
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
51 handleMsgToMe(nickIn, user, host, chan, matches.group(1))
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
52
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
53 if chan == nick:
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
54 handleMsgToMe(nickIn, user, host, chan, params)
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
55
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
56 class EventHandler(threading.Thread):
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
57 def run(self):
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
58 while True:
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
59 try:
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
60 message = server.recv(4096)
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
61 if message == '':
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
62 server.close()
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
63
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
64 handleCommand(message)
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
65 except Exception as e:
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
66 print e.message
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
67
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
68 def connect(host, port, nickIn="TestBot", password="", name="dcpubot", realname="DCPU Bot"):
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
69 global nick
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
70 nick = nickIn
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
71
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
72 global server
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
73 server = socket.create_connection((host, port))
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
74
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
75 server.sendall("PASS " + password + "\r\n")
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
76 server.sendall("NICK " + nick + "\r\n")
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
77 server.sendall("USER " + name + " 0 * :" + realname + "\r\n")
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
78
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
79 onCommand('PING', handlePing)
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
80 onCommand('PRIVMSG', handlePrivmsg)
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
81
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
82 eventHandler = EventHandler()
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
83 eventHandler.start()
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
84
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
85 def join(channels):
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
86 print channels
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
87 if type(channels) is str:
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
88 print "JOIN " + channels
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
89 server.sendall("JOIN " + channels + "\r\n")
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
90 else:
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
91 for channel in channels:
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
92 print "JOIN " + channel
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
93 server.sendall("JOIN " + channel + "\r\n")
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
94
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
95 message_re = re.compile("^((:([^!@ ]+)(!([^@ ]+))?(@([^ ]+))? ?)?([^ ]+)?)? ?((?!:)[^ ]*)[^:]*(:(.*))?")
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
96
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
97 def handleCommand(message):
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
98 print "Message: " + message
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
99 message_data = message_re.match(message)
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
100
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
101 if message_data:
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
102
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
103 nick = message_data.group(3)
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
104 user = message_data.group(5)
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
105 host = message_data.group(7)
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
106 command = message_data.group(8)
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
107 chan = message_data.group(9)
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
108 params = message_data.group(11)
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
109
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
110 for com, callback in command_handlers:
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
111 if com == command:
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
112 callback(nick, user, host, chan, params)
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
113 else:
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
114 print "Message could not be parsed: " + message
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
115
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
116 def onCommand(command, callback):
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
117 global command_handlers
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
118 command_handlers.append((command, callback))
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
119
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
120 def onPrivmsg(reg, callback):
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
121 global privmsg_handlers
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
122 regex = re.compile(reg)
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
123 privmsg_handlers.append((regex, callback))
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
124
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
125 def onMsgToMe(reg, callback):
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
126 global msgtome_handlers
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
127 regex = re.compile(reg)
730e97409041 <ThatOtherPerson> mv d a
HackBot
parents:
diff changeset
128 msgtome_handlers.append((regex, callback))