diff --git a/build.gradle.kts b/build.gradle.kts index dc465d76..d272282a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -33,7 +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) @@ -83,6 +88,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..9184f0c9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -17,6 +17,11 @@ luckperms-api = "5.5" 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" } @@ -39,3 +44,20 @@ 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" } +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" +] diff --git a/src/main/java/net/azisaba/ryuzupluginchat/RyuZUPluginChat.java b/src/main/java/net/azisaba/ryuzupluginchat/RyuZUPluginChat.java index 181c8ab4..eab1c3da 100644 --- a/src/main/java/net/azisaba/ryuzupluginchat/RyuZUPluginChat.java +++ b/src/main/java/net/azisaba/ryuzupluginchat/RyuZUPluginChat.java @@ -225,8 +225,8 @@ private void setupRedisConnections() { private void setupDiscordConnection() { try { vcLunaChatChannelSharer.setLunaChatChannelName(rpcConfig.getVcCommandLunaChatChannel()); - discordHandler = new DiscordHandler(this, rpcConfig.getDiscordBotToken()); - boolean initResult = discordHandler.init(); + discordHandler = new DiscordHandler(this); + boolean initResult = discordHandler.init(rpcConfig.getDiscordBotToken()); if (!initResult) { getLogger().warning("Failed to login to Discord Bot. Is that the correct Token?"); diff --git a/src/main/java/net/azisaba/ryuzupluginchat/config/RPCConfig.java b/src/main/java/net/azisaba/ryuzupluginchat/config/RPCConfig.java index fe6ddccb..7b3d4a85 100644 --- a/src/main/java/net/azisaba/ryuzupluginchat/config/RPCConfig.java +++ b/src/main/java/net/azisaba/ryuzupluginchat/config/RPCConfig.java @@ -1,10 +1,5 @@ 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; @@ -16,6 +11,11 @@ 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 RPCConfig { @@ -131,9 +131,8 @@ private DiscordMessageConnection importConnectionDataFromConfig( .warning("Invalid discord channel id ( " + section + ".discord-channel-id )"); return null; } - Snowflake discordChannelId = Snowflake.of(discordChIdLong); - GlobalChatSyncData globalData; + GlobalChatSyncData globalData; ChannelChatSyncData channelData; PrivateChatSyncData privateData; @@ -173,6 +172,6 @@ private DiscordMessageConnection importConnectionDataFromConfig( privateData = new PrivateChatSyncData(false, false); } - return new DiscordMessageConnection(id, discordChannelId, globalData, channelData, privateData); + return new DiscordMessageConnection(id, discordChIdLong, 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 index 423af083..2993dec3 100644 --- a/src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordHandler.java +++ b/src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordHandler.java @@ -1,12 +1,5 @@ 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; @@ -14,162 +7,139 @@ import net.azisaba.ryuzupluginchat.discord.data.PrivateChatSyncData; 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; +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; -@RequiredArgsConstructor -public class DiscordHandler { +import java.util.concurrent.ConcurrentHashMap; - private final RyuZUPluginChat plugin; - private final String token; +@RequiredArgsConstructor +public class DiscordHandler extends ListenerAdapter { + private JDA jda; + private final RyuZUPluginChat plugin; + private DiscordMessageDeliverer discordMessageDeliverer; + private ServerChatMessageDeliverer 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 DiscordMessageDeliverer(plugin); + this.serverChatMessageDeliverer = new ServerChatMessageDeliverer(plugin, jda); + + return true; + } catch (Exception e) { + plugin.getLogger().severe("Discordの初期化に失敗しました: " + e.getMessage()); + return false; + } + } - private DiscordClient client; - private GatewayDiscordClient gateway; + // DiscordからMinecraftへの入力イベント + @Override + public void onMessageReceived(MessageReceivedEvent event) { + if (event.getAuthor().isBot()) return; - private DiscordMessageDeliverer discordMessageDeliverer; - private ServerChatMessageDeliverer serverChatMessageDeliverer; + long channelId = event.getChannel().getIdLong(); + DiscordInputType type = channelConfigurations.get(channelId); - public boolean init() { + if (type == null) return; - client = DiscordClient.create(token); - gateway = client.login().block(); + switch (type) { + case GLOBAL: + discordMessageDeliverer.sendToGlobal(event); + break; + case CHANNEL: + // syncDataが必要な場合は、別途Mapなどで管理して渡す + discordMessageDeliverer.sendToChannel(event, type.getSyncData()); + break; + } + } - if (gateway == null) { - return false; + public void connectUsing(DiscordMessageConnection 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()); + } } - discordMessageDeliverer = new DiscordMessageDeliverer(plugin); - serverChatMessageDeliverer = new ServerChatMessageDeliverer(plugin, client); + private void registerGlobalToDiscord(long chId, boolean vcMode) { + MessageChannel targetChannel = jda.getTextChannelById(chId); + if (targetChannel == null) return; - // TODO これ要らなくない? - Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> gateway.onDisconnect().block()); - return true; - } + plugin.getSubscriber().registerPublicConsumer((data) -> { + if (data.isFromDiscord()) return; + Bukkit.getScheduler().runTaskAsynchronously(plugin, + () -> serverChatMessageDeliverer.sendToDiscord(data, targetChannel, vcMode)); + }); + } - public void connectUsing(DiscordMessageConnection connectionData) { - if (connectionData.getGlobalChatSyncData().isEnabled()) { - GlobalChatSyncData data = connectionData.getGlobalChatSyncData(); - if (data.isDiscordInputEnabled()) { - registerDiscordToGlobal(connectionData.getDiscordChannelId()); - } + private void registerLunaChatChannelToDiscord(ChannelChatSyncData syncData, long chId, boolean vcMode) { + MessageChannel targetChannel = jda.getTextChannelById(chId); + if (targetChannel == null) return; - registerGlobalToDiscord(connectionData.getDiscordChannelId(), data.isVoiceChatMode()); - } + plugin.getSubscriber().registerChannelChatConsumer((data) -> { + if (data.isFromDiscord()) return; + if (!syncData.isMatch(data.getLunaChatChannelName())) return; - if (connectionData.getChannelChatSyncData().isEnabled()) { - ChannelChatSyncData data = connectionData.getChannelChatSyncData(); + Bukkit.getScheduler().runTaskAsynchronously(plugin, + () -> serverChatMessageDeliverer.sendToDiscord(data, targetChannel, vcMode)); + }); + } - if (data.isDiscordInputEnabled()) { - registerDiscordToChannels(connectionData.getDiscordChannelId(), data); - } + private void registerPrivateToDiscord(long chId, boolean vcMode) { + MessageChannel targetChannel = jda.getTextChannelById(chId); + if (targetChannel == null) return; - registerLunaChatChannelToDiscord( - data, connectionData.getDiscordChannelId(), data.isVoiceChatMode()); + plugin.getSubscriber().registerTellConsumer((data) -> + Bukkit.getScheduler().runTaskAsynchronously(plugin, + () -> serverChatMessageDeliverer.sendToDiscord(data, targetChannel, vcMode))); } - if (connectionData.getPrivateChatSyncData().isEnabled()) { - PrivateChatSyncData data = connectionData.getPrivateChatSyncData(); - registerPrivateToDiscord(connectionData.getDiscordChannelId(), data.isVoiceChatMode()); + public void disconnect() { + if (jda != null) jda.shutdown(); } - } - - 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(); + // 内部判別用 + 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/DiscordMessageConnection.java b/src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordMessageConnection.java index 3929c0e9..cc7498a4 100644 --- a/src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordMessageConnection.java +++ b/src/main/java/net/azisaba/ryuzupluginchat/discord/DiscordMessageConnection.java @@ -1,6 +1,5 @@ package net.azisaba.ryuzupluginchat.discord; -import discord4j.common.util.Snowflake; import lombok.Getter; import lombok.RequiredArgsConstructor; import net.azisaba.ryuzupluginchat.discord.data.ChannelChatSyncData; @@ -11,11 +10,11 @@ @RequiredArgsConstructor public class DiscordMessageConnection { - private final String id; + private final String id; - private final Snowflake discordChannelId; + private final long discordChannelId; - private final GlobalChatSyncData globalChatSyncData; - private final ChannelChatSyncData channelChatSyncData; - private final PrivateChatSyncData privateChatSyncData; + 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..a060b734 100644 --- a/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/DiscordMessageDeliverer.java +++ b/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/DiscordMessageDeliverer.java @@ -1,97 +1,73 @@ 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 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 DiscordMessageDeliverer { + private final RyuZUPluginChat plugin; - 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; - public void sendToGlobal(MessageCreateEvent event) { - Message message = event.getMessage(); - String content = message.getContent(); - if (content.length() == 0) { - return; - } - content = removeUrl(content); + // sanitize content + content = removeUrl(content); - Member messageAuthor = message.getAuthorAsMember().block(); - if (messageAuthor == null) { - return; - } + // get username + User author = message.getAuthor(); + String senderName = author.getEffectiveName(); - 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; + // create data and publish + GlobalMessageData data = plugin.getMessageDataFactory() + .createGlobalMessageDataFromDiscord(senderName, content); + plugin.getPublisher().publishGlobalMessage(data); } - final String urlDeletedContent = removeUrl(content); - Member messageAuthor = message.getAuthorAsMember().block(); - if (messageAuthor == null) { - return; - } - - String senderName = messageAuthor.getNickname().orElse(messageAuthor.getUsername()); + public void sendToChannel(MessageReceivedEvent event, ChannelChatSyncData syncData) { + Message message = event.getMessage(); + String content = message.getContentStripped(); + if(content.isEmpty()) return; - 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); - } - } + final String sanitizedContent = removeUrl(content); - for (Channel ch : channelList) { - ChannelChatMessageData data = - plugin - .getMessageDataFactory() - .createChannelChatMessageDataFromDiscord( - senderName, ch.getName(), urlDeletedContent); + User author = message.getAuthor(); + String senderName = author.getEffectiveName(); - plugin.getPublisher().publishChannelChatMessage(data); - } - }); - } + 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++; + 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; } - 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 index 7bb3bb99..aadaadd4 100644 --- a/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/ServerChatMessageDeliverer.java +++ b/src/main/java/net/azisaba/ryuzupluginchat/discord/deliverer/ServerChatMessageDeliverer.java @@ -1,125 +1,72 @@ 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 net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import org.bukkit.ChatColor; @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(); + 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(PrivateMessageData data, RestChannel targetChannel, boolean vcMode) { - String message; - if (vcMode) { - message = data.getMessage(); - } else { - message = data.format(); + 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); + }); } - 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 もうすこしきれいな処理にできるはず - } + 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); + }); } - 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 static String sanitize(String message) { + message = message.replace("@", "\\@"); + message = ChatColor.translateAlternateColorCodes('&', message); + message = ChatColor.stripColor(message); + return message; } - } - - private String sanitize(String message) { - message = message.replace("@", "\\@"); - message = ChatColor.translateAlternateColorCodes('&', message); - message = ChatColor.stripColor(message); - return message; - } }