diff --git a/src/bot/commands/whitelist.js b/src/bot/commands/whitelist.js index cf3f8ba..2c0a72f 100644 --- a/src/bot/commands/whitelist.js +++ b/src/bot/commands/whitelist.js @@ -27,23 +27,29 @@ import { SlashCommandBuilder, MessageFlags } from 'discord.js'; import { person, panelBereit, darfWhitelist, konfig } from '../../panel.js'; /* - DIE ROLLEN-ID STEHT IM PANEL, NICHT HIER. + DIE ROLLEN WERDEN GELESEN, NICHT GEPFLEGT. - Sie ist kein Geheimnis, aber sie muss zu der passen, die der Spielserver - prüft (`d4rk_discord:role`) — stimmen sie nicht überein, zeigt dieser Befehl - „hat die Rolle" für eine Rolle, die den Zutritt gar nicht öffnet. Genau - deshalb wird sie an EINEM Ort eingetragen: auf der Einstellungsseite des - Adminpanels. + Sie sind kein Geheimnis, aber sie müssen zu denen passen, die der + Spielserver prüft (`d4rk_discord:role`) — sonst zeigt dieser Befehl „hat die + Rolle" für eine Rolle, die den Zutritt gar nicht öffnet. - Die Umgebungsvariable bleibt als Rückfall, damit der Bot auch dann läuft, - wenn das Panel gerade nicht antwortet. + Am 04.09.2026 gemessen: die Convar enthielt ZWEI Rollen, eingetragen war + eine. Deshalb kommt die Menge jetzt vom Spielserver. + + ES SIND MEHRERE, UND EINE REICHT. Wer eine davon hat, kommt herein — außer + er hat eine Sperrrolle, die schlägt alles. Das ist dieselbe Regel wie in + d4rk_lib; sie hier zu vereinfachen hieße, sie ein zweites Mal zu schreiben. + + KEIN RÜCKFALL AUF EINE GESPEICHERTE ID. Eine veraltete Liste würde + selbstbewusst falsch antworten; „nicht prüfbar" ist die richtige Antwort auf + eine Frage, die man gerade nicht beantworten kann. */ -async function whitelistRolle() { +async function zutritt() { const k = await konfig(); - if (k.ok && k.whitelistRolle) return k.whitelistRolle; + if (!k.ok || k.zutrittGelesen !== true || !k.zutritt) return null; - return process.env.WHITELIST_ROLE_ID || ''; + return k.zutritt; } const GRUENDE = { @@ -113,20 +119,31 @@ export async function execute(interaction) { Verbindung. Wer sie hier vom Server erwartet, bekommt eine Antwort, die geraten wäre. */ - const rolle = await whitelistRolle(); + const z = await zutritt(); - let rolleText = 'nicht prüfbar — im Adminpanel ist keine Whitelist-Rolle eingetragen'; + let rolleText = 'nicht prüfbar — der Spielserver sagt gerade nicht, welche Rollen gelten'; - if (rolle) { + if (z && z.rollen.length === 0) { + rolleText = 'keine Zutrittsrolle konfiguriert — die Whitelist ist offen'; + } else if (z) { const mitglied = await interaction.guild?.members .fetch(ziel.id) .catch(() => null); - rolleText = !mitglied - ? 'nicht auf diesem Discord' - : mitglied.roles.cache.has(rolle) - ? '**ja**' - : '**nein**'; + if (!mitglied) { + rolleText = 'nicht auf diesem Discord'; + } else { + const hat = z.rollen.filter((r) => mitglied.roles.cache.has(r)); + const gesperrt = (z.sperrrollen ?? []).some((r) => mitglied.roles.cache.has(r)); + + // DIE SPERRE ZUERST: sie schlägt die Zutrittsrolle. Sie danach zu + // nennen ließe „ja" stehen für jemanden, der nicht hereinkommt. + rolleText = gesperrt + ? '**gesperrt** — eine Sperrrolle schlägt jede Zutrittsrolle' + : hat.length > 0 + ? `**ja** (${hat.length} von ${z.rollen.length} Zutrittsrollen)` + : `**nein** (keine von ${z.rollen.length})`; + } } const k = p.konto; diff --git a/src/panel.js b/src/panel.js index 4661e71..6bda3f1 100644 --- a/src/panel.js +++ b/src/panel.js @@ -108,9 +108,16 @@ export async function darfWhitelist(discordId) { * Die Einstellungen, die im Panel eingetragen sind. * * WARUM DER BOT SIE NICHT SELBST FUEHRT: sonst stuende die Whitelist-Rolle an - * zwei Orten — hier in der Umgebung und dort auf der Seite. Zwei Orte fuer - * dieselbe Wahrheit heisst, dass eine Aenderung eine der beiden vergisst, und - * der Fehler sieht dann aus wie „die Rolle wird nicht erkannt". + * zwei Orten. Genau daran ist die erste Fassung gescheitert — am 04.09.2026 an + * der Serverkonsole gemessen: + * + * d4rk_discord:role = "1439019849664696460,1544029550802108437" + * + * ZWEI Rollen; eingetragen war eine. Wer nur die andere hatte, kam auf den + * Server und haette hier trotzdem „Whitelist-Rolle: nein" gelesen. + * + * Der Wert kommt deshalb aus der Convar des Spielservers, durchgereicht vom + * Panel — dieselbe Quelle, die auch ueber den Zutritt entscheidet. * * Kurz gepuffert, damit nicht jeder Befehl eine Runde ueber das Netz macht. * Ein Fehlschlag wird NICHT gepuffert — sonst bliebe eine Stoerung eine Minute