X-Git-Url: https://jfr.im/git/erebus.git/blobdiff_plain/839d2b358368b12c685ad30e6e6a534179dd0478..500ba0c6c13d3a2eb66fc3b036f2ff3fb8dfc6e0:/erebus.py diff --git a/erebus.py b/erebus.py index e8a1ca9..fb4239a 100644 --- a/erebus.py +++ b/erebus.py @@ -12,25 +12,25 @@ class Erebus(object): bots = {} fds = {} mods = {} + numhandlers = {} msghandlers = {} users = {} chans = {} class User(object): - chans = [] - def __init__(self, nick, auth=None): - print "parent.User(self, %r, %r)" % (nick, auth) self.nick = nick self.auth = auth self.checklevel() + self.chans = [] + def isauthed(self): return self.auth is not None def authed(self, auth): if auth == '0': auth = None - self.auth = auth + self.auth = auth.lower() self.checklevel() def checklevel(self): @@ -46,16 +46,45 @@ class Erebus(object): self.glevel = 0 return self.glevel + def join(self, chan): + self.chans.append(chan) + def part(self, chan): + self.chans.remove(chan) + def __str__(self): return self.nick def __repr__(self): return "" % (self.nick,self.glevel) class Channel(object): - users = [] - voices = [] - ops = [] - - def __init__(self, name): + def __init__(self, name, bot): self.name = name + self.bot = bot + self.levels = {} + + self.users = [] + self.voices = [] + self.ops = [] + + c = main.db.cursor() + c.execute("SELECT user, level FROM chusers WHERE chan = %s", (self.name,)) + row = c.fetchone() + while row is not None: + self.levels[row['user']] = row['level'] + row = c.fetchone() + + + def levelof(self, auth): + auth = auth.lower() + if auth in self.levels: + return self.levels[auth] + else: + return 0 + + def setlevel(self, auth, level, savetodb=True): + auth = auth.lower() + if savetodb: + c = main.db.cursor() + c.execute("REPLACE INTO chusers (chan, user, level) VALUES (%s, %s, %s)", (self.name, auth, level)) + self.levels[auth] = level def userjoin(self, user, level=None): if user not in self.users: self.users.append(user) @@ -87,9 +116,9 @@ class Erebus(object): self.potype = "select" self.fdlist = [] - def newbot(self, nick, user, bind, server, port, realname, chans): + def newbot(self, nick, user, bind, server, port, realname): if bind is None: bind = '' - obj = bot.Bot(self, nick, user, bind, server, port, realname, chans) + obj = bot.Bot(self, nick, user, bind, server, port, realname) self.bots[nick.lower()] = obj def newfd(self, obj, fileno): @@ -103,17 +132,31 @@ class Erebus(object): return self.bots[name.lower()] def fd(self, fileno): #get Bot() by fd/fileno return self.fds[fileno] + def randbot(self): #get Bot() randomly + for b in self.bots.itervalues(): return b #TODO - def user(self, nick): + def user(self, nick, justjoined=False): nick = nick.lower() if nick in self.users: return self.users[nick] else: user = self.User(nick) self.users[nick] = user + + if justjoined: + self.randbot().conn.send("WHO %s %%ant,2" % (nick)) + return user - def channel(self, name): #TODO #get Channel() by name - return self.Channel(name.lower()) + def channel(self, name): #get Channel() by name + if name.lower() in self.chans: + return self.chans[name.lower()] + else: + return None + + def newchannel(self, bot, name): + chan = self.Channel(name.lower(), bot) + self.chans[name.lower()] = chan + return chan def poll(self): if self.potype == "poll": @@ -128,14 +171,34 @@ class Erebus(object): #bind functions def hook(self, word, handler): - self.msghandlers[word] = handler - def unhook(self, word): - del self.msghandlers[word] + try: + self.msghandlers[word].append(handler) + except: + self.msghandlers[word] = [handler] + def unhook(self, word, handler): + if word in self.msghandlers and handler in self.msghandlers[word]: + self.msghandlers[word].remove(handler) def hashook(self, word): - return word in self.msghandlers + return word in self.msghandlers and len(self.msghandlers[word]) != 0 def gethook(self, word): return self.msghandlers[word] + def hooknum(self, word, handler): + try: + self.numhandlers[word].append(handler) + except: + self.numhandlers[word] = [handler] + def unhooknum(self, word, handler): + if word in self.numhandlers and handler in self.numhandlers[word]: + self.numhandlers[word].remove(handler) + def hasnumhook(self, word): + return word in self.numhandlers and len(self.numhandlers[word]) != 0 + def getnumhook(self, word): + return self.numhandlers[word] + + + + def setup(): global cfg, main @@ -143,8 +206,8 @@ def setup(): main = Erebus(cfg.trigger) autoloads = [mod for mod, yes in cfg.items('autoloads') if int(yes) == 1] - print autoloads for mod in autoloads: + print "Loading %s" % (mod) ctlmod.load(main, mod) main.db = MySQLdb.connect(host=cfg.dbhost, user=cfg.dbuser, passwd=cfg.dbpass, db=cfg.dbname, cursorclass=MySQLdb.cursors.DictCursor) @@ -153,17 +216,14 @@ def setup(): 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.newbot(row['nick'], row['user'], row['bind'], cfg.host, cfg.port, cfg.realname) main.connectall() def loop(): poready = main.poll() for fileno in poready: - main.fd(fileno).getdata() + for line in main.fd(fileno).getdata(): + main.fd(fileno).parse(line) if __name__ == '__main__': setup()