test multirun disabling

This commit is contained in:
deathbybandaid 2019-06-26 10:59:53 -04:00
parent 1b14d96b71
commit 8a24ca71e7
4 changed files with 217 additions and 53 deletions

View File

@ -29,6 +29,7 @@ class BotChannels():
self.lock = threading.Lock() self.lock = threading.Lock()
self.channel_lock = False self.channel_lock = False
self.channels = []
self.dict = { self.dict = {
"list": {}, "list": {},
"InitialProcess": False "InitialProcess": False
@ -46,7 +47,7 @@ class BotChannels():
if channel.lower() not in list(self.dict["list"].keys()): if channel.lower() not in list(self.dict["list"].keys()):
raise Exception('Channel ' + str(channel.lower()) + " does not seem to be on this server") raise Exception('Channel ' + str(channel.lower()) + " does not seem to be on this server")
if 'users' not in list(self.dict["list"][channel.lower()].keys()): if 'users' not in list(self.dict["list"][channel.lower()].keys()) or not self.check_channel_bot(channel):
raise Exception('Channel ' + str(channel.lower()) + " does not seem to be a channel the bot is in") raise Exception('Channel ' + str(channel.lower()) + " does not seem to be a channel the bot is in")
nick_ids = self.dict["list"][channel.lower()]['users'] nick_ids = self.dict["list"][channel.lower()]['users']
@ -102,6 +103,8 @@ class BotChannels():
self.lock.acquire() self.lock.acquire()
del self.dict['list'][channel.lower()] del self.dict['list'][channel.lower()]
self.lock.release() self.lock.release()
if channel.lower() in self.channels:
self.channels.remove(channel.lower())
def join_all_channels(self, bot): def join_all_channels(self, bot):
if botconfig.SpiceBot_Channels.joinall: if botconfig.SpiceBot_Channels.joinall:
@ -112,6 +115,10 @@ class BotChannels():
if channel not in list(bot.channels.keys()) and botconfig.SpiceBot_Channels.operadmin: if channel not in list(bot.channels.keys()) and botconfig.SpiceBot_Channels.operadmin:
bot.write(('SAJOIN', bot.nick, self.dict['list'][channel]['name'])) bot.write(('SAJOIN', bot.nick, self.dict['list'][channel]['name']))
if channel in list(bot.channels.keys()):
if channel.lower() not in self.channels:
self.channels.append(channel.lower())
def chanadmin_all_channels(self, bot): def chanadmin_all_channels(self, bot):
# Chan ADMIN +a # Chan ADMIN +a
for channel in list(bot.channels.keys()): for channel in list(bot.channels.keys()):
@ -123,6 +130,10 @@ class BotChannels():
else: else:
bot.part(channel) bot.part(channel)
if channel not in list(bot.channels.keys()):
if channel.lower() in self.channels:
self.channels.remove(channel.lower())
def whois_ident(self, nick): def whois_ident(self, nick):
nick = Identifier(nick) nick = Identifier(nick)
nick_id = botdb.db.get_nick_id(nick, create=True) nick_id = botdb.db.get_nick_id(nick, create=True)
@ -138,6 +149,8 @@ class BotChannels():
self.dict['list'][channel.lower()]['users'] = [] self.dict['list'][channel.lower()]['users'] = []
if nick_id not in self.dict['list'][channel.lower()]['users']: if nick_id not in self.dict['list'][channel.lower()]['users']:
self.dict['list'][channel.lower()]['users'].append(int(nick_id)) self.dict['list'][channel.lower()]['users'].append(int(nick_id))
if channel.lower() not in self.channels:
self.channels.append(channel.lower())
def remove_from_channel(self, channel, nick, nick_id=None): def remove_from_channel(self, channel, nick, nick_id=None):
channel = str(channel) channel = str(channel)
@ -157,6 +170,8 @@ class BotChannels():
if 'users' not in self.dict['list'][channel.lower()]: if 'users' not in self.dict['list'][channel.lower()]:
self.dict['list'][channel.lower()]['users'] = [] self.dict['list'][channel.lower()]['users'] = []
self.dict['list'][channel.lower()]['users'] = [] self.dict['list'][channel.lower()]['users'] = []
if channel.lower() in self.channels:
self.channels.remove(channel.lower())
def channel_scan(self, bot): def channel_scan(self, bot):
for channel in list(bot.channels.keys()): for channel in list(bot.channels.keys()):
@ -221,5 +236,13 @@ class BotChannels():
def mode(self, bot, trigger): def mode(self, bot, trigger):
return return
def check_channel_bot(self, channel, allchan=False):
if str(channel).lower() in self.channels:
return True
elif allchan and str(channel).lower() in list(self.dict['list'].keys()):
return True
else:
return False
channels = BotChannels() channels = BotChannels()

View File

@ -19,6 +19,7 @@ from .Logs import logs
from .Config import config as botconfig from .Config import config as botconfig
from .Database import db as botdb from .Database import db as botdb
from .Read import read as botread from .Read import read as botread
from .Channels import channels as botchannels
class SpiceBot_Commands_MainSection(StaticSection): class SpiceBot_Commands_MainSection(StaticSection):
@ -38,7 +39,7 @@ class BotCommands():
'nickname': {}, 'nickname': {},
'rule': {} 'rule': {}
}, },
'disabled': {} 'disabled': {},
} }
self.module_files_parse() self.module_files_parse()
self.nickrules() self.nickrules()
@ -67,17 +68,6 @@ class BotCommands():
return commandstype return commandstype
return None return None
def get_commands_disabled(self, channel):
if not len(list(self.dict['disabled'])):
self.dict['disabled'] = botdb.get_channel_value(channel, 'commands_disabled') or {}
return self.dict['disabled']
def check_commands_disabled(self, command, channel):
if command in list(self.get_commands_disabled(channel).keys()):
return True
else:
return False
def get_realcom(self, command, trigger_command_type): def get_realcom(self, command, trigger_command_type):
realcom = command realcom = command
@ -92,18 +82,74 @@ class BotCommands():
return realcom return realcom
def set_command_disabled(self, command, channel, timestamp, reason, bywhom): def get_commands_disabled(self, target, disabletype="fully"):
if not len(list(self.dict['disabled'])): disabletype = str(disabletype)
self.dict['disabled'] = botdb.get_channel_value(channel, 'commands_disabled') or {} if disabletype not in list(self.dict['disabled'].keys()):
self.dict['disabled'][command] = {"reason": reason, "timestamp": timestamp, "disabledby": bywhom} self.dict['disabled'][disabletype] = {
botdb.set_channel_value(channel, 'commands_disabled', self.dict['disabled']) "users": {},
"channels": {}
}
if botdb.check_nick_id(target):
if not len(list(self.dict['disabled'][disabletype]["users"])):
self.dict['disabled'][disabletype]["users"] = botdb.get_nick_value(target, 'commands_' + disabletype + 'disabled') or {}
return self.dict['disabled'][disabletype]["users"]
elif botchannels.check_channel_bot(target, True):
if not len(list(self.dict['disabled'][disabletype]["channels"])):
self.dict['disabled'][disabletype]["channels"] = botdb.get_channel_value(target, 'commands_disabled') or {}
return self.dict['disabled'][disabletype]["channels"]
else:
raise Exception(str(target.lower()) + " appears to not be a valid user/channel")
def unset_command_disabled(self, command, channel): def check_commands_disabled(self, command, target, disabletype="fully"):
if not len(list(self.dict['disabled'])): if disabletype not in list(self.dict['disabled'].keys()):
self.dict['disabled'] = botdb.get_channel_value(channel, 'commands_disabled') or {} self.dict['disabled'][disabletype] = {
if command in list(self.dict['disabled'].keys()): "users": {},
del self.dict['disabled'][command] "channels": {}
botdb.set_channel_value(channel, 'commands_disabled', self.dict['disabled']) }
if command in list(self.get_commands_disabled(target, disabletype).keys()):
return True
else:
return False
def set_command_disabled(self, command, target, timestamp, reason, bywhom, disabletype="fully"):
if disabletype not in list(self.dict['disabled'].keys()):
self.dict['disabled'][disabletype] = {
"users": {},
"channels": {}
}
if botdb.check_nick_id(target):
if not len(list(self.dict['disabled'][disabletype]["users"])):
self.dict['disabled'][disabletype]["users"] = botdb.get_nick_value(target, 'commands_disabled') or {}
self.dict['disabled'][disabletype]["users"][command] = {"reason": reason, "timestamp": timestamp, "disabledby": bywhom}
botdb.set_nick_value(target, 'commands_disabled', self.dict['disabled'][disabletype]["users"])
elif botchannels.check_channel_bot(target, True):
if not len(list(self.dict['disabled'][disabletype]["channels"])):
self.dict['disabled'][disabletype]["channels"] = botdb.get_channel_value(target, 'commands_disabled') or {}
self.dict['disabled'][disabletype]["channels"][command] = {"reason": reason, "timestamp": timestamp, "disabledby": bywhom}
botdb.set_channel_value(target, 'commands_disabled', self.dict['disabled'][disabletype]["channels"])
else:
raise Exception(str(target.lower()) + " appears to not be a valid user/channel")
def unset_command_disabled(self, command, target, timestamp, reason, bywhom, disabletype="fully"):
if disabletype not in list(self.dict['disabled'].keys()):
self.dict['disabled'][disabletype] = {
"users": {},
"channels": {}
}
if botdb.check_nick_id(target):
if not len(list(self.dict['disabled'][disabletype]["users"])):
self.dict['disabled'][disabletype]["users"] = botdb.get_nick_value(target, 'commands_disabled') or {}
if command in list(self.dict['disabled'][disabletype]["users"].keys()):
del self.dict['disabled'][disabletype]["users"][command]
botdb.set_nick_value(target, 'commands_disabled', self.dict['disabled'][disabletype]["users"])
elif botchannels.check_channel_bot(target, True):
if not len(list(self.dict['disabled'][disabletype]["channels"])):
self.dict['disabled'][disabletype]["channels"] = botdb.get_channel_value(target, 'commands_disabled') or {}
if command in list(self.dict['disabled'][disabletype]["channels"].keys()):
del self.dict['disabled'][disabletype]["channels"][command]
botdb.set_channel_value(target, 'commands_disabled', self.dict['disabled'][disabletype]["channels"])
else:
raise Exception(str(target.lower()) + " appears to not be a valid user/channel")
def register(self, command_dict): def register(self, command_dict):

