From ea5b01d1369faae5485e8514fb38f7ca8d9a24cc Mon Sep 17 00:00:00 2001 From: Shirayuki Nekomata Date: Sun, 3 Nov 2019 17:54:24 +0700 Subject: Refactor Using ternary to avoid if else --- bot/cogs/moderation/modlog.py | 96 +++++++++++++++---------------------------- 1 file changed, 32 insertions(+), 64 deletions(-) diff --git a/bot/cogs/moderation/modlog.py b/bot/cogs/moderation/modlog.py index 88f2b6c67..347b820de 100644 --- a/bot/cogs/moderation/modlog.py +++ b/bot/cogs/moderation/modlog.py @@ -635,39 +635,23 @@ class ModLog(Cog, name="ModLog"): author = before.author channel = before.channel + channel_name = f"{channel.category}/#{channel.name}" if channel.category else f"#{channel.name}" + + before_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}" + ) - if channel.category: - before_response = ( - f"**Author:** {author} (`{author.id}`)\n" - f"**Channel:** {channel.category}/#{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.category}/#{channel.name} (`{channel.id}`)\n" - f"**Message ID:** `{before.id}`\n" - "\n" - f"{after.clean_content}" - ) - else: - before_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" - "\n" - f"{after.clean_content}" - ) + after_response = ( + f"**Author:** {author} (`{author.id}`)\n" + f"**Channel:** {channel_name} (`{channel.id}`)\n" + f"**Message ID:** `{before.id}`\n" + "\n" + f"{after.clean_content}" + ) if before.edited_at: # Message was previously edited, to assist with self-bot detection, use the edited_at @@ -718,39 +702,23 @@ class ModLog(Cog, name="ModLog"): author = message.author channel = message.channel + channel_name = f"{channel.category}/#{channel.name}" if channel.category else f"#{channel.name}" + + before_response = ( + f"**Author:** {author} (`{author.id}`)\n" + f"**Channel:** {channel_name} (`{channel.id}`)\n" + f"**Message ID:** `{message.id}`\n" + "\n" + "This message was not cached, so the message content cannot be displayed." + ) - if channel.category: - before_response = ( - f"**Author:** {author} (`{author.id}`)\n" - f"**Channel:** {channel.category}/#{channel.name} (`{channel.id}`)\n" - f"**Message ID:** `{message.id}`\n" - "\n" - "This message was not cached, so the message content cannot be displayed." - ) - - after_response = ( - f"**Author:** {author} (`{author.id}`)\n" - f"**Channel:** {channel.category}/#{channel.name} (`{channel.id}`)\n" - f"**Message ID:** `{message.id}`\n" - "\n" - f"{message.clean_content}" - ) - else: - before_response = ( - f"**Author:** {author} (`{author.id}`)\n" - f"**Channel:** #{channel.name} (`{channel.id}`)\n" - f"**Message ID:** `{message.id}`\n" - "\n" - "This message was not cached, so the message content cannot be displayed." - ) - - after_response = ( - f"**Author:** {author} (`{author.id}`)\n" - f"**Channel:** #{channel.name} (`{channel.id}`)\n" - f"**Message ID:** `{message.id}`\n" - "\n" - f"{message.clean_content}" - ) + after_response = ( + f"**Author:** {author} (`{author.id}`)\n" + f"**Channel:** {channel_name} (`{channel.id}`)\n" + f"**Message ID:** `{message.id}`\n" + "\n" + f"{message.clean_content}" + ) await self.send_log_message( Icons.message_edit, Colour.blurple(), "Message edited (Before)", -- cgit v1.2.3 From 2c19c1c7e1a433c639b6fba8aa10ad744e3827db Mon Sep 17 00:00:00 2001 From: Shirayuki Nekomata Date: Sun, 3 Nov 2019 18:05:55 +0700 Subject: 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. --- bot/cogs/moderation/modlog.py | 43 ++++++++++++++++++++++++++++--------------- 1 file 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.""" -- cgit v1.2.3 From e90b47e37587fedde765cf78bf27eca15202314d Mon Sep 17 00:00:00 2001 From: Shirayuki Nekomata Date: Tue, 5 Nov 2019 10:27:27 +0700 Subject: un-monstrosify code ... I think? --- bot/cogs/moderation/modlog.py | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/bot/cogs/moderation/modlog.py b/bot/cogs/moderation/modlog.py index 92b399874..53ea4ebcb 100644 --- a/bot/cogs/moderation/modlog.py +++ b/bot/cogs/moderation/modlog.py @@ -641,20 +641,26 @@ class ModLog(Cog, name="ModLog"): _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 == '-': + # Getting the difference per words and group them by type - add, remove, same + # Note that this is intended grouping without sorting + diff = difflib.ndiff(_before.split(), _after.split()) + diff_groups = tuple( + (diff_type, tuple(s[2:] for s in diff_words)) + for diff_type, diff_words in itertools.groupby(diff, key=lambda s: s[0]) + ) + + for index, (diff_type, words) in enumerate(diff_groups): + sub = ' '.join(words) + if diff_type == '-': _before = _before.replace(sub, f"[{sub}](http://.z)") - elif name == '+': + elif diff_type == '+': _after = _after.replace(sub, f"[{sub}](http://.z)") else: - if len(values) > 2: - new = (f"{values[0].strip() if index > 0 else ''}" + if len(words) > 2: + new = (f"{words[0] if index > 0 else ''}" " ... " - f"{values[-1].strip() if index < len(groups) - 1 else ''}") + f"{words[-1] if index < len(diff_groups) - 1 else ''}") else: new = sub _before = _before.replace(sub, new) -- cgit v1.2.3 From 7d10fcafa8302b137733d4cf84ffc15fe1a8f219 Mon Sep 17 00:00:00 2001 From: Shirayuki Nekomata Date: Tue, 5 Nov 2019 10:29:54 +0700 Subject: remove unneccessary else --- bot/cogs/moderation/modlog.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/bot/cogs/moderation/modlog.py b/bot/cogs/moderation/modlog.py index 53ea4ebcb..4fbe39d7f 100644 --- a/bot/cogs/moderation/modlog.py +++ b/bot/cogs/moderation/modlog.py @@ -661,10 +661,8 @@ class ModLog(Cog, name="ModLog"): new = (f"{words[0] if index > 0 else ''}" " ... " f"{words[-1] if index < len(diff_groups) - 1 else ''}") - else: - new = sub - _before = _before.replace(sub, new) - _after = _after.replace(sub, new) + _before = _before.replace(sub, new) + _after = _after.replace(sub, new) response = ( f"**Author:** {author} (`{author.id}`)\n" -- cgit v1.2.3 From 990e216ea7cbb0acf7df1a6805c62d6243897a90 Mon Sep 17 00:00:00 2001 From: Shirayuki Nekomata Date: Tue, 5 Nov 2019 23:59:19 +0700 Subject: Changed link used in hyperlink - A simple `http://.z` will show properly for PC client, but for android it completely broke -> changed to `http://o.hi` - minimum link to make discord think it's a link. --- bot/cogs/moderation/modlog.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bot/cogs/moderation/modlog.py b/bot/cogs/moderation/modlog.py index 4fbe39d7f..6ce83840d 100644 --- a/bot/cogs/moderation/modlog.py +++ b/bot/cogs/moderation/modlog.py @@ -653,9 +653,9 @@ class ModLog(Cog, name="ModLog"): for index, (diff_type, words) in enumerate(diff_groups): sub = ' '.join(words) if diff_type == '-': - _before = _before.replace(sub, f"[{sub}](http://.z)") + _before = _before.replace(sub, f"[{sub}](http://o.hi)") elif diff_type == '+': - _after = _after.replace(sub, f"[{sub}](http://.z)") + _after = _after.replace(sub, f"[{sub}](http://o.hi)") else: if len(words) > 2: new = (f"{words[0] if index > 0 else ''}" -- cgit v1.2.3 From 80967822c06f9ece1ad6989bd9448464dea73ece Mon Sep 17 00:00:00 2001 From: Shirayuki Nekomata Date: Wed, 6 Nov 2019 09:18:35 +0700 Subject: Merged `else` and its single `if`, changed style to be more consistent Following Mark's reviews: - The single `if` inside the `else` can be merged with its `else` - this will reduce the level of complexity and indentation. - Changed from style ```py new = ('hello' 'world') ``` to ```py new = ( 'hello' 'world' ) ``` to be more consistent with the rest of the code --- bot/cogs/moderation/modlog.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/bot/cogs/moderation/modlog.py b/bot/cogs/moderation/modlog.py index 6ce83840d..c86bf6faa 100644 --- a/bot/cogs/moderation/modlog.py +++ b/bot/cogs/moderation/modlog.py @@ -656,13 +656,14 @@ class ModLog(Cog, name="ModLog"): _before = _before.replace(sub, f"[{sub}](http://o.hi)") elif diff_type == '+': _after = _after.replace(sub, f"[{sub}](http://o.hi)") - else: - if len(words) > 2: - new = (f"{words[0] if index > 0 else ''}" - " ... " - f"{words[-1] if index < len(diff_groups) - 1 else ''}") - _before = _before.replace(sub, new) - _after = _after.replace(sub, new) + elif len(words) > 2: + new = ( + f"{words[0] if index > 0 else ''}" + " ... " + f"{words[-1] if index < len(diff_groups) - 1 else ''}" + ) + _before = _before.replace(sub, new) + _after = _after.replace(sub, new) response = ( f"**Author:** {author} (`{author.id}`)\n" -- cgit v1.2.3 From 2ff711b5d7299baab84e20842cec856c5f17f992 Mon Sep 17 00:00:00 2001 From: Shirayuki Nekomata Date: Wed, 13 Nov 2019 09:15:17 +0700 Subject: Switched to using list instead of `str.replace()` for much better control over each word. --- bot/cogs/moderation/modlog.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/bot/cogs/moderation/modlog.py b/bot/cogs/moderation/modlog.py index c86bf6faa..3a7e0d3ce 100644 --- a/bot/cogs/moderation/modlog.py +++ b/bot/cogs/moderation/modlog.py @@ -639,39 +639,42 @@ class ModLog(Cog, name="ModLog"): channel = before.channel channel_name = f"{channel.category}/#{channel.name}" if channel.category else f"#{channel.name}" - _before = before.clean_content - _after = after.clean_content - # Getting the difference per words and group them by type - add, remove, same # Note that this is intended grouping without sorting - diff = difflib.ndiff(_before.split(), _after.split()) + diff = difflib.ndiff(before.clean_content.split(), after.clean_content.split()) diff_groups = tuple( (diff_type, tuple(s[2:] for s in diff_words)) for diff_type, diff_words in itertools.groupby(diff, key=lambda s: s[0]) ) + _before = [] + _after = [] + for index, (diff_type, words) in enumerate(diff_groups): sub = ' '.join(words) if diff_type == '-': - _before = _before.replace(sub, f"[{sub}](http://o.hi)") + _before.append(f"[{sub}](http://o.hi)") elif diff_type == '+': - _after = _after.replace(sub, f"[{sub}](http://o.hi)") + _after.append(f"[{sub}](http://o.hi)") elif len(words) > 2: new = ( f"{words[0] if index > 0 else ''}" " ... " f"{words[-1] if index < len(diff_groups) - 1 else ''}" ) - _before = _before.replace(sub, new) - _after = _after.replace(sub, new) + _before.append(new) + _after.append(new) + elif diff_type == ' ': + _before.append(sub) + _after.append(sub) response = ( f"**Author:** {author} (`{author.id}`)\n" f"**Channel:** {channel_name} (`{channel.id}`)\n" f"**Message ID:** `{before.id}`\n" "\n" - f"**Before**:\n{_before}\n" - f"**After**:\n{_after}\n" + f"**Before**:\n{' '.join(_before)}\n" + f"**After**:\n{' '.join(_after)}\n" "\n" f"[jump to message]({after.jump_url})" ) -- cgit v1.2.3 From 501aa5655c8039f43b3cf3106474b8be16b4074a Mon Sep 17 00:00:00 2001 From: Shirayuki Nekomata Date: Thu, 14 Nov 2019 12:05:18 +0700 Subject: Condensed logic, now only check for `add` `remove` `same` diff_type only. --- bot/cogs/moderation/modlog.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/bot/cogs/moderation/modlog.py b/bot/cogs/moderation/modlog.py index 3a7e0d3ce..ce2a5e1f7 100644 --- a/bot/cogs/moderation/modlog.py +++ b/bot/cogs/moderation/modlog.py @@ -656,15 +656,13 @@ class ModLog(Cog, name="ModLog"): _before.append(f"[{sub}](http://o.hi)") elif diff_type == '+': _after.append(f"[{sub}](http://o.hi)") - elif len(words) > 2: - new = ( - f"{words[0] if index > 0 else ''}" - " ... " - f"{words[-1] if index < len(diff_groups) - 1 else ''}" - ) - _before.append(new) - _after.append(new) elif diff_type == ' ': + if len(words) > 2: + sub = ( + f"{words[0] if index > 0 else ''}" + " ... " + f"{words[-1] if index < len(diff_groups) - 1 else ''}" + ) _before.append(sub) _after.append(sub) -- cgit v1.2.3 From e66ed4b4f534e6fa4178d8b2a82bc486b97affd5 Mon Sep 17 00:00:00 2001 From: Shirayuki Nekomata Date: Sat, 16 Nov 2019 08:26:38 +0700 Subject: Renamed variables to be more explicit, added type hinting for `content_before` and `content_after` --- bot/cogs/moderation/modlog.py | 48 +++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/bot/cogs/moderation/modlog.py b/bot/cogs/moderation/modlog.py index ce2a5e1f7..41d7709e4 100644 --- a/bot/cogs/moderation/modlog.py +++ b/bot/cogs/moderation/modlog.py @@ -620,42 +620,42 @@ class ModLog(Cog, name="ModLog"): ) @Cog.listener() - async def on_message_edit(self, before: discord.Message, after: discord.Message) -> None: + async def on_message_edit(self, msg_before: discord.Message, msg_after: discord.Message) -> None: """Log message edit event to message change log.""" if ( - not before.guild - or before.guild.id != GuildConstant.id - or before.channel.id in GuildConstant.ignored - or before.author.bot + not msg_before.guild + or msg_before.guild.id != GuildConstant.id + or msg_before.channel.id in GuildConstant.ignored + or msg_before.author.bot ): return - self._cached_edits.append(before.id) + self._cached_edits.append(msg_before.id) - if before.content == after.content: + if msg_before.content == msg_after.content: return - author = before.author - channel = before.channel + author = msg_before.author + channel = msg_before.channel channel_name = f"{channel.category}/#{channel.name}" if channel.category else f"#{channel.name}" # Getting the difference per words and group them by type - add, remove, same # Note that this is intended grouping without sorting - diff = difflib.ndiff(before.clean_content.split(), after.clean_content.split()) + diff = difflib.ndiff(msg_before.clean_content.split(), msg_after.clean_content.split()) diff_groups = tuple( (diff_type, tuple(s[2:] for s in diff_words)) for diff_type, diff_words in itertools.groupby(diff, key=lambda s: s[0]) ) - _before = [] - _after = [] + content_before: t.List[str] = [] + content_after: t.List[str] = [] for index, (diff_type, words) in enumerate(diff_groups): sub = ' '.join(words) if diff_type == '-': - _before.append(f"[{sub}](http://o.hi)") + content_before.append(f"[{sub}](http://o.hi)") elif diff_type == '+': - _after.append(f"[{sub}](http://o.hi)") + content_after.append(f"[{sub}](http://o.hi)") elif diff_type == ' ': if len(words) > 2: sub = ( @@ -663,31 +663,31 @@ class ModLog(Cog, name="ModLog"): " ... " f"{words[-1] if index < len(diff_groups) - 1 else ''}" ) - _before.append(sub) - _after.append(sub) + content_before.append(sub) + content_after.append(sub) response = ( f"**Author:** {author} (`{author.id}`)\n" f"**Channel:** {channel_name} (`{channel.id}`)\n" - f"**Message ID:** `{before.id}`\n" + f"**Message ID:** `{msg_before.id}`\n" "\n" - f"**Before**:\n{' '.join(_before)}\n" - f"**After**:\n{' '.join(_after)}\n" + f"**Before**:\n{' '.join(content_before)}\n" + f"**After**:\n{' '.join(content_after)}\n" "\n" - f"[jump to message]({after.jump_url})" + f"[jump to message]({msg_after.jump_url})" ) - if before.edited_at: + if msg_before.edited_at: # Message was previously edited, to assist with self-bot detection, use the edited_at # datetime as the baseline and create a human-readable delta between this edit event # and the last time the message was edited - timestamp = before.edited_at - delta = humanize_delta(relativedelta(after.edited_at, before.edited_at)) + timestamp = msg_before.edited_at + delta = humanize_delta(relativedelta(msg_after.edited_at, msg_before.edited_at)) footer = f"Last edited {delta} ago" else: # Message was not previously edited, use the created_at datetime as the baseline, no # delta calculation needed - timestamp = before.created_at + timestamp = msg_before.created_at footer = None await self.send_log_message( -- cgit v1.2.3 From d4269b36bbe1a57c4e1b61671c28647267c608bc Mon Sep 17 00:00:00 2001 From: Leon Sandøy Date: Sat, 30 Nov 2019 13:35:41 +0100 Subject: Update bot/cogs/moderation/modlog.py --- bot/cogs/moderation/modlog.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bot/cogs/moderation/modlog.py b/bot/cogs/moderation/modlog.py index 41d7709e4..0df752a97 100644 --- a/bot/cogs/moderation/modlog.py +++ b/bot/cogs/moderation/modlog.py @@ -674,7 +674,7 @@ class ModLog(Cog, name="ModLog"): f"**Before**:\n{' '.join(content_before)}\n" f"**After**:\n{' '.join(content_after)}\n" "\n" - f"[jump to message]({msg_after.jump_url})" + f"[Jump to message]({msg_after.jump_url})" ) if msg_before.edited_at: -- cgit v1.2.3