]> jfr.im git - erebus.git/blobdiff - erebus.py
Added DB usage, fixed error in config.py, added __str__ __repr__ to Bot, BotConnection
[erebus.git] / erebus.py
index bf8305f0bc421d8d32a6d2e66b4134a50a832c2c..b38820b6fe5cfe2d0020d6dd0995c856c2270173 100644 (file)
--- a/erebus.py
+++ b/erebus.py
@@ -2,8 +2,8 @@
 
 #TODO: tons
 
-import sys, select
-import bot
+import os, sys, select, MySQLdb, MySQLdb.cursors
+import bot, config
 
 class Erebus(object):
        bots = {}
@@ -26,8 +26,10 @@ class Erebus(object):
                        self.checklevel()
 
                def checklevel(self): self.level = 9999 #TODO get level from db
+
                def __str__(self): return self.nick
                def __repr__(self): return "<User %r>" % (self.nick)
+
        class Channel(object):
                users = []
                voices = []
@@ -40,7 +42,6 @@ class Erebus(object):
                        if user not in self.users: self.users.append(user)
                        if level == 'op' and user not in self.ops: self.ops.append(user)
                        if level == 'voice' and user not in self.voices: self.voices.append(user)
-
                def userpart(self, user):
                        if user in self.ops: self.ops.remove(user)
                        if user in self.voices: self.voices.remove(user)
@@ -48,13 +49,10 @@ class Erebus(object):
 
                def userop(self, user):
                        if user in self.users and user not in self.ops: self.ops.append(user)
-
                def uservoice(self, user):
                        if user in self.users and user not in self.voices: self.voices.append(user)
-
                def userdeop(self, user):
                        if user in self.ops: self.ops.remove(user)
-
                def userdevoice(self, user):
                        if user in self.voices: self.voices.remove(user)
 
@@ -62,7 +60,12 @@ class Erebus(object):
                def __repr__(self): return "<Channel %r>" % (self.name)
 
        def __init__(self):
-               self.po = select.poll()
+               if os.name == "posix":
+                       self.potype = "poll"
+                       self.po = select.poll()
+               else: # f.e. os.name == "nt" (Windows)
+                       self.potype = "select"
+                       self.fdlist = []
 
        def newbot(self, nick, user, bind, server, port, realname, chans):
                if bind is None: bind = ''
@@ -70,24 +73,27 @@ class Erebus(object):
                self.bots[nick.lower()] = obj
 
        def newfd(self, obj, fileno):
-               print "newfd(Erebus(), %r, %r)" % (obj, fileno)
                self.fds[fileno] = obj
-               self.po.register(fileno, select.POLLIN)
+               if self.potype == "poll":
+                       self.po.register(fileno, select.POLLIN)
+               elif self.potype == "select":
+                       self.fdlist.append(fileno)
 
-       def bot(self, name):
+       def bot(self, name): #get Bot() by name (nick)
                return self.bots[name.lower()]
-
-       def fd(self, fileno):
+       def fd(self, fileno): #get Bot() by fd/fileno
                return self.fds[fileno]
 
-       def user(self, nick): #TODO
+       def user(self, nick): #TODO #get User() by nick
                return self.User(nick.lower())
-
-       def channel(self, name): #TODO
+       def channel(self, name): #TODO #get Channel() by name
                return self.Channel(name.lower())
 
        def poll(self):
-               return self.po.poll(60000)
+               if self.potype == "poll":
+                       return [fd for (fd, ev) in self.po.poll()]
+               elif self.potype == "select":
+                       return select.select(self.fdlist, [], [])[0]
 
        def connectall(self):
                for bot in self.bots.itervalues():
@@ -107,17 +113,26 @@ class Erebus(object):
        def rmbind(self, word, handler): pass
        def getbind(self, word, handler): pass
 
-
+cfg = config.Config('bot.config')
 main = Erebus()
 
 def setup():
-       main.newbot('Erebus', 'erebus', None, 'irc.quakenet.org', 6667, 'Erebus', ['#dimetest'])
-       main.bot('erebus').connect()
+       main.db = MySQLdb.connect(host=cfg.dbhost, user=cfg.dbuser, passwd=cfg.dbpass, db=cfg.dbname, cursorclass=MySQLdb.cursors.DictCursor)
+       c = main.db.cursor()
+       c.execute("SELECT nick, user, bind FROM bots WHERE active = 1")
+       rows = c.fetchall()
+       c.close()
+       for row in rows:
+               c2 = main.db.cursor()
+               c2.execute("SELECT chname FROM chans WHERE bot = %s AND active = 1", (row['nick'],))
+               chans = [chdic['chname'] for chdic in c2.fetchall()]
+               c2.close()
+               main.newbot(row['nick'], row['user'], row['bind'], cfg.host, cfg.port, cfg.realname, chans)
+       main.connectall()
 
 def loop():
        poready = main.poll()
-
-       for (fileno,mask) in poready:
+       for fileno in poready:
                main.fd(fileno).getdata()
 
 if __name__ == '__main__':