diff --git a/admin/forum-admin.php b/admin/forum-admin.php index d5f2701..0c2bf5a 100644 --- a/admin/forum-admin.php +++ b/admin/forum-admin.php @@ -30,6 +30,7 @@ add_action( 'admin_menu', function() { add_submenu_page( 'wbf-admin', 'Thread-Prรคfixe','Thread-Prรคfixe','manage_options', 'wbf-prefixes', 'wbf_admin_prefixes' ); add_submenu_page( 'wbf-admin', 'Wortfilter', 'Wortfilter', 'manage_options', 'wbf-wordfilter', 'wbf_admin_wordfilter' ); add_submenu_page( 'wbf-admin', 'Export / Import','Export / Import','manage_options', 'wbf-export', 'wbf_admin_export' ); + add_submenu_page( 'wbf-admin', '๐ŸŽฎ Discord', '๐ŸŽฎ Discord', 'manage_options', 'wbf-discord', 'wbf_admin_discord' ); add_submenu_page( 'wbf-admin', 'โš ๏ธ Deinstallieren', 'โš ๏ธ Deinstallieren', 'manage_options', 'wbf-uninstall', 'wbf_admin_uninstall' ); add_submenu_page( 'wbf-admin', '๐Ÿ”” Updates', '๐Ÿ”” Updates', 'manage_options', 'wbf-updates', 'wbf_admin_updates' ); }, 10 ); @@ -1346,14 +1347,46 @@ function wbf_admin_members() { } } - $members = WBF_DB::get_all_users( 200 ); + $members = WBF_DB::get_all_users( 200 ); + $s_discord = wbf_get_settings(); + $dc_sync_on = ( $s_discord['discord_role_sync'] ?? '0' ) === '1' && trim( $s_discord['discord_bot_token'] ?? '' ); + + // Discord-Meta aller User vorladen (1 Query statt N) + $dc_meta = []; + if ( $dc_sync_on ) { + global $wpdb; + $rows = $wpdb->get_results( + "SELECT user_id, + MAX(CASE WHEN meta_key='discord_user_id' THEN meta_value END) AS discord_uid, + MAX(CASE WHEN meta_key='discord_username' THEN meta_value END) AS discord_name + FROM {$wpdb->prefix}forum_user_meta + WHERE meta_key IN ('discord_user_id','discord_username') + GROUP BY user_id" + ); + foreach ( $rows as $r ) { + $dc_meta[ (int)$r->user_id ] = $r; + } + } ?>
-

+

Mitglieder - +
+ + + + + +

