Upload folder via GUI - src

This commit is contained in:
Git Manager GUI
2026-04-30 10:07:36 +02:00
parent 8c6751c63c
commit 7f0ebc4590
5 changed files with 43 additions and 13 deletions

View File

@@ -446,7 +446,7 @@ public class TicketCommand implements CommandExecutor, TabCompleter {
// ── /ticket forward ─────────────────────────────────────────────────── // ── /ticket forward ───────────────────────────────────────────────────
private void handleForward(Player player, String[] args) { private void handleForward(Player player, String[] args) {
if (!player.hasPermission("ticket.admin")) { if (!player.hasPermission("ticket.support") && !player.hasPermission("ticket.admin")) {
plugin.lang().send(player, "general.no-permission"); return; plugin.lang().send(player, "general.no-permission"); return;
} }
if (args.length < 3) { player.sendMessage(plugin.lang().get("forward.usage")); return; } if (args.length < 3) { player.sendMessage(plugin.lang().get("forward.usage")); return; }
@@ -454,27 +454,50 @@ public class TicketCommand implements CommandExecutor, TabCompleter {
try { id = Integer.parseInt(args[1]); } try { id = Integer.parseInt(args[1]); }
catch (NumberFormatException e) { plugin.lang().send(player, "general.invalid-id"); return; } catch (NumberFormatException e) { plugin.lang().send(player, "general.invalid-id"); return; }
Player target = Bukkit.getPlayer(args[2]); String targetName = args[2];
if (target == null) {
// Selbst-Weiterleitung verhindern
if (targetName.equalsIgnoreCase(player.getName())) {
plugin.lang().send(player, "forward.cannot-self"); return;
}
// Ziel-Spieler auflösen: zuerst online prüfen, dann OfflinePlayer
Player onlineTarget = Bukkit.getPlayer(targetName);
// Wenn online: Permission-Prüfung direkt möglich
if (onlineTarget != null) {
if (!onlineTarget.hasPermission("ticket.support") && !onlineTarget.hasPermission("ticket.admin")) {
plugin.lang().send(player, "forward.not-a-supporter"); return;
}
}
@SuppressWarnings("deprecation")
OfflinePlayer offlineTarget = onlineTarget != null
? onlineTarget
: Bukkit.getOfflinePlayer(targetName);
// Spieler komplett unbekannt (hasPlayedBefore = false, nicht online)
if (!offlineTarget.hasPlayedBefore() && !offlineTarget.isOnline()) {
player.sendMessage(plugin.isBungeeCordEnabled() player.sendMessage(plugin.isBungeeCordEnabled()
? plugin.lang().format("forward.bungee-offline", "{player}", args[2]) ? plugin.lang().format("forward.bungee-offline", "{player}", targetName)
: plugin.lang().get("forward.local-not-found")); : plugin.lang().get("forward.local-not-found"));
return; return;
} }
final int ticketId = id; final int ticketId = id;
final String fromName = player.getName(); final String fromName = player.getName();
final Player t = target; final UUID targetUUID = offlineTarget.getUniqueId();
final String resolvedName = offlineTarget.getName() != null ? offlineTarget.getName() : targetName;
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
boolean ok = plugin.getDatabaseManager().forwardTicket(ticketId, t.getUniqueId(), t.getName()); boolean ok = plugin.getDatabaseManager().forwardTicket(ticketId, targetUUID, resolvedName);
plugin.getTicketCache().invalidate(ticketId); plugin.getTicketCache().invalidate(ticketId);
Bukkit.getScheduler().runTask(plugin, () -> { Bukkit.getScheduler().runTask(plugin, () -> {
if (!ok) { plugin.lang().send(player, "general.ticket-not-found"); return; } if (!ok) { plugin.lang().send(player, "general.ticket-not-found"); return; }
Ticket ticket = getCachedOrFetch(ticketId); Ticket ticket = getCachedOrFetch(ticketId);
if (ticket == null) return; if (ticket == null) return;
player.sendMessage(plugin.lang().format("ticket.forwarded", player.sendMessage(plugin.lang().format("ticket.forwarded",
"{id}", String.valueOf(ticketId), "{player}", t.getName())); "{id}", String.valueOf(ticketId), "{player}", resolvedName));
plugin.getTicketManager().notifyForwardedTo(ticket, fromName); plugin.getTicketManager().notifyForwardedTo(ticket, fromName);
plugin.getTicketManager().notifyCreatorForwarded(ticket); plugin.getTicketManager().notifyCreatorForwarded(ticket);
}); });
@@ -1357,8 +1380,11 @@ public class TicketCommand implements CommandExecutor, TabCompleter {
completions.addAll(getPriorityInputsForTab(args[2])); completions.addAll(getPriorityInputsForTab(args[2]));
} else if (args.length == 3 && normalize(args[0]).equals("forward")) { } else if (args.length == 3 && normalize(args[0]).equals("forward")) {
for (Player p : Bukkit.getOnlinePlayers()) for (Player p : Bukkit.getOnlinePlayers()) {
if (p.equals(player)) continue; // Selbst-Forward ausblenden
if (!p.hasPermission("ticket.support") && !p.hasPermission("ticket.admin")) continue;
if (p.getName().toLowerCase().startsWith(args[2].toLowerCase())) completions.add(p.getName()); if (p.getName().toLowerCase().startsWith(args[2].toLowerCase())) completions.add(p.getName());
}
} else if (args.length == 2 && normalize(args[0]).equals("blacklist")) { } else if (args.length == 2 && normalize(args[0]).equals("blacklist")) {
if (useEn) completions.addAll(List.of("add", "remove", "list")); if (useEn) completions.addAll(List.of("add", "remove", "list"));

View File

@@ -274,9 +274,9 @@ public class TicketManager {
if (player.hasPermission("ticket.support") || player.hasPermission("ticket.admin")) { if (player.hasPermission("ticket.support") || player.hasPermission("ticket.admin")) {
plugin.lang().send(player, "help.claim"); plugin.lang().send(player, "help.claim");
plugin.lang().send(player, "help.close"); plugin.lang().send(player, "help.close");
plugin.lang().send(player, "help.forward");
} }
if (player.hasPermission("ticket.admin")) { if (player.hasPermission("ticket.admin")) {
plugin.lang().send(player, "help.forward");
plugin.lang().send(player, "help.blacklist"); plugin.lang().send(player, "help.blacklist");
plugin.lang().send(player, "help.reload"); plugin.lang().send(player, "help.reload");
plugin.lang().send(player, "help.stats"); plugin.lang().send(player, "help.stats");

View File

@@ -111,6 +111,8 @@ forward:
usage: "&cBenutzung: {cmd_forward} <ID> <Spieler>" usage: "&cBenutzung: {cmd_forward} <ID> <Spieler>"
bungee-offline: "&7[BungeeCord] Spieler &e{player} &7ist auf diesem Server nicht online." bungee-offline: "&7[BungeeCord] Spieler &e{player} &7ist auf diesem Server nicht online."
local-not-found: "&cSpieler nicht gefunden!" local-not-found: "&cSpieler nicht gefunden!"
not-a-supporter: "&cDieser Spieler hat keine Supporter-Berechtigung!"
cannot-self: "&cDu kannst ein Ticket nicht an dich selbst weiterleiten!"
# ============================================================ # ============================================================
# KOMMENTARE # KOMMENTARE

View File

@@ -111,6 +111,8 @@ forward:
usage: "&cUsage: {cmd_forward} <ID> <player>" usage: "&cUsage: {cmd_forward} <ID> <player>"
bungee-offline: "&7[BungeeCord] Player &e{player} &7is not online on this server." bungee-offline: "&7[BungeeCord] Player &e{player} &7is not online on this server."
local-not-found: "&cPlayer not found!" local-not-found: "&cPlayer not found!"
not-a-supporter: "&cThis player does not have supporter permission!"
cannot-self: "&cYou cannot forward a ticket to yourself!"
# ============================================================ # ============================================================
# COMMENTS # COMMENTS

View File

@@ -1,5 +1,5 @@
name: TicketSystem name: TicketSystem
version: 1.1.6 version: 1.1.7
main: de.ticketsystem.TicketPlugin main: de.ticketsystem.TicketPlugin
api-version: 1.20 api-version: 1.20
author: M_Viper author: M_Viper
@@ -39,7 +39,7 @@ permissions:
# ── Supporter-Permissions ───────────────────────────────────────────────── # ── Supporter-Permissions ─────────────────────────────────────────────────
ticket.support: ticket.support:
description: Supporter kann Tickets einsehen, claimen und schließen description: Supporter kann Tickets einsehen, claimen, schließen und weiterleiten
default: false default: false
ticket.archive: ticket.archive: