9
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Java】DiscordBotの作り方 2023年版

Last updated at Posted at 2023-10-26

はじめに

初投稿かつQiita初心者です。
DiscordのBotを作る際にすごーーく戸惑ったので、初心者目線でリファレンスを置いておきます。
なお、私自身はJavaのすこーし書けるぐらいです。

使用するもの

  • Eclipse(Pleiades)
  • Discord
  • JDA

※ダウンロード方法などは下に書いておきます!

ライブラリ

※あんまり気しなくてよいです。このバージョン使ってるよーっていう記述だけ。

Discord サーバーの用意

DiscordのBotをテストする自分だけのサーバーを作りましょう。
※他の人がいるサーバーでテストすると通知音がうるさく迷惑がかかるので。

サーバーの+マークをクリック
キャプチャ2.PNG

オリジナルの作成(何でもよいです。)
キャプチャ3.PNG

自分と友達のためを押下(どっちでもよいです。)
キャプチャ4.PNG

好きな名前のサーバーに設定して新規作成
image.png

Discord Botの用意

まずはDiscordのBotを作成しましょう。
下記のサイトに行っていただき、ログインを行ってください。
https://discord.com/developers/applications

New Applicationをクリック
キャプチャ.PNG

Botの名前とチェックを入れてCreateを押下
※名前は後で変えられます。
※日本語でもOK
キャプチャ.PNG

左のメニューからBotを選択し、MESSAGE CONTENT INTENTにチェックを入れる
キャプチャ32.PNG

左のメニューからOAuth2→URLGeneratorを押下
キャプチャ1.PNG

SCOPESには「applications.commands」と「bot」をチェック
BOT PERMISSIONSには「Administrator」にチェックを入れる
image.png

一番下に出てくるGENERATED URLをコピー
キャプチャ5.PNG

コピーしたURLをブラウザの上部に張り付けてエンター
(新しいタブでやったほうがいいかも!)
キャプチャ6.PNG

ブラウザ上でサーバーを自分が追加したサーバーを選んで「はい」を押下
(ここで出てこない場合はサーバーを作っていない方か、サーバーの権限が足りない可能性があります。)
image.png

認証を押下
image.png

そうすると、サーバーにBotが入ってきたと思います。
キャプチャ8.PNG

環境開発の用意

ぶっちゃけJavaが動けばいいので自身が好きなエディタでよいです。
(VSCode、IntelliJ IDEAなど...)

今回はEcripseで紹介します。
下記のサイトからEcripseをダウンロードしてください。
https://mergedoc.osdn.jp/

Ecripse2023を押下
キャプチャ9.PNG

Java版をダウンロード
キャプチャ10.PNG

ダウンロードしたファイルを解凍
※7zipとかで解凍してもよいのですが、7Zipなど解凍ツール持っていない方はPleiadesのツールで解凍しましょう。
フォルダの格納先はCドライブ配下の「pleiades」配下に入れてください。
参照:c:\pleiades
image.png

解凍が終わると下記のような形になっています。
image.png

eclipse→eclipse.exeを起動しましょう。
キャプチャ11.PNG

起動するたび毎回このフォルダに来るのが面倒なので
ディスクトップにeclipse.exeのショートカットを作成しましょう。
キャプチャ12.PNG

そのまま起動を押下
image.png

eclipseが立ち上がればOKです。
image.png

プロジェクトの作成

左上の新規を押下
キャプチャ13.PNG

ウィザードが出てくるので
ウィザードに「Maven」と記述し、Mavenプロジェクトを選択、次へをクリック
キャプチャ14.PNG

そのまま次へ
キャプチャ15.PNG

フィルターに「maven-archetype-quickstart」と入力し、
グループIDが「org.apache.maven.archetypes」を選択して次へ
キャプチャ16.PNG

グループIdとアーティファクトIdには適当な名前を付けておけばOK
考えるのが面倒な人は
グループID:com.discord
アーティファクトId:samplebot
こんな感じでつけておいてください。
入力したら完了を押下
キャプチャ17.PNG

コンソールにこのパッケージでよいですかー?みたいな感じで出てくるので、

キャプチャ18.PNG

コンソールに「Y」を入力してエンター
キャプチャ19.PNG

コンソールにBUILD SUCCESSと出てきて、
新たなフォルダができているはずです。
キャプチャ20.PNG

作成したフォルダ内のpom.xmlを開く
dependenciesっていうタグがあるので、その中にいろいろ入れる
※コードが出てこない場合は下の方にあるpom.xmlのタブを開いてください。(画像参照)
キャプチャ21.PNG

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

projectを右クリックしてプロパティーを押下
キャプチャ22.PNG

プロジェクト・ファセットを選択し、
ファセット・フォームへ変換を押下
キャプチャ23.PNG

この画面になったら適応して閉じるを押下
キャプチャ24.PNG

プログラムの初期設定

パッケージを右クリックして新規→クラスを選択
キャプチャ25.PNG

名前は何でもよし!
入力したら完了を押下
※先頭文字は必ず大文字にしてください。
キャプチャ26.PNG

作成したファイルの中に初期設定をしていきます。

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を選択
キャプチャ27.PNG

Reset Tokenを押下
キャプチャ28.PNG

Yes, do it!を押下
キャプチャ29.PNG

出てきたトークンをコピー
※このトークンは絶対に人に教えないでください!!!
キャプチャ30.PNG

Botのトークンに張り付け
キャプチャ31.PNG

botを動かしてみる

作成したクラスを右クリック→実行→Javaアプリケーションを押下
キャプチャ34.PNG

コンソールに下記のような感じで出ていればOK
image.png

失敗する場合はエラー情報をネットで調べるか読み込んでいるJDAとかが古くないか確認してみてください。

Botがオンラインになっていると思います。
image.png

いざBotの実装へ!

そしたら、コーディングしていきましょう。
※コーディングを反映させたい場合はJavaアプリをいったん落としてから起動しなおしましょう。

ステータスの変更

    .setActivity(Activity.playing("ステータス"))

Activityには種類があり、様々な文字列に変更することができます。
キャプチャ33.PNG

  • 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();
	}

例1:動かすとこんな感じ
Animation2.gif

例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();
        }
	}

例2:動かすとこんな感じ
Animation2.gif

スラッシュコマンドの対応

	@Override
	public void onSlashCommandInteraction(SlashCommandInteractionEvent event) {

	}

このメソッドはDiscordのコマンドによって動きます。

コマンドの登録
mainメソッド内にコマンドを登録しましょう。

    jda.upsertCommand("コマンド","コマンド説明").queue();

キャプチャ36.PNG
左側がスラッシュの後に来るコマンドで、右側がコマンドの説明部分になります。
実際の画面
キャプチャ35.PNG

コマンドの実行処理
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();
	}

例1:動かすとこんな感じ
Animation2.gif

例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;
	}

image.png

例2:動かすとこんな感じ
Animation2.gif

まとめ

いかがでしたでしょうか。
他のQiitaを見ていると初学者だとここの書き方だとわからんなぁというところが多かったため、
今回画像を多めに使用して説明しました。
基本さえわかれば後はJavaと同じように実装するだけなのでいろいろできると思います!
ぜひいろいろ試してみてね!

9
7
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?