Minecraft-BungeeCord-Status/minecraft-bungeecord-status.php aktualisiert
This commit is contained in:
@@ -3,7 +3,7 @@
|
|||||||
* Plugin Name: Minecraft BungeeCord Status – Network Edition
|
* Plugin Name: Minecraft BungeeCord Status – Network Edition
|
||||||
* Description: Der ultimative Live-Status für dein BungeeCord Netzwerk (Border None Fix).
|
* Description: Der ultimative Live-Status für dein BungeeCord Netzwerk (Border None Fix).
|
||||||
* Tags: minecraft, bungeecord, server status, player list
|
* Tags: minecraft, bungeecord, server status, player list
|
||||||
* Version: 3.6.3
|
* Version: 3.6.4
|
||||||
* Author: M_Viper
|
* Author: M_Viper
|
||||||
* Requires at least: 6.0
|
* Requires at least: 6.0
|
||||||
* Requires PHP: 7.4
|
* Requires PHP: 7.4
|
||||||
@@ -897,4 +897,185 @@ function mcss_shortcode($atts) {
|
|||||||
|
|
||||||
|
|
||||||
<?php return ob_get_clean();
|
<?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