diff --git a/.github/workflows/nightly-release.yml b/.github/workflows/nightly-release.yml index 0d196a3..4af33fc 100644 --- a/.github/workflows/nightly-release.yml +++ b/.github/workflows/nightly-release.yml @@ -55,6 +55,13 @@ jobs: # Can Can Need Result ls -l + # 这一步是为了删除之前的文件 + - name: Delete Old Release + # 使用 || true 忽略错误,防止第一次运行时因为没有 release 而报错 + run: gh release delete latest-dev --cleanup-tag -y || true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Update Nightly Release uses: softprops/action-gh-release@v2 with: diff --git a/build.gradle b/build.gradle index 975ea6f..d42e206 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group = 'com.springwater.easybot' -version = '2.0.8' +version = '2.1.1' 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.2-SNAPSHOT' + implementation 'com.springwater.easybot:easybot-bridge:1.4-SNAPSHOT' 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/src/main/java/com/springwater/easybot/EasyBotImpl.java b/src/main/java/com/springwater/easybot/EasyBotImpl.java index cb2a11a..1b494dd 100644 --- a/src/main/java/com/springwater/easybot/EasyBotImpl.java +++ b/src/main/java/com/springwater/easybot/EasyBotImpl.java @@ -112,6 +112,10 @@ public void KickPlayer(String player, String kickMessage) { @Override public void SyncToChatExtra(List segments, String text) { + if (!ChatCompatUtil.hasAppendMethod()) { + Easybot.instance.runTask(() -> Bukkit.getOnlinePlayers().forEach(x -> x.sendMessage(text))); + return; + } try { ComponentBuilder builder = new ComponentBuilder(""); @@ -152,9 +156,9 @@ public void SyncToChatExtra(List segments, String text) { Easybot.instance.runTask(() -> Bukkit.getOnlinePlayers().forEach(p -> { // 判断玩家名字是否在atPlayerNames中,忽略大小写 - boolean hasAt = atPlayerNames.stream().anyMatch(x -> x.equalsIgnoreCase(GeyserUtils.getName(p))); + boolean hasAt = atPlayerNames.stream().anyMatch(x -> x.equalsIgnoreCase(GeyserUtils.getNameByPlayer(p))); if (!hasAt && Easybot.instance.getConfig().getBoolean("event.on_at.find", true)) { - hasAt = text.contains(GeyserUtils.getName(p)); + hasAt = text.contains(GeyserUtils.getNameByPlayer(p)); } if (hasAt && Easybot.instance.getConfig().getBoolean("event.on_at.enable", true)) { @@ -185,8 +189,8 @@ public List getPlayerList() { return Bukkit.getOnlinePlayers().stream() .map(x -> { PlayerInfo info = new PlayerInfo(); - info.setPlayerName(GeyserUtils.getName(x)); - info.setPlayerUuid(GeyserUtils.getUuid(x).toString()); + info.setPlayerName(GeyserUtils.getNameByPlayer(x)); + info.setPlayerUuid(GeyserUtils.getUuid(x.getUniqueId()).toString()); info.setIp(BridgeUtils.getPlayerIp(x)); info.setBedrock(GeyserUtils.isBedrock(x)); info.setSkinUrl(SkinUtils.getSkin(x)); @@ -247,18 +251,16 @@ private BaseComponent toComponent(Segment segment) { ((FileSegment) segment).getFileUrl() )); - } else if(segment instanceof FaceSegment) { + } else if (segment instanceof FaceSegment) { component.setColor(ChatColor.GREEN); - if (ClientProfile.isHasItemsAdder() && ClientProfile.isHasQFaces()){ + if (ClientProfile.isHasItemsAdder() && ClientProfile.isHasQFaces()) { String qface = ItemsAdderUtils.getFace(Integer.parseInt(((FaceSegment) segment).getId())); - if (qface != null){ + if (qface != null) { component = new TextComponent(qface); component.setColor(ChatColor.WHITE); } } - } - else - { + } else { component.setColor(ChatColor.WHITE); } return component; diff --git a/src/main/java/com/springwater/easybot/event/PlayerEvents.java b/src/main/java/com/springwater/easybot/event/PlayerEvents.java index 7fbac55..ddd7524 100644 --- a/src/main/java/com/springwater/easybot/event/PlayerEvents.java +++ b/src/main/java/com/springwater/easybot/event/PlayerEvents.java @@ -1,5 +1,6 @@ package com.springwater.easybot.event; +import com.google.errorprone.annotations.Var; import com.springwater.easybot.Easybot; import com.springwater.easybot.bridge.packet.PlayerLoginResultPacket; import com.springwater.easybot.utils.BridgeUtils; @@ -7,53 +8,32 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerLoginEvent; public class PlayerEvents implements Listener { @EventHandler - public void onPlayerLogin(PlayerLoginEvent event) { + public void onPlayerLogin(AsyncPlayerPreLoginEvent event) { try { + String ip = event.getAddress().getHostAddress(); + String name = GeyserUtils.getName(event.getUniqueId()); + if (name == null) name = event.getPlayerProfile().getName(); + Easybot.getClient().reportPlayer(name, GeyserUtils.getUuid(event.getUniqueId()).toString(), ip); PlayerLoginResultPacket result = Easybot.getClient().login( - GeyserUtils.getName(event.getPlayer()), - GeyserUtils.getUuid(event.getPlayer()).toString() + name, + GeyserUtils.getUuid(event.getUniqueId()).toString() ); if (result.getKick()) { event.setKickMessage(result.getKickMessage()); - event.setResult(PlayerLoginEvent.Result.KICK_OTHER); + event.setLoginResult(AsyncPlayerPreLoginEvent.Result.KICK_OTHER); } } catch (Exception ex) { Easybot.instance.getLogger().severe("处理玩家登录事件遇到异常! " + ex); if (!Easybot.instance.getConfig().getBoolean("service.ignore_error")) { event.setKickMessage("§c服务器内部异常,请稍后重试!"); - event.setResult(PlayerLoginEvent.Result.KICK_OTHER); + event.setLoginResult(AsyncPlayerPreLoginEvent.Result.KICK_OTHER); } } } - - @EventHandler - public void reportPlayerOnLogin(PlayerLoginEvent event) { - String ip = BridgeUtils.getPlayerIp(event.getPlayer()); - new Thread(() -> Easybot.getClient().reportPlayer( - GeyserUtils.getName(event.getPlayer()), - GeyserUtils.getUuid(event.getPlayer()).toString(), - ip - ), "EasyBot-Thread: ReportPlayerOnLogin " + event.getPlayer().getName()).start(); - } - - @EventHandler - public void reportPlayer(PlayerJoinEvent event) { - String ip = BridgeUtils.getPlayerIp(event.getPlayer()); - new Thread(() -> { - try { - Thread.sleep(1000); - } catch (InterruptedException ex) { - ex.printStackTrace(); - } - Easybot.getClient().reportPlayer( - GeyserUtils.getName(event.getPlayer()), - GeyserUtils.getUuid(event.getPlayer()).toString(), - ip); - }, "EasyBot-Thread: ReportPlayerOnJoin " + event.getPlayer().getName()).start(); - } } diff --git a/src/main/java/com/springwater/easybot/utils/BridgeUtils.java b/src/main/java/com/springwater/easybot/utils/BridgeUtils.java index cec64d6..2491667 100644 --- a/src/main/java/com/springwater/easybot/utils/BridgeUtils.java +++ b/src/main/java/com/springwater/easybot/utils/BridgeUtils.java @@ -7,9 +7,9 @@ public class BridgeUtils { public static PlayerInfoWithRaw buildPlayerInfoFull(Player player){ PlayerInfoWithRaw playerInfoWithRaw = new PlayerInfoWithRaw(); - playerInfoWithRaw.setName(GeyserUtils.getName(player)); + playerInfoWithRaw.setName(GeyserUtils.getNameByPlayer(player)); playerInfoWithRaw.setNameRaw(GeyserUtils.getNameRaw(player)); - playerInfoWithRaw.setUuid(GeyserUtils.getUuid(player).toString()); + playerInfoWithRaw.setUuid(GeyserUtils.getUuid(player.getUniqueId()).toString()); playerInfoWithRaw.setIp(""); return playerInfoWithRaw; } diff --git a/src/main/java/com/springwater/easybot/utils/ChatCompatUtil.java b/src/main/java/com/springwater/easybot/utils/ChatCompatUtil.java new file mode 100644 index 0000000..502f442 --- /dev/null +++ b/src/main/java/com/springwater/easybot/utils/ChatCompatUtil.java @@ -0,0 +1,33 @@ +package com.springwater.easybot.utils; + +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.ComponentBuilder; + +import java.lang.reflect.Method; + +public class ChatCompatUtil { + + private static boolean appendSingleComponentExists; + private static boolean initialized = false; + + /** + * 判断 ComponentBuilder.append(BaseComponent) 是否存在 + */ + public static boolean hasAppendMethod() { + if (!initialized) { + checkMethod(); + } + return appendSingleComponentExists; + } + + private static void checkMethod() { + try { + Method method = ComponentBuilder.class.getMethod("append", BaseComponent.class); + appendSingleComponentExists = true; + } catch (NoSuchMethodException | SecurityException e) { + appendSingleComponentExists = false; + } + initialized = true; + } + +} \ No newline at end of file diff --git a/src/main/java/com/springwater/easybot/utils/GeyserUtils.java b/src/main/java/com/springwater/easybot/utils/GeyserUtils.java index 2cdb2a4..98c6d54 100644 --- a/src/main/java/com/springwater/easybot/utils/GeyserUtils.java +++ b/src/main/java/com/springwater/easybot/utils/GeyserUtils.java @@ -7,6 +7,7 @@ import org.geysermc.api.GeyserApiBase; import org.geysermc.floodgate.api.FloodgateApi; import org.geysermc.floodgate.api.player.FloodgatePlayer; +import org.jetbrains.annotations.Nullable; import java.util.UUID; @@ -25,7 +26,7 @@ public static String getNameRaw(Player player) { return player.getName(); } - public static String getName(Player player) { + public static String getNameByPlayer(Player player) { if (ClientProfile.isHasFloodgate()) { FloodgatePlayer conn = FloodgateApi.getInstance().getPlayer(player.getUniqueId()); if (conn != null) { @@ -34,15 +35,25 @@ public static String getName(Player player) { } return player.getName(); } + + public static @Nullable String getName(UUID player) { + if (ClientProfile.isHasFloodgate()) { + FloodgatePlayer conn = FloodgateApi.getInstance().getPlayer(player); + if (conn != null) { + return toggle() ? conn.getUsername() : conn.getJavaUsername(); + } + } + return null; + } - public static UUID getUuid(Player player) { - if (ClientProfile.isHasFloodgate() && toggle()) { - FloodgatePlayer conn = FloodgateApi.getInstance().getPlayer(player.getUniqueId()); + public static UUID getUuid(UUID uuid) { + if (ClientProfile.isHasFloodgate()) { + FloodgatePlayer conn = FloodgateApi.getInstance().getPlayer(uuid); if (conn != null) { return conn.getJavaUniqueId(); } } - return player.getUniqueId(); + return uuid; } public static boolean isBedrock(Player player) {