Пример #1
0
    def create_audit_log(audit_type: AuditLogItemType,
                         guild: Optional[discord.Guild] = None,
                         user: Optional[Union[discord.Member,
                                              discord.User]] = None,
                         channel_id: Optional[int] = None,
                         data: Optional[dict] = None) -> AuditLogItem:
        if guild is not None and user is not None:
            if not UserRepo.guild_user_exist(user.id, guild.id):
                UserRepo.create_guild_user(user)
        elif guild is None and user is not None:
            if not UserRepo.user_exist(user.id):
                UserRepo.create_user(user)
        elif guild is not None and user is None:
            if not GuildRepo.guild_exist(guild.id):
                GuildRepo.create_guild(guild)

        item = AuditLogItem(
            user_id=str(user.id) if user is not None else None,
            guild_id=str(guild.id) if guild is not None else None,
            type=audit_type,
            data=data,
            channel_id=str(channel_id) if channel_id is not None else None)
        session.add(item)
        session.commit()
        return item
Пример #2
0
  def __init__(self, bot: commands.Bot):
    super(Auditlog, self).__init__(bot, __file__)

    self.audit_repo = AuditLogRepo()
    self.guild_repo = GuildRepo()
    self.user_repo = UserRepo()

    self.clear_audit_log_task.start()
Пример #3
0
  def create_empty_role_giver(guild:discord.Guild) -> RoleGiverData:
    if not GuildRepo.guild_exist(guild.id):
      GuildRepo.create_guild(guild)

    item = RoleGiverData(guild_ID=str(guild.id))
    session.add(item)
    session.commit()

    return item
Пример #4
0
    def __create_warden_settings(guild: discord.Guild) -> WardenSettings:
        if not GuildRepo.guild_exist(guild.id):
            GuildRepo.create_guild(guild)

        item = WardenSettings(guild_id=str(guild.id))
        session.add(item)
        session.commit()

        return item
Пример #5
0
  def create_repost_settings(guild:discord.Guild, repost_channel_id: int) -> Optional[RepostSeting]:
    if RepostSettingsRepo.get_repost_settings(guild.id) is not None:
      return None

    if not GuildRepo.guild_exist(guild.id):
      GuildRepo.create_guild(guild)

    item = RepostSeting(guild_id=str(guild.id), repost_channel_id=str(repost_channel_id))
    session.add(item)
    session.commit()

    return item
    def __create_empty(guild: discord.Guild):
        if not GuildRepo.guild_exist(guild.id):
            GuildRepo.create_guild(guild)

        item = WelcomeMessageConfig(guild_id=str(guild.id),
                                    welcome_message_enable=False,
                                    welcome_message_channel_id=None,
                                    welcome_message=None)
        session.add(item)
        session.commit()

        return item
Пример #7
0
  def __create_emoji(emoji:Union[discord.Emoji, discord.PartialEmoji, str], guild:discord.Guild) -> Karma:
    if not GuildRepo.guild_exist(guild.id):
      GuildRepo.create_guild(guild)

    emoji_id = general_util.emoji_id_from_emoji(emoji)
    if not EmojiDataRepo.emoji_data_exist(emoji_id):
      EmojiDataRepo.create_emoji_data(emoji)

    with emoji_access_lock:
      item = Karma_emoji(emoji_ID=emoji_id, guild_id=str(guild.id))
      session.add(item)
      session.commit()
    return item
Пример #8
0
    def create_guild_user(member: discord.Member) -> GuildUser:
        if not UserRepo.user_exist(member.id):
            UserRepo.create_user(member)

        if not GuildRepo.guild_exist(member.guild.id):
            GuildRepo.create_guild(member.guild)

        item = GuildUser(display_name=member.display_name,
                         id=str(member.id),
                         guild_id=str(member.guild.id),
                         joined_at=member.joined_at)
        session.add(item)
        session.commit()

        return item
Пример #9
0
    def __create_guild_emoji_stats_for_emoji(
        guild: discord.Guild, emoji: Union[discord.Emoji, discord.PartialEmoji,
                                           str]) -> GuildEmojiStats:
        if not GuildRepo.guild_exist(guild.id):
            GuildRepo.create_guild(guild)

        emoji_id = general_util.emoji_id_from_emoji(emoji)
        if not EmojiDataRepo.emoji_data_exist(emoji_id):
            EmojiDataRepo.create_emoji_data(emoji)

        item = GuildEmojiStats(guild_id=str(guild.id), emoji_id=emoji_id)
        session.add(item)
        session.commit()

        return item
Пример #10
0
class BaseHandlers(Base_Cog):
  def __init__(self, bot:commands.Bot):
    super(BaseHandlers, self).__init__(bot, __file__)

    self.guild_repo = GuildRepo()
    self.user_repo = UserRepo()

  @commands.Cog.listener()
  async def on_member_join(self, member: discord.Member):
    if not member.bot:
      self.user_repo.create_guild_user(member)

  @commands.Cog.listener()
  async def on_member_remove(self, member: discord.Member):
    self.user_repo.delete_guild_user(member.id, member.guild.id)

  @commands.Cog.listener()
  async def on_guild_join(self, guild: discord.Guild):
    self.guild_repo.create_guild(guild)

  @commands.Cog.listener()
  async def on_guild_remove(self, guild: discord.Guild):
    self.guild_repo.delete_guild(guild.id)
