Пример #1
0
    async def handle_submission_approve(
            self, payload: discord.RawReactionActionEvent):
        if payload.user_id == self.bot.user.id:
            return

        if str(payload.emoji) != str(SubmissionState.VALIDATED):
            return

        channel = self.bot.get_channel(payload.channel_id)
        if channel.id == CHAN_SUBMIT_MAPS:
            initial = True
        elif is_testing(channel):
            initial = False
        else:
            return

        user = channel.guild.get_member(payload.user_id)
        if not is_staff(user):
            return

        message = self.bot.get_message(
            payload.message_id) or await channel.fetch_message(
                payload.message_id)
        if not has_map(message):
            return

        if initial:
            if message.id in self._active_submissions:
                return

            isubm = InitialSubmission(message)
            try:
                isubm.validate()
            except ValueError:
                return

            self._active_submissions.add(message.id)
            subm = await isubm.process()
            await isubm.set_state(SubmissionState.PROCESSED)
            self._map_channels[isubm.map_channel.id] = isubm.map_channel
            self._active_submissions.discard(message.id)

        else:
            subm = Submission(message)

        await self.upload_submission(subm)
        log.info('%s approved submission %r in channel #%s', user,
                 subm.filename, channel)
Пример #2
0
    async def handle_submission(self, message: discord.Message):
        author = message.author
        if author == self.bot.user:
            return

        if not has_map(message):
            return

        channel = message.channel
        if channel.id == CHAN_SUBMIT_MAPS:
            isubm = InitialSubmission(message)
            await self.validate_submission(isubm)

        else:
            map_channel = self.get_map_channel(channel.id)
            if map_channel is None:
                return

            subm = Submission(message)
            if map_channel.filename == str(subm):
                by_mapper = str(author.id) in map_channel.mapper_mentions
                if by_mapper and map_channel.state in (MapState.WAITING, MapState.READY):
                    await map_channel.set_state(state=MapState.TESTING)

                if by_mapper or is_staff(author):
                    await self.upload_submission(subm)
                else:
                    await subm.set_state(SubmissionState.VALIDATED)
Пример #3
0
    async def handle_submission_edit(self,
                                     payload: discord.RawMessageUpdateEvent):
        # have to work with the raw data here to avoid unnecessary api calls
        data = payload.data
        if 'author' in data and int(data['author']['id']) == self.bot.user.id:
            return

        if payload.channel_id != CHAN_SUBMIT_MAPS:
            return

        if not ('attachments' in data and data['attachments']
                and data['attachments'][0]['filename'].endswith('.map')):
            return

        # don't handle already processed submissions
        if 'reactions' in data and data['reactions'][0]['emoji'][
                'name'] == str(SubmissionState.PROCESSED):
            return

        channel = self.bot.get_channel(payload.channel_id)
        message = self.bot.get_message(
            payload.message_id) or await channel.fetch_message(
                payload.message_id)

        isubm = InitialSubmission(message)
        await self.validate_submission(isubm)
Пример #4
0
    async def validate_submission(self, isubm: InitialSubmission):
        try:
            isubm.validate()

            exists = self.get_map_channel(name=isubm.name)
            if exists:
                raise ValueError('A channel for this map already exists')

            query = 'SELECT TRUE FROM stats_maps_static WHERE name = $1;'
            released = await self.bot.pool.fetchrow(query, isubm.name)
            if released:
                raise ValueError('A map with that name is already released')
        except ValueError as exc:
            await isubm.respond(exc)
            await isubm.set_state(SubmissionState.ERROR)
        else:
            await isubm.set_state(SubmissionState.VALIDATED)
Пример #5
0
    async def handle_submission(self, message: discord.Message):
        author = message.author
        if not has_map(message):
            return

        channel = message.channel
        if channel.id == CHAN_SUBMIT_MAPS:
            isubm = InitialSubmission(message)
            await self.validate_submission(isubm)

        else:
            map_channel = self.get_map_channel(channel.id)
            if map_channel is None:
                return

            subm = Submission(message)
            if map_channel.filename == str(subm):
                by_mapper = str(author.id) in map_channel.mapper_mentions
                if by_mapper and map_channel.state in (MapState.WAITING,
                                                       MapState.READY):
                    await map_channel.set_state(state=MapState.TESTING)

                if by_mapper or is_staff(author) or author == self.bot.user:
                    await self.upload_submission(subm)
                else:
                    await subm.set_state(SubmissionState.VALIDATED)
                debug_output = await subm.debug_map()
                if debug_output:
                    if len(debug_output) + 6 < 2000:
                        await message.reply("```" + debug_output + "```",
                                            mention_author=False)
                    else:
                        file = discord.File(io.StringIO(debug_output),
                                            filename="debug_output.txt")
                        await message.reply("Error log in the attached file",
                                            file=file,
                                            mention_author=False)
                else:
                    await subm.message.add_reaction("👌")
Пример #6
0
    async def handle_submission_approve(
            self, payload: discord.RawReactionActionEvent):
        if payload.user_id == self.bot.user.id:
            return

        if str(payload.emoji) != str(SubmissionState.VALIDATED):
            return

        channel = self.bot.get_channel(payload.channel_id)
        if channel.id == CHAN_SUBMIT_MAPS:
            initial = True
        elif is_testing(channel):
            initial = False
        else:
            return

        user = channel.guild.get_member(payload.user_id)
        if not is_staff(user):
            return

        message = self.bot.get_message(
            payload.message_id) or await channel.fetch_message(
                payload.message_id)
        if not has_map(message):
            return

        if initial:
            if message.id in self._active_submissions:
                return

            isubm = InitialSubmission(message)
            try:
                isubm.validate()
            except ValueError:
                return

            self._active_submissions.add(message.id)
            subm = await isubm.process()
            await isubm.set_state(SubmissionState.PROCESSED)
            self._map_channels[isubm.map_channel.id] = isubm.map_channel
            self._active_submissions.discard(message.id)

        else:
            subm = Submission(message)
            debug_output = await subm.debug_map()
            if debug_output:
                if len(debug_output) + 6 < 2000:
                    await message.reply("```" + debug_output + "```",
                                        mention_author=False)
                else:
                    file = discord.File(io.StringIO(debug_output),
                                        filename="debug_output.txt")
                    await message.reply("Error log in the attached file",
                                        file=file,
                                        mention_author=False)
            else:
                await subm.message.add_reaction("👌")

        await self.upload_submission(subm)
        log.info('%s approved submission %r in channel #%s', user,
                 subm.filename, channel)