Команды пользователя, сообщения и точки входа¶
Кроме слэш-команд, в Discord есть команды, которые запускаются из контекстного меню пользователя или сообщения, и команда точки входа, которая открывает Активность приложения.
Команды пользователя и сообщения¶
import bostie
from bostie import Context, Message, ResolvedMember, User, WebhookMessage, fmt
bot = bostie.Bot()
@bot.user_command("Account age")
async def account_age(ctx: Context, user: User) -> None:
created = fmt.timestamp(user.created_at, "R")
await ctx.respond(f"{user.mention} joined Discord {created}.", ephemeral=True)
@bot.user_command("Joined server")
async def joined(ctx: Context, member: ResolvedMember) -> None:
if member.joined_at is None:
await ctx.respond(f"Discord sent no join date for {member.mention}.")
return
await ctx.respond(f"{member.mention} joined {fmt.timestamp(member.joined_at)}.")
@bot.message_command("Word count")
async def word_count(ctx: Context, message: Message | WebhookMessage) -> None:
await ctx.respond(f"{len(message.content.split())} words.", ephemeral=True)
@bot.user_command(name) и @bot.message_command(name) регистрируют функцию, которая принимает контекст и цель. Имя — это то, что показывает меню: от 1 до 32 символов, и, в отличие от имён слэш-команд, оно может содержать заглавные буквы и пробелы. У таких команд нет описания и параметров.
Аннотация типа цели определяет, что получит обработчик:
| Команда | Аннотация | Обработчик получает |
|---|---|---|
| пользователя | User |
пользователя |
| пользователя | ResolvedMember |
участника вместе с его user; только на серверах |
| пользователя | User \| ResolvedMember |
участника на сервере, пользователя в остальных местах |
| сообщения | Message |
сообщение, отправленное пользователем или ботом |
| сообщения | WebhookMessage |
сообщение, отправленное вебхуком, включая ответы на взаимодействия |
| сообщения | Message \| WebhookMessage |
любое из них |
Цель, которая не разрешается в тип из аннотации, вызывает OptionConversionError, а он уходит в хуки ошибок. Аннотируйте цель-сообщение как Message | WebhookMessage, если только команда не имеет смысла лишь для одного из этих типов.
Такие команды принимают настройки слэш-команды, кроме description, description_localizations и настроек параметров: name_localizations, ephemeral, auto_defer, default_permissions, nsfw, guilds, contexts, integration_types, checks и extra. Discord разрешает 15 команд пользователя и 15 команд сообщения на область, и при превышении синхронизация выдаёт предупреждение.
Команда точки входа¶
У приложения с Активностями есть одна команда точки входа, которую показывает панель запуска приложений (App Launcher). @bot.entry_point(name) регистрирует её с функцией, которая принимает только контекст:
import bostie
from bostie import Context
bot = bostie.Bot()
@bot.entry_point("Launch", description="Open the game")
async def launch(ctx: Context) -> None:
await ctx.launch_activity()
Обработчик отвечает как у любой команды: ctx.launch_activity() открывает Активность и возвращает ID её экземпляра, а ctx.respond(...) вместо этого отвечает сообщением. Discord отклоняет эту команду у приложения, для которого Активности не включены в Developer Portal.
Точка входа всегда глобальная. Если задан dev_guilds, синхронизация пропускает её и выдаёт предупреждение. Если в Discord уже есть точка входа по умолчанию под другим именем, синхронизация сохраняет ID этой команды, чтобы Discord заменил её, а не оставил обе. launch_activity() есть и в контекстах компонентов и модальных окон, но это должен быть первый ответ.
entry_point принимает description, name_localizations, description_localizations, ephemeral, auto_defer, default_permissions, nsfw, contexts, integration_types, checks и extra. Остальное об Активностях описано в разделе «Активности, монетизация и Social SDK».