async def buildCache(self, guild: discord.Guild, limit=250): start = time.perf_counter() GearbotLogging.info( f"Populating modlog with missed messages during downtime for {guild.name} ({guild.id})." ) newCount = 0 editCount = 0 count = 0 for channel in guild.text_channels: if channel.permissions_for(guild.get_member( self.bot.user.id)).read_messages: logged_messages = LoggedMessage.select().where( LoggedMessage.channel == channel.id).order_by( LoggedMessage.messageid.desc()).limit(limit * 1.5) messages = dict() for message in logged_messages: messages[message.messageid] = message async for message in channel.history(limit=limit, reverse=False): if not self.running: GearbotLogging.info( "Cog unloaded while still building cache, aborting." ) return if message.author == self.bot.user: continue if message.id not in messages.keys(): try: LoggedMessage.create( messageid=message.id, author=message.author.id, content=message.content, timestamp=message.created_at.timestamp(), channel=channel.id, server=channel.guild.id) for a in message.attachments: LoggedAttachment.create( id=a.id, url=a.url, isImage=(a.width is not None or a.width is 0), messageid=message.id) newCount = newCount + 1 except IntegrityError: # somehow we didn't fetch enough messages, did someone set off a nuke in the channel? logged = LoggedMessage.get(messageid=message.id) if logged.content != message.content: logged.content = message.content logged.save() editCount = editCount + 1 else: logged = messages[message.id] if logged.content != message.content: logged.content = message.content logged.save() editCount = editCount + 1 count = count + 1 GearbotLogging.info( f"Discovered {newCount} new messages and {editCount} edited in {guild.name} (checked {count}) in {time.perf_counter() - start }s." )
async def channel(self, ctx, channel: discord.TextChannel = None, amount=100): """archive_channel_help""" if amount > 5000: await ctx.send( f"{Emoji.get_chat_emoji('NO')} {Translator.translate('archive_too_much', ctx)}" ) return if channel is None: channel = ctx.message.channel if Configuration.get_var(ctx.guild.id, "EDIT_LOGS"): permissions = channel.permissions_for(ctx.author) if permissions.read_messages and permissions.read_message_history: messages = LoggedMessage.select().where( (LoggedMessage.server == ctx.guild.id) & (LoggedMessage.channel == channel.id)).order_by( LoggedMessage.messageid.desc()).limit(amount) await Archive.ship_messages(ctx, messages) else: ctx.send( f"{Emoji.get_chat_emoji('NO')} {Translator.translate('archive_denied_read_perms', ctx, prefix=ctx.prefix)}" ) else: await ctx.send( f"{Emoji.get_chat_emoji('NO')} {Translator.translate('archive_no_edit_logs', ctx)}" )
async def user(self, ctx, user: UserID, amount=100): """archive_user_help""" if amount > 5000: await ctx.send( f"{Emoji.get_chat_emoji('NO')} {Translator.translate('archive_too_much', ctx)}" ) return if Configuration.get_var(ctx.guild.id, "EDIT_LOGS"): messages = LoggedMessage.select().where( (LoggedMessage.server == ctx.guild.id) & (LoggedMessage.author == user)).order_by( LoggedMessage.messageid.desc()).limit(amount) await Archive.ship_messages(ctx, messages) else: await ctx.send( f"{Emoji.get_chat_emoji('NO')} {Translator.translate('archive_no_edit_logs', ctx)}" )