diff --git a/Minecraft-BungeeCord-Status/minecraft-bungeecord-status.php b/Minecraft-BungeeCord-Status/minecraft-bungeecord-status.php
index dd25fee..77381c4 100644
--- a/Minecraft-BungeeCord-Status/minecraft-bungeecord-status.php
+++ b/Minecraft-BungeeCord-Status/minecraft-bungeecord-status.php
@@ -1,694 +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)'];
-
- ?>
-
-
BungeeCord Netzwerk Einstellungen
-
- Final: Expliziter `border: none` im Inline-Style für Wartungsmodus.
-
-
-
-
-
-
-
- false,'players'=>[],'version'=>'Offline','ping'=>9999,'motd'=>'Verbindung fehlgeschlagen'];
- }
-
- $players_info = [];
- $user_defined_ranks = json_decode($srv['ranks_json'] ?? '[]', true);
- if (!is_array($user_defined_ranks)) $user_defined_ranks = [];
-
- foreach ($api_data['players'] as $name) {
- $rank = 'Spieler';
- $color = '#566d8dff';
- $players_info[] = [
- 'name' => $name,
- 'avatar' => "https://mc-heads.net/avatar/" . rawurlencode($name) . "/64",
- 'rank' => $rank,
- 'color' => $color,
- ];
- }
-
- $clean_version = mcss_parse_bungeecord_version($api_data['version'] ?? 'BungeeCord');
-
- $result = [
- 'online' => true,
- 'players' => $players_info,
- 'version' => $clean_version,
- 'ping' => 1,
- 'motd' => is_array($api_data['motd']) ? implode(' ', $api_data['motd']) : $api_data['motd']
- ];
-
- $fast_cache_ttl = min(2, $srv['cache_tl'] ?? $srv['cache_ttl']);
- set_transient($cache_key, $result, $fast_cache_ttl);
- return $result;
-}
-
-/* ---------------- AJAX ---------------- */
-add_action('wp_ajax_mcss_fetch', 'mcss_ajax_fetch');
-add_action('wp_ajax_nopriv_mcss_fetch', 'mcss_ajax_fetch');
-function mcss_ajax_fetch() {
- $id = sanitize_text_field($_POST['server_id'] ?? '');
- $servers = get_option('mcss_servers', []);
- foreach ($servers as $srv) {
- if (($srv['id'] ?? '') === $id) wp_send_json(mcss_fetch_server_with_ranks($srv));
- if (($srv['name'] ?? '') === $id) wp_send_json(mcss_fetch_server_with_ranks($srv));
- }
- wp_send_json(['online'=>false]);
-}
-
-/* ---------------- FRONTEND (SHORTCODE) ---------------- */
-add_shortcode('bungeecord_status', 'mcss_shortcode');
-function mcss_shortcode($atts) {
- $atts = shortcode_atts(['id' => ''], $atts);
- if (empty($atts['id'])) return 'Fehler';
-
- $servers = get_option('mcss_servers', []);
- $srv = null;
- foreach ($servers as $s) {
- if (($s['id'] ?? '') === $atts['id']) { $srv = $s; break; }
- if (($s['name'] ?? '') === $atts['id']) { $srv = $s; break; }
- }
- if (!$srv) return 'Server nicht gefunden';
-
- // MAINTENANCE MODE (Rich Style - No Border)
- $maintenance_mode = !empty($srv['maintenance_mode']);
- $maintenance_message = $srv['maintenance_message'] ?? 'Der Server befindet sich derzeit im Wartungsmodus. Wir sind bald wieder für dich da!';
- if ($maintenance_mode) {
- $uid = md5($srv['host']);
- $logo = $srv['logo_id'] ? wp_get_attachment_image_url($srv['logo_id'], 'full') : ($srv['logo_url'] ?: MCSS_URL.'img/default-server-logo.png');
- $name_color = $srv['name_color'] ?? '#333333';
- $name_size = $srv['name_size'] ?? '1.8em';
-
- ob_start(); ?>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- '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)'];
+
+ ?>
+
+
BungeeCord Netzwerk Einstellungen
+
+ Final: Expliziter `border: none` im Inline-Style für Wartungsmodus.
+
+
+
+
+
+
+
+ false,'players'=>[],'version'=>'Offline','ping'=>9999,'motd'=>'Verbindung fehlgeschlagen'];
+ }
+
+ $players_info = [];
+ $user_defined_ranks = json_decode($srv['ranks_json'] ?? '[]', true);
+ if (!is_array($user_defined_ranks)) $user_defined_ranks = [];
+
+ foreach ($api_data['players'] as $name) {
+ $rank = 'Spieler';
+ $color = '#566d8dff';
+ $players_info[] = [
+ 'name' => $name,
+ 'avatar' => "https://mc-heads.net/avatar/" . rawurlencode($name) . "/64",
+ 'rank' => $rank,
+ 'color' => $color,
+ ];
+ }
+
+ $clean_version = mcss_parse_bungeecord_version($api_data['version'] ?? 'BungeeCord');
+
+ $result = [
+ 'online' => true,
+ 'players' => $players_info,
+ 'version' => $clean_version,
+ 'ping' => 1,
+ 'motd' => is_array($api_data['motd']) ? implode(' ', $api_data['motd']) : $api_data['motd']
+ ];
+
+ $fast_cache_ttl = min(2, $srv['cache_tl'] ?? $srv['cache_ttl']);
+ set_transient($cache_key, $result, $fast_cache_ttl);
+ return $result;
+}
+
+/* ---------------- AJAX ---------------- */
+add_action('wp_ajax_mcss_fetch', 'mcss_ajax_fetch');
+add_action('wp_ajax_nopriv_mcss_fetch', 'mcss_ajax_fetch');
+function mcss_ajax_fetch() {
+ $id = sanitize_text_field($_POST['server_id'] ?? '');
+ $servers = get_option('mcss_servers', []);
+ foreach ($servers as $srv) {
+ if (($srv['id'] ?? '') === $id) wp_send_json(mcss_fetch_server_with_ranks($srv));
+ if (($srv['name'] ?? '') === $id) wp_send_json(mcss_fetch_server_with_ranks($srv));
+ }
+ wp_send_json(['online'=>false]);
+}
+
+/* ---------------- FRONTEND (SHORTCODE) ---------------- */
+add_shortcode('bungeecord_status', 'mcss_shortcode');
+function mcss_shortcode($atts) {
+ $atts = shortcode_atts(['id' => ''], $atts);
+ if (empty($atts['id'])) return 'Fehler';
+
+ $servers = get_option('mcss_servers', []);
+ $srv = null;
+ foreach ($servers as $s) {
+ if (($s['id'] ?? '') === $atts['id']) { $srv = $s; break; }
+ if (($s['name'] ?? '') === $atts['id']) { $srv = $s; break; }
+ }
+ if (!$srv) return 'Server nicht gefunden';
+
+ // MAINTENANCE MODE (Rich Style - No Border)
+ $maintenance_mode = !empty($srv['maintenance_mode']);
+ $maintenance_message = $srv['maintenance_message'] ?? 'Der Server befindet sich derzeit im Wartungsmodus. Wir sind bald wieder für dich da!';
+ if ($maintenance_mode) {
+ $uid = md5($srv['host']);
+ $logo = $srv['logo_id'] ? wp_get_attachment_image_url($srv['logo_id'], 'full') : ($srv['logo_url'] ?: MCSS_URL.'img/default-server-logo.png');
+ $name_color = $srv['name_color'] ?? '#333333';
+ $name_size = $srv['name_size'] ?? '1.8em';
+
+ ob_start(); ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+