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
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 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
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
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
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
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
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
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)
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())
def __init__(self, bot:commands.Bot): super(BaseHandlers, self).__init__(bot, __file__) self.guild_repo = GuildRepo() self.user_repo = UserRepo()