diff options
| -rw-r--r-- | bot/cogs/events.py | 11 | ||||
| -rw-r--r-- | bot/cogs/filtering.py | 42 | ||||
| -rw-r--r-- | bot/cogs/modlog.py | 15 | ||||
| -rw-r--r-- | bot/constants.py | 4 | ||||
| -rw-r--r-- | config-default.yml | 4 | 
5 files changed, 45 insertions, 31 deletions
| diff --git a/bot/cogs/events.py b/bot/cogs/events.py index f0baecd4b..8dac83d9b 100644 --- a/bot/cogs/events.py +++ b/bot/cogs/events.py @@ -1,4 +1,5 @@  import logging +from functools import partial  from discord import Colour, Embed, Member, Object  from discord.ext.commands import ( @@ -7,7 +8,6 @@ from discord.ext.commands import (      Context, NoPrivateMessage, UserInputError  ) -from bot.cogs.modlog import ModLog  from bot.constants import (      Channels, Colours, DEBUG_MODE,      Guild, Icons, Keys, @@ -28,8 +28,9 @@ class Events:          self.headers = {"X-API-KEY": Keys.site_api}      @property -    def mod_log(self) -> ModLog: -        return self.bot.get_cog("ModLog") +    def send_log(self) -> partial: +        cog = self.bot.get_cog("ModLog") +        return partial(cog.send_log_message, channel_id=Channels.userlog)      async def send_updated_users(self, *users, replace_all=False):          users = list(filter(lambda user: str(Roles.verified) in user["roles"], users)) @@ -249,7 +250,7 @@ class Events:          except Exception as e:              log.exception("Failed to persist roles") -            await self.mod_log.send_log_message( +            await self.send_log(                  Icons.crown_red, Colour(Colours.soft_red), "Failed to persist roles",                  f"```py\n{e}\n```",                  member.avatar_url_as(static_format="png") @@ -290,7 +291,7 @@ class Events:                  reason="Roles restored"              ) -            await self.mod_log.send_log_message( +            await self.send_log(                  Icons.crown_blurple, Colour.blurple(), "Roles restored",                  f"Restored {len(new_roles)} roles",                  member.avatar_url_as(static_format="png") diff --git a/bot/cogs/filtering.py b/bot/cogs/filtering.py index 570d6549f..6b4469ceb 100644 --- a/bot/cogs/filtering.py +++ b/bot/cogs/filtering.py @@ -1,7 +1,9 @@  import logging  import re +from typing import Optional  import discord.errors +from dateutil.relativedelta import relativedelta  from discord import Colour, DMChannel, Member, Message, TextChannel  from discord.ext.commands import Bot @@ -73,18 +75,11 @@ class Filtering:                      f"Your URL has been removed because it matched a blacklisted domain. {_staff_mistake_str}"                  )              }, -            "filter_rich_embeds": { -                "enabled": Filter.filter_rich_embeds, +            "watch_rich_embeds": { +                "enabled": Filter.watch_rich_embeds,                  "function": self._has_rich_embed, -                "type": "filter", +                "type": "watchlist",                  "content_only": False, -                "user_notification": Filter.notify_user_rich_embeds, -                "notification_msg": ( -                    "Your post has been removed because it contained a rich embed. " -                    "This indicates that you're either using an unofficial discord client or are using a self-bot, " -                    f"both of which violate Discord's Terms of Service. {_staff_mistake_str}\n\n" -                    "Please don't use a self-bot or an unofficial Discord client on our server." -                )              },              "watch_words": {                  "enabled": Filter.watch_words, @@ -107,10 +102,14 @@ class Filtering:      async def on_message(self, msg: Message):          await self._filter_message(msg) -    async def on_message_edit(self, _: Message, after: Message): -        await self._filter_message(after) +    async def on_message_edit(self, before: Message, after: Message): +        if not before.edited_at: +            delta = relativedelta(after.edited_at, before.created_at).microseconds +        else: +            delta = None +        await self._filter_message(after, delta) -    async def _filter_message(self, msg: Message): +    async def _filter_message(self, msg: Message, delta: Optional[int] = None):          """          Whenever a message is sent or edited,          run it through our filters to see if it @@ -141,6 +140,13 @@ class Filtering:              for filter_name, _filter in self.filters.items():                  # Is this specific filter enabled in the config?                  if _filter["enabled"]: +                    # Double trigger check for the embeds filter +                    if filter_name == "watch_rich_embeds": +                        # If the edit delta is less than 0.001 seconds, then we're probably dealing +                        # with a double filter trigger. +                        if delta is not None and delta < 100: +                            return +                      # Does the filter only need the message content or the full message?                      if _filter["content_only"]:                          triggered = await _filter["function"](msg.content) @@ -183,7 +189,7 @@ class Filtering:                          log.debug(message) -                        additional_embeds = msg.embeds if filter_name == "filter_rich_embeds" else None +                        additional_embeds = msg.embeds if filter_name == "watch_rich_embeds" else None                          # Send pretty mod log embed to mod-alerts                          await self.mod_log.send_log_message( @@ -311,11 +317,13 @@ class Filtering:      @staticmethod      async def _has_rich_embed(msg: Message):          """ -        Returns True if any of the embeds in the message -        are of type 'rich', returns False otherwise +        Returns True if any of the embeds in the message are of type 'rich', but are not twitter +        embeds. Returns False otherwise.          """          if msg.embeds: -            return any(embed.type == "rich" for embed in msg.embeds) +            for embed in msg.embeds: +                if embed.type == "rich" and (not embed.url or "twitter.com" not in embed.url): +                    return True          return False      async def notify_member(self, filtered_member: Member, reason: str, channel: TextChannel): diff --git a/bot/cogs/modlog.py b/bot/cogs/modlog.py index d60ccf895..495795b6d 100644 --- a/bot/cogs/modlog.py +++ b/bot/cogs/modlog.py @@ -381,7 +381,8 @@ class ModLog:          await self.send_log_message(              Icons.user_ban, Colour(Colours.soft_red),              "User banned", f"{member.name}#{member.discriminator} (`{member.id}`)", -            thumbnail=member.avatar_url_as(static_format="png") +            thumbnail=member.avatar_url_as(static_format="png"), +            channel_id=Channels.modlog          )      async def on_member_join(self, member: Member): @@ -400,7 +401,8 @@ class ModLog:          await self.send_log_message(              Icons.sign_in, Colour(Colours.soft_green),              "User joined", message, -            thumbnail=member.avatar_url_as(static_format="png") +            thumbnail=member.avatar_url_as(static_format="png"), +            channel_id=Channels.userlog          )      async def on_member_remove(self, member: Member): @@ -414,7 +416,8 @@ class ModLog:          await self.send_log_message(              Icons.sign_out, Colour(Colours.soft_red),              "User left", f"{member.name}#{member.discriminator} (`{member.id}`)", -            thumbnail=member.avatar_url_as(static_format="png") +            thumbnail=member.avatar_url_as(static_format="png"), +            channel_id=Channels.userlog          )      async def on_member_unban(self, guild: Guild, member: User): @@ -428,7 +431,8 @@ class ModLog:          await self.send_log_message(              Icons.user_unban, Colour.blurple(),              "User unbanned", f"{member.name}#{member.discriminator} (`{member.id}`)", -            thumbnail=member.avatar_url_as(static_format="png") +            thumbnail=member.avatar_url_as(static_format="png"), +            channel_id=Channels.modlog          )      async def on_member_update(self, before: Member, after: Member): @@ -516,7 +520,8 @@ class ModLog:          await self.send_log_message(              Icons.user_update, Colour.blurple(),              "Member updated", message, -            thumbnail=after.avatar_url_as(static_format="png") +            thumbnail=after.avatar_url_as(static_format="png"), +            channel_id=Channels.userlog          )      async def on_raw_bulk_message_delete(self, event: RawBulkMessageDeleteEvent): diff --git a/bot/constants.py b/bot/constants.py index be713cef2..61f62b09c 100644 --- a/bot/constants.py +++ b/bot/constants.py @@ -201,7 +201,7 @@ class Filter(metaclass=YAMLGetter):      filter_zalgo: bool      filter_invites: bool      filter_domains: bool -    filter_rich_embeds: bool +    watch_rich_embeds: bool      watch_words: bool      watch_tokens: bool @@ -209,7 +209,6 @@ class Filter(metaclass=YAMLGetter):      notify_user_zalgo: bool      notify_user_invites: bool      notify_user_domains: bool -    notify_user_rich_embeds: bool      ping_everyone: bool      guild_invite_whitelist: List[int] @@ -352,6 +351,7 @@ class Channels(metaclass=YAMLGetter):      off_topic_3: int      python: int      reddit: int +    userlog: int      verification: int diff --git a/config-default.yml b/config-default.yml index b6427b489..5938ae533 100644 --- a/config-default.yml +++ b/config-default.yml @@ -114,6 +114,7 @@ guild:          python:                           267624335836053506          reddit:                           458224812528238616          staff_lounge:      &STAFF_LOUNGE  464905259261755392 +        userlog:                          528976905546760203          verification:                     352442727016693763      ignored: [*ADMINS, *MESSAGE_LOG, *MODLOG] @@ -140,7 +141,7 @@ filter:      filter_zalgo:       false      filter_invites:     true      filter_domains:     true -    filter_rich_embeds: false +    watch_rich_embeds:  true      watch_words:        true      watch_tokens:       true @@ -149,7 +150,6 @@ filter:      notify_user_zalgo:       false      notify_user_invites:     true      notify_user_domains:     false -    notify_user_rich_embeds: true      # Filter configuration      ping_everyone: true  # Ping @everyone when we send a mod-alert? | 
