JDAでコマンドの実行者を取得
はじめに
Zenn 初投稿のえめさんです。
JDA でコマンドの実行者を特定する方法が見つからなかったため、自分の備忘録用に記事を書くことにしました。
このような記事を書くことは初めてなので、至らない点があるかもしれませんが、よろしくお願いします。
環境
Kotlin 1.9.22 で書いていますが、Java でも同じように実装できます。
Bot のライブラリは JDA 5.0.0_Beta19 です。
使用するメソッド
JDA の JavaDoc を見ていると、MessageReceivedEvent
クラスにgetInteraction()
というメソッドがあることがわかります。
This is sent on the message object when the message is a response to an Interaction without an existing message.
This means responses to Message Components do not include this property, instead including a message reference object as components always exist on preexisting messages.
そして、この getInteraction()メソッド内のgetUser()
メソッドを使用することで、コマンドの実行者を特定することができます。
The User who caused this interaction.
実装してみると、以下のようになります。
Java
static void onMessageReceived(MessageReceivedEvent event) {
User user = event.getInteraction().getUser();
// ここでコマンドの実行者を特定できる
}
Kotlin
fun onMessageReceived(event: MessageReceivedEvent) {
val user = event.interaction.user
// ここでコマンドの実行者を特定できる
}
ソースコード全文
Java
import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.events.interaction.MessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
public class Main extends ListenerAdapter {
public static void main(String[] args) throws Exception {
JDABuilder.createDefault("token", GatewayIntent.GUILD_MESSAGES)
.addEventListeners(new Main())
.build();
}
@Override
public void onMessageReceived(MessageReceivedEvent event) {
User user = event.getInteraction().getUser();
// ここでコマンドの実行者を特定できる
}
}
Kotlin
import net.dv8tion.jda.api.JDABuilder
import net.dv8tion.jda.api.events.interaction.MessageReceivedEvent
import net.dv8tion.jda.api.hooks.ListenerAdapter
class Main : ListenerAdapter() {
override fun onMessageReceived(event: MessageReceivedEvent) {
val user = event.interaction.user
// ここでコマンドの実行者を特定できる
}
}
fun main() {
JDABuilder.createDefault("token", GatewayIntent.GUILD_MESSAGES)
.addEventListeners(Main())
.build()
}
あとがき
Discord の Bump などでコマンドの実行者を特定する必要があったので、調べてみました。
こんな記事ですが、誰かのお役に立てれば幸いです。
Discussion