2525
2626from __future__ import annotations
2727
28+ from functools import cached_property
2829from typing import TYPE_CHECKING , Any , Callable , ClassVar , Generator , TypeVar
2930
3031from . import enums , utils
3536from .mixins import Hashable
3637from .object import Object
3738from .permissions import PermissionOverwrite , Permissions
39+ from .utils .private import get_as_snowflake
3840
3941__all__ = (
4042 "AuditLogDiff" ,
@@ -381,7 +383,7 @@ def _handle_role(
381383 elem : list [RolePayload ],
382384 ) -> None :
383385 if not hasattr (first , "roles" ):
384- setattr ( first , " roles" , [])
386+ first . roles = []
385387
386388 data = []
387389 g : Guild = entry .guild # type: ignore
@@ -396,7 +398,7 @@ def _handle_role(
396398
397399 data .append (role )
398400
399- setattr ( second , " roles" , data )
401+ second . roles = data
400402
401403 def _handle_trigger_metadata (
402404 self ,
@@ -407,13 +409,13 @@ def _handle_trigger_metadata(
407409 attr : str ,
408410 ) -> None :
409411 if not hasattr (first , "trigger_metadata" ):
410- setattr ( first , " trigger_metadata" , None )
412+ first . trigger_metadata = None
411413
412414 key = attr .split ("_" , 1 )[- 1 ]
413415 data = {key : elem }
414416 tm = AutoModTriggerMetadata .from_dict (data )
415417
416- setattr ( second , " trigger_metadata" , tm )
418+ second . trigger_metadata = tm
417419
418420
419421class _AuditLogProxyMemberPrune :
@@ -559,21 +561,21 @@ def _from_data(self, data: AuditLogEntryPayload) -> None:
559561 # into meaningful data when requested
560562 self ._changes = data .get ("changes" , [])
561563
562- self .user = self ._get_member (utils . _get_as_snowflake (data , "user_id" )) # type: ignore
563- self ._target_id = utils . _get_as_snowflake (data , "target_id" )
564+ self .user = self ._get_member (get_as_snowflake (data , "user_id" )) # type: ignore
565+ self ._target_id = get_as_snowflake (data , "target_id" )
564566
565567 def _get_member (self , user_id : int ) -> Member | User | None :
566568 return self .guild .get_member (user_id ) or self ._users .get (user_id )
567569
568570 def __repr__ (self ) -> str :
569571 return f"<AuditLogEntry id={ self .id } action={ self .action } user={ self .user !r} >"
570572
571- @property
573+ @cached_property
572574 def created_at (self ) -> datetime .datetime :
573575 """Returns the entry's creation time in UTC."""
574576 return utils .snowflake_time (self .id )
575577
576- @property
578+ @cached_property
577579 def target (
578580 self ,
579581 ) -> (
@@ -602,7 +604,7 @@ def category(self) -> enums.AuditLogActionCategory:
602604 """The category of the action, if applicable."""
603605 return self .action .category
604606
605- @property
607+ @cached_property
606608 def changes (self ) -> AuditLogChanges :
607609 """The list of changes this entry has."""
608610 obj = AuditLogChanges (self , self ._changes , state = self ._state )
0 commit comments