Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
90fefb2865 | ||
|
|
8b4efb2cb9 |
+6
-2
@@ -49,8 +49,12 @@ services:
|
||||
# eingerichtet" sagt.
|
||||
ACP_URL: ${ACP_URL:-}
|
||||
ACP_BOT_TOKEN: ${ACP_BOT_TOKEN:-}
|
||||
# Die Discord-Rolle, die den Zutritt oeffnet. Muss dieselbe sein, die der
|
||||
# Spielserver prueft (Convar d4rk_discord:role).
|
||||
# Die Discord-Rolle, die den Zutritt oeffnet. NUR NOCH RUECKFALL: seit
|
||||
# dem 04.09.2026 holt der Bot sie vom Adminpanel (/bot/config), wo sie
|
||||
# auf der Seite "Einstellungen" eingetragen wird. Was dort steht, gewinnt.
|
||||
#
|
||||
# Der Rueckfall bleibt, damit /whitelist auch dann noch etwas anzeigen
|
||||
# kann, wenn das Panel gerade nicht antwortet.
|
||||
WHITELIST_ROLE_ID: ${WHITELIST_ROLE_ID:-}
|
||||
# HTTP-Endpoint für Gitea-Webhooks + Webinterface
|
||||
# NPM leitet bot.d4rkst3r.de → host.docker.internal:3080
|
||||
|
||||
@@ -24,13 +24,33 @@
|
||||
// gemessen hat, ist ein Schreibbefehl ins Ungewisse.
|
||||
import { SlashCommandBuilder, MessageFlags } from 'discord.js';
|
||||
|
||||
import { person, panelBereit, darfWhitelist } from '../../panel.js';
|
||||
import { person, panelBereit, darfWhitelist, konfig } from '../../panel.js';
|
||||
|
||||
// Die Rollen-ID kommt aus derselben Umgebung wie der Rest der Botkonfiguration.
|
||||
// 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.
|
||||
const WHITELIST_ROLLE = process.env.WHITELIST_ROLE_ID || '';
|
||||
/*
|
||||
DIE ROLLEN WERDEN GELESEN, NICHT GEPFLEGT.
|
||||
|
||||
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.
|
||||
|
||||
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 zutritt() {
|
||||
const k = await konfig();
|
||||
|
||||
if (!k.ok || k.zutrittGelesen !== true || !k.zutritt) return null;
|
||||
|
||||
return k.zutritt;
|
||||
}
|
||||
|
||||
const GRUENDE = {
|
||||
nicht_eingerichtet:
|
||||
@@ -99,18 +119,31 @@ export async function execute(interaction) {
|
||||
Verbindung. Wer sie hier vom Server erwartet, bekommt eine Antwort, die
|
||||
geraten wäre.
|
||||
*/
|
||||
let rolleText = 'nicht prüfbar — `WHITELIST_ROLE_ID` ist nicht gesetzt';
|
||||
const z = await zutritt();
|
||||
|
||||
if (WHITELIST_ROLLE) {
|
||||
let rolleText = 'nicht prüfbar — der Spielserver sagt gerade nicht, welche Rollen gelten';
|
||||
|
||||
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(WHITELIST_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;
|
||||
|
||||
+42
-4
@@ -74,8 +74,11 @@ async function hole(weg) {
|
||||
* fehlende Quelle als „nichts gefunden" zu lesen wäre der Fehler, den diese
|
||||
* Flags verhindern.
|
||||
*/
|
||||
export async function person(discordId) {
|
||||
const a = await hole(`person?discord=${encodeURIComponent(discordId)}`);
|
||||
export async function person(discordId, recht) {
|
||||
// `recht` ist optional. Wird eines mitgegeben, prueft der Spielserver es
|
||||
// gleich mit und legt `darf` in die Antwort - eine Frage, eine Runde.
|
||||
const zusatz = recht ? `&recht=${encodeURIComponent(recht)}` : '';
|
||||
const a = await hole(`person?discord=${encodeURIComponent(discordId)}${zusatz}`);
|
||||
|
||||
if (!a.ok) return a;
|
||||
|
||||
@@ -91,12 +94,47 @@ export async function person(discordId) {
|
||||
* Beides wäre geraten, also wird es unterschieden.
|
||||
*/
|
||||
export async function darfWhitelist(discordId) {
|
||||
const p = await person(discordId);
|
||||
const p = await person(discordId, 'd4rk.whitelist');
|
||||
|
||||
if (!p.ok) return { bekannt: false, grund: p.grund };
|
||||
if (p.rolleGelesen === false) return { bekannt: false, grund: 'rechtesystem_stumm' };
|
||||
if (!p.rolle) return { bekannt: true, darf: false, grund: 'keine_rolle' };
|
||||
if (p.rechtGelesen === false) return { bekannt: false, grund: 'recht_nicht_lesbar' };
|
||||
|
||||
return { bekannt: true, darf: p.darfWhitelist === true, rolle: p.rolle };
|
||||
return { bekannt: true, darf: p.darf === true, rolle: p.rolle };
|
||||
}
|
||||
|
||||
/**
|
||||
* Die Einstellungen, die im Panel eingetragen sind.
|
||||
*
|
||||
* WARUM DER BOT SIE NICHT SELBST FUEHRT: sonst stuende die Whitelist-Rolle an
|
||||
* 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
|
||||
* lang stehen, nachdem sie vorbei ist.
|
||||
*/
|
||||
let konfigStand = null;
|
||||
let konfigZeit = 0;
|
||||
|
||||
export async function konfig() {
|
||||
if (konfigStand && Date.now() - konfigZeit < 30000) return konfigStand;
|
||||
|
||||
const a = await hole('config');
|
||||
|
||||
if (!a.ok) return a;
|
||||
|
||||
konfigStand = a;
|
||||
konfigZeit = Date.now();
|
||||
|
||||
return a;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user