diff --git a/mc-player-history.php b/mc-player-history.php index 8964237..3f9a50e 100644 --- a/mc-player-history.php +++ b/mc-player-history.php @@ -2,7 +2,7 @@ /* Plugin Name: MC Player History Description: Spielerverlauf deines Minecraft Servers. -Version: 1.1.1 +Version: 1.1.2 Author: M_Viper */ @@ -53,11 +53,11 @@ function mcph_parse_minecraft_colors( $text ) { } /** - * 1. Tabelle beim Aktivieren anlegen + * 1. Tabelle beim Aktivieren anlegen + Playtime Spalte */ register_activation_hook( __FILE__, 'mcph_install' ); function mcph_install() { - global $wpdb; + global $wpdb, $mc_player_history_db_version; // FIX: Variable global verfügbar machen $table_name = $wpdb->prefix . 'mc_players'; $charset_collate = $wpdb->get_charset_collate(); $sql = "CREATE TABLE $table_name ( @@ -68,10 +68,12 @@ function mcph_install() { first_seen datetime NOT NULL, last_seen datetime NOT NULL, is_online tinyint(1) NOT NULL DEFAULT 0, + playtime_seconds INT NOT NULL DEFAULT 0, PRIMARY KEY (id), UNIQUE KEY uuid (uuid), KEY username (username), - KEY is_online (is_online) + KEY is_online (is_online), + KEY playtime_seconds (playtime_seconds) ) $charset_collate;"; require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); dbDelta( $sql ); @@ -83,6 +85,22 @@ function mcph_deactivate() { wp_clear_scheduled_hook( 'mcph_sync_event' ); } +/** + * NEU: Playtime Spalte hinzufügen (wird beim Laden geprüft) + */ +add_action( 'init', 'mcph_add_playtime_column' ); +function mcph_add_playtime_column() { + global $wpdb; + $table_name = $wpdb->prefix . 'mc_players'; + + // Prüfen, ob Spalte existiert + $column_exists = $wpdb->get_var( "SHOW COLUMNS FROM $table_name LIKE 'playtime_seconds'" ); + + if ( empty( $column_exists ) ) { + $wpdb->query( "ALTER TABLE $table_name ADD COLUMN playtime_seconds INT NOT NULL DEFAULT 0 AFTER last_seen" ); + } +} + /** * 2. Cron-Job */ @@ -94,7 +112,7 @@ function mcph_setup_schedule() { } add_filter( 'cron_schedules', 'mcph_add_cron_interval' ); function mcph_add_cron_interval( $schedules ) { - $schedules['mcph_2min'] = array( 'interval' => 2 * MINUTE_IN_SECONDS, 'display' => 'Alle 2 Minuten' ); + $schedules['mcph_2min'] = array( 'interval' => 2 * MINUTE_IN_SECONDS, 'display' => 'Alle 2 Minuten' ); return $schedules; } @@ -113,12 +131,15 @@ function mcph_sync_from_statusapi() { $table_name = $wpdb->prefix . 'mc_players'; if ( $wpdb->get_var( "SHOW TABLES LIKE '$table_name'" ) != $table_name ) { return; } + // 1. Alle Spieler auf Offline setzen (Reset) $wpdb->query( "UPDATE $table_name SET is_online = 0" ); $players = isset( $json->players ) && is_array( $json->players ) ? $json->players : array(); + // 2. Spieler durchgehen foreach ( $players as $p ) { $name = isset( $p->name ) ? sanitize_text_field( $p->name ) : ''; $prefix = isset( $p->prefix ) ? sanitize_text_field( $p->prefix ) : ''; + // UUID aus API übernehmen, falls vorhanden, sonst legacy-Hash if ( isset( $p->uuid ) && !empty( $p->uuid ) ) { $uuid = sanitize_text_field( $p->uuid ); @@ -127,31 +148,62 @@ function mcph_sync_from_statusapi() { } if ( empty( $name ) ) continue; - // Prüfe ob Spieler bereits existiert (nach UUID ODER Username) + // Prüfe ob Spieler bereits existiert (nach UUID) $exists = $wpdb->get_var( $wpdb->prepare( "SELECT id FROM $table_name WHERE uuid = %s", $uuid ) ); - // Falls nicht per UUID gefunden, prüfe nach Username (für Migration alter Einträge) + // Fallback: Falls nicht per UUID gefunden, prüfe nach Username if ( ! $exists ) { $old_entry = $wpdb->get_row( $wpdb->prepare( "SELECT id, uuid FROM $table_name WHERE username = %s", $name ) ); if ( $old_entry ) { - // Alter Eintrag gefunden - UUID aktualisieren statt neuen Eintrag + // FIX: Basis-Daten für Update (ohne Prefix) + $update_data = array( + 'uuid' => $uuid, + 'last_seen' => current_time( 'mysql' ), + 'is_online' => 1 + ); + $update_format = array( '%s', '%s', '%d' ); + + // FIX: Prefix nur aktualisieren, wenn API einen Wert liefert (nicht leer) + if ( ! empty( $prefix ) ) { + $update_data['prefix'] = $prefix; + $update_format[] = '%s'; + } + $wpdb->update( $table_name, - array( 'uuid' => $uuid, 'prefix' => $prefix, 'last_seen' => current_time( 'mysql' ), 'is_online' => 1 ), + $update_data, array( 'id' => $old_entry->id ), - array( '%s', '%s', '%s', '%d' ), + $update_format, array( '%d' ) ); continue; } } + // NEU: Playtime erhöhen (2 Minuten = 120 Sekunden pro Sync) + $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET playtime_seconds = playtime_seconds + 120 WHERE uuid = %s", $uuid ) ); + $now = current_time( 'mysql' ); if ( $exists ) { - $wpdb->update( $table_name, array( 'username' => $name, 'prefix' => $prefix, 'last_seen' => $now, 'is_online' => 1 ), array( 'uuid' => $uuid ), array( '%s', '%s', '%s', '%d' ), array( '%s' ) ); + // FIX: Basis-Daten für Update (ohne Prefix) + $update_data = array( + 'username' => $name, + 'last_seen' => $now, + 'is_online' => 1 + ); + $update_format = array( '%s', '%s', '%d' ); + + // FIX: Prefix nur aktualisieren, wenn API einen Wert liefert (nicht leer) + if ( ! empty( $prefix ) ) { + $update_data['prefix'] = $prefix; + $update_format[] = '%s'; + } + + $wpdb->update( $table_name, $update_data, array( 'uuid' => $uuid ), $update_format, array( '%s' ) ); } else { - $wpdb->insert( $table_name, array( 'uuid' => $uuid, 'username' => $name, 'prefix' => $prefix, 'first_seen' => $now, 'last_seen' => $now, 'is_online' => 1 ), array( '%s', '%s', '%s', '%s', '%s', '%d' ) ); + // Bei neuen Spielern fügen wir das Prefix ein (auch wenn es leer ist) + $wpdb->insert( $table_name, array( 'uuid' => $uuid, 'username' => $name, 'prefix' => $prefix, 'first_seen' => $now, 'last_seen' => $now, 'is_online' => 1, 'playtime_seconds' => 0 ), array( '%s', '%s', '%s', '%s', '%s', '%d', '%d' ) ); } } } @@ -215,7 +267,7 @@ function mcph_generate_player_html( $limit = 500, $only_online = false, $is_ajax } } - $sql_limit = $only_online ? ($limit * 2) : $limit; + $sql_limit = $only_online ? ( $limit * 2 ) : $limit; $rows = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $table_name ORDER BY last_seen DESC LIMIT %d", $sql_limit ) ); if ( empty( $rows ) ) { @@ -261,7 +313,7 @@ function mcph_generate_player_html( $limit = 500, $only_online = false, $is_ajax $anim_style = ''; if ( ! $is_ajax ) { - $anim_style = 'animation: fadeInUp 0.5s ease forwards; opacity: 0; animation-delay: ' . ($displayed_count * 0.05) . 's;'; + $anim_style = 'animation: fadeInUp 0.5s ease forwards; opacity: 0; animation-delay: ' . ( $displayed_count * 0.05 ) . 's;'; } if ( $is_online ) { @@ -402,10 +454,10 @@ function mcph_shortcode( $atts ) { ?>