Esempio n. 1
0
 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."
     )
Esempio n. 2
0
 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)}"
         )
Esempio n. 3
0
 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)}"
         )