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)
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)
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)
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)
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("👌")
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)