]> jfr.im git - erebus.git/blob - bot.py
Initial commit
[erebus.git] / bot.py
1 #!/usr/bin/python
2
3 #TODO: error checking
4
5 import socket
6
7 #bots = {'erebus': bot.Bot(nick='Erebus', user='erebus', bind='', server='irc.quakenet.org', port=6667, realname='Erebus')}
8 class Bot(object):
9 def __init__(self, parent, nick, user, bind, server, port, realname, chans):
10 self.parent = parent
11 self.nick = nick
12 self.chans = chans
13
14 self.conn = BotConnection(self, nick, user, bind, server, port, realname)
15 def connect(self):
16 self.conn.connect()
17 def getdata(self):
18 for line in self.conn.read():
19 self.parse(line)
20 def parse(self, line):
21 pieces = line.split()
22 if not self.conn.registered():
23 if pieces[0] == "PING":
24 self.conn.send("PONG %s" % (pieces[1]))
25 elif pieces[1] == "001":
26 self.conn.registered(True)
27 print "!!!REGISTERED!!!"
28
29 class BotConnection(object):
30 state = 0 # 0=disconnected, 1=registering, 2=connected
31
32 def __init__(self, parent, nick, user, bind, server, port, realname):
33 self.parent = parent
34 self.buffer = ''
35 self.socket = None
36
37 self.nick = nick
38 self.user = user
39 self.bind = bind
40 self.server = server
41 self.port = int(port)
42 self.realname = realname
43
44 def connect(self):
45 self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
46 self.socket.bind((self.bind, 0))
47 self.socket.connect((self.server, self.port))
48 self.send("NICK %s" % (self.nick))
49 self.send("USER %s 0 * :%s" % (self.user, self.realname))
50 self.state = 1
51
52 def registered(self, done=False):
53 if done: self.state = 2
54 return self.state == 2
55
56 def fileno(self):
57 if self.socket is not None:
58 return self.socket.fileno()
59 else:
60 return None
61
62 #TODO: rewrite send() to queue
63 def send(self, line):
64 self.write(line)
65 def write(self, line):
66 print self.nick, '[O]', line
67 self.socket.sendall(line+"\r\n")
68 def read(self):
69 self.buffer += self.socket.recv(8192)
70 lines = []
71 while '\r\n' in self.buffer:
72 pieces = self.buffer.split('\r\n', 1)
73 print self.nick, '[I]', pieces[0]
74 lines.append(pieces[0])
75 self.buffer = pieces[1]
76 return lines