@@ -1409,6 +1442,7 @@ function wbf_admin_members() { #NutzerE-Mail Aktuelle RolleBeitrรคge RegistriertRolle รคndern + Discord @@ -1417,9 +1451,17 @@ function wbf_admin_members() { $color = esc_attr( $role['color'] ); $bg = esc_attr( $role['bg_color'] ); $icon = esc_attr( $role['icon'] ?? 'fas fa-user' ); - $is_sa = ( $m->role === WBF_Roles::SUPERADMIN ); + // Nur sperren wenn dieser Forum-User wirklich dem WP-Superadmin (ID 1) entspricht. + // Reine Rollen-Prรผfung reicht nicht โ€” sonst kann man versehentlich + // zugewiesene superadmin-Rollen nicht mehr korrigieren. + $wp_sa_data = get_userdata( WBF_Roles::get_wp_superadmin_id() ); + $is_sa = ( $m->role === WBF_Roles::SUPERADMIN ) + && $wp_sa_data + && ( strtolower($m->email) === strtolower($wp_sa_data->user_email) ); $ban_reason = esc_attr( $m->ban_reason ?? '' ); $opts = ''; + $dc_user = $dc_meta[ (int)$m->id ] ?? null; + $has_dc = $dc_sync_on && $dc_user && ! empty( $dc_user->discord_uid ); foreach ( $roles as $k => $r ) { if ( $k === WBF_Roles::SUPERADMIN ) continue; $sel = $m->role === $k ? ' selected' : ''; @@ -1438,13 +1480,13 @@ function wbf_admin_members() { - (WP-Admin) + (Haupt-Admin) post_count ); ?> registered ) ) ); ?> - Automatisch (WP-Admin) + Gesperrt โ€” Haupt-Superadmin (WP User ID )
@@ -1711,11 +1753,127 @@ function wbf_admin_members() {
+ + + + +
+ + + discord_name ?: $dc_user->discord_uid ); ?> + + + +
+ + Nicht verknรผpft + + + + + + + + + $f ): - $fi = 'fi_' . $f['key']; + $fi = $wbf_fidx; + $wbf_fidx++; ?> @@ -3268,9 +3429,11 @@ function wbf_admin_profile_fields() { โ€” + > + > @@ -3318,7 +3481,7 @@ function wbf_admin_profile_fields() { + + + + +
+

๐Ÿ”— Aktive Rollen-Zuordnungen

+ +

Keine Zuordnungen konfiguriert.

+ Jetzt einrichten + + + + + $fr_key): + $fr_label = $all_roles[$fr_key]['label'] ?? $fr_key; ?> + + + + + + +
Discord Rollen-IDForum-Rolle
+ Bearbeiten + +
+ + + + +
+

๐Ÿ‘ฅ Verknรผpfte Forum-Nutzer

+ get_results( + "SELECT fu.id, fu.username, fu.display_name, fu.role, + MAX(CASE WHEN um.meta_key='discord_username' THEN um.meta_value END) AS discord_name, + MAX(CASE WHEN um.meta_key='discord_user_id' THEN um.meta_value END) AS discord_uid + FROM {$wpdb->prefix}forum_users fu + JOIN {$wpdb->prefix}forum_user_meta um ON um.user_id = fu.id + WHERE um.meta_key IN ('discord_username','discord_user_id') + GROUP BY fu.id + HAVING discord_name != '' AND discord_name IS NOT NULL + ORDER BY fu.username" + ); + if (empty($linked)): ?> +

Noch keine verknรผpften Nutzer.

+ + + + + + + + + + + + + +
Forum-NutzerRolleDiscord-NameDiscord-ID
display_name); ?> + @username); ?>role); ?> discord_name ?: 'โ€“'); ?>discord_uid ?: 'โ€“'); ?>
+ +
+ + + "**1. Respektvoller Umgang**\nBehandle alle Mitglieder freundlich und respektvoll. Beleidigungen, Mobbing und Diskriminierung sind nicht toleriert.\n\n**2. Keine Spam-Inhalte**\nWerbung, Spam und irrelevante Links sind verboten.\n\n**3. Keine illegalen Inhalte**\nJegliche Inhalte, die gegen geltendes Recht verstoรŸen, sind streng verboten.\n\n**4. Themenrelevanz**\nBeitrรคge sollten zur jeweiligen Kategorie passen.\n\n**5. Urheberrecht**\nVerรถffentliche keine Inhalte, an denen du keine Rechte besitzt.\n\n**6. Datenschutz**\nTeile keine persรถnlichen Daten anderer Personen ohne deren Zustimmung.\n\n**7. Moderations-Entscheidungen**\nEntscheidungen der Moderatoren sind zu respektieren. Bei Fragen wende dich direkt ans Team.\n\nVerstรถรŸe kรถnnen zur Verwarnung oder dauerhaften Sperrung fรผhren.", // Ignore/Block-System: Rollen die nicht geblockt werden kรถnnen (kommagetrennte Schlรผssel) 'ignore_blocked_roles' => 'superadmin,admin,moderator', + // Discord-Integration + 'discord_bot_token' => '', + 'discord_guild_id' => '', + 'discord_client_id' => '', + 'discord_client_secret' => '', + 'discord_role_sync' => '0', // Rollen-Sync aktiviert? + 'discord_role_map' => '', // JSON: {"discord_role_id":"forum_role_key"} ]; $saved = get_option( 'wbf_settings', [] ); @@ -130,6 +137,27 @@ function wbf_admin_settings() { // rules_content separat (nicht in $fields, da textarea mit eigener Behandlung) $settings['rules_content'] = sanitize_textarea_field( $_POST['rules_content'] ?? '' ); + // Discord-Einstellungen gesondert speichern (sensitiv โ€” niemals in wbf_settings รถffentlich) + $discord_fields = ['discord_bot_token', 'discord_guild_id', 'discord_client_id', 'discord_client_secret']; + foreach ( $discord_fields as $df ) { + $settings[$df] = sanitize_text_field( $_POST[$df] ?? '' ); + } + $settings['discord_role_sync'] = isset($_POST['discord_role_sync']) && $_POST['discord_role_sync'] === '1' ? '1' : '0'; + + // Discord-Rollen-Map: Array von discord_role_id => forum_role_key + $role_map = []; + $dc_ids = array_map('sanitize_text_field', (array)($_POST['discord_role_id'] ?? [])); + $fr_keys = array_map('sanitize_key', (array)($_POST['discord_forum_role'] ?? [])); + $valid_roles = array_keys(WBF_Roles::get_all()); + foreach ( $dc_ids as $i => $dc_id ) { + $dc_id = trim($dc_id); + $fr_key = $fr_keys[$i] ?? ''; + if ( $dc_id !== '' && in_array($fr_key, $valid_roles, true) ) { + $role_map[$dc_id] = $fr_key; + } + } + $settings['discord_role_map'] = json_encode($role_map); + // Checkbox-Felder explizit als '0' speichern wenn nicht angehakt, // damit array_filter(...,'strlen') sie nicht wegwirft und der Default '1' greift. $checkbox_fields = ['maintenance_mode', 'rules_enabled', 'rules_accept_required']; @@ -150,6 +178,12 @@ function wbf_admin_settings() { $settings['ignore_blocked_roles'] = implode( ',', $checked_roles ); update_option( 'wbf_settings', $settings ); + + // Superadmin WP-User-ID separat speichern (auรŸerhalb von wbf_settings) + $sa_wp_id = (int) ( $_POST['superadmin_wp_id'] ?? 1 ); + if ( $sa_wp_id < 1 ) $sa_wp_id = 1; + update_option( 'wbf_superadmin_wp_id', $sa_wp_id ); + echo '

โœ… Einstellungen gespeichert!

'; } @@ -251,6 +285,40 @@ function wbf_admin_settings() { ๐Ÿ”’ Sicherheit + + + + + + + + + +

+ ๐ŸŽฎ Discord-Integration +

+

+ Bot-Token und Guild-ID findest du im Discord Developer Portal. + Der Bot muss Mitglied deines Servers sein und die Berechtigung Direct Messages lesen/senden sowie + Server-Mitglieder verwalten besitzen. +

+ + + + + + + + + + + + + + + + + + + + + + + + +

๐Ÿ”— Discord-Rollen โ†’ Forum-Rollen Zuordnung

+

+ Trage die Discord-Rollen-ID und die gewรผnschte Forum-Rolle ein. + Mehrere Eintrรคge werden der Reihe nach geprรผft โ€” der erste Treffer gewinnt. +

+ + + + + + + + + $fr_key ) : ?> + + + + + + + +
Discord Rollen-IDForum-Rolle
+ +
+ + + + +
+ ๐Ÿ”Œ Verbindungstest
+

+ Speichere zuerst die Einstellungen, dann klicke โ€žTesten" um zu prรผfen ob der Bot erreichbar ist. +

+ + +
+ + 'margin-top:1rem' ] ); ?> -