aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Shirayuki Nekomata <[email protected]>2019-11-03 18:05:55 +0700
committerGravatar Shirayuki Nekomata <[email protected]>2019-11-03 18:05:55 +0700
commit2c19c1c7e1a433c639b6fba8aa10ad744e3827db (patch)
tree4150431c4d49032fa1a69f012b606281955f1524
parentRefactor (diff)
Merge before & after response, show only differences
- Merged `before_response` and `after_response`. - Only show the differences between `before.clean_content` and `after.clean_content` - Included a `jump to message` link.
-rw-r--r--bot/cogs/moderation/modlog.py43
1 files changed, 28 insertions, 15 deletions
diff --git a/bot/cogs/moderation/modlog.py b/bot/cogs/moderation/modlog.py
index 347b820de..92b399874 100644
--- a/bot/cogs/moderation/modlog.py
+++ b/bot/cogs/moderation/modlog.py
@@ -1,4 +1,6 @@
import asyncio
+import difflib
+import itertools
import logging
import typing as t
from datetime import datetime
@@ -637,20 +639,36 @@ class ModLog(Cog, name="ModLog"):
channel = before.channel
channel_name = f"{channel.category}/#{channel.name}" if channel.category else f"#{channel.name}"
- before_response = (
+ _before = before.clean_content
+ _after = after.clean_content
+ groups = tuple((g[0], tuple(g[1]))
+ for g in itertools.groupby(difflib.ndiff(_before.split(), _after.split()), key=lambda s: s[0]))
+
+ for index, (name, values) in enumerate(groups):
+ sub = ' '.join(s[2:].strip() for s in values)
+ if name == '-':
+ _before = _before.replace(sub, f"[{sub}](http://.z)")
+ elif name == '+':
+ _after = _after.replace(sub, f"[{sub}](http://.z)")
+ else:
+ if len(values) > 2:
+ new = (f"{values[0].strip() if index > 0 else ''}"
+ " ... "
+ f"{values[-1].strip() if index < len(groups) - 1 else ''}")
+ else:
+ new = sub
+ _before = _before.replace(sub, new)
+ _after = _after.replace(sub, new)
+
+ response = (
f"**Author:** {author} (`{author.id}`)\n"
f"**Channel:** {channel_name} (`{channel.id}`)\n"
f"**Message ID:** `{before.id}`\n"
"\n"
- f"{before.clean_content}"
- )
-
- after_response = (
- f"**Author:** {author} (`{author.id}`)\n"
- f"**Channel:** {channel_name} (`{channel.id}`)\n"
- f"**Message ID:** `{before.id}`\n"
+ f"**Before**:\n{_before}\n"
+ f"**After**:\n{_after}\n"
"\n"
- f"{after.clean_content}"
+ f"[jump to message]({after.jump_url})"
)
if before.edited_at:
@@ -667,15 +685,10 @@ class ModLog(Cog, name="ModLog"):
footer = None
await self.send_log_message(
- Icons.message_edit, Colour.blurple(), "Message edited (Before)", before_response,
+ Icons.message_edit, Colour.blurple(), "Message edited", response,
channel_id=Channels.message_log, timestamp_override=timestamp, footer=footer
)
- await self.send_log_message(
- Icons.message_edit, Colour.blurple(), "Message edited (After)", after_response,
- channel_id=Channels.message_log, timestamp_override=after.edited_at
- )
-
@Cog.listener()
async def on_raw_message_edit(self, event: discord.RawMessageUpdateEvent) -> None:
"""Log raw message edit event to message change log."""