Skip to content
This repository was archived by the owner on Nov 9, 2024. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
8973e85
[update]アカウントマネージャを抽象化し各メソッドを非同期にする
Necnion8 May 23, 2023
69ef656
[fix]AccountManager.linkedDiscordId を linkDiscordId に変更
Necnion8 May 23, 2023
2cfe7ff
[fix]リンクがDBに書き込めたらリンク完了処理を実行する
Necnion8 May 23, 2023
c80adb2
[fix]accountsセクションが config.yml に存在しない時のエラーを防ぐ
Necnion8 May 24, 2023
386f794
[update]YamlAccountManagerの初期化処理をFutureで囲う
Necnion8 May 24, 2023
13e6e2c
[fix]YamlAccountManagerが変更を保存しない
Necnion8 May 24, 2023
78ddea3
[update]AccountManagerの接続/切断メソッドを同期処理に変更
Necnion8 May 24, 2023
48ce662
[fix]プラグインの初期化に失敗したら setEnabled(false) で無効化する
Necnion8 May 24, 2023
e273818
[fix]コマンドを登録する前にプラグインを初期化させる
Necnion8 May 24, 2023
08daf20
[fix]設定再読み込みコマンドでinitをtryで囲う
Necnion8 May 24, 2023
6802531
[fix]設定再読み込みコマンドでinitをtryで囲う
Necnion8 May 24, 2023
ff0688c
[add]SQLiteデータベースの対応
Necnion8 May 24, 2023
4d6f14a
[add]MySQLデータベースの対応
Necnion8 May 24, 2023
6080d01
[update]データベースタイプの判定を作成メソッドに移す
Necnion8 May 24, 2023
c288478
Merge remote-tracking branch 'Necnion8/devold/add-accounts-db' into d…
Necnion8 May 24, 2023
ab23983
[fix]コマンドを登録した後にプラグインを初期化させる
Necnion8 May 24, 2023
63ec13a
[fix]Avatar API を Mineskin に変更
Necnion8 Aug 17, 2024
4574753
[add]参加するためにアカウントリンクを必須にする設定/実装の追加
Necnion8 Aug 17, 2024
12aef92
[update]jarファイル名を DiscordConnect-old-spigot に変更
Necnion8 Nov 9, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ dependencies {
implementation("net.dv8tion:JDA:5.0.0-alpha.3") {
exclude module: 'opus-java'
}
implementation('com.zaxxer:HikariCP:5.0.1')
implementation 'club.minnced:discord-webhooks:0.7.4'
implementation 'com.fasterxml.jackson.core:jackson-core:2.13.1'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.1'
Expand All @@ -50,7 +51,7 @@ shadowJar {
group = 'work.novablog.mcplugin'
version = '3.1'
description = 'DiscordConnect'
archivesBaseName = 'DiscordConnect-spigot'
archivesBaseName = 'DiscordConnect-old-spigot'
java.sourceCompatibility = JavaVersion.VERSION_1_8

tasks.withType(JavaCompile) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,20 @@
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import work.novablog.mcplugin.discordconnect.account.AccountManager;
import work.novablog.mcplugin.discordconnect.account.db.DatabaseConfig;
import work.novablog.mcplugin.discordconnect.command.BukkitCommand;
import work.novablog.mcplugin.discordconnect.command.DiscordCommandExecutor;
import work.novablog.mcplugin.discordconnect.command.DiscordStandardCommand;
import work.novablog.mcplugin.discordconnect.listener.BukkitListener;
import work.novablog.mcplugin.discordconnect.listener.LunaChatListener;
import work.novablog.mcplugin.discordconnect.util.AccountManager;
import work.novablog.mcplugin.discordconnect.util.ConfigManager;
import work.novablog.mcplugin.discordconnect.util.GithubAPI;
import work.novablog.mcplugin.discordconnect.util.discord.BotManager;
import work.novablog.mcplugin.discordconnect.util.discord.DiscordWebhookSender;

import javax.annotation.Nullable;
import javax.security.auth.login.LoginException;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Optional;
Expand All @@ -38,7 +38,7 @@ public final class DiscordConnect extends JavaPlugin {
private UUIDCacheData uuidCacheData;
private LunaChatListener lunaChatListener;

private final AccountManager accountManager = new AccountManager(new File(getDataFolder(), "accounts.yml"));
private @Nullable AccountManager accountManager;

/**
* インスタンスを返します
Expand All @@ -56,7 +56,7 @@ public static DiscordConnect getInstance() {
return botManager;
}

public AccountManager getAccountManager() {
public @Nullable AccountManager getAccountManager() {
return accountManager;
}

Expand Down Expand Up @@ -105,7 +105,12 @@ public void onEnable() {
discordCommandExecutor = new DiscordCommandExecutor();
discordCommandExecutor.registerCommand(new DiscordStandardCommand());

init();
try {
init();
} catch (Throwable e) {
e.printStackTrace();
setEnabled(false);
}
}

/**
Expand All @@ -115,20 +120,17 @@ public void onEnable() {
* 複数回呼び出した場合、新しいconfigデータが読み出されます
* </p>
*/
public void init() {
public void init() throws IOException {
if(botManager != null) botManager.botShutdown(true);
if(discordWebhookSenders != null) discordWebhookSenders.forEach(DiscordWebhookSender::shutdown);
if(bukkitListener != null) HandlerList.unregisterAll(bukkitListener);
if(lunaChatListener != null) HandlerList.unregisterAll(lunaChatListener);

ConfigManager configManager;
try {
configManager = new ConfigManager(this);
} catch (IOException e) {
e.printStackTrace();
return;
}
accountManager.loadFile();
ConfigManager configManager = new ConfigManager(this);

DatabaseConfig dbConfig = configManager.getAccountsDatabaseConfig();
accountManager = AccountManager.createManager(dbConfig, this);
accountManager.connect();

discordCommandExecutor.setAdminRole(configManager.adminRole);

Expand Down Expand Up @@ -160,7 +162,7 @@ public void init() {
}

//BungeecordイベントのListenerを登録
bukkitListener = new BukkitListener(configManager.fromMinecraftToDiscordName);
bukkitListener = new BukkitListener(configManager);
getServer().getPluginManager().registerEvents(bukkitListener, this);
if(lunaChatAPI != null) {
lunaChatListener = new LunaChatListener(
Expand Down Expand Up @@ -203,5 +205,13 @@ public void init() {
public void onDisable() {
if(botManager != null) botManager.botShutdown(false);
if(discordWebhookSenders != null) discordWebhookSenders.forEach(DiscordWebhookSender::shutdown);

if (accountManager != null) {
try {
accountManager.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package work.novablog.mcplugin.discordconnect.account;

import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import work.novablog.mcplugin.discordconnect.account.db.DatabaseConfig;
import work.novablog.mcplugin.discordconnect.account.db.MySQLAccountManager;
import work.novablog.mcplugin.discordconnect.account.db.SQLiteAccountManager;
import work.novablog.mcplugin.discordconnect.account.db.YamlAccountManager;

import java.io.IOException;
import java.util.Locale;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ThreadLocalRandom;

public abstract class AccountManager {
private final Map<String, UUID> linkingCodes = new ConcurrentHashMap<>();
private final Map<UUID, String> names = new ConcurrentHashMap<>();


public abstract void connect() throws IOException;

public abstract void close() throws IOException;


public final String generateCode(UUID playerUuid, String playerName) {
names.put(playerUuid, playerName);
String codeString;
do {
int code = ThreadLocalRandom.current().nextInt(10000);
codeString = String.format("%04d", code);

} while (linkingCodes.putIfAbsent(codeString, playerUuid) != null);
return codeString;
}

public @Nullable String getLinkingPlayerName(UUID playerId) {
return names.get(playerId);
}

public final @Nullable UUID removeMinecraftIdByLinkCode(@NotNull String code) {
return linkingCodes.remove(code);
}

public final Map<String, UUID> linkingCodes() {
return linkingCodes;
}


public abstract CompletableFuture<@NotNull Boolean> isLinkedDiscord(@NotNull UUID minecraftId);

public abstract CompletableFuture<@Nullable Long> getLinkedDiscordId(@NotNull UUID minecraftId);

public abstract CompletableFuture<Void> linkDiscordId(@NotNull UUID minecraftId, long discordId);

public abstract CompletableFuture<@NotNull Boolean> isLinkedMinecraft(long discordId);

public abstract CompletableFuture<@Nullable UUID> getLinkedMinecraftId(long discordId);

public abstract CompletableFuture<Void> unlinkByMinecraftId(@NotNull UUID minecraftId);

public abstract CompletableFuture<Void> unlinkByDiscordId(long discordId);


public abstract CompletableFuture<LinkedAccount[]> getLinkedAccountAll();

public abstract CompletableFuture<Integer> getLinkedAccountCount();


public static DatabaseConfig createDatabaseConfig(String dbType, ConfigurationSection config) {
switch (dbType.toLowerCase(Locale.ROOT)) {
case "yaml":
return new YamlAccountManager.DatabaseConfig(config);
case "sqlite":
return new SQLiteAccountManager.DatabaseConfig(config);
case "mysql":
return new MySQLAccountManager.DatabaseConfig(config);
}
throw new IllegalArgumentException("Unknown database type: " + dbType);
}

public static AccountManager createManager(DatabaseConfig config, Plugin plugin) {
if (config instanceof YamlAccountManager.DatabaseConfig) {
return new YamlAccountManager(plugin.getDataFolder(), ((YamlAccountManager.DatabaseConfig) config));
} else if (config instanceof SQLiteAccountManager.DatabaseConfig) {
return new SQLiteAccountManager(plugin.getDataFolder(), ((SQLiteAccountManager.DatabaseConfig) config));
} else if (config instanceof MySQLAccountManager.DatabaseConfig) {
return new MySQLAccountManager(((MySQLAccountManager.DatabaseConfig) config));
}
throw new IllegalArgumentException("Unknown database config: " + config.getClass().getSimpleName());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package work.novablog.mcplugin.discordconnect.account;

import org.jetbrains.annotations.NotNull;

import java.util.UUID;

public class LinkedAccount {

private final @NotNull UUID minecraftId;
private final long discordId;

public LinkedAccount(@NotNull UUID minecraftId, long discordId) {
this.minecraftId = minecraftId;
this.discordId = discordId;
}

public @NotNull UUID getMinecraftId() {
return minecraftId;
}

public long getDiscordId() {
return discordId;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package work.novablog.mcplugin.discordconnect.account.db;

import org.bukkit.configuration.ConfigurationSection;

public abstract class DatabaseConfig {

protected final ConfigurationSection config;

public DatabaseConfig(ConfigurationSection config) {
this.config = config;
}

public abstract String getType();

public ConfigurationSection getConfig() {
return config;
}

}
Loading