見出し画像

Discord4Jを使ってJavaでDiscordbot作成してみた話

1.初めに

ゲームや雑談などに使われるコミュニケーションアプリにDiscordがあります。これはlineなどのアプリに比べてアカウントが作りやすいことなどから世界的にかなり人気のものとなっています。
そんなDiscordを便利にするものがBotです。
Botは様々なプログラミング言語で組まれた自動化されたアカウントです。
今回はそんなBotをJavaで作ってみました。

2.なんでJava?

なんで今回Botを作る言語にJavaを選んだのか気になっている人もいるかもしれません。ある程度ググってみるとPythonやJavaScriptで作っている人が大半だと思います。その中で筆者がJavaを選んだ理由は単純で
"JavaのDiscordBot、特に今回使うDiscord4Jに関する記事がほぼない"
からです。
※逆張りとか言わないでね

3.どんなBotを作ったのか

なかの人は最近スプラトゥーンとかいうゲームにはまっているのでそれに関連するBotを作りました。具体的には「/stage」と送ると現在のステージ情報を返してくれるというものです。スプラトゥーンがわからない方用にわかりやすく言うと指定のサイトをスクレイピングしてその結果を送るものです。

画像1

4.環境

Windows10
IntelliJ

5.まずBot用のアカウントを作成

こちら の手順がわかりやすいので参考にして登録しちゃいましょう

6.コードを書いていく

今回はMavenプロジェクトで進めていきます。
まずはpom.xml に依存関係を書いていきます。
Discord4J(DiscordBotを扱ううえで必要なライブラリ)とJsoup(スクレイピング用)をしっかり記入

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>org.example</groupId>
 <artifactId>discotest</artifactId>
 <version>1.0-SNAPSHOT</version>
 <properties>
   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   <java.version>15.0.2</java.version>
 </properties>

 <build>
   <plugins>
     <plugin>
       <artifactId>maven-assembly-plugin</artifactId>
       <executions>
         <execution>
           <phase>package</phase>
           <goals>
             <goal>single</goal>
           </goals>
         </execution>
       </executions>
       <configuration>
         <archive>
           <manifest>
             <mainClass>org.example.App</mainClass>
           </manifest>
         </archive>
         <descriptorRefs>
           <descriptorRef>jar-with-dependencies</descriptorRef>
         </descriptorRefs>
       </configuration>
     </plugin>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-compiler-plugin</artifactId>
       <configuration>
         <source>8</source>
         <target>8</target>
       </configuration>
     </plugin>
   </plugins>
 </build>

 <dependencies>
   <dependency>
     <groupId>com.discord4j</groupId>
     <artifactId>discord4j-core</artifactId>
     <version>3.1.3</version>
   </dependency>
   <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>4.11</version>
     <scope>test</scope>
   </dependency>
   <dependency>
     <!-- jsoup HTML parser library @ https://jsoup.org/ -->
     <groupId>org.jsoup</groupId>
     <artifactId>jsoup</artifactId>
     <version>1.13.1</version>
   </dependency>
 </dependencies>
</project>

赤くなって読み込めていない部分がある場合はプロジェクトの再ロードをしてみましょう。

画像2

App.javaは以下のようにしました。
final DiscordClient client = DiscordClient.create("TOKEN");
の部分には自分のBotのTOKENを入れてください

package org.example;

import discord4j.core.DiscordClient;
import discord4j.core.GatewayDiscordClient;
import discord4j.core.event.domain.message.MessageCreateEvent;
import discord4j.core.object.entity.Message;
import java.io.IOException;

import discord4j.core.object.entity.channel.MessageChannel;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public final class App {
   public static void main(final String[] args) {
       final DiscordClient client = DiscordClient.create("TOKEN");
       final GatewayDiscordClient gateway = client.login().block();
       gateway.on(MessageCreateEvent.class).subscribe(event -> {
           Message message = event.getMessage();
           if ("/stage".equals(message.getContent())) {
               final MessageChannel channel = message.getChannel().block();
               try {

                   Document doc = Jsoup.connect("https://splatoon.caxdb.com/schedule2.cgi").get();
                   Elements elements = doc.select("li");
                   int i = 0;
                   for (Element element : elements) {
                       if (i < 10) {
                           System.out.println(element.text());
                           channel.createMessage(element.text()).block();

                           i += 1;

                       }

                   }

               } catch (IOException e) {
                   e.printStackTrace();
               }
               

実行してみましょう

画像3

動きました。ちなみにコマンドを送ってあげると送ったものが表示されるようになっています。

画像4

このプロジェクトをJarファイルにしてHerokuで動かすと24時間常駐のBotの完成です。

ここまでお読みいただきありがとうございました!


この記事が気に入ったらサポートをしてみませんか?