]> jfr.im git - erebus.git/commitdiff
Finished user authentication when bot joins channel (WHO #chan %ant,0) and added...
authorJohn Runyon <redacted>
Tue, 17 Dec 2013 11:08:22 +0000 (05:08 -0600)
committerJohn Runyon <redacted>
Tue, 17 Dec 2013 11:08:22 +0000 (05:08 -0600)
bot.config.example
bot.py
config.py
erebus.py
modlib.py

index 535de22d2b7bf55772b97e930d4e91c2b34c7d3e..95b002904b428e2fc8244ffcb20516c821bc9d5b 100644 (file)
@@ -8,4 +8,7 @@ dbuser = erebus
 dbpass = darkness
 dbname = erebus
 
-trigger = .
+trigger = !
+
+[autoloads]
+modtest = 1
diff --git a/bot.py b/bot.py
index 68cd8aeb0416522f2f78b6c40ef865d711c86b1e..1737f93debd4914999aadb10ebcd984983a909ae 100644 (file)
--- a/bot.py
+++ b/bot.py
@@ -18,8 +18,7 @@ class Bot(object):
 
                self.conn = BotConnection(self, bind, server, port)
        def connect(self):
-               
-if self.conn.connect():
+               if self.conn.connect():
                        self.parent.newfd(self, self.conn.socket.fileno())
 
        def getdata(self):
@@ -52,13 +51,25 @@ if self.conn.connect():
                elif pieces[0] == "PING":
                        self.conn.send("PONG %s" % (pieces[1]))
 
+               elif pieces[1] == "354": # WHOX
+                       qt = pieces[3]
+                       nick = pieces[4]
+                       auth = pieces[5]
+                       if auth != '0':
+                               self.parent.user(nick).authed(auth)
+
                elif pieces[1] == "JOIN":
                        nick = pieces[0].split('!')[0][1:]
                        user = self.parent.user(nick)
-                       chan = self.parent.channel(pieces[2]) #TODO TODO TODO
+                       chan = self.parent.channel(pieces[2])
+
+                       if nick == self.nick:
+                               self.conn.send("WHO %s %%ant,1" % (chan))
+                       else:
+                               pass #TODO TODO TODO add to common chans!
                        
        def parsemsg(self, user, chan, msg):
-               if msg[0] == '!': #TODO check config for trigger
+               if msg[0] == self.parent.trigger:
                        msg = msg[1:]
                else:
                        return
@@ -67,7 +78,12 @@ if self.conn.connect():
                cmd = pieces[0].lower()
 
                if self.parent.hashook(cmd):
-                       self.parent.gethook(cmd)(self, user, chan, *pieces[1:])
+                       callback = self.parent.gethook(cmd)
+                       if user.level >= callback.reqlevel:
+                               callback(self, user, chan, *pieces[1:])
+                               return
+
+               self.msg(user, "No such command, or you don't have access.")
 
        def msg(self, target, msg):
                if isinstance(target, self.parent.User): self.conn.send("NOTICE %s :%s" % (target.nick, msg))
index 92b08cb077877c5c17149960bebc66d432ba2b0f..c8a461bd2572843901ab049b3cafe799745b1807 100644 (file)
--- a/config.py
+++ b/config.py
@@ -16,6 +16,12 @@ class Config(object):
        def __setattr__(self, key, value):
                self.config.set('erebus', key, value)
 
+       def level(self, cmd):
+               return self.config.get('levels', cmd)
+
+       def setlevel(self, cmd, level):
+               self.config.set('levels', cmd, level)
+
        def items(self, section='erebus'):
                return self.config.items(section)
 
index 2c489f62ce74ee90f312821c2bea6e990aa19679..68d6bc78fadb40f1c1e30f14065a9dafdb16c5b9 100644 (file)
--- a/erebus.py
+++ b/erebus.py
@@ -13,16 +13,23 @@ class Erebus(object):
        fds = {}
        mods = {}
        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 = nick #TEMP
+                       self.auth = auth
                        self.checklevel()
 
+               def isauthed(self):
+                       return self.auth is not None
+
                def authed(self, auth):
+                       if auth == '0': auth = None
                        self.auth = auth
                        self.checklevel()
 
@@ -71,7 +78,8 @@ class Erebus(object):
                def __str__(self): return self.name
                def __repr__(self): return "<Channel %r>" % (self.name)
 
-       def __init__(self):
+       def __init__(self, trigger):
+               self.trigger = trigger
                if os.name == "posix":
                        self.potype = "poll"
                        self.po = select.poll()
@@ -96,8 +104,14 @@ class Erebus(object):
        def fd(self, fileno): #get Bot() by fd/fileno
                return self.fds[fileno]
 
-       def user(self, nick): #TODO #get User() by nick
-               return self.User(nick.lower())
+       def user(self, nick):
+               nick = nick.lower()
+               if nick in self.users:
+                       return self.users[nick]
+               else:
+                       user = self.User(nick)
+                       self.users[nick] = user
+                       return user
        def channel(self, name): #TODO #get Channel() by name
                return self.Channel(name.lower())
 
@@ -126,9 +140,10 @@ def setup():
        global cfg, main
 
        cfg = config.Config('bot.config')
-       main = Erebus()
+       main = Erebus(cfg.trigger)
 
        autoloads = [mod for mod, yes in cfg.items('autoloads') if int(yes) == 1]
+       print autoloads
        for mod in autoloads:
                ctlmod.load(main, mod)
 
index 8ad040677fe0510eea1926dd97b8161538bf51b4..abf1a3d8e9c45a9586ab5809c222ea35ee23d773 100644 (file)
--- a/modlib.py
+++ b/modlib.py
@@ -13,10 +13,10 @@ class error(object):
                return self.errormsg
 
 class modlib(object):
-       #access levels
-       MANAGER = 3
-       ADMIN = 2
-       STAFF = 1
+       # default access levels
+       MANAGER = 100
+       ADMIN = 90
+       STAFF = 80
        AUTHED = 0
        ANYONE = -1
 
@@ -34,8 +34,9 @@ class modlib(object):
                for cmd, func in self.hooks.iteritems():
                        self.parent.unhook(cmd, func)
 
-       def hook(self, cmd):
+       def hook(self, cmd, level=ANYONE):
                def realhook(func):
+                       func.reqlevel = level
                        self.hooks[cmd] = func
                        if self.parent is not None:
                                self.parent.hook(cmd, func)