async def on_voice_state_update(self, member, before, after): if Features.is_logged(member.guild.id, "VOICE_CHANGES_DETAILED"): simple = ["deaf", "mute", "self_mute", "self_deaf", "afk"] for s in simple: old = getattr(before, s) new = getattr(after, s) if old != new: key = f"voice_change_{s}_{str(new).lower()}" logging = Translator.assemble("VOICE", key, member.guild.id, user=Utils.clean_user(member), user_id=member.id) GearbotLogging.log_to(member.guild.id, "VOICE_CHANGES_DETAILED", logging) if Features.is_logged(member.guild.id, "VOICE_CHANGES"): if before.channel != after.channel: parts = dict(user=Utils.clean_user(member), user_id=member.id) if before.channel is None: key = "connected_to_voice" parts.update(channel_name=after.channel, channel_id=after.channel.id) elif after.channel is None: key = "disconnected_voice" parts.update(channel_name=before.channel, channel_id=before.channel.id) else: key = "moved_voice" parts.update(old_channel_name=before.channel, old_channel_id=before.channel.id, new_channel_name=after.channel, new_channel_id=after.channel.id) logging = Translator.assemble("VOICE", key, member.guild.id, **parts) GearbotLogging.log_to(member.guild.id, "VOICE_CHANGES", logging)
async def on_guild_role_create(self, role): if not Features.is_logged(role.guild.id, "ROLE_CHANGES"): return entry = await self.find_log(role.guild, AuditLogAction.role_create, lambda e: e.target.id == role.id) if entry is None: logging = Translator.assemble("CREATE", "role_created", role.guild.id, role=role.name) else: logging = Translator.assemble("CREATE", "role_created_by", role.guild.id, role=role.name, person=Utils.clean_user(entry.user), person_id=entry.user.id) GearbotLogging.log_to(role.guild.id, "ROLE_CHANGES", logging)
async def on_guild_channel_delete(self, channel): if not Features.is_logged(channel.guild.id, "CHANNEL_CHANGES"): return e = await self.find_log(channel.guild, AuditLogAction.channel_delete, lambda e: e.target.id == channel.id) if e is not None: logging = Translator.assemble("DELETE", "channel_deleted_by", channel.guild, channel=channel, person=e.user) else: logging = Translator.assemble("DELETE", "channel_delete", channel.guild, channel=channel) GearbotLogging.log_to(channel.guild.id, "CHANNEL_CHANGES", logging)
async def handle_simple_changes(self, before, after, base_key, log_key, action, attributes): for attr in attributes: if hasattr(before, attr): ba = getattr(before, attr) aa = getattr(after, attr) key = base_key if ba != aa: entry = await self.find_log( before.guild, action, lambda e: e.target.id == before.id and hasattr( e.changes.before, attr) and getattr( e.changes.before, attr) == ba and getattr( e.changes.after, attr) == aa) parts = dict(before=self.prep_attr(ba), after=self.prep_attr(aa), thing=after, thing_id=after.id, attr=attr) if entry is not None: parts.update(person=entry.user, person_id=entry.user.id) key += "_by" logging = Translator.assemble("ALTER", key, before.guild, **parts) GearbotLogging.log_to(before.guild.id, log_key, logging)
async def on_guild_role_update(self, before: discord.Role, after): if not Features.is_logged(before.guild.id, "ROLE_CHANGES"): return await self.handle_simple_changes( before, after, "role_update_simple", "ROLE_CHANGES", AuditLogAction.role_update, ["name", "color", "hoist", "mentionable"]) if before.permissions != after.permissions: for perm, value in before.permissions: av = getattr(after.permissions, perm) if av != value: entry = await self.find_log( before.guild, AuditLogAction.role_update, lambda e: e.target.id == after.id and hasattr( e.before, "permissions" ) and e.before.permissions == before.permissions and e. after.permissions == after.permissions) key = f"role_update_perm_{'added' if av else 'revoked'}" parts = dict(role=await Utils.clean(after.name), role_id=after.id, perm=perm) if entry is not None: key += "_by" parts.update(person=Utils.clean_user(entry.user), person_id=entry.user.id) logging = Translator.assemble("ALTER", key, before.guild.id, **parts) GearbotLogging.log_to(after.guild.id, "ROLE_CHANGES", logging)
async def on_guild_channel_update(self, before, after): if not Features.is_logged( before.guild.id, "CHANNEL_CHANGES") or before.id in Configuration.get_var( before.guild.id, "IGNORED_CHANNELS_CHANGES"): return await self.handle_simple_changes( before, after, "channel_update_simple", "CHANNEL_CHANGES", AuditLogAction.channel_update, [ "name", "category", "nsfw", "slowmode_delay", "topic", "bitrate", "user_limit" ]) # checking overrides old_overrides = dict() for target, override in before.overwrites: old_overrides[target] = override new_overrides = dict() for target, override in after.overwrites: new_overrides[target] = override for target, override in old_overrides.items(): if target in new_overrides: # still exists, check for modifications a_override = new_overrides[target] if override._values != a_override._values: # something changed for perm, value in override: new_value = getattr(a_override, perm) if value != new_value: parts = dict(before=self.prep_override(value), after=self.prep_override(new_value), permission=perm, channel=after, target_name=Utils.escape_markdown( str(target)), target_id=target.id) key = "permission_override_update" def finder(e): if e.target.id == after.id and e.target.id == after.id and e.extra.id == target.id: before_allowed, before_denied = override.pair( ) after_allowed, after_denied = new_overrides[ target].pair() has_allow = hasattr(e.before, "allow") has_deny = hasattr(e.before, "deny") if not (((has_allow and (before_allowed.value != after_allowed.value) and before_allowed.value == e.before.allow.value and after_allowed.value == e.after.allow.value) or (has_allow == hasattr( e.after, "allow"))) and ((has_deny and (before_denied.value != before_denied.value) and before_denied.value == e.before.deny.value and after_denied.value == e.after.deny.value) or has_deny == hasattr( e.after, "deny"))): return False return True return False entry = await self.find_log( after.guild, AuditLogAction.overwrite_update, finder) if isinstance(target, Role): key += "_role" if entry is not None: key += "_by" parts.update(person=Utils.clean_user( entry.user), person_id=entry.user.id) logging = Translator.assemble( "ALTER", key, after.guild.id, **parts) GearbotLogging.log_to(after.guild.id, "CHANNEL_CHANGES", logging) else: # permission override removed key = "permission_override_removed" parts = dict(channel=after, target_name=Utils.escape_markdown(str(target)), target_id=target.id) def finder(e): if e.target.id == after.id and e.extra.id == target.id: before_allowed, before_denied = override.pair() has_allow = hasattr(e.before, "allow") has_deny = hasattr(e.before, "deny") if not ( (has_allow and before_allowed.value == e.before.allow.value) or ((not has_allow) and before_allowed.value is 0) and (has_deny and before_denied.value == e.before.deny.value) or ((not has_deny) and before_denied.value is 0)): return False return True entry = await self.find_log(after.guild, AuditLogAction.overwrite_delete, finder) if isinstance(target, Role): key += "_role" if entry is not None: key += "_by" parts.update(person=Utils.clean_user(entry.user), person_id=entry.user.id) logging = Translator.assemble("ALTER", key, after.guild.id, **parts) GearbotLogging.log_to(after.guild.id, "CHANNEL_CHANGES", logging) for target in set(new_overrides.keys()).difference( old_overrides.keys()): key = "permission_override_added" parts = dict(channel=after, target_name=Utils.escape_markdown(str(target)), target_id=target.id) def finder(e): if e.target.id == after.id and e.extra.id == target.id: after_allowed, after_denied = new_overrides[target].pair() has_allow = hasattr(e.after, "allow") has_deny = hasattr(e.after, "deny") if not ( (has_allow and after_allowed.value == e.after.allow.value) or ((not has_allow) and after_allowed.value is 0) and (has_deny and after_denied.value == e.after.deny.value) or ((not has_deny) and after_denied.value is 0)): return False return True entry = await self.find_log(after.guild, AuditLogAction.overwrite_create, finder) if isinstance(target, Role): key += "_role" if entry is not None: key += "_by" parts.update(person=Utils.clean_user(entry.user), person_id=entry.user.id) logging = Translator.assemble("ALTER", key, after.guild.id, **parts) GearbotLogging.log_to(after.guild.id, "CHANNEL_CHANGES", logging)