示例#1
0
 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)
示例#2
0
 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)
示例#3
0
 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)
示例#4
0
 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)
示例#5
0
 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)
示例#6
0
    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)