View File

@ -15,6 +15,7 @@ import spicemanip
from .Tools import command_permissions_check from .Tools import command_permissions_check
from .Commands import commands as botcommands from .Commands import commands as botcommands
from .Database import db as botdb from .Database import db as botdb
from .Channels import channels as botchannels
def prerun(t_command_type='module', t_command_subtype=None): def prerun(t_command_type='module', t_command_subtype=None):
@ -52,9 +53,13 @@ def prerun(t_command_type='module', t_command_subtype=None):
argsdict_list = trigger_argsdict_list(argsdict_default, and_split) argsdict_list = trigger_argsdict_list(argsdict_default, and_split)
# Run the function for all splits # Run the function for all splits
runcount = 0
for argsdict in argsdict_list: for argsdict in argsdict_list:
runcount += 1
trigger.sb = copy.deepcopy(argsdict) trigger.sb = copy.deepcopy(argsdict)
trigger.sb["runcount"] = runcount
trigger.sb["args"], trigger.sb["hyphen_arg"] = trigger_hyphen_args(trigger.sb["args"]) trigger.sb["args"], trigger.sb["hyphen_arg"] = trigger_hyphen_args(trigger.sb["args"])
if not trigger.sb["hyphen_arg"]: if not trigger.sb["hyphen_arg"]:
# check if anything prohibits the nick from running the command # check if anything prohibits the nick from running the command
@ -127,15 +132,43 @@ def trigger_runstatus(bot, trigger):
if trigger.sb["hyphen_arg"]: if trigger.sb["hyphen_arg"]:
return False return False
if trigger.sb["runcount"] > 1:
# check channel multirun blocks
if not trigger.is_privmsg:
channel_disabled_list = botcommands.get_commands_disabled(str(trigger.sender), "multirun")
if trigger.sb["realcom"] in list(channel_disabled_list.keys()):
reason = channel_disabled_list[trigger.sb["realcom"]]["reason"]
timestamp = channel_disabled_list[trigger.sb["realcom"]]["timestamp"]
bywhom = channel_disabled_list[trigger.sb["realcom"]]["disabledby"]
message = "The " + str(trigger.sb["com"]) + " command multirun usage was disabled by " + bywhom + " for " + str(trigger.sender) + " at " + str(timestamp) + " for the following reason: " + str(reason)
return trigger_cant_run(bot, trigger, message)
# don't run commands that are disabled for specific users
nick_disabled_list = botcommands.get_commands_disabled(str(trigger.nick), "multirun")
if trigger.sb["realcom"] in list(nick_disabled_list.keys()):
reason = nick_disabled_list[trigger.sb["realcom"]]["reason"]
timestamp = nick_disabled_list[trigger.sb["realcom"]]["timestamp"]
bywhom = nick_disabled_list[trigger.sb["realcom"]]["disabledby"]
message = "The " + str(trigger.sb["com"]) + " command was multirun unsage disabled by " + bywhom + " for " + str(trigger.sender) + " at " + str(timestamp) + " for the following reason: " + str(reason)
return trigger_cant_run(bot, trigger, message)
# don't run commands that are disabled in channels # don't run commands that are disabled in channels
if not trigger.is_privmsg: if not trigger.is_privmsg:
commandused = trigger.sb["realcom"] channel_disabled_list = botcommands.get_commands_disabled(str(trigger.sender), "fully")
disabled_list = botdb.get_channel_value(trigger.sender, 'commands_disabled') or {} if trigger.sb["realcom"] in list(channel_disabled_list.keys()):
if commandused in list(disabled_list.keys()): reason = channel_disabled_list[trigger.sb["realcom"]]["reason"]
reason = disabled_list[trigger.sb["realcom"]]["reason"] timestamp = channel_disabled_list[trigger.sb["realcom"]]["timestamp"]
timestamp = disabled_list[trigger.sb["realcom"]]["timestamp"] bywhom = channel_disabled_list[trigger.sb["realcom"]]["disabledby"]
bywhom = disabled_list[trigger.sb["realcom"]]["disabledby"] message = "The " + str(trigger.sb["com"]) + " command was disabled by " + bywhom + " for " + str(trigger.sender) + " at " + str(timestamp) + " for the following reason: " + str(reason)
message = "The " + str(trigger.sb["com"]) + " command was disabled by " + bywhom + " in " + str(trigger.sender) + " at " + str(timestamp) + " for the following reason: " + str(reason) return trigger_cant_run(bot, trigger, message)
# don't run commands that are disabled for specific users
nick_disabled_list = botcommands.get_commands_disabled(str(trigger.nick), "fully")
if trigger.sb["realcom"] in list(nick_disabled_list.keys()):
reason = nick_disabled_list[trigger.sb["realcom"]]["reason"]
timestamp = nick_disabled_list[trigger.sb["realcom"]]["timestamp"]
bywhom = nick_disabled_list[trigger.sb["realcom"]]["disabledby"]
message = "The " + str(trigger.sb["com"]) + " command was disabled by " + bywhom + " for " + str(trigger.sender) + " at " + str(timestamp) + " for the following reason: " + str(reason)
return trigger_cant_run(bot, trigger, message) return trigger_cant_run(bot, trigger, message)
return True return True
@ -177,44 +210,102 @@ def trigger_hyphen_arg_handler(bot, trigger):
else: else:
bot.osd(trigger.sb["com"] + " is a valid command") bot.osd(trigger.sb["com"] + " is a valid command")
return return
elif trigger.sb["hyphen_arg"] in [
'enable', 'disable',
'block', 'unblock',
"activate", "deactivate",
"on", "off"
]:
elif trigger.sb["hyphen_arg"] in ['enable']: target = spicemanip.main(trigger.sb["args"], 1) or None
if not target:
if trigger.sb["hyphen_arg"] in ['enable', 'unblock', "activate", "on"]:
bot.osd("Who/Where am I enabling " + str(trigger.sb["realcom"]) + " usage for?", trigger.sender)
else:
bot.osd("Who/Where am I disabling " + str(trigger.sb["realcom"]) + " usage for?", trigger.sender)
return
if not botdb.check_nick_id(target) and not botchannels.check_channel_bot(target, True):
bot.osd("I don't know who/what " + str(target) + " is.", trigger.sender)
return
if not command_permissions_check(bot, trigger, ['admins', 'owner', 'OP', 'ADMIN', 'OWNER']): if not command_permissions_check(bot, trigger, ['admins', 'owner', 'OP', 'ADMIN', 'OWNER']):
bot.osd("I was unable to disable this command due to privilege issues.") if trigger.sb["hyphen_arg"] in ['enable', 'unblock', "activate", "on"]:
bot.osd("I was unable to enable this command for " + str(target) + " due to privilege issues.")
else:
bot.osd("I was unable to disable this command for " + str(target) + " due to privilege issues.")
return return
if trigger.is_privmsg: if trigger.sb["hyphen_arg"] in ['enable', 'unblock', "activate", "on"]:
bot.osd("This command must be run in a channel you which to enable it in.", trigger.nick, 'notice')
if not botcommands.check_commands_disabled(trigger.sb["realcom"], target, "fully"):
bot.osd(trigger.sb["com"] + " is already enabled for " + str(target), trigger.nick, 'notice')
return return
if not botcommands.check_commands_disabled(trigger.sb["realcom"], trigger.sender): botcommands.unset_command_disabled(trigger.sb["realcom"], target, "fully")
bot.osd(trigger.sb["com"] + " is already enabled in " + str(trigger.sender), trigger.nick, 'notice') bot.osd(trigger.sb["com"] + " is now enabled for " + str(target))
return return
botcommands.unset_command_disabled(trigger.sb["realcom"], trigger.sender) else:
bot.osd(trigger.sb["com"] + " is now enabled in " + str(trigger.sender))
return
elif trigger.sb["hyphen_arg"] in ['disable']: if botcommands.check_commands_disabled(trigger.sb["realcom"], target, "fully"):
bot.osd(trigger.sb["com"] + " is already disabled for " + str(target), trigger.nick, 'notice')
if not command_permissions_check(bot, trigger, ['admins', 'owner', 'OP', 'ADMIN', 'OWNER']):
bot.osd("I was unable to disable this command due to privilege issues.")
return
if trigger.is_privmsg:
bot.osd("This command must be run in a channel you which to disable it in.", trigger.nick, 'notice')
return
if botcommands.check_commands_disabled(trigger.sb["realcom"], trigger.sender):
bot.osd(trigger.sb["com"] + " is already disabled in " + str(trigger.sender), trigger.nick, 'notice')
return return
trailingmessage = spicemanip.main(trigger.sb["args"], 0) or "No reason given." trailingmessage = spicemanip.main(trigger.sb["args"], 0) or "No reason given."
timestamp = str(datetime.datetime.utcnow()) timestamp = str(datetime.datetime.utcnow())
botcommands.set_command_disabled(trigger.sb["realcom"], trigger.sender, timestamp, trailingmessage, trigger.nick) botcommands.set_command_disabled(trigger.sb["realcom"], target, timestamp, trailingmessage, trigger.nick, "fully")
bot.osd(trigger.sb["com"] + " is now disabled in " + str(trigger.sender)) bot.osd(trigger.sb["com"] + " is now disabled for " + str(target))
return
if trigger.sb["hyphen_arg"] in ['multirun', 'multiruns']:
onoff = spicemanip.main(trigger.sb["args"], 1) or None
if not onoff or onoff not in ['enable', 'unblock', "activate", "on"]:
bot.osd("Do you want to enable or disable " + str(trigger.sb["realcom"]) + " multirun usage?", trigger.sender)
return
target = spicemanip.main(trigger.sb["args"], 1) or None
if not target:
if onoff in ['enable', 'unblock', "activate", "on"]:
bot.osd("Who/Where am I enabling " + str(trigger.sb["realcom"]) + " multirun usage for?", trigger.sender)
else:
bot.osd("Who/Where am I disabling " + str(trigger.sb["realcom"]) + " multirun usage for?", trigger.sender)
return
if not botdb.check_nick_id(target) and not botchannels.check_channel_bot(target, True):
bot.osd("I don't know who/what " + str(target) + " is.", trigger.sender)
return
if not command_permissions_check(bot, trigger, ['admins', 'owner', 'OP', 'ADMIN', 'OWNER']):
if onoff in ['enable', 'unblock', "activate", "on"]:
bot.osd("I was unable to enable multirun usage on " + str(trigger.sb["realcom"]) + " for " + str(target) + " due to privilege issues.")
else:
bot.osd("I was unable to enable multirun usage on " + str(trigger.sb["realcom"]) + " for " + str(target) + " due to privilege issues.")
return
if onoff in ['enable', 'unblock', "activate", "on"]:
if not botcommands.check_commands_disabled(trigger.sb["realcom"], target, "multirun"):
bot.osd(trigger.sb["com"] + " multirun is already enabled for " + str(target), trigger.nick, 'notice')
return
botcommands.unset_command_disabled(trigger.sb["realcom"], target, "multirun")
bot.osd(trigger.sb["com"] + " multirun is now enabled for " + str(target))
return
else:
if botcommands.check_commands_disabled(trigger.sb["realcom"], target, "multirun"):
bot.osd(trigger.sb["com"] + " multirun is already disabled for " + str(target), trigger.nick, 'notice')
return
trailingmessage = spicemanip.main(trigger.sb["args"], 0) or "No reason given."
timestamp = str(datetime.datetime.utcnow())
botcommands.set_command_disabled(trigger.sb["realcom"], target, timestamp, trailingmessage, trigger.nick, "multirun")
bot.osd(trigger.sb["com"] + " multirun is now disabled for " + str(target))
return return
return return

View File

@ -231,5 +231,9 @@ class BotUsers():
def targetcheck(self): def targetcheck(self):
return True return True
# idk whois
if not botdb.check_nick_id(posstarget):
return
users = BotUsers() users = BotUsers()