aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar MarkKoz <[email protected]>2020-06-14 21:16:02 -0700
committerGravatar MarkKoz <[email protected]>2020-06-14 22:28:13 -0700
commit35fc846e671192199bde7e98e43b2ac21513f629 (patch)
treef8172ded4c8c6702ca650f61a7bf6a9e6814ecb2
parentModLog: fix excluded None values in on_member_update (diff)
ModLog: refactor on_member_update
* Exclude all sequences/mapping types rather than excluding by name * Replace MEMBER_CHANGES_SUPPRESSED with excludes as DeepDiff args * Don't keep track of "done" attributes - there shouldn't be dupes
-rw-r--r--bot/cogs/moderation/modlog.py38
1 files changed, 15 insertions, 23 deletions
diff --git a/bot/cogs/moderation/modlog.py b/bot/cogs/moderation/modlog.py
index 163721e1c..bd805f590 100644
--- a/bot/cogs/moderation/modlog.py
+++ b/bot/cogs/moderation/modlog.py
@@ -24,7 +24,6 @@ GUILD_CHANNEL = t.Union[discord.CategoryChannel, discord.TextChannel, discord.Vo
CHANNEL_CHANGES_UNSUPPORTED = ("permissions",)
CHANNEL_CHANGES_SUPPRESSED = ("_overwrites", "position")
-MEMBER_CHANGES_SUPPRESSED = ("status", "activities", "_client_status")
ROLE_CHANGES_UNSUPPORTED = ("colour", "permissions")
VOICE_STATE_ATTRIBUTES = {
@@ -477,36 +476,27 @@ class ModLog(Cog, name="ModLog"):
self._ignored[Event.member_update].remove(before.id)
return
- diff = DeepDiff(before, after)
changes = self.get_role_diff(before.roles, after.roles)
- done = []
- diff_values = {}
+ # The regex is a simple way to exclude all sequence and mapping types.
+ diff = DeepDiff(before, after, exclude_regex_paths=r".*\[.*")
- diff_values.update(diff.get("values_changed", {}))
- diff_values.update(diff.get("type_changes", {}))
+ # A type change seems to always take precedent over a value change. Furthermore, it will
+ # include the value change along with the type change anyway. Therefore, it's OK to
+ # "overwrite" values_changed; in practice there will never even be anything to overwrite.
+ diff_values = {**diff.get("values_changed", {}), **diff.get("type_changes", {})}
- for key, value in diff_values.items():
- if not key: # Not sure why, but it happens
+ for attr, value in diff_values.items():
+ if not attr: # Not sure why, but it happens.
continue
- key = key[5:] # Remove "root." prefix
-
- if "[" in key:
- key = key.split("[", 1)[0]
-
- if "." in key:
- key = key.split(".", 1)[0]
-
- if key in done or key in MEMBER_CHANGES_SUPPRESSED:
- continue
+ attr = attr[len("root."):] # Remove "root." prefix.
+ attr = attr.replace("_", " ").replace(".", " ").capitalize()
new = value.get("new_value")
old = value.get("old_value")
- changes.append(f"**{key.title()}:** `{old}` **→** `{new}`")
-
- done.append(key)
+ changes.append(f"**{attr}:** `{old}` **→** `{new}`")
if not changes:
return
@@ -520,8 +510,10 @@ class ModLog(Cog, name="ModLog"):
message = f"**{member_str}** (`{after.id}`)\n{message}"
await self.send_log_message(
- Icons.user_update, Colour.blurple(),
- "Member updated", message,
+ icon_url=Icons.user_update,
+ colour=Colour.blurple(),
+ title="Member updated",
+ text=message,
thumbnail=after.avatar_url_as(static_format="png"),
channel_id=Channels.user_log
)