From 920c7c5a9b9aa80e5d9123ecd5f26f3a071cd407 Mon Sep 17 00:00:00 2001 From: ypsdf1 Date: Thu, 30 Apr 2026 19:20:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E8=BF=9C=E7=A8=8B=E4=BB=93?= =?UTF-8?q?=E5=BA=93=20-=20=E7=A7=BB=E9=99=A4myplugin=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/myplugin/Main.java | 283 --------------------------- src/main/resources/plugin.yml | 13 +- 2 files changed, 11 insertions(+), 285 deletions(-) delete mode 100644 src/main/java/com/myplugin/Main.java diff --git a/src/main/java/com/myplugin/Main.java b/src/main/java/com/myplugin/Main.java deleted file mode 100644 index 9f81e70..0000000 --- a/src/main/java/com/myplugin/Main.java +++ /dev/null @@ -1,283 +0,0 @@ -package com.myplugin; - -import org.bukkit.Bukkit; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.command.TabCompleter; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.scoreboard.Objective; -import org.bukkit.scoreboard.Scoreboard; - -import javax.net.ssl.*; -import java.io.BufferedReader; -import java.io.File; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.URL; -import java.security.cert.X509Certificate; -import java.util.*; -import java.util.concurrent.atomic.AtomicInteger; - -public class Main extends JavaPlugin implements Listener, CommandExecutor, TabCompleter { - - private final Set waitingPlayers = new HashSet<>(); - private final String repoURL = "https://api.github.com/repos/ypsdf1/sdf1_plugn/releases/latest"; - private final AtomicInteger failedAttempts = new AtomicInteger(0); - private boolean circuitBroken = false; - - @Override - public void onEnable() { - // 强制初始化插件文件夹为 sdf1,防止产生 myplugn 文件夹 - if (!getDataFolder().exists()) { - getDataFolder().mkdir(); - } - saveDefaultConfig(); - - getServer().getPluginManager().registerEvents(this, this); - if (getCommand("sdf1") != null) { - getCommand("sdf1").setExecutor(this); - getCommand("sdf1").setTabCompleter(this); - } - - // 忽略 SSL 证书校验(核心修复:解决 PKIX 报错) - trustAllHttpsCertificates(); - - Bukkit.getScheduler().runTaskLater(this, () -> triggerAutoUpdate(Bukkit.getConsoleSender()), 40L); - getLogger().info("sdf1 插件已启动。SSL 证书兼容补丁已加载。"); - } - - // --- SSL 证书忽略逻辑 --- - private void trustAllHttpsCertificates() { - try { - TrustManager[] trustAllCerts = new TrustManager[]{ - new X509TrustManager() { - public X509Certificate[] getAcceptedIssuers() { return null; } - public void checkClientTrusted(X509Certificate[] certs, String authType) {} - public void checkServerTrusted(X509Certificate[] certs, String authType) {} - } - }; - SSLContext sc = SSLContext.getInstance("SSL"); - sc.init(null, trustAllCerts, new java.security.SecureRandom()); - HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); - HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true); - } catch (Exception ignored) {} - } - - private void triggerAutoUpdate(CommandSender sender) { - String ver = getConfig().getString("version", "1.0"); - if (!getConfig().getBoolean("check-update", true) || ver.equalsIgnoreCase("999") || ver.equalsIgnoreCase("false")) { - return; - } - if (circuitBroken) return; - checkUpdate(sender, false); - } - - @EventHandler - public void onPlayerJoin(PlayerJoinEvent event) { - triggerAutoUpdate(Bukkit.getConsoleSender()); - } - - private String parse(String path, Map vars) { - String raw = getConfig().getString("messages." + path, "Missing: " + path); - String msg = raw.replace("&", "§"); - msg = msg.replace("{board}", getConfig().getString("scoreboard-names.main", "abc")); - msg = msg.replace("{version}", getConfig().getString("version", "1.0")); - if (vars != null) { - for (Map.Entry entry : vars.entrySet()) { - msg = msg.replace("{" + entry.getKey() + "}", entry.getValue() == null ? "NULL" : entry.getValue()); - } - } - return msg; - } - - private String normalize(String s) { - return (s == null) ? "" : s.replaceAll("[^a-zA-Z0-9]", "").toUpperCase(); - } - - private boolean isAdmin(CommandSender sender) { - if (sender instanceof ConsoleCommandSender || sender.isOp()) return true; - String raw = getConfig().getString("admin-whitelist", ""); - return Arrays.asList(raw.split(",")).stream().anyMatch(n -> n.trim().equalsIgnoreCase(sender.getName())); - } - - @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - if (!command.getName().equalsIgnoreCase("sdf1")) return false; - - if (args.length > 0) { - if (!isAdmin(sender)) { - sender.sendMessage(parse("no-permission", null)); - return true; - } - String sub = args[0].toLowerCase(); - if (sub.equals("reload")) { - reloadConfig(); - sender.sendMessage("§a[sdf1] 配置重载成功!"); - return true; - } else if (sub.equals("update")) { - circuitBroken = false; - failedAttempts.set(0); - sender.sendMessage("§b[sdf1] 正在手动连接 GitHub 仓库..."); - checkUpdate(sender, true); - return true; - } else if (sub.equals("admin")) { - if (args.length >= 3 && (sender instanceof ConsoleCommandSender || sender.isOp())) { - updateAdmin(args[1], args[2]); - sender.sendMessage("§a[sdf1] 管理员名单已更新。"); - } - return true; - } - return true; - } - - if (!(sender instanceof Player)) { - sender.sendMessage(parse("only-player", null)); - return true; - } - - Player p = (Player) sender; - waitingPlayers.add(p.getUniqueId()); - p.sendMessage(parse("input-hint", null)); - return true; - } - - private void updateAdmin(String action, String target) { - String raw = getConfig().getString("admin-whitelist", ""); - List list = new ArrayList<>(); - if (!raw.isEmpty()) list.addAll(Arrays.asList(raw.split(","))); - if (action.equalsIgnoreCase("add")) { if (!list.contains(target)) list.add(target); } - else if (action.equalsIgnoreCase("remove")) { list.remove(target); } - getConfig().set("admin-whitelist", String.join(",", list)); - saveConfig(); - } - - @EventHandler - public void onPlayerChat(AsyncPlayerChatEvent event) { - Player player = event.getPlayer(); - if (!waitingPlayers.contains(player.getUniqueId())) return; - event.setCancelled(true); - String userInput = event.getMessage().trim(); - waitingPlayers.remove(player.getUniqueId()); - - if (userInput.equals("0")) { - player.sendMessage(parse("cancel-msg", null)); - return; - } - - Scoreboard sb = Bukkit.getScoreboardManager().getMainScoreboard(); - Objective objM = sb.getObjective(getConfig().getString("scoreboard-names.main", "abc")); - if (objM == null) { player.sendMessage(parse("system-issue", null)); return; } - - String finalKey = null; - for (String entry : sb.getEntries()) { - if (entry.equals(userInput) || normalize(entry).equals(normalize(userInput))) { - finalKey = entry; - break; - } - } - - Map v = new HashMap<>(); - v.put("name", userInput); - v.put("entry", finalKey); - - if (finalKey == null) { - player.sendMessage(parse("not-found", v)); - return; - } - - int score = objM.getScore(finalKey).getScore(); - v.put("score", String.valueOf(score)); - - if (score == -1) { - player.sendMessage(parse("used-up", v)); - } else if (score == 0) { - Objective objR = sb.getObjective(getConfig().getString("scoreboard-names.record", "def")); - if (objR == null) { player.sendMessage(parse("system-issue", v)); return; } - String recName = finalKey + "_" + player.getName(); - if (objR.getScore(recName).getScore() != 0) { - player.sendMessage(parse("already-claimed", v)); - } else { - double amt = getConfig().getDouble("reward-rules.0", 10.0); - v.put("amount", String.valueOf(amt)); - pay(player, amt, v); - objR.getScore(recName).setScore(1); - } - } else { - String sk = String.valueOf(score); - if (getConfig().contains("reward-rules." + sk)) { - double amt = getConfig().getDouble("reward-rules." + sk); - v.put("amount", String.valueOf(amt)); - pay(player, amt, v); - objM.getScore(finalKey).setScore(-1); - } else { - player.sendMessage(parse("system-issue", v)); - } - } - } - - private void pay(Player p, double amt, Map v) { - p.sendMessage(parse("success-pay", v)); - Bukkit.getScheduler().runTask(this, () -> - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "eco give " + p.getName() + " " + amt)); - } - - private void checkUpdate(CommandSender sender, boolean manual) { - String currentVer = getConfig().getString("version", "1.0"); - Bukkit.getScheduler().runTaskAsynchronously(this, () -> { - try { - HttpURLConnection conn = (HttpURLConnection) new URL(repoURL).openConnection(); - conn.setRequestMethod("GET"); - conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) sdf1-plugin"); - conn.setConnectTimeout(8000); - conn.setReadTimeout(8000); - - if (conn.getResponseCode() != 200) throw new Exception("HTTP " + conn.getResponseCode()); - - BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); - StringBuilder response = new StringBuilder(); - String inputLine; - while ((inputLine = in.readLine()) != null) response.append(inputLine); - in.close(); - - String content = response.toString(); - if (!content.contains("\"tag_name\":\"")) throw new Exception("No tag found"); - String latest = content.split("\"tag_name\":\"")[1].split("\"")[0].replace("v", ""); - - failedAttempts.set(0); - Bukkit.getScheduler().runTask(this, () -> { - if (!latest.equals(currentVer)) { - Map v = new HashMap<>(); - v.put("latest", latest); - sender.sendMessage(parse("update-found", v)); - } else if (manual) { - sender.sendMessage(parse("update-latest", null)); - } - }); - } catch (Exception e) { - int count = failedAttempts.incrementAndGet(); - if (count >= 3 && !circuitBroken) { - circuitBroken = true; - Bukkit.getScheduler().runTask(this, () -> getLogger().warning(parse("update-circuit-break", null))); - } - if (manual) { - Bukkit.getScheduler().runTask(this, () -> sender.sendMessage("§c[sdf1] 检查更新时发生异常 (PKIX/网络): " + e.getMessage())); - } - } - }); - } - - @Override - public List onTabComplete(CommandSender s, Command c, String a, String[] args) { - if (args.length == 1 && isAdmin(s)) return Arrays.asList("reload", "admin", "update"); - if (args.length == 2 && args[0].equalsIgnoreCase("admin")) return Arrays.asList("add", "remove"); - return null; - } -} \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index fb7836a..cf8a3a7 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -6,5 +6,14 @@ api-version: 1.21 softdepend: [CY_beibao] commands: sdf1: - description: 主控激活口令指令 - usage: /sdf1 \ No newline at end of file + description: 主命令 + usage: /sdf1 + permission: cy.use + permission-message: §c你没有权限使用此命令 +permissions: + sdf1.use: + description: 使用 /sdf1 基础命令 + default: true + sdf1.admin: + description: 管理员权限(reload/update) + default: op