Sync with remote - remove myplugin refs
This commit is contained in:
@@ -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<UUID> 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<String, String> 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<String, String> 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<String> 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<String, String> 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<String, String> 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<String, String> 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<String> 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;
|
||||
}
|
||||
}
|
||||
@@ -6,5 +6,14 @@ api-version: 1.21
|
||||
softdepend: [CY_beibao]
|
||||
commands:
|
||||
sdf1:
|
||||
description: 主控激活口令指令
|
||||
usage: /sdf1
|
||||
description: 主命令
|
||||
usage: /sdf1
|
||||
permission: cy.use
|
||||
permission-message: §c你没有权限使用此命令
|
||||
permissions:
|
||||
sdf1.use:
|
||||
description: 使用 /sdf1 基础命令
|
||||
default: true
|
||||
sdf1.admin:
|
||||
description: 管理员权限(reload/update)
|
||||
default: op
|
||||
|
||||
Reference in New Issue
Block a user