diff --git a/Minecraft-BungeeCord-Status/minecraft-bungeecord-status.php b/Minecraft-BungeeCord-Status/minecraft-bungeecord-status.php new file mode 100644 index 0000000..dd25fee --- /dev/null +++ b/Minecraft-BungeeCord-Status/minecraft-bungeecord-status.php @@ -0,0 +1,694 @@ +'mcss_sanitize_servers']); +}); + +function mcss_sanitize_servers($input) { + if (!is_array($input)) return []; + $clean = []; + foreach ($input as $srv) { + if (!is_array($srv)) continue; + $clean[] = [ + 'id' => sanitize_key($srv['id'] ?? 'srv_'.wp_rand()), + 'name' => sanitize_text_field($srv['name'] ?? 'BungeeCord'), + 'host' => sanitize_text_field($srv['host'] ?? ''), + 'rcon_port' => absint($srv['rcon_port'] ?? 25577), + 'rcon_pass' => sanitize_text_field($srv['rcon_pass'] ?? ''), + 'player_port' => sanitize_text_field($srv['player_port'] ?? '9191'), // API Port + 'player_port_copy' => sanitize_text_field($srv['player_port_copy'] ?? ''), // Display Port + 'copy_address' => sanitize_text_field($srv['copy_address'] ?? ''), + 'hide_port' => !empty($srv['hide_port']), + 'show_motd' => !empty($srv['show_motd']), + 'cache_ttl' => max(2, absint($srv['cache_ttl'] ?? 10)), + 'logo_id' => absint($srv['logo_id'] ?? 0), + 'logo_url' => esc_url_raw($srv['logo_url'] ?? ''), + 'custom_text' => wp_kses_post($srv['custom_text'] ?? ''), + // Styles + 'ip_color' => sanitize_hex_color($srv['ip_color'] ?? '#1f2937'), + 'ct_color' => sanitize_hex_color($srv['ct_color'] ?? '#1e293b'), + 'ip_size' => sanitize_text_field($srv['ip_size'] ?? '1.5em'), + 'ct_size' => sanitize_text_field($srv['ct_size'] ?? '1.05em'), + 'name_color' => sanitize_hex_color($srv['name_color'] ?? '#333333'), + 'name_size' => sanitize_text_field($srv['name_size'] ?? '1.8em'), + // Events & Maintenance + 'maintenance_mode' => !empty($srv['maintenance_mode']), + 'maintenance_message' => wp_kses_post($srv['maintenance_message'] ?? 'Wartung'), + 'announcement_enabled' => !empty($srv['announcement_enabled']), + 'announcement_text' => wp_kses_post($srv['announcement_text'] ?? ''), + 'announcement_start' => sanitize_text_field($srv['announcement_start'] ?? ''), + 'announcement_end' => sanitize_text_field($srv['announcement_end'] ?? ''), + 'announcement_type' => sanitize_text_field($srv['announcement_type'] ?? 'info'), + // Ranks + 'ranks_json' => mcss_sanitize_ranks($srv['ranks_json'] ?? '[]'), + ]; + } + return $clean; +} + +function mcss_sanitize_ranks($input) { + $decoded = json_decode($input, true); + if (!is_array($decoded)) return '[]'; + $out = []; + foreach ($decoded as $r) { + if (!is_array($r) || empty($r['name'])) continue; + $out[] = ['name'=>sanitize_text_field($r['name']), 'color'=>sanitize_text_field($r['color']??'#6c5ce7')]; + } + return wp_json_encode($out); +} + +/* ---------------- Helper Functions ---------------- */ +function mcss_should_show_announcement($srv) { + if (empty($srv['announcement_enabled'])) return false; + if (empty($srv['announcement_text'])) return false; + if (empty($srv['announcement_start'])) return true; + + $current_time = current_time('timestamp'); + $start_time = strtotime($srv['announcement_start']); + if ($start_time > $current_time) return false; + + if (empty($srv['announcement_end'])) return true; + + $end_time = strtotime($srv['announcement_end']); + return $end_time >= $current_time; +} + +function mcss_get_announcement_style($type) { + switch ($type) { + case 'warning': return ['bg' => '#fef3c7','border' => '#fbbf24','text' => '#92400e','icon' => '⚠️']; + case 'success': return ['bg' => '#d1fae5','border' => '#10b981','text' => '#065f46','icon' => '✅']; + case 'error': return ['bg' => '#fee2e2','border' => '#ef4444','text' => '#991b1b','icon' => '❌']; + case 'info': default: return ['bg' => '#dbeafe','border' => '#3b82f6','text' => '#1e40af','icon' => 'ℹ️']; + } +} + +/* ---------------- Backend Page ---------------- */ +function mcss_settings_page() { + $servers = get_option('mcss_servers', []); + if (empty($servers)) { + $servers = [['id'=>'default', 'name'=>'Mein Netzwerk', 'host'=>'127.0.0.1', 'player_port'=>'9191', 'cache_ttl'=>10, 'hide_port'=>true, 'show_motd'=>true]]; + } + + // Vollständige Liste + $font_sizes = [ + '0.7em'=>'Sehr klein','0.85em'=>'Klein','1em'=>'Normal','1.2em'=>'Etwas größer', + '1.4em'=>'Groß','1.5em'=>'Sehr groß','1.7em'=>'Extra groß','2em'=>'Riesig', + '2.5em'=>'Enorm','3em'=>'Gigantisch', + ]; + + $announcement_types = ['info'=>'Info (Blau)','warning'=>'Warnung (Orange)','success'=>'Erfolg (Grün)','error'=>'Fehler (Rot)']; + + ?> +
+ Final: Expliziter `border: none` im Inline-Style für Wartungsmodus. +
+ +| Name | |
|---|---|
| Name – Schrift | ++ + + + + | +
| Host (IP) | |
| API Port (StatusAPI) | |
| Spielerport (für IP-Anzeige) | |
| Cache TTL | |
| Kopier-Adresse | |
| Logo URL | |
| Zusatztext | |
| Zusatztext – Schrift | ++ + + + + | +
| Wartungsmodus | /> |
| Wartungsnachricht | |
| Ankündigungen | /> |
| Ankündigungstext | |
| Ankündigungszeitraum | +
+
+
+
+
+ |
+
| Ankündigungstyp | ++ + | +
Wir arbeiten daran, den Server so schnell wie möglich wieder verfügbar zu machen. Vielen Dank für deine Geduld!
+
+
+
+