Skip to content

Commit b8a4f12

Browse files
committed
Initial commit
1 parent a52f5d4 commit b8a4f12

File tree

11 files changed

+267
-0
lines changed

11 files changed

+267
-0
lines changed

pom.xml

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0"
2+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
5+
<modelVersion>4.0.0</modelVersion>
6+
<groupId>me.example</groupId>
7+
<artifactId>DiscordLinkPlugin</artifactId>
8+
<version>1.0-SNAPSHOT</version>
9+
<packaging>jar</packaging>
10+
11+
<name>DiscordLinkPlugin</name>
12+
<description>A Minecraft plugin for linking Discord</description>
13+
14+
<!-- Java 8 or higher -->
15+
<properties>
16+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
17+
<maven.compiler.source>21</maven.compiler.source>
18+
<maven.compiler.target>21</maven.compiler.target>
19+
</properties>
20+
21+
<!-- PaperMC API -->
22+
<repositories>
23+
<repository>
24+
<id>papermc</id>
25+
<url>https://repo.papermc.io/repository/maven-public/</url>
26+
</repository>
27+
28+
<!-- ▼▼▼ JDAのためにこれを追記する ▼▼▼ -->
29+
<repository>
30+
<id>central</id>
31+
<name>Maven Central</name>
32+
<url>https://repo.maven.apache.org/maven2/</url>
33+
</repository>
34+
35+
</repositories>
36+
37+
<dependencies>
38+
<dependency>
39+
<groupId>io.papermc.paper</groupId>
40+
<artifactId>paper-api</artifactId>
41+
<version>1.21.1-R0.1-SNAPSHOT</version>
42+
<scope>provided</scope>
43+
</dependency>
44+
45+
<dependency>
46+
<groupId>net.dv8tion</groupId>
47+
<artifactId>JDA</artifactId>
48+
<version>5.0.0-beta.24</version> <!-- 2025年8月時点での最新版の一つです -->
49+
</dependency>
50+
</dependencies>
51+
52+
<build>
53+
<plugins>
54+
<plugin>
55+
<groupId>org.apache.maven.plugins</groupId>
56+
<artifactId>maven-compiler-plugin</artifactId>
57+
<version>3.8.1</version>
58+
<configuration>
59+
<source>21</source>
60+
<target>21</target>
61+
</configuration>
62+
</plugin>
63+
<plugin>
64+
<groupId>org.apache.maven.plugins</groupId>
65+
<artifactId>maven-jar-plugin</artifactId>
66+
<version>3.2.0</version>
67+
<configuration>
68+
<archive>
69+
<manifest>
70+
<addClasspath>true</addClasspath>
71+
</manifest>
72+
</archive>
73+
</configuration>
74+
</plugin>
75+
</plugins>
76+
</build>
77+
78+
79+
</project>
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package me.example;
2+
3+
import net.dv8tion.jda.api.JDA;
4+
import net.dv8tion.jda.api.JDABuilder;
5+
import net.dv8tion.jda.api.requests.GatewayIntent;
6+
import org.bukkit.command.Command;
7+
import org.bukkit.command.CommandSender;
8+
import org.bukkit.entity.Player;
9+
import org.bukkit.plugin.java.JavaPlugin;
10+
11+
import java.util.HashMap;
12+
import java.util.Map;
13+
import java.util.UUID;
14+
15+
public class DiscordLinkPlugin extends JavaPlugin {
16+
// 認証コードとプレイヤーUUIDを一時的に保存するMap
17+
private final Map<String, UUID> codeMap = new HashMap<>();
18+
// 連携済みのプレイヤーUUIDとDiscordユーザーIDを保存するMap
19+
private final Map<UUID, String> linkedPlayers = new HashMap<>();
20+
21+
private JDA jda; // JDAのインスタンスを保持する変数
22+
23+
@Override
24+
public void onEnable() {
25+
getLogger().info("DiscordLinkPluginが有効になりました。");
26+
27+
// デフォルトのconfig.ymlが存在しない場合、jar内のファイルをコピーして生成する
28+
saveDefaultConfig();
29+
30+
// config.ymlからトークンを読み込む
31+
String botToken = getConfig().getString("bot-token");
32+
33+
// トークンが設定されているかチェック
34+
if (botToken == null || botToken.equals("YourTokenHere") || botToken.isEmpty()) {
35+
getLogger().severe("==================================================");
36+
getLogger().severe("Discord Botのトークンがconfig.ymlに設定されていません!");
37+
getLogger().severe("plugins/DiscordLinkPlugin/config.yml を編集してください。");
38+
getLogger().severe("プラグインを無効化します。");
39+
getLogger().severe("==================================================");
40+
getServer().getPluginManager().disablePlugin(this);
41+
return; // onEnableの処理をここで中断
42+
}
43+
44+
try {
45+
// JDAインスタンスを構築し、Botをログインさせる
46+
jda = JDABuilder.createDefault(botToken)
47+
// DM受信とメッセージ内容取得のためにインテントを有効化
48+
.enableIntents(GatewayIntent.MESSAGE_CONTENT, GatewayIntent.DIRECT_MESSAGES)
49+
.build();
50+
51+
// 作成したDiscordListenerをJDAにイベントリスナーとして登録
52+
jda.addEventListener(new DiscordListener(this));
53+
54+
// JDAが完全に準備できるまで待つ
55+
jda.awaitReady();
56+
getLogger().info("Discord Botが正常にログインしました。");
57+
58+
} catch (Exception e) { // ▼▼▼ ここを修正しました ▼▼▼
59+
getLogger().severe("Discord Botのログイン中に何らかのエラーが発生しました。");
60+
getLogger().severe("トークンが正しいか、ネットワーク接続に問題がないか確認してください。");
61+
e.printStackTrace(); // 詳細なエラーをコンソールに出力
62+
getServer().getPluginManager().disablePlugin(this);
63+
}
64+
}
65+
66+
@Override
67+
public void onDisable() {
68+
// プラグインが無効になったときの処理
69+
if (jda != null) {
70+
jda.shutdownNow(); // Botの接続を即座に切断
71+
getLogger().info("Discord Botがシャットダウンしました。");
72+
}
73+
getLogger().info("DiscordLinkPluginが無効になりました。");
74+
}
75+
76+
@Override
77+
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
78+
// コマンド実行者がプレイヤーであり、かつコマンド名が "discord-link" であることを確認
79+
if (sender instanceof Player player && command.getName().equalsIgnoreCase("discord-link")) {
80+
81+
// すでに連携済みかチェック
82+
if (linkedPlayers.containsKey(player.getUniqueId())) {
83+
player.sendMessage("§c[DiscordLink] あなたのアカウントは既にDiscordと連携済みです。");
84+
return true;
85+
}
86+
87+
// ランダムな8桁の認証コードを生成
88+
String code = UUID.randomUUID().toString().substring(0, 8);
89+
codeMap.put(code, player.getUniqueId());
90+
91+
// プレイヤーにメッセージを送信
92+
player.sendMessage("§a[DiscordLink] このコードをDiscordボットにDMで送信してください:");
93+
player.sendMessage("§e" + code);
94+
getLogger().info("認証コード発行: " + code + " -> " + player.getName() + " (UUID: " + player.getUniqueId() + ")");
95+
return true;
96+
}
97+
return false;
98+
}
99+
100+
// 他のクラスからMapにアクセスするための「getter」メソッド
101+
public Map<String, UUID> getCodeMap() {
102+
return codeMap;
103+
}
104+
105+
public Map<UUID, String> getLinkedPlayers() {
106+
return linkedPlayers;
107+
}
108+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package me.example;
2+
3+
import net.dv8tion.jda.api.entities.User;
4+
import net.dv8tion.jda.api.entities.channel.ChannelType;
5+
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
6+
import net.dv8tion.jda.api.hooks.ListenerAdapter;
7+
import org.bukkit.entity.Player;
8+
import org.jetbrains.annotations.NotNull;
9+
10+
import java.util.UUID;
11+
12+
public class DiscordListener extends ListenerAdapter {
13+
14+
private final DiscordLinkPlugin plugin;
15+
16+
// コンストラクタでメインクラスのインスタンスを受け取る
17+
public DiscordListener(DiscordLinkPlugin plugin) {
18+
this.plugin = plugin;
19+
}
20+
21+
@Override
22+
public void onMessageReceived(@NotNull MessageReceivedEvent event) {
23+
// メッセージがDMから送られてきたものであり、かつ、送信者がBotでないことを確認
24+
if (event.isFromType(ChannelType.PRIVATE) && !event.getAuthor().isBot()) {
25+
String code = event.getMessage().getContentRaw(); // 送信されたメッセージ(認証コード)を取得
26+
User discordUser = event.getAuthor(); // メッセージの送信者情報を取得
27+
28+
// 認証コードが有効かどうかチェック
29+
if (plugin.getCodeMap().containsKey(code)) {
30+
// 認証成功の処理
31+
UUID playerUuid = plugin.getCodeMap().get(code); // コードに対応するプレイヤーのUUIDを取得
32+
33+
// 連携情報を保存
34+
plugin.getLinkedPlayers().put(playerUuid, discordUser.getId());
35+
36+
// 使用済みの認証コードを削除
37+
plugin.getCodeMap().remove(code);
38+
39+
// DiscordのDMに成功メッセージを送信
40+
discordUser.openPrivateChannel().queue(privateChannel -> {
41+
privateChannel.sendMessage("✅ Minecraftアカウントとの連携が完了しました!").queue();
42+
});
43+
44+
// Minecraftのプレイヤーがオンラインなら、ゲーム内にもメッセージを送信
45+
Player player = plugin.getServer().getPlayer(playerUuid);
46+
if (player != null && player.isOnline()) {
47+
player.sendMessage("§a[DiscordLink] §e" + discordUser.getName() + "§a とのアカウント連携が完了しました!");
48+
}
49+
50+
plugin.getLogger().info(discordUser.getName() + " と " + playerUuid + " のアカウント連携が完了しました。");
51+
52+
} else {
53+
// 認証失敗の処理
54+
// 連携済みかどうかの確認などはここに追加できるが、今回はシンプルに失敗メッセージのみ
55+
discordUser.openPrivateChannel().queue(privateChannel -> {
56+
privateChannel.sendMessage("❌ 認証コードが正しくありません。Minecraftサーバー内で `/discord-link` コマンドを再度実行して、新しいコードを取得してください。").queue();
57+
});
58+
}
59+
}
60+
}
61+
}

src/main/resources/plugin.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
name: DiscordLinkPlugin
2+
version: 1.0
3+
main: me.example.DiscordLinkPlugin
4+
api-version: 1.21
5+
commands:
6+
discord-link:
7+
description: Discordとのリンクコードを発行します
7.58 KB
Binary file not shown.
5.45 KB
Binary file not shown.
4.68 KB
Binary file not shown.

target/classes/plugin.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
name: DiscordLinkPlugin
2+
version: 1.0
3+
main: me.example.DiscordLinkPlugin
4+
api-version: 1.21
5+
commands:
6+
discord-link:
7+
description: Discordとのリンクコードを発行します
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
artifactId=DiscordLinkPlugin
2+
groupId=me.example
3+
version=1.0-SNAPSHOT

target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst

Whitespace-only changes.

0 commit comments

Comments
 (0)