from typing import TYPE_CHECKING, Any, Dict, Optional, Union
from .channel import PartialChannel
from .enums import InteractionType, try_enum
from .guild import PartialGuild
from .member import Member
from .message import Message
from .adapter import ResponseAdapter
from .user import User
from .utils import unwrap_user
if TYPE_CHECKING:
from .client import Client
[docs]class Interaction:
"""
Base interaction class for all interactions
Properties
----------
id: str
The unique id of the interaction
type: int
The type of the interaction
token: str
The token of the interaction
version: int
The version of the interaction
application_id: str
The id of the application that the interaction was triggered for
data: Optional[Dict[str, Any]]
The command data payload (if the interaction is a command)
guild_id: Optional[str]
The guild id of the interaction
channel_id: Optional[str]
The channel id of the interaction
app_permissions: Optional[int]
The permissions of the application
locale: Optional[str]
The locale of the interaction
guild_locale: Optional[str]
The guild locale of the interaction
Parameters
----------
data: Dict[str, Any]
The interaction data payload
client: Client
The request object from fastapi
"""
def __init__(self, client: "Client", data: Dict[str, Any]):
self.payload = data
self._responded = False
self.client: "Client" = client
self.data: Optional[Dict[str, Any]] = data.get("data")
@property
def responded(self) -> bool:
"""
Whether the interaction has been responded to
Returns
-------
bool
"""
return self._responded
@property
def id(self) -> str:
"""
The unique id of the interaction
Returns
-------
str
"""
return self.payload["id"]
@property
def kind(self) -> Optional[InteractionType]:
"""
The type of the interaction
Returns
-------
Optional[InteractionType]
"""
return try_enum(InteractionType, self.payload["type"])
@property
def token(self) -> str:
"""
The token of the interaction
Returns
-------
str
"""
return self.payload["token"]
@property
def version(self) -> int:
"""
The version of the interaction
Returns
-------
int
"""
return self.payload["version"]
@property
def application_id(self) -> str:
"""
The id of the application that the interaction was triggered for
Returns
-------
str
"""
return self.payload["application_id"]
@property
def guild_id(self) -> Optional[str]:
"""
The guild id of the interaction
Returns
-------
Optional[str]
"""
return self.payload.get("guild_id")
@property
def channel_id(self) -> str:
"""
The channel id of the interaction
Returns
-------
Optional[str]
"""
return self.payload["channel_id"]
@property
def app_permissions(self) -> Optional[int]:
"""
The permissions of the application
Returns
-------
Optional[int]
"""
return self.payload.get("app_permissions")
@property
def locale(self) -> Optional[str]:
"""
The locale of the interaction
Returns
-------
Optional[str]
"""
return self.payload.get("locale")
@property
def guild_locale(self) -> Optional[str]:
"""
The guild locale of the interaction
Returns
-------
Optional[str]
"""
return self.payload.get("guild_locale")
@property
def channel(self) -> PartialChannel:
"""
The channel where the interaction was triggered
Returns
-------
PartialChannel
"""
return PartialChannel(self.client, self.channel_id, self.guild_id)
@property
def author(self) -> Union[User, Member]:
"""
The author of the interaction
If the interaction was triggered in a guild, this will return a member object else it will return user object.
Returns
-------
Union[User, Member]
"""
if not self.guild_id:
return User(self.client, self.payload["user"])
return Member(self.client, unwrap_user(self.payload["member"], self.guild_id))
@property
def guild(self) -> Optional[PartialGuild]:
if not self.guild_id:
return
return PartialGuild(self.client, self.guild_id)
@property
def message(self) -> Optional[Message]:
"""
The message from which the component interaction was triggered
Returns
-------
Message
"""
payload = self.payload.get("message")
if not payload:
return
return Message(self.client, payload)
@property
def response(self):
"""
The response adapter for the interaction
Returns
-------
ResponseAdapter
"""
return ResponseAdapter(self)
@property
def from_originator(self) -> bool:
"""
Whether the interaction was triggered by the same user who triggered the message
Returns
-------
bool
"""
if not self.message:
return True
return self.message.interaction.user == self.author
[docs] async def original_response(self) -> Optional[Message]:
"""
Gets the original response message of the interaction if the interaction has been responded to.
Returns
-------
InteractionResponse
The original response message
"""
if not self._responded:
return
resp = await self.client.http.fetch_original_webhook_message(self.application_id, self.token)
data = await resp.json()
return Message(self.client, data)