]> jfr.im git - erebus.git/blobdiff - modules/userinfo.py
userinfo - add function/command to delete
[erebus.git] / modules / userinfo.py
index 27cba63a3b6194d63a33f8a7f75b983f37d63c87..d907b088ff5209e40e02bbdf74876f8dd324b228 100644 (file)
@@ -1,13 +1,14 @@
 # Erebus IRC bot - Author: Erebus Team
-# trivia module
+# userinfo module
 # This file is released into the public domain; see http://unlicense.org/
 
 # module info
 modinfo = {
        'author': 'Erebus Team',
        'license': 'public domain',
-       'compatible': [1], # compatible module API versions
-       'depends': [], # other modules required to work properly?
+       'compatible': [2],
+       'depends': [],
+       'softdeps': ['help'],
 }
 
 # preamble
@@ -29,9 +30,12 @@ import json
 def gotParent():
        global jsonfile, db
        jsonfile = parent.cfg.get('userinfo', 'jsonpath', default="./modules/userinfo.json")
-       db = json.load(open(jsonfile, "r"))
+       try:
+               db = json.load(open(jsonfile, "r"))
+       except:
+               db = {}
 def closeshop():
-       if json is not None and json.dump is not None:
+       if json is not None and json.dump is not None and db != {}:
                json.dump(db, open(jsonfile, "w"))#, indent=4, separators=(',', ': '))
 
 #functions
@@ -40,32 +44,63 @@ def getauth(thing):
                if thing.auth is not None:
                        return "#"+thing.auth
        elif isinstance(thing, basestring):
-               if thing[0] == "#":
+               if thing.startswith("#"):
                        return thing
                else:
                        if parent.user(thing).auth is not None:
                                return "#"+parent.user(thing).auth
        return None
 
-def has(user, key):
+def _keys(user):
+       return list(set(db.get(getauth(user), {}).keys() + db.get(str(user).lower(), {}).keys())) #list-to-set-to-list to remove duplicates
+def _has(user, key):
+       key = key.lower()
        return (
                key in db.get(getauth(user), {}) or
                key in db.get(str(user).lower(), {})
        )
-def get(user, key, default=None):
+def _get(user, key, default=None):
+       key = key.lower()
        return (
-               db.get(getauth(user), {}).get(key,
-               db.get(str(user).lower(), {}).get(key,
-               default
+               db.get(getauth(user), {}). #try to get the auth
+                       get(key, #try to get the info-key by auth
+                       db.get(str(user).lower(), {}). #fallback to using the nick
+                               get(key, #and try to get the info-key from that
+                               default #otherwise throw out whatever default
        )))
-def set(user, key, value):
-       if getauth(user) is not None: db.setdefault(getauth(user), {})[key] = value
-       db.setdefault(str(user).lower(), {})[key] = value
+def _set(user, key, value):
+       key = key.lower()
+       if getauth(user) is not None:
+               db.setdefault(getauth(user), {})[key] = value #use auth if we can
+       db.setdefault(str(user).lower(), {})[key] = value #but set nick too
+def _del(user, key):
+       key = key.lower()
+       auth = getauth(user)
+       if auth is not None and auth in db and key in db[auth]:
+               del db[auth][key]
+       target = str(user).lower()
+       if target in db and key in db[target]:
+               del db[target][key]
 
 #commands
-@lib.hook('get', needchan=False)
-def cmd_get(bot, user, chan, realtarget, *args):
-       if chan is not None and realtarget == chan.name: replyto = chan
+@lib.hook(needchan=False, wantchan=True)
+@lib.help("[<target>]", "lists info items known about someone", "<target> may be a nick, or an auth in format '#auth'", "it defaults to yourself")
+def getitems(bot, user, chan, realtarget, *args):
+       if chan is not None: replyto = chan
+       else: replyto = user
+
+       if len(args) > 0:
+               target = args[0]
+       else:
+               target = user
+
+       bot.msg(replyto, "%(user)s: %(target)s has the following info items: %(items)s" % {'user':user,'target':target,'items':(', '.join(_keys(target)))})
+
+@lib.hook(needchan=False, wantchan=True)
+@lib.help("[<target>] <item>", "gets an info item about someone", "<target> may be a nick, or an auth in format '#auth'", "it defaults to yourself")
+@lib.argsGE(1)
+def getinfo(bot, user, chan, realtarget, *args):
+       if chan is not None: replyto = chan
        else: replyto = user
 
        if len(args) > 1:
@@ -75,20 +110,40 @@ def cmd_get(bot, user, chan, realtarget, *args):
                target = user
                item = args[0]
 
-       value = get(target, item, None)
+       value = _get(target, item, None)
        if value is None:
                bot.msg(replyto, "%(user)s: %(item)s on %(target)s is not set." % {'user':user,'item':item,'target':target})
        else:
                bot.msg(replyto, "%(user)s: %(item)s on %(target)s: %(value)s" % {'user':user,'item':item,'target':target,'value':value})
 
-@lib.hook('set', needchan=False)
+@lib.hook(needchan=False)
+@lib.help("<item> <value>", "sets an info item about you")
 @lib.argsGE(2)
-def cmd_set(bot, user, chan, realtarget, *args):
-       set(user, args[0], ' '.join(args[1:]))
+def setinfo(bot, user, chan, realtarget, *args):
+       _set(user, args[0], ' '.join(args[1:]))
+       closeshop()
        bot.msg(user, "Done.")
 
-@lib.hook('oset', glevel=lib.STAFF, needchan=False)
+@lib.hook(needchan=False)
+@lib.help("<item>", "deletes an info item about you")
+@lib.argsEQ(1)
+def delinfo(bot, user, chan, realtarget, *args):
+       _del(user, args[0])
+       closeshop()
+       bot.msg(user, "Done.")
+
+@lib.hook(glevel=lib.ADMIN, needchan=False)
+@lib.help("<target> <item> <value>", "sets an info item about someone else", "<target> may be a nick, or an auth in format '#auth'")
 @lib.argsGE(3)
-def cmd_oset(bot, user, chan, realtarget, *args):
-       set(args[0], args[1], ' '.join(args[2:]))
+def osetinfo(bot, user, chan, realtarget, *args):
+       _set(args[0], args[1], ' '.join(args[2:]))
+       closeshop()
+       bot.msg(user, "Done.")
+
+@lib.hook(glevel=lib.STAFF, needchan=False)
+@lib.help("<target> <item>", "deletes an info item about someone else", "<target> may be a nick, or an auth in format '#auth'")
+@lib.argsEQ(2)
+def odelinfo(bot, user, chan, realtarget, *args):
+       _del(args[0], args[1])
+       closeshop()
        bot.msg(user, "Done.")