aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar mbaruh <[email protected]>2022-11-28 22:51:07 +0200
committerGravatar mbaruh <[email protected]>2022-11-28 22:51:07 +0200
commit58949ce36c321d6ffd528e346b974820b90b858b (patch)
tree4b21566c1b958fa50a1c1f7678138a05dd884549
parentfix: Remove hash prefix from filter IDs (diff)
fix: Correctly handle author being a User
If an offending message is sent in DMs, infractions that require the user being on the server didn't work, and there was an error while trying to display the user embed from that object, since the user is on the server (and therefore should have a nick attribute).
-rw-r--r--bot/exts/filtering/_settings_types/actions/infraction_and_notification.py7
-rw-r--r--bot/exts/filtering/_ui/ui.py7
2 files changed, 12 insertions, 2 deletions
diff --git a/bot/exts/filtering/_settings_types/actions/infraction_and_notification.py b/bot/exts/filtering/_settings_types/actions/infraction_and_notification.py
index ed08362de..d60bcac5b 100644
--- a/bot/exts/filtering/_settings_types/actions/infraction_and_notification.py
+++ b/bot/exts/filtering/_settings_types/actions/infraction_and_notification.py
@@ -5,6 +5,7 @@ from typing import ClassVar
import arrow
import discord.abc
from botcore.utils.logging import get_logger
+from botcore.utils.members import get_or_fetch_member
from discord import Colour, Embed, Member, User
from discord.errors import Forbidden
from pydantic import validator
@@ -37,7 +38,7 @@ class Infraction(Enum):
async def invoke(
self,
user: Member | User,
- channel: discord.abc.Messageable,
+ channel: discord.abc.GuildChannel | discord.DMChannel,
alerts_channel: discord.TextChannel,
duration: float,
reason: str
@@ -50,6 +51,10 @@ class Infraction(Enum):
log.warning(f":warning: Could not apply {command_name} to {user.mention}: command not found.")
return
+ if isinstance(user, discord.User): # For example because a message was sent in a DM.
+ member = await get_or_fetch_member(channel.guild, user.id)
+ if member:
+ user = member
ctx = FakeContext(channel, command)
if self.name in ("KICK", "WARNING", "WATCH", "NOTE"):
await command(ctx, user, reason=reason or None)
diff --git a/bot/exts/filtering/_ui/ui.py b/bot/exts/filtering/_ui/ui.py
index e71bab0d1..98741a96d 100644
--- a/bot/exts/filtering/_ui/ui.py
+++ b/bot/exts/filtering/_ui/ui.py
@@ -11,6 +11,7 @@ import discord
from botcore.site_api import ResponseCodeError
from botcore.utils import scheduling
from botcore.utils.logging import get_logger
+from botcore.utils.members import get_or_fetch_member
from discord import Embed, Interaction
from discord.ext.commands import Context
from discord.ui.select import MISSING as SELECT_MISSING, SelectOption
@@ -529,7 +530,11 @@ class AlertView(discord.ui.View):
await interaction.response.defer()
fake_ctx = FakeContext(interaction.channel, command, author=interaction.user)
- await command(fake_ctx, self.ctx.author)
+ # Get the most updated user/member object every time the button is pressed.
+ author = await get_or_fetch_member(interaction.guild, self.ctx.author.id)
+ if author is None:
+ author = await bot.instance.fetch_user(self.ctx.author.id)
+ await command(fake_ctx, author)
@discord.ui.button(emoji="⚠")
async def user_infractions(self, interaction: Interaction, button: discord.ui.Button) -> None: