Upload folder via GUI - src

This commit is contained in:
Git Manager GUI
2026-05-26 16:52:40 +02:00
parent 45e1e3cbc0
commit 41d0d80811
5 changed files with 359 additions and 18 deletions

View File

@@ -11,7 +11,8 @@ import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.time.LocalDateTime; import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
/** /**
@@ -21,13 +22,15 @@ import java.time.format.DateTimeFormatter;
public class PlayerLoginLogger implements Listener { public class PlayerLoginLogger implements Listener {
private static final DateTimeFormatter FMT = private static final DateTimeFormatter FMT =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");
private final Plugin plugin; private final Plugin plugin;
private final File logFile; private final File logFile;
private final ZoneId zoneId;
public PlayerLoginLogger(Plugin plugin) { public PlayerLoginLogger(Plugin plugin, ZoneId zoneId) {
this.plugin = plugin; this.plugin = plugin;
this.zoneId = zoneId;
this.logFile = new File(plugin.getDataFolder(), "player-logins.log"); this.logFile = new File(plugin.getDataFolder(), "player-logins.log");
// Sicherstellen, dass das Plugin-Verzeichnis existiert // Sicherstellen, dass das Plugin-Verzeichnis existiert
@@ -53,7 +56,7 @@ public class PlayerLoginLogger implements Listener {
plugin.getLogger().warning("[PlayerLoginLogger] Konnte IP nicht lesen: " + e.getMessage()); plugin.getLogger().warning("[PlayerLoginLogger] Konnte IP nicht lesen: " + e.getMessage());
} }
String timestamp = LocalDateTime.now().format(FMT); String timestamp = ZonedDateTime.now(zoneId).format(FMT);
String line = String.format("[%s] UUID=%s | Name=%-16s | IP=%s", String line = String.format("[%s] UUID=%s | Name=%-16s | IP=%s",
timestamp, uuid, name, ip); timestamp, uuid, name, ip);

View File

@@ -154,9 +154,18 @@ public class StatusAPI extends Plugin implements Runnable {
// PlayerLoginLogger: schreibt UUID, Name und IP bei jedem Join in player-logins.log // PlayerLoginLogger: schreibt UUID, Name und IP bei jedem Join in player-logins.log
// Aktivieren: LOGIN_LOGGER_ENABLED = true setzen und neu kompilieren // Aktivieren: LOGIN_LOGGER_ENABLED = true setzen und neu kompilieren
if (LOGIN_LOGGER_ENABLED) { if (LOGIN_LOGGER_ENABLED) {
PlayerLoginLogger loginLogger = new PlayerLoginLogger(this); Properties loginProps = loadNetworkGuardProperties();
String tzRaw = loginProps.getProperty("login.log.timezone", "UTC").trim();
java.time.ZoneId loginZone;
try {
loginZone = java.time.ZoneId.of(tzRaw);
} catch (java.time.zone.ZoneRulesException e) {
getLogger().warning("[PlayerLoginLogger] Unbekannte Zeitzone '" + tzRaw + "' fallback auf UTC.");
loginZone = java.time.ZoneId.of("UTC");
}
PlayerLoginLogger loginLogger = new PlayerLoginLogger(this, loginZone);
ProxyServer.getInstance().getPluginManager().registerListener(this, loginLogger); ProxyServer.getInstance().getPluginManager().registerListener(this, loginLogger);
getLogger().info("[PlayerLoginLogger] Login-Logging aktiv -> " + getDataFolder() + "/player-logins.log"); getLogger().info("[PlayerLoginLogger] Login-Logging aktiv -> " + getDataFolder() + "/player-logins.log (Zeitzone: " + loginZone + ")");
} }
// FIX: ScoreboardModule mit NetworkInfoModule verbinden (TPS-Fallback) // FIX: ScoreboardModule mit NetworkInfoModule verbinden (TPS-Fallback)

View File

@@ -6,7 +6,7 @@ networkinfo.command.enabled=true
# Aus Datenschutzgruenden standardmaessig aus. Wenn true, erscheinen alle Spielernamen im JSON. # Aus Datenschutzgruenden standardmaessig aus. Wenn true, erscheinen alle Spielernamen im JSON.
networkinfo.include_player_names=false networkinfo.include_player_names=false
# Discord Webhook fuer Status-, Warn- und Attack-Meldungen # Discord Webhook für Status-, Warn- und Attack-Meldungen
networkinfo.webhook.enabled=false networkinfo.webhook.enabled=false
networkinfo.webhook.url= networkinfo.webhook.url=
networkinfo.webhook.username= networkinfo.webhook.username=
@@ -31,6 +31,10 @@ networkinfo.attack.source=
# API-Key fuer POST /network/attack # API-Key fuer POST /network/attack
networkinfo.attack.api_key= networkinfo.attack.api_key=
# Zeitzone (IANA-Format, z.B. Europe/Berlin, UTC, America/New_York)
# Vollstaendige Liste: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
login.log.timezone=Europe/Berlin
# =========================== # ===========================
# ANTIBOT / ATTACK GUARD # ANTIBOT / ATTACK GUARD
# =========================== # ===========================
@@ -89,8 +93,8 @@ antibot.learning.recent_events.limit=30
# =========================== # ===========================
# Diese Werte koennen von BackendJoinGuard im StatusAPI-Sync-Modus abgeholt werden. # Diese Werte koennen von BackendJoinGuard im StatusAPI-Sync-Modus abgeholt werden.
# Standalone bleibt weiterhin moeglich. # Standalone bleibt weiterhin moeglich.
backendguard.enforcement_enabled=true backendguard.enforcement_enabled=false
backendguard.log_blocked_attempts=true backendguard.log_blocked_attempts=false
backendguard.kick_message=&cBitte verbinde dich nur über den Proxy-Server. backendguard.kick_message=&cBitte verbinde dich nur über den Proxy-Server.
# Wichtig: Hier nur echte Proxy-IP(s) eintragen. # Wichtig: Hier nur echte Proxy-IP(s) eintragen.
backendguard.allowed_proxy_ips=127.0.0.1,::1,10.0.0.10 backendguard.allowed_proxy_ips=127.0.0.1,::1,10.0.0.10
@@ -105,13 +109,13 @@ backendguard.sync.api_key=
# MULTI ACCOUNT GUARD # MULTI ACCOUNT GUARD
# =========================== # ===========================
# Verhindert, dass ein Spieler mit zwei Accounts gleichzeitig online ist. # Verhindert, dass ein Spieler mit zwei Accounts gleichzeitig online ist.
multiaccountguard.enabled=true multiaccountguard.enabled=false
# IP-Check: Gleiche IP mit unterschiedlichem Namen -> blockieren # IP-Check: Gleiche IP mit unterschiedlichem Namen -> blockieren
multiaccountguard.check_ip=true multiaccountguard.check_ip=false
# UUID-Check: Gleiche UUID mit unterschiedlichem Namen -> blockieren (Bedrock-Edge-Cases) # UUID-Check: Gleiche UUID mit unterschiedlichem Namen -> blockieren (Bedrock-Edge-Cases)
multiaccountguard.check_uuid=true multiaccountguard.check_uuid=false
# true = bestehenden (alten) Account rauswerfen, neuen reinlassen # true = bestehenden (alten) Account rauswerfen, neuen reinlassen
# false = neuen Account blockieren (Standard) # false = neuen Account blockieren (Standard)
@@ -121,15 +125,16 @@ multiaccountguard.kick_existing=false
multiaccountguard.kick_message=&cDu bist bereits mit einem anderen Account online!\n&7Bitte trenne deinen anderen Account zuerst. multiaccountguard.kick_message=&cDu bist bereits mit einem anderen Account online!\n&7Bitte trenne deinen anderen Account zuerst.
# Staff-Benachrichtigung bei Konflikt (Permission: statusapi.staff.notify) # Staff-Benachrichtigung bei Konflikt (Permission: statusapi.staff.notify)
multiaccountguard.staff_notify.enabled=true multiaccountguard.staff_notify.enabled=false
multiaccountguard.staff_notify.format=&8[&cMAG&8] &e{blocked} &7wurde blockiert &8(2. Account von &e{existing}&8) &7| IP: &f{ip} multiaccountguard.staff_notify.format=&8[&cMAG&8] &e{blocked} &7wurde blockiert &8(2. Account von &e{existing}&8) &7| IP: &f{ip}
# Temporaerer IP-Bann nach X Versuchen (Integration mit AntiBotModule) # Temporaerer IP-Bann nach X Versuchen (Integration mit AntiBotModule)
# max_attempts: Anzahl Konflikte bevor die IP gebannt wird # max_attempts: Anzahl Konflikte bevor die IP gebannt wird
# duration_secs: Bann-Dauer in Sekunden # duration_secs: Bann-Dauer in Sekunden
multiaccountguard.tempban.enabled=true multiaccountguard.tempban.enabled=false
multiaccountguard.tempban.max_attempts=3 multiaccountguard.tempban.max_attempts=3
multiaccountguard.tempban.duration_secs=300 multiaccountguard.tempban.duration_secs=300
# Discord-Meldung bei jedem Konflikt (nutzt networkinfo.webhook.url automatisch) # Discord-Meldung bei jedem Konflikt (nutzt networkinfo.webhook.url automatisch)
multiaccountguard.webhook.enabled=true multiaccountguard.webhook.enabled=false

View File

@@ -211,9 +211,11 @@ commands:
permissions: permissions:
# ── AfkModule ────────────────────────────────────────────── # ── AfkModule ──────────────────────────────────────────────
# KEIN default Permission muss manuell vergeben werden!
# lp user <Name> permission set statusapi.afk.bypass true
statusapi.afk.bypass: statusapi.afk.bypass:
description: Automatisches AFK nach Inaktivität umgehen description: Automatisches AFK nach Inaktivität umgehen (nur manuell vergeben)
default: op default: false
# ── StatusAPI Core ──────────────────────────────────────── # ── StatusAPI Core ────────────────────────────────────────
statusapi.admin: statusapi.admin:

View File

@@ -0,0 +1,322 @@
name: StatusAPI
main: net.viper.status.StatusAPI
version: 4.1.4
author: M_Viper
description: StatusAPI für BungeeCord inkl. Update-Checker, Modul-System und ChatModule
# Mindestanforderung: Minecraft 1.20 / BungeeCord mit PlayerChatEvent-Unterstützung
softdepend:
- LuckPerms
- Geyser-BungeeCord
commands:
# ── AfkModule ──────────────────────────────────────────────
afk:
description: AFK-Modus ein- oder ausschalten
usage: /afk
# ── HelpModule ────────────────────────────────────────────
help:
description: Zeigt alle verfügbaren Befehle (Admin-Befehle nur mit Berechtigung)
usage: /<command> help
# Hinweis: Der Befehlsname ist in verify.properties unter statusapi.help konfigurierbar
# Beispiel: statusapi.help=vn → /vn help
# ── ScoreboardModule ──────────────────────────────────────
scoreboard:
description: Scoreboard ein-/ausblenden oder zwischen Player/Admin wechseln
usage: /scoreboard [hide|show|player|admin]
aliases: [sb, togglesb]
# ── StatusAPI Admin ───────────────────────────────────────
statusapi:
description: StatusAPI verwalten (Reload, Info)
usage: /statusapi reload
aliases: [sapi]
permission: statusapi.admin
# /pay und /ecoadmin werden von NexEco (Spigot) verwaltet
# ── VanishModule ──────────────────────────────────────────
vanish:
description: Vanish ein-/ausschalten
usage: /vanish [Spieler]
aliases: [v]
vanishlist:
description: Alle unsichtbaren Spieler anzeigen
usage: /vanishlist
aliases: [vlist]
# ── Verify Modul ──────────────────────────────────────────
verify:
description: Verifiziere dich mit einem Token
usage: /verify <token>
# ── ForumBridge Modul ─────────────────────────────────────
forumlink:
description: Verknüpfe deinen Minecraft-Account mit dem Forum
usage: /forumlink <token>
aliases: [fl]
forum:
description: Zeigt ausstehende Forum-Benachrichtigungen an
usage: /forum
# ── NetworkInfo Modul ─────────────────────────────────────
netinfo:
description: Zeigt erweiterte Proxy- und Systeminfos an
usage: /netinfo
antibot:
description: Zeigt AntiBot-Status und Verwaltung
usage: /antibot <status|clearblocks|unblock|profile|reload>
# ── AutoMessage Modul ─────────────────────────────────────
automessage:
description: AutoMessage Verwaltung
usage: /automessage reload
# ── ChatModule Kanal ────────────────────────────────────
channel:
description: Kanal wechseln oder Kanalliste anzeigen
usage: /channel [kanalname]
aliases: [ch, kanal]
# ── ChatModule HelpOp ───────────────────────────────────
helpop:
description: Sende eine Hilfeanfrage an das Team
usage: /helpop <Nachricht>
# ── ChatModule Privat-Nachrichten ───────────────────────
msg:
description: Sende eine private Nachricht
usage: /msg <Spieler> <Nachricht>
aliases: [tell, w, whisper]
r:
description: Antworte auf die letzte private Nachricht
usage: /r <Nachricht>
aliases: [reply, antwort]
# ── ChatModule Blockieren ───────────────────────────────
ignore:
description: Spieler ignorieren
usage: /ignore <Spieler>
aliases: [block]
unignore:
description: Spieler nicht mehr ignorieren
usage: /unignore <Spieler>
aliases: [unblock]
# ── ChatModule Mute (Admin) ─────────────────────────────
chatmute:
description: Spieler im Chat stumm schalten
usage: /chatmute <Spieler> [Minuten]
aliases: [gmute]
chatunmute:
description: Chat-Stummschaltung aufheben
usage: /chatunmute <Spieler>
aliases: [gunmute]
# ── ChatModule Selbst-Mute ──────────────────────────────
chataus:
description: Eigenen Chat-Empfang ein-/ausschalten
usage: /chataus
aliases: [togglechat, chaton, chatoff]
# ── ChatModule Broadcast ────────────────────────────────
broadcast:
description: Nachricht an alle Spieler senden
usage: /broadcast <Nachricht>
aliases: [bc, alert]
# ── ChatModule Emoji ────────────────────────────────────
emoji:
description: Liste aller verfügbaren Emojis
usage: /emoji
aliases: [emojis]
# ── ChatModule Social Spy ───────────────────────────────
socialspy:
description: Private Nachrichten mitlesen (Admin)
usage: /socialspy
aliases: [spy]
# ── ChatModule Reload ───────────────────────────────────
chatreload:
description: Chat-Konfiguration neu laden
usage: /chatreload
# ── ChatModule Admin-Info ───────────────────────────────
chatinfo:
description: Chat-Informationen ueber einen Spieler anzeigen (Admin)
usage: /chatinfo <Spieler>
# ── ChatModule Chat-History ─────────────────────────────
chathist:
description: Chat-History aus dem Logfile anzeigen (Admin)
usage: /chathist [Spieler] [Anzahl]
# ── ChatModule Mentions ─────────────────────────────────
mentions:
description: Mention-Benachrichtigungen ein-/ausschalten
usage: /mentions
aliases: [mention]
# ── ChatModule Plugin-Bypass ────────────────────────────
chatbypass:
description: ChatModule fuer naechste Eingabe ueberspringen (fuer Plugin-Dialoge wie CMI)
usage: /chatbypass
aliases: [cbp]
# ── ChatModule Account-Verknuepfung ─────────────────────
# FIX #4: Command-Namen stimmen jetzt mit der Code-Registrierung überein.
# Im ChatModule wird "discordlink" mit Alias "dlink" registriert,
# und "telegramlink" mit Alias "tlink".
discordlink:
description: Minecraft-Account mit Discord verknuepfen
usage: /discordlink
aliases: [dlink]
telegramlink:
description: Minecraft-Account mit Telegram verknuepfen
usage: /telegramlink
aliases: [tlink]
unlink:
description: Account-Verknuepfung aufheben
usage: /unlink <discord|telegram|all>
# ── ChatModule Report ───────────────────────────────────
report:
description: Spieler melden
usage: /report <Spieler> <Grund>
reports:
description: Offene Reports anzeigen (Admin)
usage: /reports [all]
reportclose:
description: Report schliessen (Admin)
usage: /reportclose <ID>
# ── ServerSwitcherModule ──────────────────────────────────
go:
description: Schneller Serverwechsel ueber Chat-Menue oder direkt
usage: /go [servername]
aliases: [wechsel, switch]
permissions:
# ── AfkModule ──────────────────────────────────────────────
statusapi.afk.bypass:
description: Automatisches AFK nach Inaktivität umgehen
default: op
# ── StatusAPI Core ────────────────────────────────────────
statusapi.admin:
description: Zugang zu StatusAPI-Administrationsbefehlen (reload etc.)
default: op
statusapi.update.notify:
description: Erlaubt Update-Benachrichtigungen
default: op
statusapi.netinfo:
description: Zugriff auf /netinfo
default: op
statusapi.antibot:
description: Zugriff auf /antibot
default: op
statusapi.automessage:
description: Zugriff auf /automessage reload
default: op
# ── MultiAccountGuard ─────────────────────────────────────
# KEIN default Permission muss manuell vergeben werden!
# lp user <Name> permission set statusapi.multiaccountguard.bypass true
statusapi.multiaccountguard.bypass:
description: Erlaubt mehrere gleichzeitige Accounts (nur manuell vergeben)
statusapi.staff.notify:
description: Empfaengt Ingame-Benachrichtigungen vom MultiAccountGuard
default: false
# ── ChatModule Kanaele ──────────────────────────────────
chat.channel.local:
description: Zugang zum Local-Kanal
default: true
chat.channel.trade:
description: Zugang zum Trade-Kanal
default: true
chat.channel.staff:
description: Zugang zum Staff-Kanal
default: false
# ── ChatModule HelpOp ───────────────────────────────────
chat.helpop.receive:
description: HelpOp-Nachrichten empfangen
default: false
# ── ChatModule Mute ─────────────────────────────────────
chat.mute:
description: Spieler muten / unmuten
default: false
# ── ChatModule Broadcast ────────────────────────────────
chat.broadcast:
description: Broadcast-Nachrichten senden
default: false
# ── ChatModule Social Spy ───────────────────────────────
chat.socialspy:
description: Private Nachrichten mitlesen
default: false
# ── ChatModule Admin ────────────────────────────────────
chat.admin.bypass:
description: Admin-Bypass - Kann nicht geblockt/gemutet werden
default: op
chat.admin.notify:
description: Benachrichtigungen ueber Mutes und Blocks erhalten
default: false
# ── ChatModule Report ───────────────────────────────────
chat.report:
description: Spieler reporten (/report)
default: true
# ── ChatModule Farben ───────────────────────────────────
chat.color:
description: Farbcodes (&a, &b, ...) im Chat nutzen
default: false
chat.color.format:
description: Formatierungen (&l, &o, &n, ...) im Chat nutzen
default: false
# ── ChatModule Filter ───────────────────────────────────
chat.filter.bypass:
description: Chat-Filter (Anti-Spam, Caps, Blacklist) umgehen
default: false
# ── CommandBlocker ────────────────────────────────────────
commandblocker.bypass:
description: Command-Blocker umgehen
default: op
commandblocker.admin:
description: CommandBlocker verwalten (/cb)
default: op
# ── ServerSwitcherModule ──────────────────────────────────
serverswitcher.use:
description: Zugriff auf /go (Schneller Serverwechsel)
default: false