def start_vote(self, event): """ :help: Start a vote :usage: <description> """ if event["target"].get_setting("votes-start-restricted", True): event["check_assert"](utils.Check("channel-mode", "o") | utils.Check("permission", "vote") | utils.Check("channel-access", "vote")) vote = self._start_vote(event["target"], event["args"]) event["stdout"].write( "Vote %s started. use '%svote <option>' to vote (options: %s)" % (vote["id"], event["command_prefix"], self._format_options(vote)))
def part(self, event): check = utils.Check("permission", "part") if event["args"]: target = event["args_split"][0] elif event["is_channel"]: target = event["target"].name check |= utils.Check("channel-mode", "high") check |= utils.Check("channel-access", "part") else: event["stderr"].write("No channel provided") event["check_assert"](check) event["server"].send_part(target)
def relay_group(self, event): subcommand = event["args_split"][0].lower() group_settings = self.bot.find_settings(prefix="relay-group-") groups = {} for setting, value in group_settings: name = setting.replace("relay-group-", "", 1) groups[name] = value if subcommand == "list": event["stdout"].write("Relay groups: %s" % ", ".join(groups.keys())) return if not len(event["args_split"]) > 1: raise utils.EventError("Please provide a group name") name = event["args_split"][1].lower() event["check_assert"](utils.Check("is-channel")) current_channel = [event["server"].id, event["target"].name] channel_groups = event["target"].get_setting("relay-groups", []) message = None remove = False if subcommand == "join": if not name in groups: groups[name] = [] if current_channel in groups[name] or name in channel_groups: raise utils.EventError("Already joined group '%s'" % name) groups[name].append(current_channel) channel_groups.append(name) message = "Joined" elif subcommand == "leave": if (not name in groups or not current_channel in groups[name] or not name in channel_groups): raise utils.EventError("Not in group '%s'" % name) groups[name].remove(current_channel) channel_groups.remove(name) message = "Left" else: raise utils.EventError("Unknown subcommand '%s'" % subcommand) if not message == None: if not groups[name]: self.bot.del_setting("relay-group-%s" % name) else: self.bot.set_setting("relay-group-%s" % name, groups[name]) if channel_groups: event["target"].set_setting("relay-groups", channel_groups) else: event["target"].del_setting("relay-groups") event["stdout"].write("%s group '%s'" % (message, name))
def private_unban(self, event): """ :help: Unban a user/hostmask from the current channel :usage: <channel> <nickname/hostmask> """ channel = event["server"].channels.get(event["args_split"][0]) event["check_assert"](utils.Check("channel-access", channel, "ban")) self._ban(event["server"], channel, False, event["args_split"][1])
def markov_for(self, event): if event["args_split"][0] in event["server"].channels: channel = event["server"].channels.get(event["args_split"][0]) if not channel.has_user(event["user"]): event["check_assert"](utils.Check("permission", "markovfor")) self._markov_for(channel, event["stdout"], event["stderr"], first_words=event["args_split"][1:]) else: event["stderr"].write("Unknown channel")
def private_kick(self, event): """ :help: Kick a user from the current channel :usage: <nickname> [reason] :prefix: Kick """ channel = event["server"].channels.get(event["args_split"][0]) event["check_assert"](utils.Check("channel-access", channel, "kick")) self._kick_command(event, channel, event["args_split"][1:])
def vote(self, event): """ :help: Cast choice for a given vote :usage: <id> [choice] """ if event["target"].get_setting("votes-scast-restricted", True): event["check_assert"](utils.Check("channel-mode", "v") | utils.Check("permission", "vote") | utils.Check("channel-access", "vote")) vote_id = event["args_split"][0] vote = self._get_vote(event["target"], vote_id) if vote == None: raise utils.EventError(STR_NOVOTE % vote_id) if not len(event["args_split"]) > 1: closed = "" if vote["open"] else " (closed)" event["stdout"].write("Vote %s%s: %s" % (vote_id, closed, self._format_vote(vote))) else: if not vote["open"]: raise utils.EventError("%s: vote %s is closed" % (event["user"].nickname, vote_id)) choice = event["args_split"][1].lower() if not choice in vote["options"]: raise utils.EventError("Vote options: %s" % self._format_options(vote)) cast_result = self._cast_vote(event["target"], vote_id, event["user"], choice) cast_desc = "has been cast" if cast_result == VoteCastResult.Changed: cast_desc = "has been changed" elif cast_result == VoteCastResult.Unchanged: cast_desc = "is unchanged" event["stdout"].write("%s: your vote %s." % (event["user"].nickname, cast_desc))
def down(self, event): if not event["spec"][1] or event["spec"][1][1] == event["user"]: users = [event["user"]] else: event["check_assert"](utils.Check("channel-mode", "o") | utils.Check("channel-access", "high,down")) if event["spec"][1][0] == "cuser": users = [event["spec"][1][1]] elif event["spec"][1][0] == "cmask": users = event["spec"][1][1] for i, user in enumerate(users): if event["server"].is_own_nickname(user.nickname): users.append(users.pop(i)) break modes = [] for user in users: user_modes = event["spec"][0].get_user_modes(user) modes.extend([(m, user.nickname) for m in user_modes]) if modes: event["spec"][0].send_modes(modes, False)
def config(self, event): arg_count = len(event["args_split"]) context_desc, _, name = event["args_split"][0].partition(":") setting = None value = None if arg_count > 1: setting = event["args_split"][1].lower() if arg_count > 2: value = " ".join(event["args_split"][2:]) try: target, context, name_override = self._to_context( event["server"], event["target"], event["user"], context_desc) except ValueError: raise utils.EventError("Unknown context '%s'. Please provide " "'user', 'channel', 'server' or 'bot'" % context_desc) name = name_override or name permission_check = utils.Check("permission", "config") if context == "set": if name: event["check_assert"](utils.Check("self", name) | permission_check) target = event["server"].get_user(name) else: target = event["user"] elif context == "channelset": if name: if name in event["server"].channels: target = event["server"].channels.get(name) else: target = ConfigChannelTarget(self.bot, event["server"], name) else: if event["is_channel"]: target = event["target"] else: raise utils.EventError( "Cannot change config for current channel when in " "private message") event["check_assert"]( permission_check | utils.Check("channel-access", target, "high,config") | utils.Check("channel-mode", target, "o")) elif context == "serverset" or context == "botset": event["check_assert"](permission_check) export_settings = self._get_export_setting(context) if not setting == None: if not setting.lstrip("-") in export_settings: raise utils.EventError("Setting not found") try: result = self._config(export_settings, target, setting, value) except ConfigInvalidValue as e: if not e.message == None: raise utils.EventError("Invalid value: %s" % e.message) example = export_settings[setting].get_example() if not example == None: raise utils.EventError("Invalid value. %s" % example) else: raise utils.EventError("Invalid value") except ConfigSettingInexistent: raise utils.EventError("Setting not set") for_str = "" if name_override: for_str = " for %s" % name_override if result.result == ConfigResults.Changed: event["stdout"].write("Config '%s'%s set to %s" % (setting, for_str, result.data)) elif result.result == ConfigResults.Retrieved: event["stdout"].write("%s%s: %s" % (setting, for_str, result.data)) elif result.result == ConfigResults.Removed: event["stdout"].write("Unset setting '%s'%s" % (setting.lstrip("-"), for_str)) elif result.result == ConfigResults.Unchanged: event["stdout"].write("Config '%s'%s unchanged" % (setting, for_str)) else: event["stdout"].write("Available config: %s" % ", ".join(export_settings.keys()))