用户命令、消息命令和入口点命令¶
除了斜杠命令,Discord 还有从用户或消息的上下文菜单中运行的命令,以及用于打开应用 Activity 的入口点命令。
用户命令和消息命令¶
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 |
由 Webhook 发送的消息,包括交互的回应 |
| 消息 | 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 条消息命令,超出时同步会发出警告。
入口点命令¶
带有 Activity 的应用有一条入口点命令,显示在应用启动器中。@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() 打开 Activity 并返回其实例 ID,ctx.respond(...) 则改为用一条消息回应。如果应用没有在 Developer Portal 中启用 Activity,Discord 会拒绝这条命令。
入口点命令总是全局的。设置了 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。Activity 方面的其余内容请参见 Activity、变现和 Social SDK。