]> jfr.im git - erebus.git/commitdiff
Initial commit
authorJohn Runyon <redacted>
Tue, 19 Nov 2013 06:44:47 +0000 (00:44 -0600)
committerJohn Runyon <redacted>
Tue, 19 Nov 2013 06:44:47 +0000 (00:44 -0600)
.gitignore [new file with mode: 0644]
bot.config.example [new file with mode: 0644]
bot.py [new file with mode: 0644]
config.py [new file with mode: 0644]
erebus.py [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..4856d6b
--- /dev/null
@@ -0,0 +1,5 @@
+*.pyc
+*~
+*.bak
+bot.config
+.*.swp
diff --git a/bot.config.example b/bot.config.example
new file mode 100644 (file)
index 0000000..535de22
--- /dev/null
@@ -0,0 +1,11 @@
+[erebus]
+real = Erebus r1
+host = dk.quakenet.org
+port = 6667
+
+dbhost = localhost
+dbuser = erebus
+dbpass = darkness
+dbname = erebus
+
+trigger = .
diff --git a/bot.py b/bot.py
new file mode 100644 (file)
index 0000000..f82f143
--- /dev/null
+++ b/bot.py
@@ -0,0 +1,76 @@
+#!/usr/bin/python
+
+#TODO: error checking
+
+import socket
+
+#bots = {'erebus': bot.Bot(nick='Erebus', user='erebus', bind='', server='irc.quakenet.org', port=6667, realname='Erebus')}
+class Bot(object):
+       def __init__(self, parent, nick, user, bind, server, port, realname, chans):
+               self.parent = parent
+               self.nick = nick
+               self.chans = chans
+
+               self.conn = BotConnection(self, nick, user, bind, server, port, realname)
+       def connect(self):
+               self.conn.connect()
+       def getdata(self):
+               for line in self.conn.read():
+                       self.parse(line)
+       def parse(self, line):
+               pieces = line.split()
+               if not self.conn.registered():
+                       if pieces[0] == "PING":
+                               self.conn.send("PONG %s" % (pieces[1]))
+                       elif pieces[1] == "001":
+                               self.conn.registered(True)
+                               print "!!!REGISTERED!!!"
+
+class BotConnection(object):
+       state = 0 # 0=disconnected, 1=registering, 2=connected
+
+       def __init__(self, parent, nick, user, bind, server, port, realname):
+               self.parent = parent
+               self.buffer = ''
+               self.socket = None
+
+               self.nick = nick
+               self.user = user
+               self.bind = bind
+               self.server = server
+               self.port = int(port)
+               self.realname = realname
+
+       def connect(self):
+               self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+               self.socket.bind((self.bind, 0))
+               self.socket.connect((self.server, self.port))
+               self.send("NICK %s" % (self.nick))
+               self.send("USER %s 0 * :%s" % (self.user, self.realname))
+               self.state = 1
+
+       def registered(self, done=False):
+               if done: self.state = 2
+               return self.state == 2
+
+       def fileno(self):
+               if self.socket is not None:
+                       return self.socket.fileno()
+               else:
+                       return None
+
+       #TODO: rewrite send() to queue
+       def send(self, line):
+               self.write(line)
+       def write(self, line):
+               print self.nick, '[O]', line
+               self.socket.sendall(line+"\r\n")
+       def read(self):
+               self.buffer += self.socket.recv(8192)
+               lines = []
+               while '\r\n' in self.buffer:
+                       pieces = self.buffer.split('\r\n', 1)
+                       print self.nick, '[I]', pieces[0]
+                       lines.append(pieces[0])
+                       self.buffer = pieces[1]
+               return lines
diff --git a/config.py b/config.py
new file mode 100644 (file)
index 0000000..d4dfe5d
--- /dev/null
+++ b/config.py
@@ -0,0 +1,32 @@
+import ConfigParser
+
+class Config(object):
+#      config = ConfigParser.SafeConfigParser()
+       def __init__(self, filename, writeout=True):
+               self.__dict__['config'] = ConfigParser.SafeConfigParser()
+               self.__dict__['filename'] = filename
+               self.__dict__['writeout'] = writeout
+               self.config.read(filename)
+
+       def __getattr__(self, key):
+               return self.config.get('erebus', key)
+
+       def __setattr__(self, key, value):
+               self.config.set('erebus', key, value)
+
+       def items(self):
+               return self.config.items('erebus')
+
+       def write(self):
+               with open(self._filename, 'wb') as configfile:
+                       self.config.write(configfile)
+       def __del__(self):
+               if self.writeout: self.write()
+
+
+if __name__ == '__main__':
+       import sys
+       cfg = Config(sys.argv[1], False)
+
+       for k, v in cfg.items():
+               print k, '=', v
diff --git a/erebus.py b/erebus.py
new file mode 100644 (file)
index 0000000..01f9a57
--- /dev/null
+++ b/erebus.py
@@ -0,0 +1,33 @@
+#!/usr/bin/python
+
+#TODO: tons
+
+import sys, select
+import bot
+
+class Erebus(object):
+       pass
+
+main = Erebus()
+bots = {}
+fds = {}
+po = select.poll()
+
+def setup():
+       global bots, fds
+       bots = {'erebus': bot.Bot(main, 'Erebus', 'erebus', '', 'irc.quakenet.org', 6667, 'Erebus', [])}
+       fds = {}
+
+       bots['erebus'].connect()
+       fds[bots['erebus'].conn.fileno()] = bots['erebus']
+       po.register(bots['erebus'].conn.fileno(), select.POLLIN)
+
+def loop():
+       poready = po.poll(60000)
+       for (fd,mask) in poready:
+               fds[fd].getdata()
+
+if __name__ == '__main__':
+       setup()
+       while True:
+               loop()