diff --git a/build.gradle b/build.gradle index 9b8587d..fdabe51 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group = 'com.springwater.easybot' -version = '2.1.5' +version = '2.2.0' repositories { mavenCentral() @@ -60,7 +60,7 @@ tasks.build.dependsOn(tasks.shadowJar) dependencies { compileOnly "org.spigotmc:spigot-api:1.13.2-R0.1-SNAPSHOT" - implementation 'com.springwater.easybot:easybot-bridge:1.7-rc.1' + implementation 'com.springwater.easybot:easybot-bridge:1.7.1' implementation 'org.javassist:javassist:3.28.0-GA' implementation 'bot.inker.acj:runtime:1.5' implementation 'org.reflections:reflections:0.10.2' diff --git a/libs/AuthMe-5.6.0.jar b/libs/AuthMe-5.6.0.jar new file mode 100644 index 0000000..b8343cb Binary files /dev/null and b/libs/AuthMe-5.6.0.jar differ diff --git a/src/main/java/com/springwater/easybot/BridgeImpl.java b/src/main/java/com/springwater/easybot/BridgeImpl.java index 9ef7ef3..6e186e5 100644 --- a/src/main/java/com/springwater/easybot/BridgeImpl.java +++ b/src/main/java/com/springwater/easybot/BridgeImpl.java @@ -184,6 +184,21 @@ public void SyncToChatExtra(List segments, String text) { } } + @Override + public boolean moduleIsInstalled(String name) { + return Bukkit.getPluginManager().getPlugin(name) != null; + } + + @Override + public boolean moduleIsEnabled(String name) { + return Bukkit.getPluginManager().isPluginEnabled(name); + } + + @Override + public boolean isAuthenticated(String name) { + return false; + } + @Override public List getPlayerList() { return Bukkit.getOnlinePlayers().stream() @@ -229,12 +244,22 @@ private BaseComponent toComponent(Segment segment) { } } else if (segment instanceof ImageSegment) { component.setColor(ChatColor.GREEN); - component.setHoverEvent(new HoverEvent( - HoverEvent.Action.SHOW_TEXT, - new ComponentBuilder("§7§n点击预览 ") - .append(new TextComponent("§7§n" + ((ImageSegment) segment).getUrl())) - .create() - )); + + if (Easybot.instance.getConfig().getBoolean("sync.chat_image_support", true)) { + component.setHoverEvent(new HoverEvent( + HoverEvent.Action.SHOW_TEXT, + new ComponentBuilder("[[CICode,url=" + ((ImageSegment) segment).getUrl() + ",name=" + ((ImageSegment) segment).getSummary() + "]]") + .create() + )); + } else { + component.setHoverEvent(new HoverEvent( + HoverEvent.Action.SHOW_TEXT, + new ComponentBuilder("§7§n点击预览 ") + .append(new TextComponent("§7§n" + ((ImageSegment) segment).getUrl())) + .create() + )); + } + component.setClickEvent(new ClickEvent( ClickEvent.Action.OPEN_URL, ((ImageSegment) segment).getUrl() diff --git a/src/main/java/com/springwater/easybot/Easybot.java b/src/main/java/com/springwater/easybot/Easybot.java index 2800dbb..63f9bc8 100644 --- a/src/main/java/com/springwater/easybot/Easybot.java +++ b/src/main/java/com/springwater/easybot/Easybot.java @@ -12,6 +12,7 @@ import com.springwater.easybot.papi.EasyBotExpansion; import com.springwater.easybot.papi.OfflineStatisticExpansion; import com.springwater.easybot.task.TaskManager; +import com.springwater.easybot.utils.AuthMeUtils; import com.springwater.easybot.utils.BukkitUtils; import com.springwater.easybot.utils.FakePlayerUtils; import com.springwater.easybot.utils.ItemsAdderUtils; @@ -79,12 +80,20 @@ public void onEnable() { handleBungeeChatCompatibility(); handleSkinsRestorerCompatibility(); handleItemsAdderCompatibility(); + handleAuthMeCompatibility(); bridgeClient = new BridgeClient(getConfig().getString("service.url", "ws://127.0.0.1:8080/bridge"), bridgeBehavior); bridgeClient.setToken(getConfig().getString("service.token")); putTasks(); } + private void handleAuthMeCompatibility() { + if (AuthMeUtils.init()) { + getLogger().info("\u001B[32m※ 检测到AuthMe,群聊登录可以正常使用!\u001B[0m"); + } else { + getLogger().info("\u001B[31m※ 未检测到AuthMe,群聊登录功能可能无法正常工作!\u001B[0m"); + } + } private void handleSkinsRestorerCompatibility() { if (BukkitUtils.hasSkinsRestorer() && !BukkitUtils.placeholderApiInstalled()) { diff --git a/src/main/java/com/springwater/easybot/utils/AuthMeUtils.java b/src/main/java/com/springwater/easybot/utils/AuthMeUtils.java new file mode 100644 index 0000000..1206e18 --- /dev/null +++ b/src/main/java/com/springwater/easybot/utils/AuthMeUtils.java @@ -0,0 +1,39 @@ +package com.springwater.easybot.utils; + +import com.springwater.easybot.Easybot; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.util.concurrent.CompletableFuture; + +public class AuthMeUtils { + private static boolean isAuthMeInstalled = false; + + public static boolean init() { + try { + Class.forName("fr.xephi.authme.AuthMe"); + isAuthMeInstalled = true; + } catch (ClassNotFoundException e) { + isAuthMeInstalled = false; + } + return isAuthMeInstalled; + } + + public Boolean isPlayerAuthenticated(String playerName) { + return CompletableFuture.supplyAsync(() -> { + CompletableFuture inner = new CompletableFuture<>(); + Bukkit.getScheduler().runTask(Easybot.instance, () -> { + try { + Player player = Bukkit.getPlayer(playerName); + boolean result = player != null && + fr.xephi.authme.api.v3.AuthMeApi.getInstance().isAuthenticated(player); + inner.complete(result); + } catch (Exception e) { + inner.completeExceptionally(e); + } + }); + return inner; + }).thenCompose(f -> f).join(); + } + +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 63352fc..0172423 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -86,4 +86,9 @@ geyser: # - 如果之前未启用但现在启用,一些已经绑定的基岩版玩家可能需要重新绑定。(为什么你自己想) # - 启用时(True),如果基岩版玩家的前缀为 BE_。 # 示例:BE_MiuxuE -> MiuxuE - ignore_prefix: false \ No newline at end of file + ignore_prefix: false + +# 消息同步设置 +sync: + # 消息同步图片时支持ChatImage + chat_image_support: true \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 69e8f80..30bdd29 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -3,7 +3,7 @@ version: '${version}' main: com.springwater.easybot.Easybot api-version: '1.13' load: STARTUP -softdepend: [ Essentials,PlaceHolderAPI,PlayerChat,RedisChat,TrChat,Geyser-Spigot,SkinsRestorer,ItemsAdder,FakePlayer,VentureChat ] +softdepend: [ Essentials,PlaceHolderAPI,PlayerChat,RedisChat,TrChat,Geyser-Spigot,SkinsRestorer,ItemsAdder,FakePlayer,VentureChat,AuthMe ] folia-supported: true commands: