Application Commands

What is an application command?

Application commands are commands that an application can register to Discord. They provide users a first-class way of interacting directly with your application that feels deeply integrated into Discord.

From: Discord API docs

How do I register an application command?

Use Discorb::Command::Handler#slash, Discorb::Command::Handler#group for slash commands, Discorb::Command::Handler#user_command for user menu commands, and Discorb::Command::Handler#message_command for message menu commands.

Note

To register a global command, it will take 1 hour to be registered. Guild commands will be registered immediately.

Register Slash Commands

This example registers a slash command that says "Hello, world!" when the user types /hello.

require "discorb"

client = Discorb::Client.new

client.slash("hello", "Greet for you") do |interaction|
  interaction.post("Hello World!", ephemeral: true)
end

client.run(ENV["DISCORD_BOT_TOKEN"])

Discorb::Command::Handler#slash takes 5 arguments:

Argument Description
command_name The name of the command.
description The description of the command.
options A hash of options.
guild_ids The ID of the guild to register the command in.
block A block that will be called when the command is invoked.

In options, hash should be like this:

{
    "Name" => {
        type: :string,
        required: true,
        description: "The description of the command."
    }
}
Key Description
type The type of the argument.
required Whether the argument is required.
description The description of the argument.
choices The choices of the argument.

choices should be unspecified if you don't want to use it. choices is hash like this:

{
    "vocaloid" => {
        required: true,
        description: "The vocaloid which you like."
        type: :string,
        choices: {
            "Hatsune Miku" => "miku",
            "Kagamine Rin" => "rin",
            "Kagamine Len" => "len",
            "Megurine Luka" => "luka",
            "MEIKO" => "meiko",
            "KAITO" => "kaito",
        }
    }
}

# Note: This aritcle is written in 8/31.

The key will be displayed in the user menu, and the value will be used as the argument.

In type, You must use one of the following:

Name Description Aliases
:string String argument. :str
:integer Integer argument. :int
:float Float argument. None
:boolean Boolean argument. :bool
:user User argument. :member
:channel Channel argument. None
:role Role argument. None

Group Slash Commands

To register a group of slash commands, use Discorb::Command::Handler#slash_group.

group = client.slash_group("settings", "Set settings of bot.")

group.slash("message_expand", "Whether bot should expand message.", {
    "enabled" => {
        type: :boolean,
        description: "Whether bot should expand message."
    }
}) do |interaction|
  # ...
end

group.slash("bump_alert", "Whether bot should notify DISBOARD bump.", {
    "enabled" => {
        type: :boolean,
        description: "Whether bot should notify DISBOARD bump."
    }
}) do |interaction|
  # ...
end

You can make subcommand group by using Discorb::Command::GroupCommand#group.

group = client.slash_group("permission", "Set/Get command permissions.")

group_user = group.group("user", "Set/Get user's command permissions.")

group_user.slash("set", "Set user's command permissions.", {
    "user_id" => {
        type: :user,
        description: "The user."
    },
    "value" => {
        type: :boolean,
        description: "Whether the user can use the command."
    }
}) do |interaction, user|
  # ...
end

group_user.slash("get", "Set user's command permissions.", {
    "user_id" => {
        type: :user,
        description: "The user."
    },
}) do |interaction, user|
  # ...
end

group_user = group.group("user", "Set/Get user's command permissions.")

group_user.slash("set", "Set user's command permissions.", {
    "user_id" => {
        type: :user,
        description: "The user."
    },
    "value" => {
        type: :boolean,
        description: "Whether the user can use the command."
    }
}) do |interaction, user|
  # ...
end

group_user.slash("get", "Set user's command permissions.", {
    "user_id" => {
        type: :user,
        description: "The user."
    },
}) do |interaction, user|
  # ...
end

group_role = group.group("role", "Set/Get role's command permissions.")

group_role.slash("set", "Set role's command permissions.", {
    "role_id" => {
        type: :role,
        description: "The role."
    },
    "value" => {
        type: :boolean,
        description: "Whether the role can use the command."
    }
}) do |interaction, role|
  # ...
end

group_role.slash("get", "Set role's command permissions.", {
    "role_id" => {
        type: :role,
        description: "The role."
    },
}) do |interaction, role|
  # ...
end

Register User Context Menu Command

client.user_command("hello") do |interaction, user|
  interaction.post("Hello, #{user.name}!")
end

Discorb::Command::Handler#user_command takes 3 arguments:

Parameter Description
command_name The name of the command.
guild_ids The ID of the guild to register the command in.
block A block that will be called when the command is invoked.

block will be called with two arguments:

Parameter Description
interaction The interaction object.
user The user object.

Register Message Context Menu Command

client.message_command("Bookmark") do |interaction, message|
  # ...
end

Discorb::Command::Handler#message_command takes 3 arguments:

Parameter Description
command_name The name of the command.
guild_ids The ID of the guild to register the command in.
block A block that will be called when the command is invoked.

block will be called with two arguments:

Parameter Description
interaction The interaction object.
message The message object.