aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Izan <[email protected]>2021-08-11 18:53:05 +0100
committerGravatar Izan <[email protected]>2021-08-22 20:03:18 +0100
commitad873f91aadb7698c3fd73e1e263ad7bc0ca21e9 (patch)
tree0fe6cc2fe0d465741b9d2911eba4b0ec59478193
parentRemove unused imports (diff)
Rename converter from FetchedMember to MemberOrUser
-rw-r--r--bot/converters.py2
-rw-r--r--bot/errors.py5
-rw-r--r--bot/exts/fun/duck_pond.py4
-rw-r--r--bot/exts/info/information.py14
-rw-r--r--bot/exts/moderation/infraction/_scheduler.py6
-rw-r--r--bot/exts/moderation/infraction/_utils.py16
-rw-r--r--bot/exts/moderation/infraction/infractions.py34
-rw-r--r--bot/exts/moderation/infraction/management.py8
-rw-r--r--bot/exts/moderation/watchchannels/bigbrother.py10
-rw-r--r--bot/exts/recruitment/talentpool/_cog.py16
10 files changed, 58 insertions, 57 deletions
diff --git a/bot/converters.py b/bot/converters.py
index 1cfbd29b8..ff9f6e5d9 100644
--- a/bot/converters.py
+++ b/bot/converters.py
@@ -499,4 +499,4 @@ class Infraction(Converter):
Expiry = t.Union[Duration, ISODateTime]
-FetchedMember = t.Union[discord.Member, discord.User]
+MemberOrUser = t.Union[discord.Member, discord.User]
diff --git a/bot/errors.py b/bot/errors.py
index d472334d4..5186aa3bb 100644
--- a/bot/errors.py
+++ b/bot/errors.py
@@ -1,6 +1,6 @@
from typing import Hashable
-from discord import Member, User
+from converters import MemberOrUser
class LockedResourceError(RuntimeError):
@@ -30,7 +30,8 @@ class InvalidInfractedUserError(Exception):
`user` -- User or Member which is invalid
"""
- def __init__(self, user: Union[Member, User], reason: str = "User infracted is a bot."):
+ def __init__(self, user: MemberOrUser, reason: str = "User infracted is a bot."):
+
self.user = user
self.reason = reason
diff --git a/bot/exts/fun/duck_pond.py b/bot/exts/fun/duck_pond.py
index 7c09e27f5..0ac985139 100644
--- a/bot/exts/fun/duck_pond.py
+++ b/bot/exts/fun/duck_pond.py
@@ -8,7 +8,7 @@ from discord.ext.commands import Cog, Context, command
from bot import constants
from bot.bot import Bot
-from bot.converters import FetchedMember
+from bot.converters import MemberOrUser
from bot.utils.checks import has_any_role
from bot.utils.messages import count_unique_users_reaction, send_attachments
from bot.utils.webhooks import send_webhook
@@ -37,7 +37,7 @@ class DuckPond(Cog):
log.exception(f"Failed to fetch webhook with id `{self.webhook_id}`")
@staticmethod
- def is_staff(member: FetchedMember) -> bool:
+ def is_staff(member: MemberOrUser) -> bool:
"""Check if a specific member or user is staff."""
if hasattr(member, "roles"):
for role in member.roles:
diff --git a/bot/exts/info/information.py b/bot/exts/info/information.py
index 167731e64..ff3fb9408 100644
--- a/bot/exts/info/information.py
+++ b/bot/exts/info/information.py
@@ -12,7 +12,7 @@ from discord.ext.commands import BucketType, Cog, Context, Paginator, command, g
from bot import constants
from bot.api import ResponseCodeError
from bot.bot import Bot
-from bot.converters import FetchedMember
+from bot.converters import MemberOrUser
from bot.decorators import in_whitelist
from bot.errors import NonExistentRoleError
from bot.pagination import LinePaginator
@@ -220,7 +220,7 @@ class Information(Cog):
await ctx.send(embed=embed)
@command(name="user", aliases=["user_info", "member", "member_info", "u"])
- async def user_info(self, ctx: Context, user: FetchedMember = None) -> None:
+ async def user_info(self, ctx: Context, user: MemberOrUser = None) -> None:
"""Returns info about a user."""
if user is None:
user = ctx.author
@@ -235,7 +235,7 @@ class Information(Cog):
embed = await self.create_user_embed(ctx, user)
await ctx.send(embed=embed)
- async def create_user_embed(self, ctx: Context, user: FetchedMember) -> Embed:
+ async def create_user_embed(self, ctx: Context, user: MemberOrUser) -> Embed:
"""Creates an embed containing information on the `user`."""
on_server = bool(ctx.guild.get_member(user.id))
@@ -307,7 +307,7 @@ class Information(Cog):
return embed
- async def basic_user_infraction_counts(self, user: FetchedMember) -> Tuple[str, str]:
+ async def basic_user_infraction_counts(self, user: MemberOrUser) -> Tuple[str, str]:
"""Gets the total and active infraction counts for the given `member`."""
infractions = await self.bot.api_client.get(
'bot/infractions',
@@ -324,7 +324,7 @@ class Information(Cog):
return "Infractions", infraction_output
- async def expanded_user_infraction_counts(self, user: FetchedMember) -> Tuple[str, str]:
+ async def expanded_user_infraction_counts(self, user: MemberOrUser) -> Tuple[str, str]:
"""
Gets expanded infraction counts for the given `member`.
@@ -365,7 +365,7 @@ class Information(Cog):
return "Infractions", "\n".join(infraction_output)
- async def user_nomination_counts(self, user: FetchedMember) -> Tuple[str, str]:
+ async def user_nomination_counts(self, user: MemberOrUser) -> Tuple[str, str]:
"""Gets the active and historical nomination counts for the given `member`."""
nominations = await self.bot.api_client.get(
'bot/nominations',
@@ -390,7 +390,7 @@ class Information(Cog):
return "Nominations", "\n".join(output)
- async def user_messages(self, user: FetchedMember) -> Tuple[Union[bool, str], Tuple[str, str]]:
+ async def user_messages(self, user: MemberOrUser) -> Tuple[Union[bool, str], Tuple[str, str]]:
"""
Gets the amount of messages for `member`.
diff --git a/bot/exts/moderation/infraction/_scheduler.py b/bot/exts/moderation/infraction/_scheduler.py
index 89869820c..13f59bb76 100644
--- a/bot/exts/moderation/infraction/_scheduler.py
+++ b/bot/exts/moderation/infraction/_scheduler.py
@@ -13,7 +13,7 @@ from bot import constants
from bot.api import ResponseCodeError
from bot.bot import Bot
from bot.constants import Colours
-from bot.converters import FetchedMember
+from bot.converters import MemberOrUser
from bot.exts.moderation.infraction import _utils
from bot.exts.moderation.modlog import ModLog
from bot.utils import messages, scheduling, time
@@ -115,7 +115,7 @@ class InfractionScheduler:
self,
ctx: Context,
infraction: _utils.Infraction,
- user: FetchedMember,
+ user: MemberOrUser,
action_coro: t.Optional[t.Awaitable] = None,
user_reason: t.Optional[str] = None,
additional_info: str = "",
@@ -264,7 +264,7 @@ class InfractionScheduler:
self,
ctx: Context,
infr_type: str,
- user: FetchedMember,
+ user: MemberOrUser,
send_msg: bool = True
) -> None:
"""
diff --git a/bot/exts/moderation/infraction/_utils.py b/bot/exts/moderation/infraction/_utils.py
index 9c3f9d804..fe9815600 100644
--- a/bot/exts/moderation/infraction/_utils.py
+++ b/bot/exts/moderation/infraction/_utils.py
@@ -7,7 +7,7 @@ from discord.ext.commands import Context
from bot.api import ResponseCodeError
from bot.constants import Colours, Icons
-from bot.converters import FetchedMember
+from bot.converters import MemberOrUser
from bot.errors import InvalidInfractedUserError
log = logging.getLogger(__name__)
@@ -44,7 +44,7 @@ INFRACTION_DESCRIPTION_TEMPLATE = (
)
-async def post_user(ctx: Context, user: FetchedMember) -> t.Optional[dict]:
+async def post_user(ctx: Context, user: MemberOrUser) -> t.Optional[dict]:
"""
Create a new user in the database.
@@ -71,7 +71,7 @@ async def post_user(ctx: Context, user: FetchedMember) -> t.Optional[dict]:
async def post_infraction(
ctx: Context,
- user: FetchedMember,
+ user: MemberOrUser,
infr_type: str,
reason: str,
expires_at: datetime = None,
@@ -79,7 +79,7 @@ async def post_infraction(
active: bool = True
) -> t.Optional[dict]:
"""Posts an infraction to the API."""
- if isinstance(user, FetchedMember) and user.bot:
+ if isinstance(user, MemberOrUser) and user.bot:
log.trace(f"Posting of {infr_type} infraction for {user} to the API aborted. User is a bot.")
raise InvalidInfractedUserError(user)
@@ -114,7 +114,7 @@ async def post_infraction(
async def get_active_infraction(
ctx: Context,
- user: FetchedMember,
+ user: MemberOrUser,
infr_type: str,
send_msg: bool = True
) -> t.Optional[dict]:
@@ -149,7 +149,7 @@ async def get_active_infraction(
async def notify_infraction(
- user: FetchedMember,
+ user: MemberOrUser,
infr_type: str,
expires_at: t.Optional[str] = None,
reason: t.Optional[str] = None,
@@ -185,7 +185,7 @@ async def notify_infraction(
async def notify_pardon(
- user: FetchedMember,
+ user: MemberOrUser,
title: str,
content: str,
icon_url: str = Icons.user_verified
@@ -203,7 +203,7 @@ async def notify_pardon(
return await send_private_embed(user, embed)
-async def send_private_embed(user: FetchedMember, embed: discord.Embed) -> bool:
+async def send_private_embed(user: MemberOrUser, embed: discord.Embed) -> bool:
"""
A helper method for sending an embed to a user's DMs.
diff --git a/bot/exts/moderation/infraction/infractions.py b/bot/exts/moderation/infraction/infractions.py
index dfffb2b20..48ffbd773 100644
--- a/bot/exts/moderation/infraction/infractions.py
+++ b/bot/exts/moderation/infraction/infractions.py
@@ -10,7 +10,7 @@ from discord.ext.commands import Context, command
from bot import constants
from bot.bot import Bot
from bot.constants import Event
-from bot.converters import Duration, Expiry, FetchedMember
+from bot.converters import Duration, Expiry, MemberOrUser
from bot.decorators import respect_role_hierarchy
from bot.exts.moderation.infraction import _utils
from bot.exts.moderation.infraction._scheduler import InfractionScheduler
@@ -53,7 +53,7 @@ class Infractions(InfractionScheduler, commands.Cog):
# region: Permanent infractions
@command()
- async def warn(self, ctx: Context, user: FetchedMember, *, reason: t.Optional[str] = None) -> None:
+ async def warn(self, ctx: Context, user: MemberOrUser, *, reason: t.Optional[str] = None) -> None:
"""Warn a user for the given reason."""
if not isinstance(user, Member):
await ctx.send(":x: The user doesn't appear to be on the server.")
@@ -66,7 +66,7 @@ class Infractions(InfractionScheduler, commands.Cog):
await self.apply_infraction(ctx, infraction, user)
@command()
- async def kick(self, ctx: Context, user: FetchedMember, *, reason: t.Optional[str] = None) -> None:
+ async def kick(self, ctx: Context, user: MemberOrUser, *, reason: t.Optional[str] = None) -> None:
"""Kick a user for the given reason."""
if not isinstance(user, Member):
await ctx.send(":x: The user doesn't appear to be on the server.")
@@ -78,7 +78,7 @@ class Infractions(InfractionScheduler, commands.Cog):
async def ban(
self,
ctx: Context,
- user: FetchedMember,
+ user: MemberOrUser,
duration: t.Optional[Expiry] = None,
*,
reason: t.Optional[str] = None
@@ -94,7 +94,7 @@ class Infractions(InfractionScheduler, commands.Cog):
async def purgeban(
self,
ctx: Context,
- user: FetchedMember,
+ user: MemberOrUser,
duration: t.Optional[Expiry] = None,
*,
reason: t.Optional[str] = None
@@ -110,7 +110,7 @@ class Infractions(InfractionScheduler, commands.Cog):
async def voiceban(
self,
ctx: Context,
- user: FetchedMember,
+ user: MemberOrUser,
duration: t.Optional[Expiry] = None,
*,
reason: t.Optional[str]
@@ -128,7 +128,7 @@ class Infractions(InfractionScheduler, commands.Cog):
@command(aliases=["mute"])
async def tempmute(
self, ctx: Context,
- user: FetchedMember,
+ user: MemberOrUser,
duration: t.Optional[Expiry] = None,
*,
reason: t.Optional[str] = None
@@ -162,7 +162,7 @@ class Infractions(InfractionScheduler, commands.Cog):
async def tempban(
self,
ctx: Context,
- user: FetchedMember,
+ user: MemberOrUser,
duration: Expiry,
*,
reason: t.Optional[str] = None
@@ -188,7 +188,7 @@ class Infractions(InfractionScheduler, commands.Cog):
async def tempvoiceban(
self,
ctx: Context,
- user: FetchedMember,
+ user: MemberOrUser,
duration: Expiry,
*,
reason: t.Optional[str]
@@ -214,7 +214,7 @@ class Infractions(InfractionScheduler, commands.Cog):
# region: Permanent shadow infractions
@command(hidden=True)
- async def note(self, ctx: Context, user: FetchedMember, *, reason: t.Optional[str] = None) -> None:
+ async def note(self, ctx: Context, user: MemberOrUser, *, reason: t.Optional[str] = None) -> None:
"""Create a private note for a user with the given reason without notifying the user."""
infraction = await _utils.post_infraction(ctx, user, "note", reason, hidden=True, active=False)
if infraction is None:
@@ -223,7 +223,7 @@ class Infractions(InfractionScheduler, commands.Cog):
await self.apply_infraction(ctx, infraction, user)
@command(hidden=True, aliases=['shadowban', 'sban'])
- async def shadow_ban(self, ctx: Context, user: FetchedMember, *, reason: t.Optional[str] = None) -> None:
+ async def shadow_ban(self, ctx: Context, user: MemberOrUser, *, reason: t.Optional[str] = None) -> None:
"""Permanently ban a user for the given reason without notifying the user."""
await self.apply_ban(ctx, user, reason, hidden=True)
@@ -234,7 +234,7 @@ class Infractions(InfractionScheduler, commands.Cog):
async def shadow_tempban(
self,
ctx: Context,
- user: FetchedMember,
+ user: MemberOrUser,
duration: Expiry,
*,
reason: t.Optional[str] = None
@@ -260,17 +260,17 @@ class Infractions(InfractionScheduler, commands.Cog):
# region: Remove infractions (un- commands)
@command()
- async def unmute(self, ctx: Context, user: FetchedMember) -> None:
+ async def unmute(self, ctx: Context, user: MemberOrUser) -> None:
"""Prematurely end the active mute infraction for the user."""
await self.pardon_infraction(ctx, "mute", user)
@command()
- async def unban(self, ctx: Context, user: FetchedMember) -> None:
+ async def unban(self, ctx: Context, user: MemberOrUser) -> None:
"""Prematurely end the active ban infraction for the user."""
await self.pardon_infraction(ctx, "ban", user)
@command(aliases=("uvban",))
- async def unvoiceban(self, ctx: Context, user: FetchedMember) -> None:
+ async def unvoiceban(self, ctx: Context, user: MemberOrUser) -> None:
"""Prematurely end the active voice ban infraction for the user."""
await self.pardon_infraction(ctx, "voice_ban", user)
@@ -319,7 +319,7 @@ class Infractions(InfractionScheduler, commands.Cog):
async def apply_ban(
self,
ctx: Context,
- user: FetchedMember,
+ user: MemberOrUser,
reason: t.Optional[str],
purge_days: t.Optional[int] = 0,
**kwargs
@@ -375,7 +375,7 @@ class Infractions(InfractionScheduler, commands.Cog):
await bb_cog.apply_unwatch(ctx, user, bb_reason, send_message=False)
@respect_role_hierarchy(member_arg=2)
- async def apply_voice_ban(self, ctx: Context, user: FetchedMember, reason: t.Optional[str], **kwargs) -> None:
+ async def apply_voice_ban(self, ctx: Context, user: MemberOrUser, reason: t.Optional[str], **kwargs) -> None:
"""Apply a voice ban infraction with kwargs passed to `post_infraction`."""
if await _utils.get_active_infraction(ctx, user, "voice_ban"):
return
diff --git a/bot/exts/moderation/infraction/management.py b/bot/exts/moderation/infraction/management.py
index d1437c635..68ebab8ba 100644
--- a/bot/exts/moderation/infraction/management.py
+++ b/bot/exts/moderation/infraction/management.py
@@ -12,7 +12,7 @@ from discord.utils import escape_markdown
from bot import constants
from bot.bot import Bot
-from bot.converters import Expiry, FetchedMember, Infraction, allowed_strings
+from bot.converters import Expiry, MemberOrUser, Infraction, allowed_strings
from bot.exts.moderation.infraction.infractions import Infractions
from bot.exts.moderation.modlog import ModLog
from bot.pagination import LinePaginator
@@ -201,15 +201,15 @@ class ModManagement(commands.Cog):
# region: Search infractions
@infraction_group.group(name="search", aliases=('s',), invoke_without_command=True)
- async def infraction_search_group(self, ctx: Context, query: t.Union[FetchedMember, str]) -> None:
+ async def infraction_search_group(self, ctx: Context, query: t.Union[MemberOrUser, str]) -> None:
"""Searches for infractions in the database."""
- if isinstance(query, FetchedMember):
+ if isinstance(query, MemberOrUser):
await self.search_user(ctx, query)
else:
await self.search_reason(ctx, query)
@infraction_search_group.command(name="user", aliases=("member", "id"))
- async def search_user(self, ctx: Context, user: FetchedMember) -> None:
+ async def search_user(self, ctx: Context, user: MemberOrUser) -> None:
"""Search for infractions by member."""
infraction_list = await self.bot.api_client.get(
'bot/infractions/expanded',
diff --git a/bot/exts/moderation/watchchannels/bigbrother.py b/bot/exts/moderation/watchchannels/bigbrother.py
index c6ee844ef..4ee69ec9b 100644
--- a/bot/exts/moderation/watchchannels/bigbrother.py
+++ b/bot/exts/moderation/watchchannels/bigbrother.py
@@ -6,7 +6,7 @@ from discord.ext.commands import Cog, Context, group, has_any_role
from bot.bot import Bot
from bot.constants import Channels, MODERATION_ROLES, Webhooks
-from bot.converters import FetchedMember
+from bot.converters import MemberOrUser
from bot.exts.moderation.infraction._utils import post_infraction
from bot.exts.moderation.watchchannels._watchchannel import WatchChannel
@@ -60,7 +60,7 @@ class BigBrother(WatchChannel, Cog, name="Big Brother"):
@bigbrother_group.command(name='watch', aliases=('w',), root_aliases=('watch',))
@has_any_role(*MODERATION_ROLES)
- async def watch_command(self, ctx: Context, user: FetchedMember, *, reason: str) -> None:
+ async def watch_command(self, ctx: Context, user: MemberOrUser, *, reason: str) -> None:
"""
Relay messages sent by the given `user` to the `#big-brother` channel.
@@ -71,11 +71,11 @@ class BigBrother(WatchChannel, Cog, name="Big Brother"):
@bigbrother_group.command(name='unwatch', aliases=('uw',), root_aliases=('unwatch',))
@has_any_role(*MODERATION_ROLES)
- async def unwatch_command(self, ctx: Context, user: FetchedMember, *, reason: str) -> None:
+ async def unwatch_command(self, ctx: Context, user: MemberOrUser, *, reason: str) -> None:
"""Stop relaying messages by the given `user`."""
await self.apply_unwatch(ctx, user, reason)
- async def apply_watch(self, ctx: Context, user: FetchedMember, reason: str) -> None:
+ async def apply_watch(self, ctx: Context, user: MemberOrUser, reason: str) -> None:
"""
Add `user` to watched users and apply a watch infraction with `reason`.
@@ -125,7 +125,7 @@ class BigBrother(WatchChannel, Cog, name="Big Brother"):
await ctx.send(msg)
- async def apply_unwatch(self, ctx: Context, user: FetchedMember, reason: str, send_message: bool = True) -> None:
+ async def apply_unwatch(self, ctx: Context, user: MemberOrUser, reason: str, send_message: bool = True) -> None:
"""
Remove `user` from watched users and mark their infraction as inactive with `reason`.
diff --git a/bot/exts/recruitment/talentpool/_cog.py b/bot/exts/recruitment/talentpool/_cog.py
index 304bdafba..5c1a1cd3f 100644
--- a/bot/exts/recruitment/talentpool/_cog.py
+++ b/bot/exts/recruitment/talentpool/_cog.py
@@ -12,7 +12,7 @@ from discord.ext.commands import Cog, Context, group, has_any_role
from bot.api import ResponseCodeError
from bot.bot import Bot
from bot.constants import Channels, Emojis, Guild, MODERATION_ROLES, Roles, STAFF_ROLES, Webhooks
-from bot.converters import FetchedMember
+from bot.converters import MemberOrUser
from bot.exts.moderation.watchchannels._watchchannel import WatchChannel
from bot.exts.recruitment.talentpool._review import Reviewer
from bot.pagination import LinePaginator
@@ -178,7 +178,7 @@ class TalentPool(WatchChannel, Cog, name="Talentpool"):
@nomination_group.command(name='forcewatch', aliases=('fw', 'forceadd', 'fa'), root_aliases=("forcenominate",))
@has_any_role(*MODERATION_ROLES)
- async def force_watch_command(self, ctx: Context, user: FetchedMember, *, reason: str = '') -> None:
+ async def force_watch_command(self, ctx: Context, user: MemberOrUser, *, reason: str = '') -> None:
"""
Adds the given `user` to the talent pool, from any channel.
@@ -188,7 +188,7 @@ class TalentPool(WatchChannel, Cog, name="Talentpool"):
@nomination_group.command(name='watch', aliases=('w', 'add', 'a'), root_aliases=("nominate",))
@has_any_role(*STAFF_ROLES)
- async def watch_command(self, ctx: Context, user: FetchedMember, *, reason: str = '') -> None:
+ async def watch_command(self, ctx: Context, user: MemberOrUser, *, reason: str = '') -> None:
"""
Adds the given `user` to the talent pool.
@@ -207,7 +207,7 @@ class TalentPool(WatchChannel, Cog, name="Talentpool"):
await self._watch_user(ctx, user, reason)
- async def _watch_user(self, ctx: Context, user: FetchedMember, reason: str) -> None:
+ async def _watch_user(self, ctx: Context, user: MemberOrUser, reason: str) -> None:
"""Adds the given user to the talent pool."""
if user.bot:
await ctx.send(f":x: I'm sorry {ctx.author}, I'm afraid I can't do that. I only watch humans.")
@@ -271,7 +271,7 @@ class TalentPool(WatchChannel, Cog, name="Talentpool"):
@nomination_group.command(name='history', aliases=('info', 'search'))
@has_any_role(*MODERATION_ROLES)
- async def history_command(self, ctx: Context, user: FetchedMember) -> None:
+ async def history_command(self, ctx: Context, user: MemberOrUser) -> None:
"""Shows the specified user's nomination history."""
result = await self.bot.api_client.get(
self.api_endpoint,
@@ -300,7 +300,7 @@ class TalentPool(WatchChannel, Cog, name="Talentpool"):
@nomination_group.command(name='unwatch', aliases=('end', ), root_aliases=("unnominate",))
@has_any_role(*MODERATION_ROLES)
- async def unwatch_command(self, ctx: Context, user: FetchedMember, *, reason: str) -> None:
+ async def unwatch_command(self, ctx: Context, user: MemberOrUser, *, reason: str) -> None:
"""
Ends the active nomination of the specified user with the given reason.
@@ -323,7 +323,7 @@ class TalentPool(WatchChannel, Cog, name="Talentpool"):
@nomination_edit_group.command(name='reason')
@has_any_role(*MODERATION_ROLES)
- async def edit_reason_command(self, ctx: Context, nomination_id: int, actor: FetchedMember, *, reason: str) -> None:
+ async def edit_reason_command(self, ctx: Context, nomination_id: int, actor: MemberOrUser, *, reason: str) -> None:
"""Edits the reason of a specific nominator in a specific active nomination."""
if len(reason) > REASON_MAX_CHARS:
await ctx.send(f":x: Maxiumum allowed characters for the reason is {REASON_MAX_CHARS}.")
@@ -417,7 +417,7 @@ class TalentPool(WatchChannel, Cog, name="Talentpool"):
await ctx.message.add_reaction(Emojis.check_mark)
@Cog.listener()
- async def on_member_ban(self, guild: Guild, user: Union[FetchedMember]) -> None:
+ async def on_member_ban(self, guild: Guild, user: Union[MemberOrUser]) -> None:
"""Remove `user` from the talent pool after they are banned."""
await self.unwatch(user.id, "User was banned.")