-
Notifications
You must be signed in to change notification settings - Fork 2
Slash CommandおよびButtonへの対応 #17
Comments
https://discord.com/developers/docs/interactions/slash-commands 「コマンド」の引数として、「サブコマンド」と「サブコマンドグループ」を追設定できる
という7つの引数ケースを持つコマンドを実装する場合(実際に実装するわけではない)、 Command.Choice[] permissions = new Command.Choice[]{
new Command.Choice("Command: perm", "cmd-perm"), // 第1引数: ユーザーに見える説明、第2引数: プログラムに渡される判定用文字列
new Command.Choice("Command: test", "cmd-test"),
// などなど
};
CommandData perm = new CommandData("perm", "パーミッションに関する操作を行う")
.addSubcommandGroups(
new SubcommandGroupData("role", "ロール")
.addSubcommands(
new SubcommandData("add", "ロールに対してパーミッションを設定")
.addOptions(
new OptionData(OptionType.ROLE, "target", "対象ロール", true),
new OptionData(OptionType.STRING, "permission", "パーミッション", true)
.addChoices(permissions)
),
new SubcommandData("remove", "ロールからパーミッションを削除")
.addOptions(
new OptionData(OptionType.ROLE, "target", "対象ロール", true),
new OptionData(OptionType.STRING, "permission", "パーミッション", true)
.addChoices(permissions)
),
new SubcommandData("status", "ロールのステータスを表示")
.addOptions(
new OptionData(OptionType.ROLE, "target", "対象ロール", false)
)
),
new SubcommandGroupData("user", "ユーザー")
.addSubcommands(
new SubcommandData("add", "ユーザーに対してパーミッションを設定")
.addOptions(
new OptionData(OptionType.USER, "target", "対象ユーザー", true),
new OptionData(OptionType.STRING, "permission", "パーミッション", true)
.addChoices(permissions)
),
new SubcommandData("remove", "ユーザーからパーミッションを削除")
.addOptions(
new OptionData(OptionType.USER, "target", "対象ユーザー", true),
new OptionData(OptionType.STRING, "permission", "パーミッション", true)
.addChoices(permissions)
),
new SubcommandData("status", "ユーザーのステータスを表示")
.addOptions(
new OptionData(OptionType.STRING, "target", "対象ユーザー", true)
)
)
);
Objects.requireNonNull(event.getJDA().getGuildById(597378876556967936L))
.upsertCommand(perm).queue();
参考までに、JDA本家が置いているサンプルソースコード: https://github.com/DV8FromTheWorld/JDA/blob/development/src/examples/java/SlashBotExample.java |
ユーザーが選択・入力した項目を取得するには以下の通り
|
ユーザーが実行したコマンド(インタラクト)には3秒以内に応答を返す必要がある。応答は
|
今までのDiscordBotの利用形態からして、 |
ボタンに関して 登場人物は まず、 次に、 最後に、 結論として、以下のようにプログラミングすれば実装できる: // MessageBuilder を使う場合 (スラッシュメッセージ駆動でない場合)
jda.getTextChannelById("チャンネルID")
.sendMessage(new MessageBuilder("メッセージ")
.setActionRows(ActionRow.of(
Button.primary("btn-one", "One"),
Button.primary("btn-two", "Two")))
.build());
// スラッシュメッセージの場合
@Override
public void onSlashCommand(SlashCommandEvent event) {
// event.reply時点(ReplyAction)でボタンを表示する場合
event.reply("Pong!")
.setEphemeral(false)
.addActionRow(
Button.primary("btn-one", "One"),
Button.primary("btn-two", "Two"))
.queue();
// 一度応答した後、editOriginalでメッセージを編集するときにボタンを設定・表示する場合
event.reply("Pong!").setEphemeral(false)
.flatMap(v ->
event.getHook().editOriginal("メッセージ")
.setActionRows(ActionRow.of(
Button.primary("btn-one", "One"),
Button.primary("btn-two", "Two")))
).queue();
} |
ボタンが押されたときのイベント駆動については
でそれぞれ取得できる |
以下、Javajaotan2での方針
|
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
うへ〜 |
Cmd_????から引数を自動で取得->登録 |
引数を自動で、というのがどこまで何を示しているのかわからんのでアレだけど、流石に難しくないか…?明示的にどの場合どうやるって割り当てないと厳しそう |
コマンド自体をJavajaotanは全部自動で登録してたから、そんな風に出来たら便利じゃないかな~とか思った😔 |
あれとは全然違うんだろうけど |
. |
頭になるコマンドだけを判別してそれで振り分けるのはなんら難しいことではない |
そっかコマンドフレームワーク使えないのか... |
まあ、機能削減したりJDAが今回実装したOptionType, OptionDataとかをうまく流用してコマンドフレームワークっぽいものを作るとかのやり方をするしかないんだろうなあ |
構想が全然練れてないし、どうしたらいいか正直難しいので案とかあればください(そもそも時間をどこまでとれるか微妙なので案として実装してくれてもいい) |
コマンドフレームワークっぽく出来るように色々やってみてるけど、さっきから1時間経ってもSlashCommandが全く反映されない... |
Bot(Guild)にslash commandの利用可能許可は出した?GuildにBot追加するときみたいに認証かまさないと駄目なはず |
ほんとだ..................................................................
|
まあ前者かなあ… あとは今のコマンドフレームワークみたいにこれこれこういうサブコマンドだったらこの関数を呼び出してね、みたいにした方が分かりやすいのかなあと思ったり(switchとかifをコマンド実装側でやるとバグの温床にならざるを得ないし何より読みにくい…) |
とはいえ、cloudが対応する前は別の方法でなんか考えることになるだろうけど。
According to the policy of the repository, conversations are conducted in Japanese in principle. Please use translation etc. for reference.
参考: discord-jda/JDA#1501
The text was updated successfully, but these errors were encountered: