Accept discord.Objects for cases, add last_known_username param in create_case() (#4326)

* [Modlog] Fix typehints for create_case

* Simplify Logic after review

* discord.abc.User to catch both member and user objects and other potential discord.Object's being sent

* fix typehints and Case.edit()

* fix docstrings in create_case

* Add note about last_known_username

* fix the weird thing that scared me
This commit is contained in:
TrustyJAID 2020-09-19 11:05:00 -06:00 committed by GitHub
parent 6162b0f2bd
commit fec25fcaba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -240,13 +240,13 @@ class Case:
guild: discord.Guild, guild: discord.Guild,
created_at: int, created_at: int,
action_type: str, action_type: str,
user: Union[discord.User, int], user: Union[discord.Object, discord.abc.User, int],
moderator: Optional[Union[discord.User, int]], moderator: Optional[Union[discord.Object, discord.abc.User, int]],
case_number: int, case_number: int,
reason: str = None, reason: str = None,
until: int = None, until: int = None,
channel: Optional[Union[discord.TextChannel, discord.VoiceChannel, int]] = None, channel: Optional[Union[discord.TextChannel, discord.VoiceChannel, int]] = None,
amended_by: Optional[Union[discord.User, int]] = None, amended_by: Optional[Union[discord.Object, discord.abc.User, int]] = None,
modified_at: Optional[int] = None, modified_at: Optional[int] = None,
message: Optional[discord.Message] = None, message: Optional[discord.Message] = None,
last_known_username: Optional[str] = None, last_known_username: Optional[str] = None,
@ -256,12 +256,18 @@ class Case:
self.created_at = created_at self.created_at = created_at
self.action_type = action_type self.action_type = action_type
self.user = user self.user = user
if isinstance(user, discord.Object):
self.user = user.id
self.last_known_username = last_known_username self.last_known_username = last_known_username
self.moderator = moderator self.moderator = moderator
if isinstance(moderator, discord.Object):
self.moderator = moderator.id
self.reason = reason self.reason = reason
self.until = until self.until = until
self.channel = channel self.channel = channel
self.amended_by = amended_by self.amended_by = amended_by
if isinstance(amended_by, discord.Object):
self.amended_by = amended_by.id
self.modified_at = modified_at self.modified_at = modified_at
self.case_number = case_number self.case_number = case_number
self.message = message self.message = message
@ -280,9 +286,12 @@ class Case:
data.pop("case_number", None) data.pop("case_number", None)
# last username is set based on passed user object # last username is set based on passed user object
data.pop("last_known_username", None) data.pop("last_known_username", None)
for item, value in data.items():
for item in list(data.keys()): if isinstance(value, discord.Object):
setattr(self, item, data[item]) # probably expensive to call but meh should capture all cases
setattr(self, item, value.id)
else:
setattr(self, item, value)
# update last known username # update last known username
if not isinstance(self.user, int): if not isinstance(self.user, int):
@ -388,12 +397,10 @@ class Case:
user = f"[{translated}] ({self.user})" user = f"[{translated}] ({self.user})"
else: else:
user = f"{self.last_known_username} ({self.user})" user = f"{self.last_known_username} ({self.user})"
avatar_url = None
else: else:
user = escape_spoilers( user = escape_spoilers(
filter_invites(f"{self.user} ({self.user.id})") filter_invites(f"{self.user} ({self.user.id})")
) # Invites and spoilers get rendered even in embeds. ) # Invites and spoilers get rendered even in embeds.
avatar_url = self.user.avatar_url
if embed: if embed:
emb = discord.Embed(title=title, description=reason) emb = discord.Embed(title=title, description=reason)
@ -800,11 +807,12 @@ async def create_case(
guild: discord.Guild, guild: discord.Guild,
created_at: datetime, created_at: datetime,
action_type: str, action_type: str,
user: Union[discord.User, discord.Member], user: Union[discord.Object, discord.abc.User, int],
moderator: Optional[Union[discord.User, discord.Member]] = None, moderator: Optional[Union[discord.Object, discord.abc.User, int]] = None,
reason: Optional[str] = None, reason: Optional[str] = None,
until: Optional[datetime] = None, until: Optional[datetime] = None,
channel: Optional[discord.TextChannel] = None, channel: Optional[discord.TextChannel] = None,
last_known_username: Optional[str] = None,
) -> Optional[Case]: ) -> Optional[Case]:
""" """
Creates a new case. Creates a new case.
@ -823,9 +831,9 @@ async def create_case(
(similarly to how Python treats naive `datetime` objects). (similarly to how Python treats naive `datetime` objects).
action_type: str action_type: str
The type of action that was taken The type of action that was taken
user: Union[discord.User, discord.Member] user: Union[discord.Object, discord.abc.User, int]
The user target by the action The user target by the action
moderator: Optional[Union[discord.User, discord.Member]] moderator: Optional[Union[discord.Object, discord.abc.User, int]]
The moderator who took the action The moderator who took the action
reason: Optional[str] reason: Optional[str]
The reason the action was taken The reason the action was taken
@ -835,6 +843,10 @@ async def create_case(
(similarly to how Python treats naive `datetime` objects). (similarly to how Python treats naive `datetime` objects).
channel: Optional[discord.TextChannel] channel: Optional[discord.TextChannel]
The channel the action was taken in The channel the action was taken in
last_known_username: Optional[str]
The last known username of the user
Note: This is ignored if a Member or User object is provided
in the user field
""" """
case_type = await get_casetype(action_type, guild) case_type = await get_casetype(action_type, guild)
if case_type is None: if case_type is None:
@ -865,6 +877,7 @@ async def create_case(
amended_by=None, amended_by=None,
modified_at=None, modified_at=None,
message=None, message=None,
last_known_username=last_known_username,
) )
await _config.custom(_CASES, str(guild.id), str(next_case_number)).set(case.to_json()) await _config.custom(_CASES, str(guild.id), str(next_case_number)).set(case.to_json())
await _config.guild(guild).latest_case_number.set(next_case_number) await _config.guild(guild).latest_case_number.set(next_case_number)