Example #1
0
    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)))
Example #2
0
    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)
Example #3
0
    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))
Example #4
0
    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])
Example #5
0
    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")
Example #6
0
    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:])
Example #7
0
    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))
Example #8
0
    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)
Example #9
0
    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()))