From 3192052add2d307fc534f6b447599ccb3b5cfaca Mon Sep 17 00:00:00 2001 From: "Vgr E.Barry" Date: Sat, 6 Dec 2014 15:43:34 -0500 Subject: [PATCH] Allow admins and owners tracking via account. --- botconfig.py.example | 3 +++ modules/wolfgame.py | 32 +++++++++++++++++++++++--------- settings/wolfgame.py | 5 ++++- tools/decorators.py | 29 ++++++++++++++++++++++++++--- 4 files changed, 56 insertions(+), 13 deletions(-) diff --git a/botconfig.py.example b/botconfig.py.example index 8863fc7..799bd26 100644 --- a/botconfig.py.example +++ b/botconfig.py.example @@ -20,3 +20,6 @@ ALLOWED_NORMAL_MODE_COMMANDS = [] # debug mode commands to be allowed in normal OWNERS = ("unaffiliated/wolfbot_admin1",) # the comma is required at the end if there is one owner ADMINS = ("unaffiliated/wolfbot_admin2", "unaffiliated/wolfbot_admin3") # glob syntax supported (wildcards) + +OWNERS_ACCOUNTS = ("1owner_acc",) +ADMINS_ACCOUNTS = ("1admin_acc", "2admin_acc") diff --git a/modules/wolfgame.py b/modules/wolfgame.py index aef524d..e1fa92b 100644 --- a/modules/wolfgame.py +++ b/modules/wolfgame.py @@ -5500,7 +5500,7 @@ def get_help(cli, rnick, rest): not fn[0].owner_only and name not in fn[0].aliases): fns.append("\u0002"+name+"\u0002") afns = [] - if is_admin(cloak) or cloak in botconfig.OWNERS: # todo - is_owner + if is_admin(nick): for name, fn in COMMANDS.items(): if fn[0].admin_only and name not in fn[0].aliases: afns.append("\u0002"+name+"\u0002") @@ -5522,9 +5522,23 @@ def on_invite(cli, nick, something, chan): cli.join(chan) -def is_admin(cloak): - return bool([ptn for ptn in botconfig.OWNERS+botconfig.ADMINS if fnmatch.fnmatch(cloak.lower(), ptn.lower())]) +def is_admin(nick): + if nick not in var.USERS.keys(): + return False + if [ptn for ptn in botconfig.OWNERS+botconfig.ADMINS if fnmatch.fnmatch(var.USERS[nick]["cloak"].lower(), ptn.lower())]: + return True + if [ptn for ptn in botconfig.OWNERS_ACCOUNTS+botconfig.ADMINS_ACCOUNTS if fnmatch.fnmatch(var.USERS[nick]["account"].lower(), ptn.lower())]: + return True + return False +def is_owner(nick): + if nick not in var.USERS.keys(): + return False + if [ptn for ptn in botconfig.OWNERS if fnmatch.fnmatch(var.USERS[nick]["cloak"].lower(), ptn.lower())]: + return True + if [ptn for ptn in botconfig.OWNERS_ACCOUNTS if fnmatch.fnmatch(var.USERS[nick]["account"].lower(), ptn.lower())]: + return True + return False @cmd("admins", "ops") def show_admins(cli, nick, chan, rest): @@ -5552,7 +5566,7 @@ def show_admins(cli, nick, chan, rest): if not var.ADMIN_PINGING: return - if is_admin(cloak) and "G" not in status and user != botconfig.NICK: + if is_admin(user) and "G" not in status and user != botconfig.NICK: admins.append(user) @hook("endofwho", hookid=4) @@ -6097,7 +6111,7 @@ def _say(cli, raw_nick, rest, command, action=False): (target, message) = rest - if not is_admin(host): + if not is_admin(nick): if nick not in var.USERS: pm(cli, nick, "You have to be in {0} to use this command.".format( botconfig.CHANNEL)) @@ -6262,7 +6276,7 @@ if botconfig.DEBUG_MODE or botconfig.ALLOWED_NORMAL_MODE_COMMANDS: did = False if PM_COMMANDS.get(cmd) and not PM_COMMANDS[cmd][0].owner_only: if (PM_COMMANDS[cmd][0].admin_only and nick in var.USERS and - not is_admin(var.USERS[nick]["cloak"])): + not is_admin(nick)): # Not a full admin cli.notice(nick, "Only full admins can force an admin-only command.") return @@ -6280,7 +6294,7 @@ if botconfig.DEBUG_MODE or botconfig.ALLOWED_NORMAL_MODE_COMMANDS: # chk_nightdone(cli) elif COMMANDS.get(cmd) and not COMMANDS[cmd][0].owner_only: if (COMMANDS[cmd][0].admin_only and nick in var.USERS and - not is_admin(var.USERS[nick]["cloak"])): + not is_admin(nick)): # Not a full admin cli.notice(nick, "Only full admins can force an admin-only command.") return @@ -6319,7 +6333,7 @@ if botconfig.DEBUG_MODE or botconfig.ALLOWED_NORMAL_MODE_COMMANDS: cmd = rst.pop(0).lower().replace(botconfig.CMD_CHAR, "", 1) if PM_COMMANDS.get(cmd) and not PM_COMMANDS[cmd][0].owner_only: if (PM_COMMANDS[cmd][0].admin_only and nick in var.USERS and - not is_admin(var.USERS[nick]["cloak"])): + not is_admin(nick)): # Not a full admin cli.notice(nick, "Only full admins can force an admin-only command.") return @@ -6332,7 +6346,7 @@ if botconfig.DEBUG_MODE or botconfig.ALLOWED_NORMAL_MODE_COMMANDS: # chk_nightdone(cli) elif cmd.lower() in COMMANDS.keys() and not COMMANDS[cmd][0].owner_only: if (COMMANDS[cmd][0].admin_only and nick in var.USERS and - not is_admin(var.USERS[nick]["cloak"])): + not is_admin(nick)): # Not a full admin cli.notice(nick, "Only full admins can force an admin-only command.") return diff --git a/settings/wolfgame.py b/settings/wolfgame.py index c55d1e2..f837171 100644 --- a/settings/wolfgame.py +++ b/settings/wolfgame.py @@ -198,9 +198,12 @@ LYNCH_MESSAGES_NO_REVEAL = ("The villagers, after much debate, finally decide on import botconfig RULES = (botconfig.CHANNEL + " channel rules: http://wolf.xnrand.com/rules") -botconfig.DENY = {} #these are set in here ... for now +botconfig.DENY = {} # These are set in here ... for now botconfig.ALLOW = {} +botconfig.DENY_ACCOUNTS = {} +botconfig.ALLOW_ACCOUNTS = {} + # Other settings: OPT_IN_PING = False # instead of !away/!back, users can opt-in to be pinged diff --git a/tools/decorators.py b/tools/decorators.py index 1289017..e6364fa 100644 --- a/tools/decorators.py +++ b/tools/decorators.py @@ -11,6 +11,7 @@ from oyoyo.parse import parse_nick import fnmatch import botconfig +import settings.wolfgame as var def generate(fdict, permissions=True, **kwargs): """Generates a decorator generator. Always use this""" @@ -26,7 +27,10 @@ def generate(fdict, permissions=True, **kwargs): else: nick = "" cloak = "" - + if nick in var.USERS.keys(): + acc = var.USERS[nick]["account"] + else: + acc = None if not raw_nick and len(largs) > 1 and largs[1]: largs[1] = nick #if largs[1].startswith("#"): @@ -44,18 +48,37 @@ def generate(fdict, permissions=True, **kwargs): for cmdname in s: if cmdname in botconfig.ALLOW[pattern]: return f(*largs) # no questions + if acc: + for pattern in botconfig.DENY_ACCOUNTS.keys(): + if fnmatch.fnmatch(acc.lower(), pattern.lower()): + for cmdname in s: + if cmdname in botconfig.DENY_ACCOUNTS[pattern]: + largs[0].notice(nick, "You do not have permission to use that command.") + return + for pattern in botconfig.ALLOW_ACCOUNTS.keys(): + if fnmatch.fnmatch(acc.lower(), pattern.lower()): + for cmdname in s: + if cmdname in botconfig.ALLOW_ACCOUNTS[pattern]: + return f(*largs) if owner_only: if cloak and [ptn for ptn in botconfig.OWNERS if fnmatch.fnmatch(cloak.lower(), ptn.lower())]: return f(*largs) - elif cloak: + elif acc and [ptn for ptn in botconfig.OWNERS_ACCOUNTS + if fnmatch.fnmatch(acc.lower(), ptn.lower())]: + return f(*largs) + else: largs[0].notice(nick, "You are not the owner.") return if admin_only: if cloak and [ptn for ptn in botconfig.ADMINS+botconfig.OWNERS if fnmatch.fnmatch(cloak.lower(), ptn.lower())]: return f(*largs) - elif cloak: + elif acc and [ptn for ptn in (botconfig.ADMINS_ACCOUNTS+ + botconfig.OWNERS_ACCOUNTS) if fnmatch.fnmatch( + acc.lower(), ptn.lower())]: + return f(*largs) + else: largs[0].notice(nick, "You are not an admin.") return return f(*largs)