mirror of
https://github.com/MelisaDev/melisa.git
synced 2024-11-11 19:07:28 +03:00
feat(interactions): add send_message() method to Interaction model
This commit is contained in:
parent
9ddd182a23
commit
1c6f96e50d
2 changed files with 90 additions and 6 deletions
|
@ -10,10 +10,12 @@ from dataclasses import dataclass
|
||||||
|
|
||||||
from .commands import ApplicationCommandType
|
from .commands import ApplicationCommandType
|
||||||
from .commands import SlashCommandInteractionDataOption
|
from .commands import SlashCommandInteractionDataOption
|
||||||
|
from ...models.message import Embed
|
||||||
|
from ...exceptions import EmbedFieldError
|
||||||
from ...utils.conversion import try_enum
|
from ...utils.conversion import try_enum
|
||||||
from ...models.guild import Channel, Role, _choose_channel_type, GuildMember
|
from ...models.guild import Channel, Role, _choose_channel_type, GuildMember
|
||||||
from ...utils.api_model import APIModelBase
|
from ...utils.api_model import APIModelBase
|
||||||
from ...models.message.message import Message
|
from ...models.message.message import Message, AllowedMentions, MessageFlags
|
||||||
from ...models.user.user import User
|
from ...models.user.user import User
|
||||||
from ...utils.snowflake import Snowflake
|
from ...utils.snowflake import Snowflake
|
||||||
|
|
||||||
|
@ -86,12 +88,12 @@ class InteractionResponse(APIModelBase):
|
||||||
----------
|
----------
|
||||||
type: InteractionType
|
type: InteractionType
|
||||||
The type of response
|
The type of response
|
||||||
data: Optional[Any]
|
data: Optional[Dict[str, Any]]
|
||||||
An optional response message
|
An optional response message
|
||||||
"""
|
"""
|
||||||
|
|
||||||
type: InteractionCallbackType
|
type: InteractionCallbackType = None
|
||||||
data: Optional[Any]
|
data: Optional[Dict[str, Any]] = None
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_dict(cls, data: Dict[str, Any]) -> InteractionResponse:
|
def from_dict(cls, data: Dict[str, Any]) -> InteractionResponse:
|
||||||
|
@ -215,7 +217,7 @@ class Interaction(APIModelBase):
|
||||||
|
|
||||||
return self
|
return self
|
||||||
|
|
||||||
async def respond(self, response: InteractionResponse):
|
async def respond(self, response: InteractionResponse, *, content_type: str = None):
|
||||||
"""
|
"""
|
||||||
Respond to an interaction.
|
Respond to an interaction.
|
||||||
|
|
||||||
|
@ -227,6 +229,86 @@ class Interaction(APIModelBase):
|
||||||
|
|
||||||
await self._client.rest.interaction_respond(self, response)
|
await self._client.rest.interaction_respond(self, response)
|
||||||
|
|
||||||
|
async def send_message(
|
||||||
|
self,
|
||||||
|
content: Optional[str] = None,
|
||||||
|
*,
|
||||||
|
tts: Optional[bool] = False,
|
||||||
|
embed: Optional[Embed] = None,
|
||||||
|
embeds: Optional[List[Embed]] = None,
|
||||||
|
allowed_mentions: Optional[AllowedMentions] = None,
|
||||||
|
ephemeral: Optional[bool] = False,
|
||||||
|
) -> None:
|
||||||
|
"""|coro|
|
||||||
|
|
||||||
|
Respond to an interaction with a message.
|
||||||
|
|
||||||
|
The content must be a type that can convert to a string through str(content).
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
content: Optional[:class:`str`]
|
||||||
|
The content of the message to send.
|
||||||
|
tts: Optional[:class:`bool`]
|
||||||
|
Whether the message should be sent using text-to-speech.
|
||||||
|
embed: Optional[:class:`~melisa.models.message.embed.Embed`]
|
||||||
|
Embed
|
||||||
|
embeds: Optional[List[:class:`~melisa.models.message.embed.Embed`]]
|
||||||
|
List of embeds
|
||||||
|
allowed_mentions: Optional[:class:`~melisa.models.message.message.AllowedMentions`]
|
||||||
|
Controls the mentions being processed in this message.
|
||||||
|
ephemeral: Optional[:class:`bool`]
|
||||||
|
Whether the message should be sent as an ephemeral message. Defaults to False.
|
||||||
|
|
||||||
|
Raises
|
||||||
|
-------
|
||||||
|
HTTPException
|
||||||
|
The request to perform the action failed with other http exception.
|
||||||
|
ForbiddenError
|
||||||
|
You do not have the proper permissions to send the message.
|
||||||
|
BadRequestError
|
||||||
|
Some of specified parameters is invalid.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# ToDo: Add delete_after parameter
|
||||||
|
# ToDo: Add components parameter
|
||||||
|
# ToDo: Add files parameter
|
||||||
|
|
||||||
|
if embeds is None:
|
||||||
|
embeds = [embed] if embed is not None else []
|
||||||
|
|
||||||
|
payload = {
|
||||||
|
"content": str(content) if content is not None else None,
|
||||||
|
"embeds": [],
|
||||||
|
}
|
||||||
|
|
||||||
|
for _embed in embeds:
|
||||||
|
if _embed.total_length() > 6000:
|
||||||
|
raise EmbedFieldError.characters_from_desc(
|
||||||
|
"Embed", embed.total_length(), 6000
|
||||||
|
)
|
||||||
|
payload["embeds"].append(_embed.to_dict())
|
||||||
|
|
||||||
|
payload["tts"] = tts
|
||||||
|
if allowed_mentions is not None:
|
||||||
|
payload["allowed_mentions"] = allowed_mentions.to_dict()
|
||||||
|
elif self._client.allowed_mentions is not None:
|
||||||
|
payload[
|
||||||
|
"allowed_mentions"
|
||||||
|
] = self._client.allowed_mentions.to_dict()
|
||||||
|
|
||||||
|
if ephemeral:
|
||||||
|
payload["flags"] = MessageFlags.EPHEMERAL.value
|
||||||
|
|
||||||
|
return await self.respond(
|
||||||
|
InteractionResponse.from_dict(
|
||||||
|
{
|
||||||
|
"type": InteractionCallbackType.CHANNEL_MESSAGE_WITH_SOURCE,
|
||||||
|
"data": payload,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@dataclass(repr=False)
|
@dataclass(repr=False)
|
||||||
class ResolvedData(APIModelBase):
|
class ResolvedData(APIModelBase):
|
||||||
|
|
|
@ -1234,7 +1234,9 @@ class RESTApp:
|
||||||
]
|
]
|
||||||
|
|
||||||
async def interaction_respond(
|
async def interaction_respond(
|
||||||
self, interaction: Interaction, interaction_response: InteractionResponse
|
self,
|
||||||
|
interaction: Interaction,
|
||||||
|
interaction_response: InteractionResponse,
|
||||||
):
|
):
|
||||||
"""|coro|
|
"""|coro|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue