diff --git a/sopel_SpiceBot_Core_1/SBCore/users/__init__.py b/sopel_SpiceBot_Core_1/SBCore/users/__init__.py index 895512f..2fffcd0 100644 --- a/sopel_SpiceBot_Core_1/SBCore/users/__init__.py +++ b/sopel_SpiceBot_Core_1/SBCore/users/__init__.py @@ -8,18 +8,34 @@ class Users(): def __init__(self, bot): self.bot = None - self.priv_dict = { + self.bot_priv_dict = { "OWNER": 10, "ADMIN": 5 } + self.channel_privilege_dict = { + "OPER": plugin.OPER, + "OWNER": plugin.OWNER, + "ADMIN": plugin.ADMIN, + "OP": plugin.OP, + "HALFOP": plugin.HALFOP, + "VOICE": plugin.VOICE, + } + """Bot Priviledges""" + def get_bot_privilege_name(self, privilege): + priv_list = [] + for priv_name in list(self.bot_priv_dict.keys()): + if self.bot_priv_dict[priv_name] >= privilege: + priv_list.append(priv_name) + return priv_list[-1] + def has_bot_privilege(self, nick, privilege): if not isinstance(privilege, int): - if privilege.upper() in list(self.priv_dict.keys()): - privilege = self.priv_dict[privilege.upper()] + if privilege.upper() in list(self.bot_priv_dict.keys()): + privilege = self.bot_priv_dict[privilege.upper()] else: privilege = 0 @@ -27,9 +43,9 @@ class Users(): def get_nick_bot_privilege_level(self, nick): if self.is_bot_owner(nick): - return self.priv_dict["OWNER"] + return self.bot_priv_dict["OWNER"] elif self.is_bot_admin(nick): - return self.priv_dict["ADMIN"] + return self.bot_priv_dict["ADMIN"] return 0 """Bot Owner""" @@ -69,24 +85,32 @@ class Users(): return True return False - """Channel Priviledges""" + """Channel Privileges""" + + def get_channel_privilege_name(self, privilege): + priv_list = [] + for priv_name in list(self.channel_privilege_dict.keys()): + if self.channel_privilege_dict[priv_name] >= privilege: + priv_list.append(priv_name) + return priv_list[-1] def has_channel_privilege(self, nick, channelstr, privilege): - if privilege.upper() == "OPER": - privilege = plugin.OPER - elif privilege.upper() == "OWNER": - privilege = plugin.OWNER - elif privilege == "ADMIN": - privilege = plugin.ADMIN - elif privilege.upper() == "OP": - privilege = plugin.OP - elif privilege.upper() in ["HALFOP", "HOP"]: - privilege = plugin.HALFOP - elif privilege.upper() == "VOICE": - privilege = plugin.VOICE - else: - return False + if not isinstance(privilege, int): + if privilege.upper() == "OPER": + privilege = plugin.OPER + elif privilege.upper() == "OWNER": + privilege = plugin.OWNER + elif privilege == "ADMIN": + privilege = plugin.ADMIN + elif privilege.upper() == "OP": + privilege = plugin.OP + elif privilege.upper() in ["HALFOP", "HOP"]: + privilege = plugin.HALFOP + elif privilege.upper() == "VOICE": + privilege = plugin.VOICE + else: + return False channel = self.bot.channels[channelstr] diff --git a/sopel_SpiceBot_Core_Prerun/__init__.py b/sopel_SpiceBot_Core_Prerun/__init__.py index ef91a72..39c6d67 100644 --- a/sopel_SpiceBot_Core_Prerun/__init__.py +++ b/sopel_SpiceBot_Core_Prerun/__init__.py @@ -6,7 +6,7 @@ from sopel.trigger import Trigger from sopel_SpiceBot_Core_1 import sb -def prerun(): +def prerun(metadata={}): """This decorator is the hub of handling for all SpiceBot Commands""" def actual_decorator(function): @@ -14,7 +14,13 @@ def prerun(): @functools.wraps(function) def internal_prerun(bot, trigger, *args, **kwargs): - comrun = ComRun(bot, trigger, function) + comrun = ComRun(bot, trigger, function, metadata) + + # Check that nick has the correct bot or channel privileges + # to run the command. + if not comrun.is_nick_privileged(): + comrun.osd(comrun.required_privileges_text()) + return # Since there was more than one command, # we are going to redispatch commands @@ -140,13 +146,26 @@ def rebuild_pipes(commands, trigger_str_add=None): class ComRun(): - def __init__(self, bot, trigger, function): + def __init__(self, bot, trigger, function, metadata): self.bot = bot self.orig_trigger = trigger self.trigger = trigger self.function = function + self.metadata = metadata self._say = [] + @property + def instigator(self): + return self.trigger.nick + + @property + def channel(self): + return self.trigger.sender + + @property + def is_in_channel(self): + return self.channel.startswith("#") + def say(self, message): self._say.append(message) @@ -155,6 +174,49 @@ class ComRun(): recipients = self.trigger.sender sb.osd(messages, recipients, text_method, max_messages=-1) + @property + def required_privileges(self): + bot_level = 0 + channel_level = 0 + + if "required_privileges" in list(self.metadata.keys()): + if "bot_level" in list(self.metadata["required_privileges"].keys()): + bot_level = self.metadata["required_privileges"]["bot_level"] + if "channel_level" in list(self.metadata["required_privileges"].keys()): + channel_level = self.metadata["required_privileges"]["channel_level"] + + return { + "bot": bot_level, + "channel": channel_level + } + + @property() + def required_privileges_text(self): + ret_text = "This command requries privileges of/above the following" + if self.required_privileges["bot"]: + ret_text += " Bot: %s" % sb.users.get_bot_privilege_name(self.required_privileges["bot"]) + if self.required_privileges["channel"] and self.is_in_channel: + ret_text += " or " + ret_text += "Channel: %s" % sb.users.get_channel_privilege_name(self.required_privileges["channel"]) + ret_text += "." + return ret_text + + @property + def is_nick_privileged(self): + has_bot_priv = True + has_channel_priv = True + + priv_dict = self.required_privileges() + + has_bot_priv = sb.users.has_bot_privilege(self.trigger.nick, priv_dict["bot"]) + + if self.is_in_channel: + has_channel_priv = sb.users.has_channel_privilege(self.trigger.nick, self.trigger.sender, priv_dict["channel"]) + + if has_bot_priv or has_channel_priv: + return True + return False + @property def is_real_command(self): return sb.commands.is_real_command(self.command)