blockの巣

Discordのスラッシュコマンドの日本語ローカライズコマンド名にアルファベットを含むことができなさそう

2023/02/24 12:55 公開
Discord Poise

RustのPoiseというcrate(ライブラリ)を使用してDiscordのbotを開発しているときに確認したことです。

Poiseでは

/// Discription
#[poise::command(
    slash_command,
    name_localized("ja", "日本語コマンド名"),
    description_localized("ja", "日本語説明文")
)]
pub async fn exsample_command(ctx: Context<'_>) -> Result<()> {
    /* 処理内容 */
}

のようにすることでスラッシュコマンドを開発することができ関数名がそのままコマンド名となりname_localizedで指定したものがローカライズされたコマンド名となります。
この場合/example_commandというコマンドでこのコマンドを実行することができますが、日本語環境であれば/日本語コマンド名というコマンドで実行する事ができます。

さて本題ですが、このname_localizedで"ja"つまり日本語ローカライズしたコマンド名にアルファベットを含むことができなさそうという問題です。

私はバンカラステージボットというスプラトゥーン3のステージ情報を表示するbotを開発しているのですが、その機能追加で/Xマッチというコマンドを作成したくなりました。
以下のように定義します。

/// Displays splatoon3 X battle schedule
#[poise::command(
    slash_command,
    name_localized("ja", "エックスマッチ"),
    description_localized("ja", "Xマッチのスケジュールを取得する")
)]
pub async fn x_match(
    ctx: Context<'_>,
    #[description = "hour of the day. 0~23"]
    #[description_localized("ja", "スケジュールを確認したい時間。0~23のいずれか")]
    #[max = 23]
    hour: Option<u32>,
) -> Result<()> {
    /* 処理内容 */
}

このコマンドを登録しようとしたところDiscordから以下のようなエラーが返ってきました。

Invalid Form Body (name_localizations: Command name is invalid)

name_localizationsで指定したコマンド名に問題がありそうなエラーですね。
調べてもわかりませんでしたがコードを書き換えつつ実行確認してみた感じでは日本語ローカライズしたコマンド名にアルファベットが含まれているとダメそうでした。
アルファベットを変更しても(例:/Aマッチ)戦闘以外にアルファベットが来ても(例:/マッチX)だめでした。

余談

そんなわけでバンカラステージボットのXマッチのスケジュールを取得するコマンドは/エックスマッチ, /次のエックスマッチ, /エックスマッチアサリなどになりました。
悲しいですね。