はじめに
初投稿かつQiita初心者です。
DiscordのBotを作る際にすごーーく戸惑ったので、初心者目線でリファレンスを置いておきます。
なお、私自身はJavaのすこーし書けるぐらいです。
使用するもの
- Eclipse(Pleiades)
- Discord
- JDA
※ダウンロード方法などは下に書いておきます!
ライブラリ
※あんまり気しなくてよいです。このバージョン使ってるよーっていう記述だけ。
-
JDA
バージョン:5.0.0-beta.16
公式(github)
https://github.com/discord-jda/JDA -
Eclipse
バージョン:2023
日本語版のPleiadesを使用しています。
公式サイト
https://willbrains.jp/
Discord サーバーの用意
DiscordのBotをテストする自分だけのサーバーを作りましょう。
※他の人がいるサーバーでテストすると通知音がうるさく迷惑がかかるので。
Discord Botの用意
まずはDiscordのBotを作成しましょう。
下記のサイトに行っていただき、ログインを行ってください。
https://discord.com/developers/applications
Botの名前とチェックを入れてCreateを押下
※名前は後で変えられます。
※日本語でもOK
左のメニューからBotを選択し、MESSAGE CONTENT INTENTにチェックを入れる
左のメニューからOAuth2→URLGeneratorを押下
SCOPESには「applications.commands」と「bot」をチェック
BOT PERMISSIONSには「Administrator」にチェックを入れる
コピーしたURLをブラウザの上部に張り付けてエンター
(新しいタブでやったほうがいいかも!)
ブラウザ上でサーバーを自分が追加したサーバーを選んで「はい」を押下
(ここで出てこない場合はサーバーを作っていない方か、サーバーの権限が足りない可能性があります。)
環境開発の用意
ぶっちゃけJavaが動けばいいので自身が好きなエディタでよいです。
(VSCode、IntelliJ IDEAなど...)
今回はEcripseで紹介します。
下記のサイトからEcripseをダウンロードしてください。
https://mergedoc.osdn.jp/
ダウンロードしたファイルを解凍
※7zipとかで解凍してもよいのですが、7Zipなど解凍ツール持っていない方はPleiadesのツールで解凍しましょう。
フォルダの格納先はCドライブ配下の「pleiades」配下に入れてください。
参照:c:\pleiades
起動するたび毎回このフォルダに来るのが面倒なので
ディスクトップにeclipse.exeのショートカットを作成しましょう。
プロジェクトの作成
ウィザードが出てくるので
ウィザードに「Maven」と記述し、Mavenプロジェクトを選択、次へをクリック
フィルターに「maven-archetype-quickstart」と入力し、
グループIDが「org.apache.maven.archetypes」を選択して次へ
グループIdとアーティファクトIdには適当な名前を付けておけばOK
考えるのが面倒な人は
グループID:com.discord
アーティファクトId:samplebot
こんな感じでつけておいてください。
入力したら完了を押下
コンソールにこのパッケージでよいですかー?みたいな感じで出てくるので、
コンソールにBUILD SUCCESSと出てきて、
新たなフォルダができているはずです。
作成したフォルダ内のpom.xmlを開く
dependenciesっていうタグがあるので、その中にいろいろ入れる
※コードが出てこない場合は下の方にあるpom.xmlのタブを開いてください。(画像参照)
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
↓
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>net.dv8tion</groupId>
+ <artifactId>JDA</artifactId>
+ <version>5.0.0-beta.16</version>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <version>2.0.9</version>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-jdk14</artifactId>
+ <version>2.0.9</version>
+ </dependency>
</dependencies>
プロジェクト・ファセットを選択し、
ファセット・フォームへ変換を押下
プログラムの初期設定
名前は何でもよし!
入力したら完了を押下
※先頭文字は必ず大文字にしてください。
作成したファイルの中に初期設定をしていきます。
public class DiscordBot {
}
↓
public class DiscordBot extends ListenerAdapter {
private static JDA jda = null;
private static final String BOT_TOKEN = "Botのトークン";
public static void main(String[] args) {
jda = JDABuilder.createDefault(BOT_TOKEN)
.setRawEventsEnabled(true)
.enableIntents(GatewayIntent.MESSAGE_CONTENT)
.addEventListeners(new DiscordBot())
.setActivity(Activity.playing("ステータス"))
.build();
jda.updateCommands().queue();
}
//メッセージの反応メソッド
@Override
public void onMessageReceived(MessageReceivedEvent event) {
if (event.getAuthor().isBot()) return;
}
//コマンドの反応メソッド
@Override
public void onSlashCommandInteraction(SlashCommandInteractionEvent event) {
}
}
※.addEventListeners(new クラスの名前())
ここの部分は自分の作ったクラスの名前に変更してください。
それぞれ解説
Botのトークンは下記から取得してください。
https://discord.com/developers/applications
出てきたトークンをコピー
※このトークンは絶対に人に教えないでください!!!
botを動かしてみる
作成したクラスを右クリック→実行→Javaアプリケーションを押下
失敗する場合はエラー情報をネットで調べるか読み込んでいるJDAとかが古くないか確認してみてください。
いざBotの実装へ!
そしたら、コーディングしていきましょう。
※コーディングを反映させたい場合はJavaアプリをいったん落としてから起動しなおしましょう。
ステータスの変更
.setActivity(Activity.playing("ステータス"))
Activityには種類があり、様々な文字列に変更することができます。
- Activity.playing("好きな文字列")
〇〇をプレイ中 - Activity.competing("好きな文字列")
〇〇に参戦中です - Activity.listening("好きな文字列")
〇〇を再生中 - Activity.streaming("好きな文字列","url")
〇〇を配信中(ユーザーをクリックすることで設定したURLに飛ぶようです) - Activity.watching("好きな文字列")
〇〇を視聴中
どれかのステータスにしたい場合はもとから変更するようにしてください。
メッセージによる反応
@Override
public void onMessageReceived(MessageReceivedEvent event) {
if (event.getAuthor().isBot()) return;
}
このメソッドはDiscordのテキストチャットを送った時動きます。
if (event.getAuthor().isBot()) return;
Botが打ったチャットには反応しないようにしています。
String msg = "にゃーん"; event.getChannel().sendMessage(msg).queue();
このコードを打つことで、メッセージを飛ばしてくれます。
例1:組み合わせるとこんな感じ
@Override
public void onMessageReceived(MessageReceivedEvent event) {
if (event.getAuthor().isBot()) return;
String msg = "にゃーん";
event.getChannel().sendMessage(msg).queue();
}
例2:特定のメッセージによって反応を変えたい場合
@Override
public void onMessageReceived(MessageReceivedEvent event) {
if (event.getAuthor().isBot()) return;
String message = event.getMessage().getContentRaw(); //メッセージを受け取る
System.out.println("message:" + message);
String msg = "";
switch (message) {
case "sample1":
msg = "にゃーん1";
break;
case "sample2":
msg = "にゃーん2";
break;
case "sample3":
msg = "にゃーん3";
break;
case "sample4":
msg = "にゃーん4";
break;
}
if(!msg.isEmpty()) {
event.getChannel().sendMessage(msg).queue();
}
}
スラッシュコマンドの対応
@Override
public void onSlashCommandInteraction(SlashCommandInteractionEvent event) {
}
このメソッドはDiscordのコマンドによって動きます。
コマンドの登録
mainメソッド内にコマンドを登録しましょう。
jda.upsertCommand("コマンド","コマンド説明").queue();
コマンドの実行処理
onSlashCommandInteractionメソッド内に実行処理を記述しましょう。
String command = event.getName();
コマンドメッセージを受け取ります。
event.reply("メッセージ").setEphemeral(false).queue();
コマンドが打たれた場所にメッセージを返します。
例1:コマンドによるメッセージの返し
※さっきの登録したコマンドを使用する
@Override
public void onSlashCommandInteraction(SlashCommandInteractionEvent event) {
String command = event.getName(); //コマンドを受け取る
String msg = "";
if (command.equals("コマンド")) {
msg = "コマンドを打ったよ!";
event.reply(msg).setEphemeral(false).queue();
return;
}
event.reply("不明なコマンドです。").setEphemeral(false).queue();
}
例2:ロールダイスを作る
コマンドを登録する。
jda.upsertCommand("ロール", "0~99まで出してくれるダイスです").queue();
先ほどのコマンド処理を作った下に下記の内容を追加する
if (command.equals("ロール")) {
Random rnd = new Random();
String roll = Integer.toString(rnd.nextInt(100));
event.reply(roll).setEphemeral(false).queue();
return;
}
まとめ
いかがでしたでしょうか。
他のQiitaを見ていると初学者だとここの書き方だとわからんなぁというところが多かったため、
今回画像を多めに使用して説明しました。
基本さえわかれば後はJavaと同じように実装するだけなのでいろいろできると思います!
ぜひいろいろ試してみてね!