Пример #11
0
class Auditlog(Base_Cog):
  def __init__(self, bot: commands.Bot):
    super(Auditlog, self).__init__(bot, __file__)

    self.audit_repo = AuditLogRepo()
    self.guild_repo = GuildRepo()
    self.user_repo = UserRepo()

    self.clear_audit_log_task.start()

  def cog_unload(self) -> None:
    if self.clear_audit_log_task.is_running():
      self.clear_audit_log_task.stop()

  def __del__(self):
    if self.clear_audit_log_task.is_running():
      self.clear_audit_log_task.cancel()

  @commands.group(pass_context=True, hidden=True)
  @commands.check(general_util.is_bot_developer)
  async def auditlog(self, ctx: commands.Context):
    if ctx.invoked_subcommand is None:
      await general_util.delete_message(self.bot, ctx)
      await ctx.send(embed=general_util.generate_error_message(general_util.get_command_group_signature(ctx)), delete_after=Config.base_error_duration)

  @auditlog.command(name="list", brief=Strings.auditlog_list_brief)
  async def list_recent(self, ctx: commands.Context, limit:Optional[int]=None):
    await general_util.delete_message(self.bot, ctx)

    audit_logs = self.audit_repo.get_recent_logs(limit=limit)
    log_strings = []

    for audit_log in audit_logs:
      user_name = audit_log.user.username if audit_log.user is not None else None

      if user_name is not None:
        display_name = audit_log.guild_user.display_name if audit_log.guild_user is not None else None
        if display_name is not None and display_name != user_name:
          user_name = f"{user_name} ({display_name})"

      guild_name = audit_log.guild.name if audit_log.guild is not None else None
      item_list = [str(audit_log.id), user_name, guild_name, audit_log.type.name, str(audit_log.created_at)]
      try:
        item_list.remove(None)
      except:
        pass

      log_strings.append(" - ".join(item_list))

    if not log_strings:
      return await ctx.send(embed=general_util.generate_error_message("*No audit logs*"), delete_after=Config.base_error_duration)

    final_texts = []
    while log_strings:
      tmp_text, log_strings = general_util.add_string_until_length(log_strings, 4000, "\n")
      final_texts.append(tmp_text)

    for text in final_texts:
      await ctx.send(f"```{text}```", delete_after=Config.base_long_success_duration)

  @tasks.loop(hours=(24 * Config.auditlog_history_check_interval_days))
  async def clear_audit_log_task(self):
    cutoff_time = datetime.datetime.utcnow() - datetime.timedelta(days=Config.auditlog_history_to_keep_day)
    self.audit_repo.delete_old_auditlogs(cutoff_time)

  @commands.Cog.listener()
  async def on_user_update(self, old_user: discord.User, new_user: discord.User):
    if old_user.bot:
      return

    if old_user.name != new_user.name:
      user = self.user_repo.get_user_by_dc_user(new_user)
      user.username = new_user.name
      self.user_repo.update()

    user_upd_data = UserUpdateData.from_users(old_user, new_user)
    if user_upd_data.is_empty():
      return

    self.audit_repo.create_audit_log(AuditLogItemType.USER_UPDATED, user=new_user, data=user_upd_data.to_json())

  @commands.Cog.listener()
  async def on_member_update(self, old_member: discord.Member, new_member: discord.Member):
    if old_member.bot or old_member.system:
      return

    if old_member.display_name != new_member.display_name:
      member = self.user_repo.get_guild_user_by_member(new_member)
      member.display_name = new_member.display_name
      self.user_repo.update()

    mem_upd_data = MemberUpdateData.from_members(old_member, new_member)
    if mem_upd_data.is_empty():
      return

    self.audit_repo.create_audit_log(AuditLogItemType.MEMBER_UPDATED, new_member.guild, new_member, data=mem_upd_data.to_json())

  @commands.Cog.listener()
  async def on_guild_update(self, old_guild: discord.Guild, new_guild: discord.Guild):
    if old_guild.name != new_guild.name:
      db_guild = self.guild_repo.get_guild(new_guild)
      db_guild.name = new_guild.name
      self.guild_repo.update()

    data = GuildUpdatedData.from_guilds(old_guild, new_guild)
    if data is None:
      return

    self.audit_repo.create_audit_log(AuditLogItemType.GUILD_UPDATED, new_guild, data=data.to_json())

  @commands.Cog.listener()
  async def on_message_delete(self, message: discord.Message):
    if message.is_system():
      return

    if message.author.bot:
      return

    context: commands.Context = await self.bot.get_context(message)
    if context.valid:
      return

    del_mess_data = MesssageDeletedData.from_message(message)
    self.audit_repo.create_audit_log(AuditLogItemType.MESSAGE_DELETED, message.guild, message.author, message.channel.id, del_mess_data.to_json())

  @commands.Cog.listener()
  async def on_message_edit(self, old_message: discord.Message, new_message: discord.Message):
    if old_message.is_system():
      return

    if old_message.author.bot:
      return

    edit_mess_data = MessageEditedData.from_messages(old_message, new_message)
    self.audit_repo.create_audit_log(AuditLogItemType.MESSAGE_EDITED, old_message.guild, old_message.author, old_message.channel.id, edit_mess_data.to_json())
Пример #12
0
  def __init__(self, bot:commands.Bot):
    super(BaseHandlers, self).__init__(bot, __file__)

    self.guild_repo = GuildRepo()
    self.user_repo = UserRepo()