' Minecraft', 'order' => 50, ]; return $tabs; } public static function render_profile_tab( $content, $tab, $profile_user ) { if ( $tab !== 'minecraft' ) return $content; $current = WBF_Auth::get_current_user(); $is_own = $current && (int) $current->id === (int) $profile_user->id; $is_mod = $current && WBF_Roles::can( $current, 'manage_users' ); $mc_user = self::get_mc_username( $profile_user->id ); $verified = self::is_verified( $profile_user->id ); $servers = self::get_server_list(); ob_start(); ?>
Verifiziert Ausstehend id ); if ( $sv ) echo ' ' . esc_html( $sv ) . ''; ?>
Noch nicht verifiziert. Du kannst entweder auf Admin-Bestätigung warten oder deinen Ingame-Token normal in der Galerie eingeben — dann wird die Verknüpfung automatisch bestätigt.

Verknüpfe deinen Minecraft-Account mit deinem Forum-Profil. Danach kannst du Bilder in der Galerie ohne Ingame-Token hochladen.

Kein Minecraft-Account verknüpft.

32 ) { wp_send_json_error( 'Ungültiger Minecraft-Name (2–32 Zeichen).' ); } if ( ! preg_match( '/^[a-zA-Z0-9_]+$/', $mc_user ) ) { wp_send_json_error( 'Nur Buchstaben, Zahlen und _ erlaubt.' ); } // Doppelte Verknüpfung verhindern if ( self::mc_user_taken( $mc_user, $user->id ) ) { wp_send_json_error( 'Dieser Minecraft-Name ist bereits mit einem anderen Forum-Konto verknüpft.' ); } self::set_mc_username( $user->id, $mc_user ); self::set_mc_server( $user->id, $server ); // Verifizierung: automatisch wenn gültiger Ingame-Token vorliegt $auto_verified = self::check_active_token_for( $mc_user ); self::set_verified( $user->id, $auto_verified ); wp_send_json_success( [ 'mc_username' => $mc_user, 'verified' => $auto_verified, ] ); } /** Account-Verknüpfung trennen */ public static function ajax_unlink_account() { check_ajax_referer( self::NONCE_ACTION, 'nonce' ); $user = WBF_Auth::get_current_user(); if ( ! $user ) wp_send_json_error( 'Nicht eingeloggt.' ); self::delete_mc_link( $user->id ); wp_send_json_success(); } /** Admin bestätigt eine ausstehende Verknüpfung */ public static function ajax_admin_approve() { check_ajax_referer( self::NONCE_ACTION, 'nonce' ); $current = WBF_Auth::get_current_user(); if ( ! $current || ! WBF_Roles::can( $current, 'manage_users' ) ) { wp_send_json_error( 'Keine Berechtigung.' ); } $target_id = (int) ( $_POST['user_id'] ?? 0 ); if ( ! $target_id ) wp_send_json_error( 'Ungültige Benutzer-ID.' ); self::set_verified( $target_id, true ); wp_send_json_success(); } /** * Galerie-Verify via Forum-Login. * Wird vom Frontend aufgerufen wenn der User auf "Mit Forum-Login verifizieren" klickt. * Gibt bei Erfolg MC-Username + Server zurück, die das Gallery-JS dann als würden * sie aus einem Token-Verify stammen weiterverarbeiten kann. */ public static function ajax_verify_upload() { check_ajax_referer( self::NONCE_ACTION, 'nonce' ); $forum_user = WBF_Auth::get_current_user(); if ( ! $forum_user ) { wp_send_json_error( [ 'code' => 'not_logged_in', 'message' => 'Du musst im Forum eingeloggt sein.', ] ); } $mc_user = self::get_mc_username( $forum_user->id ); $verified = self::is_verified( $forum_user->id ); if ( ! $mc_user ) { wp_send_json_error( [ 'code' => 'no_mc_link', 'message' => 'Kein Minecraft-Konto verknüpft. Bitte zuerst im Profil verknüpfen.', ] ); } // Noch nicht verifiziert → Ingame-Token als letzten Ausweg prüfen if ( ! $verified ) { if ( self::check_active_token_for( $mc_user ) ) { self::set_verified( $forum_user->id, true ); $verified = true; } } if ( ! $verified ) { wp_send_json_error( [ 'code' => 'not_verified', 'message' => 'Dein Account ist noch nicht verifiziert. Bitte einen Admin um Bestätigung oder nutze einmalig das Ingame-Token.', ] ); } $server_id = self::get_mc_server( $forum_user->id ) ?: sanitize_text_field( $_POST['server_id'] ?? '' ); wp_send_json_success( [ 'mc_username' => $mc_user, 'server_id' => $server_id, 'display_name' => $forum_user->display_name, 'verify_type' => 'forum_login', ] ); } // ── Filter: Gallery-Upload-Berechtigung ─────────────────────────────────── /** * Gibt true zurück wenn ein eingeloggter Forum-User einen verifizierten * Link zu $mc_username hat — ersetzt dann die normale Token-Prüfung. * Wird nur aufgerufen wenn die Gallery `apply_filters('mc_gallery_can_upload', …)` nutzt. */ public static function filter_upload_permission( $allowed, $mc_username, $server_id ) { if ( $allowed ) return true; // schon erlaubt, nicht überschreiben $forum_user = WBF_Auth::get_current_user(); if ( ! $forum_user ) return false; $linked = self::get_mc_username( $forum_user->id ); if ( ! $linked ) return false; if ( strtolower( $linked ) !== strtolower( $mc_username ) ) return false; return self::is_verified( $forum_user->id ); } // ── Filter: Zusätzliche Verify-UI in der Gallery ────────────────────────── /** * Hängt unter das normale Verify-Formular einen "Mit Forum-Login"-Bereich. * Funktioniert wenn die Gallery `apply_filters('mc_gallery_verify_ui_extra', '', $server_id)` aufruft. * * Falls der Hook nicht existiert: eigenen Shortcode [mc_gallery_forum_login] nutzen. */ public static function render_verify_panel( $html, $server_id ) { return $html . self::build_verify_panel( $server_id ); } /** * Shortcode [mc_gallery_forum_login server_id="survival"] * Kann manuell auf der Upload-Seite eingebettet werden falls der Hook-Ansatz * nicht greift. */ public static function shortcode_verify_panel( $atts ) { $atts = shortcode_atts( [ 'server_id' => '' ], $atts ); return self::build_verify_panel( sanitize_text_field( $atts['server_id'] ) ); } /** Eigentliches HTML für das Verify-Panel */ public static function build_verify_panel( $server_id ) { $forum_user = WBF_Auth::get_current_user(); $nonce = wp_create_nonce( self::NONCE_ACTION ); $ajax_url = admin_url( 'admin-ajax.php' ); ob_start(); ?>
oder
Forum-Login
Direkt hochladen ohne Ingame-Token – wenn dein Minecraft-Account mit dem Forum verknüpft ist.
id ); $verified = self::is_verified( $forum_user->id ); $forum_url = function_exists('wbf_get_forum_url') ? wbf_get_forum_url() . '?forum_profile=' . (int) $forum_user->id . '#tab-minecraft' : '#'; ?>
Verifiziert als
Verknüpft · ausstehend
· Noch nicht bestätigt
Eingeloggt als display_name ); ?>
Noch kein Minecraft-Konto verknüpft.
id ); if ( ! $mc_user ) return; $verified = self::is_verified( $user->id ); $nonce = wp_create_nonce( self::NONCE_ACTION ); ?> get_var( $wpdb->prepare( "SELECT meta_value FROM {$wpdb->prefix}forum_user_meta WHERE user_id = %d AND meta_key = %s LIMIT 1", (int) $user_id, $key ) ); } private static function set_meta( $user_id, $key, $value ) { global $wpdb; $table = $wpdb->prefix . 'forum_user_meta'; $exists = $wpdb->get_var( $wpdb->prepare( "SELECT id FROM {$table} WHERE user_id = %d AND meta_key = %s", (int) $user_id, $key ) ); if ( $exists ) { $wpdb->update( $table, [ 'meta_value' => $value ], [ 'user_id' => (int) $user_id, 'meta_key' => $key ] ); } else { $wpdb->insert( $table, [ 'user_id' => (int) $user_id, 'meta_key' => $key, 'meta_value' => $value, ] ); } } private static function delete_meta( $user_id, $key ) { global $wpdb; $wpdb->delete( $wpdb->prefix . 'forum_user_meta', [ 'user_id' => (int) $user_id, 'meta_key' => $key ] ); } // Öffentliche Getter/Setter public static function get_mc_username( $user_id ) { return self::get_meta( $user_id, self::META_MC_USER ); } public static function get_mc_server ( $user_id ) { return self::get_meta( $user_id, self::META_MC_SERVER ); } public static function is_verified ( $user_id ) { return '1' === self::get_meta( $user_id, self::META_VERIFIED ); } public static function set_mc_username( $user_id, $val ) { self::set_meta( $user_id, self::META_MC_USER, $val ); } public static function set_mc_server ( $user_id, $val ) { self::set_meta( $user_id, self::META_MC_SERVER, $val ); } public static function set_verified ( $user_id, $bool ) { self::set_meta( $user_id, self::META_VERIFIED, $bool ? '1' : '0' ); } public static function delete_mc_link( $user_id ) { self::delete_meta( $user_id, self::META_MC_USER ); self::delete_meta( $user_id, self::META_MC_SERVER ); self::delete_meta( $user_id, self::META_VERIFIED ); } // Prüft ob ein MC-Name schon einem anderen Forum-User gehört private static function mc_user_taken( $mc_user, $exclude_user_id ) { global $wpdb; return (bool) $wpdb->get_var( $wpdb->prepare( "SELECT m.id FROM {$wpdb->prefix}forum_user_meta m WHERE m.meta_key = %s AND m.meta_value = %s AND m.user_id != %d LIMIT 1", self::META_MC_USER, $mc_user, (int) $exclude_user_id ) ); } // Gibt true zurück wenn gerade ein gültiger Ingame-Token für diesen MC-Namen existiert private static function check_active_token_for( $mc_username ) { if ( ! class_exists( 'MC_Gallery_Helpers' ) ) return false; $tokens = MC_Gallery_Helpers::get_tokens(); $now = time(); foreach ( $tokens as $token => $data ) { if ( ! is_array( $data ) ) continue; if ( ( $data['expires'] ?? 0 ) < $now ) continue; if ( strtolower( $data['player'] ?? '' ) === strtolower( $mc_username ) ) { return true; } } return false; } // Server-Liste aus Gallery-Config laden private static function get_server_list() { $servers = get_option( 'mc_gallery_servers', [] ); if ( ! empty( $servers ) && is_array( $servers ) ) return $servers; return [ 'default' => 'Standard-Server' ]; } }