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