X-Git-Url: https://jfr.im/git/erebus.git/blobdiff_plain/e25bacc0075c83ac63908f4173ddbdda9461bf07..826964670ac56032443ea66986c5b87c5ef38a4c:/erebus.py?ds=sidebyside diff --git a/erebus.py b/erebus.py index 755f2b4..b38820b 100644 --- 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 = {} @@ -13,23 +13,31 @@ class Erebus(object): class User(object): chans = [] + def __init__(self, nick, auth=None): self.nick = nick self.auth = auth + if auth is not None: self.checklevel() + def authed(self, auth): self.auth = auth self.checklevel() + def checklevel(self): self.level = 9999 #TODO get level from db + def __str__(self): return self.nick def __repr__(self): return "" % (self.nick) + class Channel(object): users = [] voices = [] ops = [] + def __init__(self, name): self.name = name + def userjoin(self, user, level=None): if user not in self.users: self.users.append(user) if level == 'op' and user not in self.ops: self.ops.append(user) @@ -38,6 +46,7 @@ class Erebus(object): if user in self.ops: self.ops.remove(user) if user in self.voices: self.voices.remove(user) if user in self.users: self.users.remove(user) + def userop(self, user): if user in self.users and user not in self.ops: self.ops.append(user) def uservoice(self, user): @@ -51,28 +60,40 @@ class Erebus(object): def __repr__(self): return "" % (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 = '' obj = bot.Bot(self, nick, user, bind, server, port, realname, chans) 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) - def bot(self, name): + if self.potype == "poll": + self.po.register(fileno, select.POLLIN) + elif self.potype == "select": + self.fdlist.append(fileno) + + 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(): @@ -92,16 +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__':