aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Chris Goes <[email protected]>2019-01-16 19:52:55 -0700
committerGravatar GitHub <[email protected]>2019-01-16 19:52:55 -0700
commit5c4126bee7a60cdd66b355136a3a84614791e3a7 (patch)
tree56956eca494366c19743987a88193472d21b5d01
parentAdd developer wiki links (diff)
parentMerge pull request #275 from python-discord/rich-embed-filter-fix (diff)
Merge branch 'master' into update-contrib-doc
-rw-r--r--bot/cogs/events.py11
-rw-r--r--bot/cogs/filtering.py42
-rw-r--r--bot/cogs/modlog.py15
-rw-r--r--bot/constants.py4
-rw-r--r--config-default.yml4
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 55611c5e4..e58ca3ae7 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?