Minecraft-BungeeCord-Status/minecraft-bungeecord-status.php aktualisiert
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
* Plugin Name: Minecraft BungeeCord Status – Network Edition
|
||||
* Description: Der ultimative Live-Status für dein BungeeCord Netzwerk (Border None Fix).
|
||||
* Tags: minecraft, bungeecord, server status, player list
|
||||
* Version: 3.6.3
|
||||
* Version: 3.6.4
|
||||
* Author: M_Viper
|
||||
* Requires at least: 6.0
|
||||
* Requires PHP: 7.4
|
||||
@@ -897,4 +897,185 @@ function mcss_shortcode($atts) {
|
||||
|
||||
|
||||
<?php return ob_get_clean();
|
||||
}
|
||||
}
|
||||
|
||||
/* ---------------- SIDEBAR WIDGET: MODERN PILL BADGE (ROBUST INLINE STYLES) ---------------- */
|
||||
class MCSS_Sidebar_Status_Widget extends WP_Widget {
|
||||
|
||||
public function __construct() {
|
||||
parent::__construct(
|
||||
'mcss_sidebar_status', // Basis ID
|
||||
'MC Server Status (Simple)', // Name
|
||||
array( 'description' => 'Zeigt einen modernen Online/Offline Status in der Sidebar an.' ) // Args
|
||||
);
|
||||
}
|
||||
|
||||
// Backend: Formular im Widget-Bereich
|
||||
public function form( $instance ) {
|
||||
$title = ! empty( $instance['title'] ) ? $instance['title'] : 'Server Status';
|
||||
$server_id = ! empty( $instance['server_id'] ) ? $instance['server_id'] : '';
|
||||
|
||||
// Server-Liste holen
|
||||
$servers = get_option('mcss_servers', []);
|
||||
?>
|
||||
<p>
|
||||
<label for="<?php echo $this->get_field_id( 'title' ); ?>">Titel:</label>
|
||||
<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>">
|
||||
</p>
|
||||
<p>
|
||||
<label for="<?php echo $this->get_field_id( 'server_id' ); ?>">Server wählen:</label>
|
||||
<select class="widefat" id="<?php echo $this->get_field_id( 'server_id' ); ?>" name="<?php echo $this->get_field_name( 'server_id' ); ?>">
|
||||
<option value="">-- Bitte wählen --</option>
|
||||
<?php foreach ($servers as $srv): ?>
|
||||
<option value="<?php echo esc_attr($srv['id'] ?? ''); ?>" <?php selected($server_id, $srv['id'] ?? ''); ?>>
|
||||
<?php echo esc_html($srv['name'] ?? 'Unbenannt'); ?>
|
||||
</option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</p>
|
||||
<?php
|
||||
}
|
||||
|
||||
// Backend: Speichern
|
||||
public function update( $new_instance, $old_instance ) {
|
||||
$instance = array();
|
||||
$instance['title'] = ( ! empty( $new_instance['title'] ) ) ? sanitize_text_field( $new_instance['title'] ) : '';
|
||||
$instance['server_id'] = ( ! empty( $new_instance['server_id'] ) ) ? sanitize_text_field( $new_instance['server_id'] ) : '';
|
||||
return $instance;
|
||||
}
|
||||
|
||||
// Frontend: Ausgabe
|
||||
public function widget( $args, $instance ) {
|
||||
echo $args['before_widget'];
|
||||
|
||||
if ( ! empty( $instance['title'] ) ) {
|
||||
echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ) . $args['after_title'];
|
||||
}
|
||||
|
||||
$server_id = $instance['server_id'];
|
||||
$servers = get_option('mcss_servers', []);
|
||||
$target_srv = null;
|
||||
|
||||
// Server suchen
|
||||
foreach ($servers as $srv) {
|
||||
if (($srv['id'] ?? '') === $server_id) { $target_srv = $srv; break; }
|
||||
}
|
||||
|
||||
if ($target_srv) {
|
||||
// Initiale Daten holen
|
||||
$data = mcss_fetch_server_with_ranks($target_srv);
|
||||
$is_online = $data['online'] ?? false;
|
||||
$uid = md5($target_srv['host'] . 'widget'); // Einzigartige ID für JS
|
||||
|
||||
// Farben definieren
|
||||
$bg_online = '#ecfdf5';
|
||||
$bg_offline = '#fef2f2';
|
||||
$text_online = '#059669';
|
||||
$text_offline = '#dc2626';
|
||||
$dot_online = '#10b981';
|
||||
$dot_offline = '#ef4444';
|
||||
$border_online = 'rgba(16, 185, 129, 0.2)';
|
||||
$border_offline = 'rgba(239, 68, 68, 0.2)';
|
||||
|
||||
$anim_name_online = 'mcss-pulse-modern';
|
||||
$anim_name_offline = 'mcss-pulse-modern-red';
|
||||
|
||||
// Werte für den Initialzustand setzen
|
||||
$current_bg = $is_online ? $bg_online : $bg_offline;
|
||||
$current_text = $is_online ? $text_online : $text_offline;
|
||||
$current_dot = $is_online ? $dot_online : $dot_offline;
|
||||
$current_border = $is_online ? $border_online : $border_offline;
|
||||
$current_anim = $is_online ? $anim_name_online : $anim_name_offline;
|
||||
$status_label = $is_online ? 'Online' : 'Offline';
|
||||
|
||||
// Inline Animation Definitionen für Robustheit
|
||||
?>
|
||||
<style>
|
||||
@keyframes mcss-pulse-modern {
|
||||
0% { box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.4); }
|
||||
70% { box-shadow: 0 0 0 6px rgba(16, 185, 129, 0); }
|
||||
100% { box-shadow: 0 0 0 0 rgba(16, 185, 129, 0); }
|
||||
}
|
||||
@keyframes mcss-pulse-modern-red {
|
||||
0% { box-shadow: 0 0 0 0 rgba(239, 68, 68, 0.4); }
|
||||
70% { box-shadow: 0 0 0 6px rgba(239, 68, 68, 0); }
|
||||
100% { box-shadow: 0 0 0 0 rgba(239, 68, 68, 0); }
|
||||
}
|
||||
</style>
|
||||
|
||||
<!-- Wrapper mit PUREN Inline Styles -->
|
||||
<div id="mcss-sw-wrapper-<?php echo esc_attr($uid); ?>"
|
||||
style="display: flex; align-items: center; justify-content: center; width: 93%; padding: 8px; border-radius: 50px; background-color: <?php echo $current_bg; ?>; border: 1px solid <?php echo $current_border; ?>; transition: all 0.3s ease; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; cursor: default; margin: 10px 0;">
|
||||
|
||||
<span id="mcss-sw-dot-<?php echo esc_attr($uid); ?>"
|
||||
style="width: 8px; height: 8px; border-radius: 50%; margin-right: 10px; background-color: <?php echo $current_dot; ?>; animation: <?php echo $current_anim; ?> 2s infinite;"></span>
|
||||
|
||||
<span id="mcss-sw-text-<?php echo esc_attr($uid); ?>"
|
||||
style="font-size: 12px; font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase; color: <?php echo $current_text; ?>;">
|
||||
<?php echo $status_label; ?>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<!-- Kleines Skript für Live-Update (alle 3 Sekunden) -->
|
||||
<script>
|
||||
(function(){
|
||||
var uid = "<?php echo esc_js($uid); ?>";
|
||||
var serverId = "<?php echo esc_js($target_srv['id']); ?>";
|
||||
|
||||
// Konstanten Farben
|
||||
var cOnlineBg = '<?php echo esc_js($bg_online); ?>';
|
||||
var cOfflineBg = '<?php echo esc_js($bg_offline); ?>';
|
||||
var cOnlineText = '<?php echo esc_js($text_online); ?>';
|
||||
var cOfflineText = '<?php echo esc_js($text_offline); ?>';
|
||||
var cOnlineDot = '<?php echo esc_js($dot_online); ?>';
|
||||
var cOfflineDot = '<?php echo esc_js($dot_offline); ?>';
|
||||
var bOnline = '<?php echo esc_js($border_online); ?>';
|
||||
var bOffline = '<?php echo esc_js($border_offline); ?>';
|
||||
var aOnline = '<?php echo esc_js($anim_name_online); ?>';
|
||||
var aOffline = '<?php echo esc_js($anim_name_offline); ?>';
|
||||
|
||||
setInterval(function(){
|
||||
fetch('<?php echo admin_url('admin-ajax.php'); ?>', {
|
||||
method: 'POST',
|
||||
headers: {'Content-Type':'application/x-www-form-urlencoded'},
|
||||
body: 'action=mcss_fetch&server_id=' + serverId
|
||||
})
|
||||
.then(r => r.json())
|
||||
.then(d => {
|
||||
var wrapper = document.getElementById('mcss-sw-wrapper-' + uid);
|
||||
var dot = document.getElementById('mcss-sw-dot-' + uid);
|
||||
var txt = document.getElementById('mcss-sw-text-' + uid);
|
||||
if(wrapper && dot && txt && d) {
|
||||
if(d.online) {
|
||||
wrapper.style.backgroundColor = cOnlineBg;
|
||||
wrapper.style.borderColor = bOnline;
|
||||
dot.style.backgroundColor = cOnlineDot;
|
||||
dot.style.animationName = aOnline;
|
||||
txt.style.color = cOnlineText;
|
||||
txt.textContent = 'Online';
|
||||
} else {
|
||||
wrapper.style.backgroundColor = cOfflineBg;
|
||||
wrapper.style.borderColor = bOffline;
|
||||
dot.style.backgroundColor = cOfflineDot;
|
||||
dot.style.animationName = aOffline;
|
||||
txt.style.color = cOfflineText;
|
||||
txt.textContent = 'Offline';
|
||||
}
|
||||
}
|
||||
});
|
||||
}, 3000);
|
||||
})();
|
||||
</script>
|
||||
<?php
|
||||
} else {
|
||||
echo '<p>Bitte Server in den Einstellungen wählen.</p>';
|
||||
}
|
||||
|
||||
echo $args['after_widget'];
|
||||
}
|
||||
}
|
||||
|
||||
// Widget registrieren
|
||||
add_action( 'widgets_init', function(){
|
||||
register_widget( 'MCSS_Sidebar_Status_Widget' );
|
||||
});
|
||||
Reference in New Issue
Block a user