feat: 完善插件稳定性与兼容性

This commit is contained in:
2026-08-01 00:36:17 +08:00
parent f8f731f927
commit d9b1312e0c
44 changed files with 1523 additions and 471 deletions
@@ -14,6 +14,10 @@ import java.util.Map;
public final class SkinBridgeCommand extends BaseCommand implements TabCompleter {
private static final String STATUS_PERMISSION = "essentialsc.command.skin.status";
private static final String REFRESH_PERMISSION = "essentialsc.command.skin.refresh";
private static final String OTHERS_PERMISSION = "essentialsc.command.skin.others";
public SkinBridgeCommand() {
super("essentialsc.command.skin");
}
@@ -54,11 +58,29 @@ public final class SkinBridgeCommand extends BaseCommand implements TabCompleter
}
String action = args[0].toLowerCase(Locale.ROOT);
boolean targetsOther = sender instanceof Player playerSender
&& !playerSender.getUniqueId().equals(target.getUniqueId());
if (action.equals("status")) {
if (!hasPermission(sender, STATUS_PERMISSION)) {
sendNoPermission(sender, STATUS_PERMISSION);
return true;
}
if (targetsOther && !hasPermission(sender, OTHERS_PERMISSION)) {
sendNoPermission(sender, OTHERS_PERMISSION);
return true;
}
sendStatus(sender, target, manager);
return true;
}
if (action.equals("refresh")) {
if (!hasPermission(sender, REFRESH_PERMISSION)) {
sendNoPermission(sender, REFRESH_PERMISSION);
return true;
}
if (targetsOther && !hasPermission(sender, OTHERS_PERMISSION)) {
sendNoPermission(sender, OTHERS_PERMISSION);
return true;
}
sendRefreshResult(sender, target, manager.queueSync(target, true));
return true;
}
@@ -67,11 +89,15 @@ public final class SkinBridgeCommand extends BaseCommand implements TabCompleter
return true;
}
private boolean hasPermission(CommandSender sender, String permission) {
return !(sender instanceof Player) || sender.hasPermission(permission);
}
private void sendNoPermission(CommandSender sender, String permission) {
sender.sendMessage(getLang().getPrefixedString("messages.no-permission", Map.of("permission", permission)));
}
private void sendStatus(CommandSender sender, Player target, SkinBridgeManager manager) {
if (!manager.isEnabled()) {
sender.sendMessage(getLang().getPrefixedString("skin-bridge.messages.feature-disabled"));
return;
}
if (!manager.isSkinGatewayAvailable()) {
sender.sendMessage(getLang().getPrefixedString("skin-bridge.messages.dependency-missing"));
return;
@@ -85,6 +111,7 @@ public final class SkinBridgeCommand extends BaseCommand implements TabCompleter
Map<String, String> placeholders = Map.of("player", target.getName(), "provider", String.valueOf(status.providerId()));
switch (status.state()) {
case EXTERNAL -> sender.sendMessage(getLang().getPrefixedString("skin-bridge.messages.status-external", placeholders));
case EXCLUDED -> sender.sendMessage(getLang().getPrefixedString("skin-bridge.messages.status-excluded", placeholders));
case NOT_EXTERNAL -> sender.sendMessage(getLang().getPrefixedString("skin-bridge.messages.status-not-external", placeholders));
case PENDING -> sender.sendMessage(getLang().getPrefixedString("skin-bridge.messages.status-pending", placeholders));
case UNKNOWN -> sender.sendMessage(getLang().getPrefixedString("skin-bridge.messages.status-unknown", placeholders));
@@ -97,10 +124,18 @@ public final class SkinBridgeCommand extends BaseCommand implements TabCompleter
case QUEUED -> "skin-bridge.messages.refresh-queued";
case CACHED -> "skin-bridge.messages.refresh-cached";
case ALREADY_RUNNING -> "skin-bridge.messages.refresh-running";
case FEATURE_DISABLED -> "skin-bridge.messages.feature-disabled";
case EXCLUDED -> "skin-bridge.messages.refresh-excluded";
case QUEUE_FULL -> "skin-bridge.messages.queue-full";
case DEPENDENCY_MISSING -> "skin-bridge.messages.dependency-missing";
case NO_PROVIDERS -> "skin-bridge.messages.no-providers";
case REFRESH_COOLDOWN -> "skin-bridge.messages.refresh-cooldown";
};
if (result == SkinBridgeManager.SyncResult.REFRESH_COOLDOWN) {
placeholders = Map.of(
"player", target.getName(),
"seconds", String.valueOf(plugin.getSkinBridgeManager().getRemainingForceRefreshCooldownSeconds(target))
);
}
sender.sendMessage(getLang().getPrefixedString(messagePath, placeholders));
}
@@ -108,11 +143,20 @@ public final class SkinBridgeCommand extends BaseCommand implements TabCompleter
public List<String> onTabComplete(CommandSender sender, Command command, String label, String[] args) {
if (args.length == 1) {
String partial = args[0].toLowerCase(Locale.ROOT);
return List.of("status", "refresh").stream()
List<String> actions = new ArrayList<>();
if (hasPermission(sender, STATUS_PERMISSION)) {
actions.add("status");
}
if (hasPermission(sender, REFRESH_PERMISSION)) {
actions.add("refresh");
}
return actions.stream()
.filter(option -> option.startsWith(partial))
.toList();
}
if (args.length == 2 && (args[0].equalsIgnoreCase("status") || args[0].equalsIgnoreCase("refresh"))) {
if (args.length == 2 && hasPermission(sender, OTHERS_PERMISSION)
&& ((args[0].equalsIgnoreCase("status") && hasPermission(sender, STATUS_PERMISSION))
|| (args[0].equalsIgnoreCase("refresh") && hasPermission(sender, REFRESH_PERMISSION)))) {
String partial = args[1].toLowerCase(Locale.ROOT);
List<String> players = new ArrayList<>();
for (Player onlinePlayer : Bukkit.getOnlinePlayers()) {