Commandes utilisateur, de message et de point d'entrée¶
En plus des commandes slash, Discord propose des commandes qui se lancent depuis le menu contextuel d'un utilisateur ou d'un message, et la commande de point d'entrée qui ouvre l'Activité d'une application.
Commandes utilisateur et de message¶
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) et @bot.message_command(name) enregistrent une fonction qui reçoit le contexte et la cible. Le nom est ce qu'affiche le menu : de 1 à 32 caractères, et contrairement aux noms de commandes slash, il peut contenir des majuscules et des espaces. Ces commandes n'ont ni description ni options.
L'annotation de type de la cible indique ce que reçoit le gestionnaire :
| Commande | Annotation | Le gestionnaire reçoit |
|---|---|---|
| utilisateur | User |
l'utilisateur |
| utilisateur | ResolvedMember |
le membre, avec son user ; uniquement sur un serveur |
| utilisateur | User \| ResolvedMember |
le membre sur un serveur, l'utilisateur ailleurs |
| message | Message |
un message envoyé par un utilisateur ou un bot |
| message | WebhookMessage |
un message envoyé par un webhook, réponses aux interactions comprises |
| message | Message \| WebhookMessage |
l'un ou l'autre |
Une cible qui ne se résout pas vers le type annoté lève OptionConversionError, qui part vers les hooks d'erreur. Annotez une cible de message avec Message | WebhookMessage, sauf si la commande n'a de sens que pour l'un des deux.
Elles acceptent les réglages d'une commande slash sauf description, description_localizations et les réglages d'option : name_localizations, ephemeral, auto_defer, default_permissions, nsfw, guilds, contexts, integration_types, checks et extra. Discord autorise 15 commandes utilisateur et 15 commandes de message par portée, et la synchronisation avertit au-delà.
La commande de point d'entrée¶
Une application avec des Activités a une seule commande de point d'entrée, que l'App Launcher affiche. @bot.entry_point(name) l'enregistre avec une fonction qui ne reçoit que le contexte :
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()
Le gestionnaire répond comme pour n'importe quelle commande : ctx.launch_activity() ouvre l'Activité et renvoie l'id de son instance, et ctx.respond(...) répond plutôt par un message. Discord refuse la commande venant d'une application dont les Activités ne sont pas activées dans le Developer Portal.
Le point d'entrée est toujours global. Quand dev_guilds est défini, la synchronisation l'omet et émet un avertissement. Quand Discord a déjà son point d'entrée par défaut sous un autre nom, la synchronisation garde l'id de cette commande, si bien que Discord la remplace au lieu de garder les deux. launch_activity() existe aussi sur les contextes de composant et de fenêtre modale, mais ce doit être la première réponse.
entry_point accepte description, name_localizations, description_localizations, ephemeral, auto_defer, default_permissions, nsfw, contexts, integration_types, checks et extra. Activités, monétisation et Social SDK couvre le reste du côté Activité.