From bbb48865bf32d455c53837e3e896653994eed2b1 Mon Sep 17 00:00:00 2001 From: sysnote8main Date: Thu, 30 Apr 2026 08:59:00 +0900 Subject: [PATCH 1/5] feat: add jda as dependency --- build.gradle.kts | 5 +++++ gradle/libs.versions.toml | 2 ++ 2 files changed, 7 insertions(+) diff --git a/build.gradle.kts b/build.gradle.kts index dc465d76..4f0effd9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -34,6 +34,10 @@ repositories { dependencies { implementation(libs.discord4j) + implementation(libs.jda) { + exclude(module = "opus-java") + exclude(module = "tink") + } implementation(libs.jedis) implementation(libs.aikar.taskchain) implementation(libs.semver4j) @@ -83,6 +87,7 @@ tasks.build { } tasks.shadowJar { + minimize() isEnableRelocation = true relocate("io.netty.buffer", "io.netty.buffer") relocate("io.netty.util", "io.netty.util") diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 21ecf4e2..b0190a39 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -17,6 +17,7 @@ luckperms-api = "5.5" jetbrains-annotation = "26.1.0" junit = "5.14.4" junit-platform = "1.14.4" +jda = "6.4.1" [plugins] shadow = { id = "com.gradleup.shadow", version.ref = "shadow" } @@ -39,3 +40,4 @@ jetbrains-annotation = { module = "org.jetbrains:annotations", version.ref = "je junit-bom = { module = "org.junit:junit-bom", version.ref = "junit" } junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit" } junit-platform-launcher = { module = "org.junit.platform:junit-platform-launcher", version.ref = "junit-platform" } +jda = { module = "net.dv8tion:JDA", version.ref = "jda" } From e9624da25a37e7e9c13186a41dea0afec87bb5d8 Mon Sep 17 00:00:00 2001 From: sysnote8main Date: Thu, 30 Apr 2026 09:01:14 +0900 Subject: [PATCH 2/5] feat: migrating to JDA and mark deprecated --- .../ryuzupluginchat/RyuZUPluginChat.java | 18 +- .../ryuzupluginchat/config/JDARPCConfig.java | 179 ++++++++++++++++++ .../ryuzupluginchat/config/RPCConfig.java | 1 + .../discord/DiscordHandler.java | 1 + .../discord/DiscordMessageConnection.java | 1 + .../discord/JDADiscordHandler.java | 145 ++++++++++++++ .../discord/JDADiscordMessageConnection.java | 20 ++ .../deliverer/DiscordMessageDeliverer.java | 1 + .../deliverer/JDADiscordMessageDeliverer.java | 73 +++++++ .../JDAServerChatMessageDeliverer.java | 72 +++++++ .../deliverer/ServerChatMessageDeliverer.java | 1 + 11 files changed, 503 insertions(+), 9 deletions(-) create mode 100644 src/main/java/net/azisaba/ryuzupluginchat/config/JDARPCConfig.java create mode 100644 src/main/java/net/azisaba/ryuzupluginchat/discord/JDADiscordHandler.java create mode 100644 src/main/java/net/azisaba/ryuzupluginchat/discord/JDADiscordMessageConnection.java create mode 100644 src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/JDADiscordMessageDeliverer.java create mode 100644 src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/JDAServerChatMessageDeliverer.java diff --git a/src/main/java/net/azisaba/ryuzupluginchat/RyuZUPluginChat.java b/src/main/java/net/azisaba/ryuzupluginchat/RyuZUPluginChat.java index 181c8ab4..195c0cbe 100644 --- a/src/main/java/net/azisaba/ryuzupluginchat/RyuZUPluginChat.java +++ b/src/main/java/net/azisaba/ryuzupluginchat/RyuZUPluginChat.java @@ -14,9 +14,9 @@ import net.azisaba.ryuzupluginchat.command.TellCommand; import net.azisaba.ryuzupluginchat.command.UnHideCommand; import net.azisaba.ryuzupluginchat.command.VCCommand; -import net.azisaba.ryuzupluginchat.config.RPCConfig; -import net.azisaba.ryuzupluginchat.discord.DiscordHandler; -import net.azisaba.ryuzupluginchat.discord.DiscordMessageConnection; +import net.azisaba.ryuzupluginchat.config.JDARPCConfig; +import net.azisaba.ryuzupluginchat.discord.JDADiscordHandler; +import net.azisaba.ryuzupluginchat.discord.JDADiscordMessageConnection; import net.azisaba.ryuzupluginchat.listener.ChannelMsgFromCommandListener; import net.azisaba.ryuzupluginchat.listener.ChatListener; import net.azisaba.ryuzupluginchat.listener.HideAllListener; @@ -57,7 +57,7 @@ public final class RyuZUPluginChat extends JavaPlugin { private static TaskChainFactory taskChainFactory; - private RPCConfig rpcConfig; + private JDARPCConfig rpcConfig; private MessageDataFactory messageDataFactory; private MessageProcessor messageProcessor; private RyuZUPrefixSuffixContainer prefixSuffixContainer; @@ -79,7 +79,7 @@ public final class RyuZUPluginChat extends JavaPlugin { private MessageSubscriber subscriber; private PrivateChatReachedSubscriber privateChatReachedSubscriber; - private DiscordHandler discordHandler; + private JDADiscordHandler discordHandler; private JedisPool jedisPool; @@ -89,7 +89,7 @@ public final class RyuZUPluginChat extends JavaPlugin { public void onEnable() { taskChainFactory = BukkitTaskChainFactory.create(this); - rpcConfig = new RPCConfig(this); + rpcConfig = new JDARPCConfig(this); rpcConfig.load(); try { @@ -225,15 +225,15 @@ private void setupRedisConnections() { private void setupDiscordConnection() { try { vcLunaChatChannelSharer.setLunaChatChannelName(rpcConfig.getVcCommandLunaChatChannel()); - discordHandler = new DiscordHandler(this, rpcConfig.getDiscordBotToken()); - boolean initResult = discordHandler.init(); + discordHandler = new JDADiscordHandler(this); + boolean initResult = discordHandler.init(rpcConfig.getDiscordBotToken()); if (!initResult) { getLogger().warning("Failed to login to Discord Bot. Is that the correct Token?"); return; } - for (DiscordMessageConnection connectionData : rpcConfig.getMessageConnections()) { + for (JDADiscordMessageConnection connectionData : rpcConfig.getMessageConnections()) { discordHandler.connectUsing(connectionData); } } catch (Throwable e) { diff --git a/src/main/java/net/azisaba/ryuzupluginchat/config/JDARPCConfig.java b/src/main/java/net/azisaba/ryuzupluginchat/config/JDARPCConfig.java new file mode 100644 index 00000000..318685ad --- /dev/null +++ b/src/main/java/net/azisaba/ryuzupluginchat/config/JDARPCConfig.java @@ -0,0 +1,179 @@ +package net.azisaba.ryuzupluginchat.config; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import net.azisaba.ryuzupluginchat.RyuZUPluginChat; +import net.azisaba.ryuzupluginchat.discord.DiscordMessageConnection; +import net.azisaba.ryuzupluginchat.discord.JDADiscordMessageConnection; +import net.azisaba.ryuzupluginchat.discord.data.ChannelChatSyncData; +import net.azisaba.ryuzupluginchat.discord.data.GlobalChatSyncData; +import net.azisaba.ryuzupluginchat.discord.data.PrivateChatSyncData; +import net.dv8tion.jda.api.entities.ISnowflake; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import redis.clients.jedis.HostAndPort; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +@Getter +@RequiredArgsConstructor +public class JDARPCConfig { + + private final RyuZUPluginChat plugin; + + private String serverName; + private HostAndPort hostAndPort; + private String redisUserName; + private String redisPassword; + + private String globalChatFormat; + private String privateChatFormat; + + private String groupName; + + private boolean discordBotEnabled; + private String discordBotToken; + private String vcCommandLunaChatChannel; + + private boolean defaultDisablePrivateChatInspect; + private boolean defaultDisableChannelChatInspect; + + private final List messageConnections = new ArrayList<>(); + + public void load() { + plugin.saveDefaultConfig(); + FileConfiguration conf = plugin.getConfig(); + + serverName = conf.getString("server-name"); + hostAndPort = new HostAndPort(conf.getString("redis.hostname"), conf.getInt("redis.port")); + redisUserName = conf.getString("redis.user"); + redisPassword = conf.getString("redis.password"); + + if (redisUserName != null && redisUserName.equals("")) { + redisUserName = null; + } + if (redisPassword != null && redisPassword.equals("")) { + redisPassword = null; + } + + globalChatFormat = conf.getString("formats.global"); + privateChatFormat = conf.getString("formats.private"); + + groupName = conf.getString("redis.group"); + + defaultDisablePrivateChatInspect = conf.getBoolean("default-disable-private-chat-inspect", false); + defaultDisableChannelChatInspect = conf.getBoolean("default-disable-channel-chat-inspect", false); + + discordBotEnabled = conf.getBoolean("discord.enable", false); + if (!discordBotEnabled) { + return; + } + + discordBotToken = Objects.requireNonNull(conf.getString("discord.token", "Token here")); + + if (discordBotToken.equals("Token here")) { + plugin + .getLogger() + .warning("Discord Bot Token is not specified or invalid. " + "Bot has been disabled."); + discordBotEnabled = false; + } + + vcCommandLunaChatChannel = conf.getString("discord.vc-command-lunachat-channel", null); + + ConfigurationSection section = conf.getConfigurationSection("discord.connections"); + if (section == null) { + return; + } + + messageConnections.clear(); + for (String id : section.getKeys(false)) { + JDADiscordMessageConnection connection = + importConnectionDataFromConfig(conf, "discord.connections." + id, id); + + if (connection == null) { + plugin.getLogger().warning("Failed to load 'discord.connections." + id + "' section."); + continue; + } + + messageConnections.add(connection); + } + } + + public void setGlobalChatFormat(String format) { + globalChatFormat = format; + FileConfiguration conf = plugin.getConfig(); + conf.set("formats.global", format); + plugin.saveConfig(); + } + + public void setPrivateChatFormat(String format) { + privateChatFormat = format; + FileConfiguration conf = plugin.getConfig(); + conf.set("formats.private", format); + plugin.saveConfig(); + } + + public void reloadConfig() { + plugin.reloadConfig(); + load(); + } + + private JDADiscordMessageConnection importConnectionDataFromConfig( + FileConfiguration conf, String section, String id) { + boolean discordInputDefault = conf.getBoolean(section + ".discord-input", false); + boolean vcModeDefault = conf.getBoolean(section + ".vc-mode", false); + + long discordChIdLong = conf.getLong(section + ".discord-channel-id", -1L); + if (discordChIdLong < 0) { + plugin + .getLogger() + .warning("Invalid discord channel id ( " + section + ".discord-channel-id )"); + return null; + } + + GlobalChatSyncData globalData; + ChannelChatSyncData channelData; + PrivateChatSyncData privateData; + + // global + if (conf.getBoolean(section + ".global.enable", false)) { + boolean vc = conf.getBoolean(section + ".global.vc-mode", vcModeDefault); + boolean discordInput = + conf.getBoolean(section + ".global.discord-input", discordInputDefault); + globalData = new GlobalChatSyncData(true, vc, discordInput); + } else { + globalData = new GlobalChatSyncData(false, false, false); + } + + // channel + if (conf.getBoolean(section + ".channel.enable", false)) { + boolean vc = conf.getBoolean(section + ".channel.vc-mode", vcModeDefault); + boolean discordInput = + conf.getBoolean(section + ".channel.discord-input", discordInputDefault); + List matches = null; + if (conf.isSet(section + ".channel.matches")) { + if (conf.isString(section + ".channel.matches")) { + matches = Collections.singletonList(conf.getString(section + ".channel.matches")); + } else { + matches = conf.getStringList(section + ".channel.matches"); + } + } + channelData = new ChannelChatSyncData(true, vc, discordInput, matches); + } else { + channelData = new ChannelChatSyncData(false, false, false, null); + } + + // private + if (conf.getBoolean(section + ".private.enable", false)) { + boolean vc = conf.getBoolean(section + ".private.vc-mode", vcModeDefault); + privateData = new PrivateChatSyncData(true, vc); + } else { + privateData = new PrivateChatSyncData(false, false); + } + + return new JDADiscordMessageConnection(id, discordChIdLong, globalData, channelData, privateData); + } +} diff --git a/src/main/java/net/azisaba/ryuzupluginchat/config/RPCConfig.java b/src/main/java/net/azisaba/ryuzupluginchat/config/RPCConfig.java index fe6ddccb..d60fa366 100644 --- a/src/main/java/net/azisaba/ryuzupluginchat/config/RPCConfig.java +++ b/src/main/java/net/azisaba/ryuzupluginchat/config/RPCConfig.java @@ -16,6 +16,7 @@ import org.bukkit.configuration.file.FileConfiguration; import redis.clients.jedis.HostAndPort; +@Deprecated @Getter @RequiredArgsConstructor public class RPCConfig { diff --git a/src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordHandler.java b/src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordHandler.java index 423af083..494d020d 100644 --- a/src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordHandler.java +++ b/src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordHandler.java @@ -16,6 +16,7 @@ import net.azisaba.ryuzupluginchat.discord.deliverer.ServerChatMessageDeliverer; import org.bukkit.Bukkit; +@Deprecated @RequiredArgsConstructor public class DiscordHandler { diff --git a/src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordMessageConnection.java b/src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordMessageConnection.java index 3929c0e9..97c5edc2 100644 --- a/src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordMessageConnection.java +++ b/src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordMessageConnection.java @@ -7,6 +7,7 @@ import net.azisaba.ryuzupluginchat.discord.data.GlobalChatSyncData; import net.azisaba.ryuzupluginchat.discord.data.PrivateChatSyncData; +@Deprecated @Getter @RequiredArgsConstructor public class DiscordMessageConnection { diff --git a/src/main/java/net/azisaba/ryuzupluginchat/discord/JDADiscordHandler.java b/src/main/java/net/azisaba/ryuzupluginchat/discord/JDADiscordHandler.java new file mode 100644 index 00000000..bf4f68ca --- /dev/null +++ b/src/main/java/net/azisaba/ryuzupluginchat/discord/JDADiscordHandler.java @@ -0,0 +1,145 @@ +package net.azisaba.ryuzupluginchat.discord; + +import lombok.RequiredArgsConstructor; +import net.azisaba.ryuzupluginchat.RyuZUPluginChat; +import net.azisaba.ryuzupluginchat.discord.data.ChannelChatSyncData; +import net.azisaba.ryuzupluginchat.discord.data.GlobalChatSyncData; +import net.azisaba.ryuzupluginchat.discord.data.PrivateChatSyncData; +import net.azisaba.ryuzupluginchat.discord.deliverer.JDADiscordMessageDeliverer; +import net.azisaba.ryuzupluginchat.discord.deliverer.JDAServerChatMessageDeliverer; +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.JDABuilder; +import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import net.dv8tion.jda.api.requests.GatewayIntent; +import org.bukkit.Bukkit; + +import java.util.concurrent.ConcurrentHashMap; + +@RequiredArgsConstructor +public class JDADiscordHandler extends ListenerAdapter { + private JDA jda; + private final RyuZUPluginChat plugin; + private JDADiscordMessageDeliverer discordMessageDeliverer; + private JDAServerChatMessageDeliverer serverChatMessageDeliverer; + + // どのチャンネルIDがどの処理(Global, Channel, Private)に紐付いているかを管理 + private final ConcurrentHashMap channelConfigurations = new ConcurrentHashMap<>(); + + public boolean init(String token) { + try { + // JDAの構築 + jda = JDABuilder.createDefault(token) + .enableIntents(GatewayIntent.GUILD_MESSAGES, GatewayIntent.MESSAGE_CONTENT) + .addEventListeners(this) + .build(); + + // 接続完了まで待機 + jda.awaitReady(); + + this.discordMessageDeliverer = new JDADiscordMessageDeliverer(plugin); + this.serverChatMessageDeliverer = new JDAServerChatMessageDeliverer(plugin, jda); + + return true; + } catch (Exception e) { + plugin.getLogger().severe("Discordの初期化に失敗しました: " + e.getMessage()); + return false; + } + } + + // DiscordからMinecraftへの入力イベント + @Override + public void onMessageReceived(MessageReceivedEvent event) { + if (event.getAuthor().isBot()) return; + + long channelId = event.getChannel().getIdLong(); + DiscordInputType type = channelConfigurations.get(channelId); + + if (type == null) return; + + switch (type) { + case GLOBAL: + discordMessageDeliverer.sendToGlobal(event); + break; + case CHANNEL: + // syncDataが必要な場合は、別途Mapなどで管理して渡す + discordMessageDeliverer.sendToChannel(event, type.getSyncData()); + break; + } + } + + public void connectUsing(JDADiscordMessageConnection connectionData) { + long channelId = connectionData.getDiscordChannelId(); + + // Global Chat Sync + if (connectionData.getGlobalChatSyncData().isEnabled()) { + GlobalChatSyncData data = connectionData.getGlobalChatSyncData(); + if (data.isDiscordInputEnabled()) { + channelConfigurations.put(channelId, DiscordInputType.GLOBAL); + } + registerGlobalToDiscord(channelId, data.isVoiceChatMode()); + } + + // Channel Chat Sync + if (connectionData.getChannelChatSyncData().isEnabled()) { + ChannelChatSyncData data = connectionData.getChannelChatSyncData(); + if (data.isDiscordInputEnabled()) { + // 必要に応じてsyncDataを保持するロジックを追加 + channelConfigurations.put(channelId, DiscordInputType.CHANNEL); + } + registerLunaChatChannelToDiscord(data, channelId, data.isVoiceChatMode()); + } + + // Private Chat Sync + if (connectionData.getPrivateChatSyncData().isEnabled()) { + PrivateChatSyncData data = connectionData.getPrivateChatSyncData(); + registerPrivateToDiscord(channelId, data.isVoiceChatMode()); + } + } + + private void registerGlobalToDiscord(long chId, boolean vcMode) { + MessageChannel targetChannel = jda.getTextChannelById(chId); + if (targetChannel == null) return; + + plugin.getSubscriber().registerPublicConsumer((data) -> { + if (data.isFromDiscord()) return; + Bukkit.getScheduler().runTaskAsynchronously(plugin, + () -> serverChatMessageDeliverer.sendToDiscord(data, targetChannel, vcMode)); + }); + } + + private void registerLunaChatChannelToDiscord(ChannelChatSyncData syncData, long chId, boolean vcMode) { + MessageChannel targetChannel = jda.getTextChannelById(chId); + if (targetChannel == null) return; + + plugin.getSubscriber().registerChannelChatConsumer((data) -> { + if (data.isFromDiscord()) return; + if (!syncData.isMatch(data.getLunaChatChannelName())) return; + + Bukkit.getScheduler().runTaskAsynchronously(plugin, + () -> serverChatMessageDeliverer.sendToDiscord(data, targetChannel, vcMode)); + }); + } + + private void registerPrivateToDiscord(long chId, boolean vcMode) { + MessageChannel targetChannel = jda.getTextChannelById(chId); + if (targetChannel == null) return; + + plugin.getSubscriber().registerTellConsumer((data) -> + Bukkit.getScheduler().runTaskAsynchronously(plugin, + () -> serverChatMessageDeliverer.sendToDiscord(data, targetChannel, vcMode))); + } + + public void disconnect() { + if (jda != null) jda.shutdown(); + } + + // 内部判別用 + private enum DiscordInputType { + GLOBAL, CHANNEL; + private ChannelChatSyncData syncData; + public void setSyncData(ChannelChatSyncData data) { this.syncData = data; } + public ChannelChatSyncData getSyncData() { return syncData; } + } +} diff --git a/src/main/java/net/azisaba/ryuzupluginchat/discord/JDADiscordMessageConnection.java b/src/main/java/net/azisaba/ryuzupluginchat/discord/JDADiscordMessageConnection.java new file mode 100644 index 00000000..14d2fe93 --- /dev/null +++ b/src/main/java/net/azisaba/ryuzupluginchat/discord/JDADiscordMessageConnection.java @@ -0,0 +1,20 @@ +package net.azisaba.ryuzupluginchat.discord; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import net.azisaba.ryuzupluginchat.discord.data.ChannelChatSyncData; +import net.azisaba.ryuzupluginchat.discord.data.GlobalChatSyncData; +import net.azisaba.ryuzupluginchat.discord.data.PrivateChatSyncData; + +@Getter +@RequiredArgsConstructor +public class JDADiscordMessageConnection { + + private final String id; + + private final long discordChannelId; + + private final GlobalChatSyncData globalChatSyncData; + private final ChannelChatSyncData channelChatSyncData; + private final PrivateChatSyncData privateChatSyncData; +} diff --git a/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/DiscordMessageDeliverer.java b/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/DiscordMessageDeliverer.java index 68de8569..ede53096 100644 --- a/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/DiscordMessageDeliverer.java +++ b/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/DiscordMessageDeliverer.java @@ -17,6 +17,7 @@ import net.azisaba.ryuzupluginchat.message.data.GlobalMessageData; import org.bukkit.Bukkit; +@Deprecated @RequiredArgsConstructor public class DiscordMessageDeliverer { diff --git a/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/JDADiscordMessageDeliverer.java b/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/JDADiscordMessageDeliverer.java new file mode 100644 index 00000000..7f3332c5 --- /dev/null +++ b/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/JDADiscordMessageDeliverer.java @@ -0,0 +1,73 @@ +package net.azisaba.ryuzupluginchat.discord.deliverer; + +import com.github.ucchyocean.lc3.LunaChat; +import lombok.RequiredArgsConstructor; +import net.azisaba.ryuzupluginchat.RyuZUPluginChat; +import net.azisaba.ryuzupluginchat.discord.data.ChannelChatSyncData; +import net.azisaba.ryuzupluginchat.message.data.ChannelChatMessageData; +import net.azisaba.ryuzupluginchat.message.data.GlobalMessageData; +import net.dv8tion.jda.api.entities.Message; +import net.dv8tion.jda.api.entities.User; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import org.bukkit.Bukkit; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@RequiredArgsConstructor +public class JDADiscordMessageDeliverer { + private final RyuZUPluginChat plugin; + + public void sendToGlobal(MessageReceivedEvent event){ + // get data from event + Message message = event.getMessage(); + String content = message.getContentStripped(); + if(content.isEmpty()) return; + + // sanitize content + content = removeUrl(content); + + // get username + User author = message.getAuthor(); + String senderName = author.getEffectiveName(); + + // create data and publish + GlobalMessageData data = plugin.getMessageDataFactory() + .createGlobalMessageDataFromDiscord(senderName, content); + plugin.getPublisher().publishGlobalMessage(data); + } + + public void sendToChannel(MessageReceivedEvent event, ChannelChatSyncData syncData) { + Message message = event.getMessage(); + String content = message.getContentStripped(); + if(content.isEmpty()) return; + + final String sanitizedContent = removeUrl(content); + + User author = message.getAuthor(); + String senderName = author.getEffectiveName(); + + Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { + LunaChat.getAPI().getChannels().stream() + .filter(ch -> syncData.isMatch(ch.getName())) + .forEach(ch -> { + ChannelChatMessageData data = plugin.getMessageDataFactory() + .createChannelChatMessageDataFromDiscord(senderName, ch.getName(), sanitizedContent); + plugin.getPublisher().publishChannelChatMessage(data); + }); + }); + } + + private String removeUrl(String msg) { + String urlPattern = + "((https?|ftp|gopher|telnet|file):((//)|(\\\\))+[\\w:#@%/;$()~_?+\\-=\\\\.&]*)"; + Pattern p = Pattern.compile(urlPattern, Pattern.CASE_INSENSITIVE); + Matcher m = p.matcher(msg); + int i = 0; + while (m.find()) { + msg = msg.replaceAll(m.group(i), "").trim(); + i++; + } + return msg; + } +} diff --git a/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/JDAServerChatMessageDeliverer.java b/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/JDAServerChatMessageDeliverer.java new file mode 100644 index 00000000..033ddcb3 --- /dev/null +++ b/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/JDAServerChatMessageDeliverer.java @@ -0,0 +1,72 @@ +package net.azisaba.ryuzupluginchat.discord.deliverer; + +import lombok.RequiredArgsConstructor; +import net.azisaba.ryuzupluginchat.RyuZUPluginChat; +import net.azisaba.ryuzupluginchat.message.data.ChannelChatMessageData; +import net.azisaba.ryuzupluginchat.message.data.GlobalMessageData; +import net.azisaba.ryuzupluginchat.message.data.PrivateMessageData; +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; +import org.bukkit.ChatColor; + +@RequiredArgsConstructor +public class JDAServerChatMessageDeliverer { + private final RyuZUPluginChat plugin; + private final JDA client; + + public void sendToDiscord(GlobalMessageData data, MessageChannel targetChannel, boolean vcMode) { + String message = sanitize(vcMode ? data.getMessage() : data.format()); + targetChannel.sendMessage(message).queue(sentMessage -> { + if (vcMode) { + String editedMessageContent = sanitize(data.format()); + sentMessage.editMessage(editedMessageContent).queue(); + } + }, throwable -> { + plugin.getSLF4JLogger().error("Failed to send message to Discord", throwable); + }); + } + + public void sendToDiscord(ChannelChatMessageData data, MessageChannel targetChannel, boolean vcMode) { + final String message = sanitize(vcMode ? data.getMessage() : data.format()); + targetChannel.sendMessage(message).queue(sentMessage -> { + if (vcMode) { + String editedMessageContent = sanitize(data.format()); + sentMessage.editMessage(editedMessageContent).queue(); + } + }, throwable -> { + plugin.getSLF4JLogger().error("Failed to send message to Discord", throwable); + }); + } + + public void sendToDiscord(PrivateMessageData data, MessageChannel targetChannel, boolean vcMode) { + String message = sanitize(vcMode ? data.getMessage() : data.format()); + + // name null-handling + if(data.getReceivedPlayerName() == null) { + String receivePlayerName = plugin + .getPlayerUUIDMapContainer() + .getNameFromUUID(data.getReceivedPlayerUUID()); + if(receivePlayerName != null) { + message = message.replace(data.getReceivedPlayerUUID().toString(), receivePlayerName); + } + } + + // send message + final String finalMessage = message; // to prevent from lambda capture issue + targetChannel.sendMessage(finalMessage).queue(sentMessage -> { + if (vcMode) { + String editedMessageContent = sanitize(data.format()); + sentMessage.editMessage(editedMessageContent).queue(); + } + }, throwable -> { + plugin.getSLF4JLogger().error("Failed to send message to Discord", throwable); + }); + } + + private static String sanitize(String message) { + message = message.replace("@", "\\@"); + message = ChatColor.translateAlternateColorCodes('&', message); + message = ChatColor.stripColor(message); + return message; + } +} diff --git a/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/ServerChatMessageDeliverer.java b/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/ServerChatMessageDeliverer.java index 7bb3bb99..7971ed61 100644 --- a/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/ServerChatMessageDeliverer.java +++ b/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/ServerChatMessageDeliverer.java @@ -12,6 +12,7 @@ import net.azisaba.ryuzupluginchat.message.data.PrivateMessageData; import org.bukkit.ChatColor; +@Deprecated @RequiredArgsConstructor public class ServerChatMessageDeliverer { From fd9ba922113faf9318b92ec32d7940fd5acf1ef7 Mon Sep 17 00:00:00 2001 From: sysnote8main Date: Thu, 30 Apr 2026 09:02:32 +0900 Subject: [PATCH 3/5] feat: remove old classes --- .../ryuzupluginchat/config/JDARPCConfig.java | 2 - .../ryuzupluginchat/config/RPCConfig.java | 179 ------------------ .../discord/DiscordHandler.java | 176 ----------------- .../discord/DiscordMessageConnection.java | 22 --- .../deliverer/DiscordMessageDeliverer.java | 98 ---------- .../deliverer/ServerChatMessageDeliverer.java | 126 ------------ 6 files changed, 603 deletions(-) delete mode 100644 src/main/java/net/azisaba/ryuzupluginchat/config/RPCConfig.java delete mode 100644 src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordHandler.java delete mode 100644 src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordMessageConnection.java delete mode 100644 src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/DiscordMessageDeliverer.java delete mode 100644 src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/ServerChatMessageDeliverer.java diff --git a/src/main/java/net/azisaba/ryuzupluginchat/config/JDARPCConfig.java b/src/main/java/net/azisaba/ryuzupluginchat/config/JDARPCConfig.java index 318685ad..3f47e933 100644 --- a/src/main/java/net/azisaba/ryuzupluginchat/config/JDARPCConfig.java +++ b/src/main/java/net/azisaba/ryuzupluginchat/config/JDARPCConfig.java @@ -3,12 +3,10 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import net.azisaba.ryuzupluginchat.RyuZUPluginChat; -import net.azisaba.ryuzupluginchat.discord.DiscordMessageConnection; import net.azisaba.ryuzupluginchat.discord.JDADiscordMessageConnection; import net.azisaba.ryuzupluginchat.discord.data.ChannelChatSyncData; import net.azisaba.ryuzupluginchat.discord.data.GlobalChatSyncData; import net.azisaba.ryuzupluginchat.discord.data.PrivateChatSyncData; -import net.dv8tion.jda.api.entities.ISnowflake; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import redis.clients.jedis.HostAndPort; diff --git a/src/main/java/net/azisaba/ryuzupluginchat/config/RPCConfig.java b/src/main/java/net/azisaba/ryuzupluginchat/config/RPCConfig.java deleted file mode 100644 index d60fa366..00000000 --- a/src/main/java/net/azisaba/ryuzupluginchat/config/RPCConfig.java +++ /dev/null @@ -1,179 +0,0 @@ -package net.azisaba.ryuzupluginchat.config; - -import discord4j.common.util.Snowflake; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import net.azisaba.ryuzupluginchat.RyuZUPluginChat; -import net.azisaba.ryuzupluginchat.discord.DiscordMessageConnection; -import net.azisaba.ryuzupluginchat.discord.data.ChannelChatSyncData; -import net.azisaba.ryuzupluginchat.discord.data.GlobalChatSyncData; -import net.azisaba.ryuzupluginchat.discord.data.PrivateChatSyncData; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.FileConfiguration; -import redis.clients.jedis.HostAndPort; - -@Deprecated -@Getter -@RequiredArgsConstructor -public class RPCConfig { - - private final RyuZUPluginChat plugin; - - private String serverName; - private HostAndPort hostAndPort; - private String redisUserName; - private String redisPassword; - - private String globalChatFormat; - private String privateChatFormat; - - private String groupName; - - private boolean discordBotEnabled; - private String discordBotToken; - private String vcCommandLunaChatChannel; - - private boolean defaultDisablePrivateChatInspect; - private boolean defaultDisableChannelChatInspect; - - private final List messageConnections = new ArrayList<>(); - - public void load() { - plugin.saveDefaultConfig(); - FileConfiguration conf = plugin.getConfig(); - - serverName = conf.getString("server-name"); - hostAndPort = new HostAndPort(conf.getString("redis.hostname"), conf.getInt("redis.port")); - redisUserName = conf.getString("redis.user"); - redisPassword = conf.getString("redis.password"); - - if (redisUserName != null && redisUserName.equals("")) { - redisUserName = null; - } - if (redisPassword != null && redisPassword.equals("")) { - redisPassword = null; - } - - globalChatFormat = conf.getString("formats.global"); - privateChatFormat = conf.getString("formats.private"); - - groupName = conf.getString("redis.group"); - - defaultDisablePrivateChatInspect = conf.getBoolean("default-disable-private-chat-inspect", false); - defaultDisableChannelChatInspect = conf.getBoolean("default-disable-channel-chat-inspect", false); - - discordBotEnabled = conf.getBoolean("discord.enable", false); - if (!discordBotEnabled) { - return; - } - - discordBotToken = Objects.requireNonNull(conf.getString("discord.token", "Token here")); - - if (discordBotToken.equals("Token here")) { - plugin - .getLogger() - .warning("Discord Bot Token is not specified or invalid. " + "Bot has been disabled."); - discordBotEnabled = false; - } - - vcCommandLunaChatChannel = conf.getString("discord.vc-command-lunachat-channel", null); - - ConfigurationSection section = conf.getConfigurationSection("discord.connections"); - if (section == null) { - return; - } - - messageConnections.clear(); - for (String id : section.getKeys(false)) { - DiscordMessageConnection connection = - importConnectionDataFromConfig(conf, "discord.connections." + id, id); - - if (connection == null) { - plugin.getLogger().warning("Failed to load 'discord.connections." + id + "' section."); - continue; - } - - messageConnections.add(connection); - } - } - - public void setGlobalChatFormat(String format) { - globalChatFormat = format; - FileConfiguration conf = plugin.getConfig(); - conf.set("formats.global", format); - plugin.saveConfig(); - } - - public void setPrivateChatFormat(String format) { - privateChatFormat = format; - FileConfiguration conf = plugin.getConfig(); - conf.set("formats.private", format); - plugin.saveConfig(); - } - - public void reloadConfig() { - plugin.reloadConfig(); - load(); - } - - private DiscordMessageConnection importConnectionDataFromConfig( - FileConfiguration conf, String section, String id) { - boolean discordInputDefault = conf.getBoolean(section + ".discord-input", false); - boolean vcModeDefault = conf.getBoolean(section + ".vc-mode", false); - - long discordChIdLong = conf.getLong(section + ".discord-channel-id", -1L); - if (discordChIdLong < 0) { - plugin - .getLogger() - .warning("Invalid discord channel id ( " + section + ".discord-channel-id )"); - return null; - } - Snowflake discordChannelId = Snowflake.of(discordChIdLong); - - GlobalChatSyncData globalData; - ChannelChatSyncData channelData; - PrivateChatSyncData privateData; - - // global - if (conf.getBoolean(section + ".global.enable", false)) { - boolean vc = conf.getBoolean(section + ".global.vc-mode", vcModeDefault); - boolean discordInput = - conf.getBoolean(section + ".global.discord-input", discordInputDefault); - globalData = new GlobalChatSyncData(true, vc, discordInput); - } else { - globalData = new GlobalChatSyncData(false, false, false); - } - - // channel - if (conf.getBoolean(section + ".channel.enable", false)) { - boolean vc = conf.getBoolean(section + ".channel.vc-mode", vcModeDefault); - boolean discordInput = - conf.getBoolean(section + ".channel.discord-input", discordInputDefault); - List matches = null; - if (conf.isSet(section + ".channel.matches")) { - if (conf.isString(section + ".channel.matches")) { - matches = Collections.singletonList(conf.getString(section + ".channel.matches")); - } else { - matches = conf.getStringList(section + ".channel.matches"); - } - } - channelData = new ChannelChatSyncData(true, vc, discordInput, matches); - } else { - channelData = new ChannelChatSyncData(false, false, false, null); - } - - // private - if (conf.getBoolean(section + ".private.enable", false)) { - boolean vc = conf.getBoolean(section + ".private.vc-mode", vcModeDefault); - privateData = new PrivateChatSyncData(true, vc); - } else { - privateData = new PrivateChatSyncData(false, false); - } - - return new DiscordMessageConnection(id, discordChannelId, globalData, channelData, privateData); - } -} diff --git a/src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordHandler.java b/src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordHandler.java deleted file mode 100644 index 494d020d..00000000 --- a/src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordHandler.java +++ /dev/null @@ -1,176 +0,0 @@ -package net.azisaba.ryuzupluginchat.discord; - -import discord4j.common.util.Snowflake; -import discord4j.core.DiscordClient; -import discord4j.core.GatewayDiscordClient; -import discord4j.core.event.domain.message.MessageCreateEvent; -import discord4j.core.object.entity.Message; -import discord4j.core.object.entity.User; -import discord4j.rest.entity.RestChannel; -import lombok.RequiredArgsConstructor; -import net.azisaba.ryuzupluginchat.RyuZUPluginChat; -import net.azisaba.ryuzupluginchat.discord.data.ChannelChatSyncData; -import net.azisaba.ryuzupluginchat.discord.data.GlobalChatSyncData; -import net.azisaba.ryuzupluginchat.discord.data.PrivateChatSyncData; -import net.azisaba.ryuzupluginchat.discord.deliverer.DiscordMessageDeliverer; -import net.azisaba.ryuzupluginchat.discord.deliverer.ServerChatMessageDeliverer; -import org.bukkit.Bukkit; - -@Deprecated -@RequiredArgsConstructor -public class DiscordHandler { - - private final RyuZUPluginChat plugin; - private final String token; - - private DiscordClient client; - private GatewayDiscordClient gateway; - - private DiscordMessageDeliverer discordMessageDeliverer; - private ServerChatMessageDeliverer serverChatMessageDeliverer; - - public boolean init() { - - client = DiscordClient.create(token); - gateway = client.login().block(); - - if (gateway == null) { - return false; - } - - discordMessageDeliverer = new DiscordMessageDeliverer(plugin); - serverChatMessageDeliverer = new ServerChatMessageDeliverer(plugin, client); - - // TODO これ要らなくない? - Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> gateway.onDisconnect().block()); - return true; - } - - public void connectUsing(DiscordMessageConnection connectionData) { - if (connectionData.getGlobalChatSyncData().isEnabled()) { - GlobalChatSyncData data = connectionData.getGlobalChatSyncData(); - if (data.isDiscordInputEnabled()) { - registerDiscordToGlobal(connectionData.getDiscordChannelId()); - } - - registerGlobalToDiscord(connectionData.getDiscordChannelId(), data.isVoiceChatMode()); - } - - if (connectionData.getChannelChatSyncData().isEnabled()) { - ChannelChatSyncData data = connectionData.getChannelChatSyncData(); - - if (data.isDiscordInputEnabled()) { - registerDiscordToChannels(connectionData.getDiscordChannelId(), data); - } - - registerLunaChatChannelToDiscord( - data, connectionData.getDiscordChannelId(), data.isVoiceChatMode()); - } - - if (connectionData.getPrivateChatSyncData().isEnabled()) { - PrivateChatSyncData data = connectionData.getPrivateChatSyncData(); - registerPrivateToDiscord(connectionData.getDiscordChannelId(), data.isVoiceChatMode()); - } - } - - private void registerDiscordToGlobal(Snowflake discordChannelId) { - gateway - .on(MessageCreateEvent.class) - .subscribe( - event -> { - try { - Message message = event.getMessage(); - User user = message.getAuthor().orElse(null); - if (user == null || user.isBot()) { - return; - } - if (!message.getChannelId().equals(discordChannelId)) { - return; - } - - discordMessageDeliverer.sendToGlobal(event); - } catch (Exception e) { - e.printStackTrace(); - } - }); - } - - private void registerDiscordToChannels(Snowflake discordChannelId, ChannelChatSyncData syncData) { - gateway - .on(MessageCreateEvent.class) - .subscribe( - event -> { - try { - Message message = event.getMessage(); - User user = message.getAuthor().orElse(null); - if (user == null || user.isBot()) { - return; - } - if (!message.getChannelId().equals(discordChannelId)) { - return; - } - - discordMessageDeliverer.sendToChannel(event, syncData); - } catch (Exception e) { - e.printStackTrace(); - } - }); - } - - private void registerGlobalToDiscord(Snowflake chId, boolean vcMode) { - RestChannel targetChannel = client.getChannelById(chId); - plugin - .getSubscriber() - .registerPublicConsumer( - (data) -> { - if (data.isFromDiscord()) { - return; - } - - Bukkit.getScheduler() - .runTaskAsynchronously( - plugin, - () -> serverChatMessageDeliverer.sendToDiscord(data, targetChannel, vcMode)); - }); - } - - private void registerLunaChatChannelToDiscord( - ChannelChatSyncData channelChatSyncData, Snowflake discordChannelId, boolean vcMode) { - RestChannel targetChannel = client.getChannelById(discordChannelId); - plugin - .getSubscriber() - .registerChannelChatConsumer( - (data) -> { - if (data.isFromDiscord()) { - return; - } - if (!channelChatSyncData.isMatch(data.getLunaChatChannelName())) { - return; - } - - Bukkit.getScheduler() - .runTaskAsynchronously( - plugin, - () -> serverChatMessageDeliverer.sendToDiscord(data, targetChannel, vcMode)); - }); - } - - private void registerPrivateToDiscord(Snowflake discordChannelId, boolean vcMode) { - RestChannel targetChannel = client.getChannelById(discordChannelId); - plugin - .getSubscriber() - .registerTellConsumer( - (data) -> - Bukkit.getScheduler() - .runTaskAsynchronously( - plugin, - () -> - serverChatMessageDeliverer.sendtoDiscord(data, targetChannel, vcMode))); - } - - public void disconnect() { - if (gateway != null) { - gateway.logout().block(); - } - } -} diff --git a/src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordMessageConnection.java b/src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordMessageConnection.java deleted file mode 100644 index 97c5edc2..00000000 --- a/src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordMessageConnection.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.azisaba.ryuzupluginchat.discord; - -import discord4j.common.util.Snowflake; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import net.azisaba.ryuzupluginchat.discord.data.ChannelChatSyncData; -import net.azisaba.ryuzupluginchat.discord.data.GlobalChatSyncData; -import net.azisaba.ryuzupluginchat.discord.data.PrivateChatSyncData; - -@Deprecated -@Getter -@RequiredArgsConstructor -public class DiscordMessageConnection { - - private final String id; - - private final Snowflake discordChannelId; - - private final GlobalChatSyncData globalChatSyncData; - private final ChannelChatSyncData channelChatSyncData; - private final PrivateChatSyncData privateChatSyncData; -} diff --git a/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/DiscordMessageDeliverer.java b/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/DiscordMessageDeliverer.java deleted file mode 100644 index ede53096..00000000 --- a/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/DiscordMessageDeliverer.java +++ /dev/null @@ -1,98 +0,0 @@ -package net.azisaba.ryuzupluginchat.discord.deliverer; - -import com.github.ucchyocean.lc3.LunaChat; -import com.github.ucchyocean.lc3.LunaChatAPI; -import com.github.ucchyocean.lc3.channel.Channel; -import discord4j.core.event.domain.message.MessageCreateEvent; -import discord4j.core.object.entity.Member; -import discord4j.core.object.entity.Message; -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import lombok.RequiredArgsConstructor; -import net.azisaba.ryuzupluginchat.RyuZUPluginChat; -import net.azisaba.ryuzupluginchat.discord.data.ChannelChatSyncData; -import net.azisaba.ryuzupluginchat.message.data.ChannelChatMessageData; -import net.azisaba.ryuzupluginchat.message.data.GlobalMessageData; -import org.bukkit.Bukkit; - -@Deprecated -@RequiredArgsConstructor -public class DiscordMessageDeliverer { - - private final RyuZUPluginChat plugin; - - public void sendToGlobal(MessageCreateEvent event) { - Message message = event.getMessage(); - String content = message.getContent(); - if (content.length() == 0) { - return; - } - content = removeUrl(content); - - Member messageAuthor = message.getAuthorAsMember().block(); - if (messageAuthor == null) { - return; - } - - String senderName = messageAuthor.getNickname().orElse(messageAuthor.getUsername()); - - GlobalMessageData data = - plugin.getMessageDataFactory().createGlobalMessageDataFromDiscord(senderName, content); - - plugin.getPublisher().publishGlobalMessage(data); - } - - public void sendToChannel(MessageCreateEvent event, ChannelChatSyncData syncData) { - Message message = event.getMessage(); - String content = message.getContent(); - if (content.length() == 0) { - return; - } - final String urlDeletedContent = removeUrl(content); - - Member messageAuthor = message.getAuthorAsMember().block(); - if (messageAuthor == null) { - return; - } - - String senderName = messageAuthor.getNickname().orElse(messageAuthor.getUsername()); - - Bukkit.getScheduler() - .runTaskAsynchronously( - plugin, - () -> { - LunaChatAPI api = LunaChat.getAPI(); - List channelList = new ArrayList<>(); - for (Channel channel : api.getChannels()) { - if (syncData.isMatch(channel.getName())) { - channelList.add(channel); - } - } - - for (Channel ch : channelList) { - ChannelChatMessageData data = - plugin - .getMessageDataFactory() - .createChannelChatMessageDataFromDiscord( - senderName, ch.getName(), urlDeletedContent); - - plugin.getPublisher().publishChannelChatMessage(data); - } - }); - } - - private String removeUrl(String msg) { - String urlPattern = - "((https?|ftp|gopher|telnet|file):((//)|(\\\\))+[\\w:#@%/;$()~_?+\\-=\\\\.&]*)"; - Pattern p = Pattern.compile(urlPattern, Pattern.CASE_INSENSITIVE); - Matcher m = p.matcher(msg); - int i = 0; - while (m.find()) { - msg = msg.replaceAll(m.group(i), "").trim(); - i++; - } - return msg; - } -} diff --git a/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/ServerChatMessageDeliverer.java b/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/ServerChatMessageDeliverer.java deleted file mode 100644 index 7971ed61..00000000 --- a/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/ServerChatMessageDeliverer.java +++ /dev/null @@ -1,126 +0,0 @@ -package net.azisaba.ryuzupluginchat.discord.deliverer; - -import discord4j.core.DiscordClient; -import discord4j.discordjson.json.MessageData; -import discord4j.discordjson.json.MessageEditRequest; -import discord4j.rest.entity.RestChannel; -import discord4j.rest.util.MultipartRequest; -import lombok.RequiredArgsConstructor; -import net.azisaba.ryuzupluginchat.RyuZUPluginChat; -import net.azisaba.ryuzupluginchat.message.data.ChannelChatMessageData; -import net.azisaba.ryuzupluginchat.message.data.GlobalMessageData; -import net.azisaba.ryuzupluginchat.message.data.PrivateMessageData; -import org.bukkit.ChatColor; - -@Deprecated -@RequiredArgsConstructor -public class ServerChatMessageDeliverer { - - private final RyuZUPluginChat plugin; - private final DiscordClient client; - - public void sendToDiscord(GlobalMessageData data, RestChannel targetChannel, boolean vcMode) { - String message; - if (vcMode) { - message = data.getMessage(); - } else { - message = data.format(); - } - message = sanitize(message); - MessageData jsonMessageData = targetChannel.createMessage(message).block(); - - if (vcMode) { - if (jsonMessageData == null) { - return; - } - - long channelId = jsonMessageData.channelId().asLong(); - long messageId = jsonMessageData.id().asLong(); - - String editedMessageContent = sanitize(data.format()); - - MultipartRequest req = - MultipartRequest.ofRequest( - MessageEditRequest.builder().contentOrNull(editedMessageContent).build()); - - client.getChannelService().editMessage(channelId, messageId, req).block(); - } - } - - public void sendToDiscord( - ChannelChatMessageData data, RestChannel targetChannel, boolean vcMode) { - String message; - if (vcMode) { - message = data.getMessage(); - } else { - message = data.format(); - } - message = sanitize(message); - MessageData jsonMessageData = targetChannel.createMessage(message).block(); - - if (vcMode) { - if (jsonMessageData == null) { - return; - } - - long channelId = jsonMessageData.channelId().asLong(); - long messageId = jsonMessageData.id().asLong(); - - String editedMessageContent = sanitize(data.format()); - - MultipartRequest req = - MultipartRequest.ofRequest( - MessageEditRequest.builder().contentOrNull(editedMessageContent).build()); - - client.getChannelService().editMessage(channelId, messageId, req).block(); - } - } - - public void sendtoDiscord(PrivateMessageData data, RestChannel targetChannel, boolean vcMode) { - String message; - if (vcMode) { - message = data.getMessage(); - } else { - message = data.format(); - } - message = sanitize(message); - - // 名前がnullだとUUIDが表示されてしまうのでmcidに変更する - if (data.getReceivedPlayerName() == null) { - String receivePlayerName = - plugin.getPlayerUUIDMapContainer().getNameFromUUID(data.getReceivedPlayerUUID()); - if (receivePlayerName != null) { - message = - message.replace( - data.getReceivedPlayerUUID().toString(), - receivePlayerName); // TODO もうすこしきれいな処理にできるはず - } - } - - MessageData jsonMessageData = targetChannel.createMessage(message).block(); - - if (vcMode) { - if (jsonMessageData == null) { - return; - } - - long channelId = jsonMessageData.channelId().asLong(); - long messageId = jsonMessageData.id().asLong(); - - String editedMessageContent = sanitize(data.format()); - - MultipartRequest req = - MultipartRequest.ofRequest( - MessageEditRequest.builder().contentOrNull(editedMessageContent).build()); - - client.getChannelService().editMessage(channelId, messageId, req).block(); - } - } - - private String sanitize(String message) { - message = message.replace("@", "\\@"); - message = ChatColor.translateAlternateColorCodes('&', message); - message = ChatColor.stripColor(message); - return message; - } -} From 345247465aa30f1f19daa2ed8e46c7af9ecc63ca Mon Sep 17 00:00:00 2001 From: sysnote8main Date: Thu, 30 Apr 2026 09:03:14 +0900 Subject: [PATCH 4/5] feat: rename to original one --- .../azisaba/ryuzupluginchat/RyuZUPluginChat.java | 16 ++++++++-------- .../config/{JDARPCConfig.java => RPCConfig.java} | 12 ++++++------ ...DADiscordHandler.java => DiscordHandler.java} | 16 ++++++++-------- ...ection.java => DiscordMessageConnection.java} | 2 +- ...liverer.java => DiscordMessageDeliverer.java} | 2 +- ...erer.java => ServerChatMessageDeliverer.java} | 2 +- 6 files changed, 25 insertions(+), 25 deletions(-) rename src/main/java/net/azisaba/ryuzupluginchat/config/{JDARPCConfig.java => RPCConfig.java} (93%) rename src/main/java/net/azisaba/ryuzupluginchat/discord/{JDADiscordHandler.java => DiscordHandler.java} (90%) rename src/main/java/net/azisaba/ryuzupluginchat/discord/{JDADiscordMessageConnection.java => DiscordMessageConnection.java} (93%) rename src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/{JDADiscordMessageDeliverer.java => DiscordMessageDeliverer.java} (98%) rename src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/{JDAServerChatMessageDeliverer.java => ServerChatMessageDeliverer.java} (98%) diff --git a/src/main/java/net/azisaba/ryuzupluginchat/RyuZUPluginChat.java b/src/main/java/net/azisaba/ryuzupluginchat/RyuZUPluginChat.java index 195c0cbe..eab1c3da 100644 --- a/src/main/java/net/azisaba/ryuzupluginchat/RyuZUPluginChat.java +++ b/src/main/java/net/azisaba/ryuzupluginchat/RyuZUPluginChat.java @@ -14,9 +14,9 @@ import net.azisaba.ryuzupluginchat.command.TellCommand; import net.azisaba.ryuzupluginchat.command.UnHideCommand; import net.azisaba.ryuzupluginchat.command.VCCommand; -import net.azisaba.ryuzupluginchat.config.JDARPCConfig; -import net.azisaba.ryuzupluginchat.discord.JDADiscordHandler; -import net.azisaba.ryuzupluginchat.discord.JDADiscordMessageConnection; +import net.azisaba.ryuzupluginchat.config.RPCConfig; +import net.azisaba.ryuzupluginchat.discord.DiscordHandler; +import net.azisaba.ryuzupluginchat.discord.DiscordMessageConnection; import net.azisaba.ryuzupluginchat.listener.ChannelMsgFromCommandListener; import net.azisaba.ryuzupluginchat.listener.ChatListener; import net.azisaba.ryuzupluginchat.listener.HideAllListener; @@ -57,7 +57,7 @@ public final class RyuZUPluginChat extends JavaPlugin { private static TaskChainFactory taskChainFactory; - private JDARPCConfig rpcConfig; + private RPCConfig rpcConfig; private MessageDataFactory messageDataFactory; private MessageProcessor messageProcessor; private RyuZUPrefixSuffixContainer prefixSuffixContainer; @@ -79,7 +79,7 @@ public final class RyuZUPluginChat extends JavaPlugin { private MessageSubscriber subscriber; private PrivateChatReachedSubscriber privateChatReachedSubscriber; - private JDADiscordHandler discordHandler; + private DiscordHandler discordHandler; private JedisPool jedisPool; @@ -89,7 +89,7 @@ public final class RyuZUPluginChat extends JavaPlugin { public void onEnable() { taskChainFactory = BukkitTaskChainFactory.create(this); - rpcConfig = new JDARPCConfig(this); + rpcConfig = new RPCConfig(this); rpcConfig.load(); try { @@ -225,7 +225,7 @@ private void setupRedisConnections() { private void setupDiscordConnection() { try { vcLunaChatChannelSharer.setLunaChatChannelName(rpcConfig.getVcCommandLunaChatChannel()); - discordHandler = new JDADiscordHandler(this); + discordHandler = new DiscordHandler(this); boolean initResult = discordHandler.init(rpcConfig.getDiscordBotToken()); if (!initResult) { @@ -233,7 +233,7 @@ private void setupDiscordConnection() { return; } - for (JDADiscordMessageConnection connectionData : rpcConfig.getMessageConnections()) { + for (DiscordMessageConnection connectionData : rpcConfig.getMessageConnections()) { discordHandler.connectUsing(connectionData); } } catch (Throwable e) { diff --git a/src/main/java/net/azisaba/ryuzupluginchat/config/JDARPCConfig.java b/src/main/java/net/azisaba/ryuzupluginchat/config/RPCConfig.java similarity index 93% rename from src/main/java/net/azisaba/ryuzupluginchat/config/JDARPCConfig.java rename to src/main/java/net/azisaba/ryuzupluginchat/config/RPCConfig.java index 3f47e933..7b3d4a85 100644 --- a/src/main/java/net/azisaba/ryuzupluginchat/config/JDARPCConfig.java +++ b/src/main/java/net/azisaba/ryuzupluginchat/config/RPCConfig.java @@ -3,7 +3,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import net.azisaba.ryuzupluginchat.RyuZUPluginChat; -import net.azisaba.ryuzupluginchat.discord.JDADiscordMessageConnection; +import net.azisaba.ryuzupluginchat.discord.DiscordMessageConnection; import net.azisaba.ryuzupluginchat.discord.data.ChannelChatSyncData; import net.azisaba.ryuzupluginchat.discord.data.GlobalChatSyncData; import net.azisaba.ryuzupluginchat.discord.data.PrivateChatSyncData; @@ -18,7 +18,7 @@ @Getter @RequiredArgsConstructor -public class JDARPCConfig { +public class RPCConfig { private final RyuZUPluginChat plugin; @@ -39,7 +39,7 @@ public class JDARPCConfig { private boolean defaultDisablePrivateChatInspect; private boolean defaultDisableChannelChatInspect; - private final List messageConnections = new ArrayList<>(); + private final List messageConnections = new ArrayList<>(); public void load() { plugin.saveDefaultConfig(); @@ -88,7 +88,7 @@ public void load() { messageConnections.clear(); for (String id : section.getKeys(false)) { - JDADiscordMessageConnection connection = + DiscordMessageConnection connection = importConnectionDataFromConfig(conf, "discord.connections." + id, id); if (connection == null) { @@ -119,7 +119,7 @@ public void reloadConfig() { load(); } - private JDADiscordMessageConnection importConnectionDataFromConfig( + private DiscordMessageConnection importConnectionDataFromConfig( FileConfiguration conf, String section, String id) { boolean discordInputDefault = conf.getBoolean(section + ".discord-input", false); boolean vcModeDefault = conf.getBoolean(section + ".vc-mode", false); @@ -172,6 +172,6 @@ private JDADiscordMessageConnection importConnectionDataFromConfig( privateData = new PrivateChatSyncData(false, false); } - return new JDADiscordMessageConnection(id, discordChIdLong, globalData, channelData, privateData); + return new DiscordMessageConnection(id, discordChIdLong, globalData, channelData, privateData); } } diff --git a/src/main/java/net/azisaba/ryuzupluginchat/discord/JDADiscordHandler.java b/src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordHandler.java similarity index 90% rename from src/main/java/net/azisaba/ryuzupluginchat/discord/JDADiscordHandler.java rename to src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordHandler.java index bf4f68ca..2993dec3 100644 --- a/src/main/java/net/azisaba/ryuzupluginchat/discord/JDADiscordHandler.java +++ b/src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordHandler.java @@ -5,8 +5,8 @@ import net.azisaba.ryuzupluginchat.discord.data.ChannelChatSyncData; import net.azisaba.ryuzupluginchat.discord.data.GlobalChatSyncData; import net.azisaba.ryuzupluginchat.discord.data.PrivateChatSyncData; -import net.azisaba.ryuzupluginchat.discord.deliverer.JDADiscordMessageDeliverer; -import net.azisaba.ryuzupluginchat.discord.deliverer.JDAServerChatMessageDeliverer; +import net.azisaba.ryuzupluginchat.discord.deliverer.DiscordMessageDeliverer; +import net.azisaba.ryuzupluginchat.discord.deliverer.ServerChatMessageDeliverer; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDABuilder; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; @@ -18,11 +18,11 @@ import java.util.concurrent.ConcurrentHashMap; @RequiredArgsConstructor -public class JDADiscordHandler extends ListenerAdapter { +public class DiscordHandler extends ListenerAdapter { private JDA jda; private final RyuZUPluginChat plugin; - private JDADiscordMessageDeliverer discordMessageDeliverer; - private JDAServerChatMessageDeliverer serverChatMessageDeliverer; + private DiscordMessageDeliverer discordMessageDeliverer; + private ServerChatMessageDeliverer serverChatMessageDeliverer; // どのチャンネルIDがどの処理(Global, Channel, Private)に紐付いているかを管理 private final ConcurrentHashMap channelConfigurations = new ConcurrentHashMap<>(); @@ -38,8 +38,8 @@ public boolean init(String token) { // 接続完了まで待機 jda.awaitReady(); - this.discordMessageDeliverer = new JDADiscordMessageDeliverer(plugin); - this.serverChatMessageDeliverer = new JDAServerChatMessageDeliverer(plugin, jda); + this.discordMessageDeliverer = new DiscordMessageDeliverer(plugin); + this.serverChatMessageDeliverer = new ServerChatMessageDeliverer(plugin, jda); return true; } catch (Exception e) { @@ -69,7 +69,7 @@ public void onMessageReceived(MessageReceivedEvent event) { } } - public void connectUsing(JDADiscordMessageConnection connectionData) { + public void connectUsing(DiscordMessageConnection connectionData) { long channelId = connectionData.getDiscordChannelId(); // Global Chat Sync diff --git a/src/main/java/net/azisaba/ryuzupluginchat/discord/JDADiscordMessageConnection.java b/src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordMessageConnection.java similarity index 93% rename from src/main/java/net/azisaba/ryuzupluginchat/discord/JDADiscordMessageConnection.java rename to src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordMessageConnection.java index 14d2fe93..cc7498a4 100644 --- a/src/main/java/net/azisaba/ryuzupluginchat/discord/JDADiscordMessageConnection.java +++ b/src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordMessageConnection.java @@ -8,7 +8,7 @@ @Getter @RequiredArgsConstructor -public class JDADiscordMessageConnection { +public class DiscordMessageConnection { private final String id; diff --git a/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/JDADiscordMessageDeliverer.java b/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/DiscordMessageDeliverer.java similarity index 98% rename from src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/JDADiscordMessageDeliverer.java rename to src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/DiscordMessageDeliverer.java index 7f3332c5..a060b734 100644 --- a/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/JDADiscordMessageDeliverer.java +++ b/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/DiscordMessageDeliverer.java @@ -15,7 +15,7 @@ import java.util.regex.Pattern; @RequiredArgsConstructor -public class JDADiscordMessageDeliverer { +public class DiscordMessageDeliverer { private final RyuZUPluginChat plugin; public void sendToGlobal(MessageReceivedEvent event){ diff --git a/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/JDAServerChatMessageDeliverer.java b/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/ServerChatMessageDeliverer.java similarity index 98% rename from src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/JDAServerChatMessageDeliverer.java rename to src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/ServerChatMessageDeliverer.java index 033ddcb3..aadaadd4 100644 --- a/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/JDAServerChatMessageDeliverer.java +++ b/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/ServerChatMessageDeliverer.java @@ -10,7 +10,7 @@ import org.bukkit.ChatColor; @RequiredArgsConstructor -public class JDAServerChatMessageDeliverer { +public class ServerChatMessageDeliverer { private final RyuZUPluginChat plugin; private final JDA client; From e8a88e54b1e640f95fb9c57681120f84773320a1 Mon Sep 17 00:00:00 2001 From: sysnote8main Date: Thu, 30 Apr 2026 09:18:45 +0900 Subject: [PATCH 5/5] feat: remove discord4j and add netty and jackson --- build.gradle.kts | 3 ++- gradle/libs.versions.toml | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 4f0effd9..d272282a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -33,11 +33,12 @@ repositories { } dependencies { - implementation(libs.discord4j) implementation(libs.jda) { exclude(module = "opus-java") exclude(module = "tink") } + implementation(libs.bundles.netty) + implementation(libs.bundles.jackson) implementation(libs.jedis) implementation(libs.aikar.taskchain) implementation(libs.semver4j) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b0190a39..9184f0c9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -18,6 +18,10 @@ jetbrains-annotation = "26.1.0" junit = "5.14.4" junit-platform = "1.14.4" jda = "6.4.1" +netty = "4.2.12.Final" +jackson-core = "2.21.2" +jackson-databind = "2.21.2" +jackson-annotations = "2.21" [plugins] shadow = { id = "com.gradleup.shadow", version.ref = "shadow" } @@ -41,3 +45,19 @@ junit-bom = { module = "org.junit:junit-bom", version.ref = "junit" } junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit" } junit-platform-launcher = { module = "org.junit.platform:junit-platform-launcher", version.ref = "junit-platform" } jda = { module = "net.dv8tion:JDA", version.ref = "jda" } +netty-buffer = { module = "io.netty:netty-buffer", version.ref = "netty"} +netty-codec = { module = "io.netty:netty-codec", version.ref = "netty"} +jackson-core = { module = "com.fasterxml.jackson.core:jackson-core", version.ref = "jackson-core" } +jackson-databind = { module = "com.fasterxml.jackson.core:jackson-databind", version.ref = "jackson-databind" } +jackson-annotations = { module = "com.fasterxml.jackson.core:jackson-annotations", version.ref = "jackson-annotations" } + +[bundles] +jackson = [ + "jackson-core", + "jackson-databind", + "jackson-annotations" +] +netty = [ + "netty-buffer", + "netty-codec" +]