🔃

JDAでコマンドの実行者を取得

2024/01/21に公開

はじめに

Zenn 初投稿のえめさんです。
JDA でコマンドの実行者を特定する方法が見つからなかったため、自分の備忘録用に記事を書くことにしました。
このような記事を書くことは初めてなので、至らない点があるかもしれませんが、よろしくお願いします。

環境

Kotlin 1.9.22 で書いていますが、Java でも同じように実装できます。
Bot のライブラリは JDA 5.0.0_Beta19 です。

使用するメソッド

JDA の JavaDoc を見ていると、MessageReceivedEventクラスにgetInteraction()というメソッドがあることがわかります。
https://ci.dv8tion.net/job/JDA5/javadoc/net/dv8tion/jda/api/entities/Message.html#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()メソッドを使用することで、コマンドの実行者を特定することができます。
https://ci.dv8tion.net/job/JDA5/javadoc/net/dv8tion/jda/api/interactions/Interaction.html#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

Main.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

Main.kt
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 などでコマンドの実行者を特定する必要があったので、調べてみました。

こんな記事ですが、誰かのお役に立てれば幸いです。

GitHubで編集を提案

Discussion