From e6f8e3c3c54bb01f66e7a372068d095c889ad507 Mon Sep 17 00:00:00 2001 From: D4rkst3r Date: Fri, 28 Aug 2026 14:08:21 +0200 Subject: [PATCH] Beim Sender kam die Warteschlange nie dran Im Betrieb gemeldet: Link eingereiht, Bot blieb beim Radio. `ggfAnwerfen` stieg aus, sobald ueberhaupt etwas lief -- Sender wie Titel. Der Kommentar daneben sagte "die Liste kommt dran, wenn sie dran ist", und beim Sender war das schlicht falsch: ein Sender endet nie, es gibt also kein Idle, das weiterschaltet. Der einzige Idle, den es gibt, ist ein abgerissener Strom -- und der startet denselben Sender neu. Der Titel wartete auf einen Moment, der nie kommt. Damit war auch der Rueckweg unerreichbar: "Liste leer -> zurueck auf den Sender" setzt voraus, dass man ueberhaupt erst vom Sender wegkommt. Jetzt uebernimmt ein frisch eingereihter Titel sofort, wenn ein Sender laeuft. Der Sender ist nicht verloren -- er steht als heimStation im laufenden Eintrag und kommt zurueck, sobald die Liste leer ist. Ein laufender YouTube-Titel wird weiterhin nicht unterbrochen. Die Regel steckte als Bedingung mitten in der Funktion und war von aussen weder zu lesen noch zu pruefen. Sie heisst jetzt `uebernimmtSofort()` und laesst sich mit allen drei Eingaben durchspielen -- genau das ist gemacht: nichts laeuft -> true, Sender laeuft -> true (war vorher false, das war der Fehler), YouTube laeuft -> false. Der Quellenwechsel geht jetzt ins Log. Von aussen sieht "YouTube uebernimmt" genauso aus wie "nichts passiert", und der Unterschied ist genau der, den es hier zu sehen gibt. Die Musik-Tafel behauptete "kommt als Naechstes dran" -- korrigiert auf "uebernimmt sofort". --- src/bot/radio-musik.js | 52 +++++++++++++++++++++++++++++++++++------- src/bot/radio.js | 7 +++++- 2 files changed, 50 insertions(+), 9 deletions(-) diff --git a/src/bot/radio-musik.js b/src/bot/radio-musik.js index bd0c3d0..d54614c 100644 --- a/src/bot/radio-musik.js +++ b/src/bot/radio-musik.js @@ -107,7 +107,7 @@ export function musikEmbed(client, guildId) { // auch nicht als einer dargestellt. const heim = jetzt.heimStationId ? getStation(jetzt.heimStationId) : null; embed.setDescription(`📻 Gerade läuft das Radio${heim ? ` (**${heim.name}**)` : ''}.\n` - + 'Was hier eingereiht wird, kommt als Nächstes dran.'); + + 'Was hier eingereiht wird, übernimmt sofort — danach geht es zurück auf den Sender.'); } else { embed.setDescription(liste.length > 0 ? 'Nichts läuft. **Überspringen** startet die Warteschlange — ' @@ -229,19 +229,55 @@ export function eintraegeAufnehmen(guildId, eintraege, wunschVon = null) { } /** - * Läuft nichts, soll das Einreihen sofort Musik machen. + * Nach dem Einreihen: soll das jetzt losgehen? * - * Sonst legt jemand drei Titel in eine Liste, es passiert nichts, und der - * naheliegende Schluss wäre „kaputt". Läuft dagegen schon etwas — Sender oder - * Titel —, wird nicht dazwischengefunkt: die Liste kommt dran, wenn sie dran - * ist. + * Drei Fälle, und der mittlere ist der, den ich am 28.08.2026 falsch hatte: + * + * nichts läuft → die Liste fängt an. Sonst legt jemand drei Titel hinein, + * es passiert nichts, und der naheliegende Schluss wäre + * „kaputt". + * Sender läuft → **der Titel übernimmt sofort.** „Das Radio ist die + * Grundstellung, YouTube die Unterbrechung" — und eine + * Unterbrechung, die wartet, ist keine. Hier stand vorher + * „die Liste kommt dran, wenn sie dran ist", und das war + * beim Sender schlicht falsch: ein Sender endet nie, also + * gibt es kein `Idle`, das weiterschaltet. Der einzige + * `Idle`, den es gibt, ist ein abgerissener Strom — und der + * startet denselben Sender neu. Der Titel wartete also auf + * einen Moment, der nie kommt. Im Betrieb gemeldet: Link + * eingereiht, Bot blieb beim Radio. + * Der Sender ist nicht verloren: er steht als `heimStation` + * im laufenden Eintrag und kommt zurück, wenn die Liste + * leer ist. + * Titel läuft → nicht dazwischenfunken. Der Neue reiht sich ein, und + * *hier* stimmt „kommt dran, wenn er dran ist" auch. */ export async function ggfAnwerfen(client, guildId, kanalId) { - if (laeuft(guildId) || !kanalId) return false; - const q = await weiter(client, guildId, { erzwungen: true, kanalId }); + const jetzt = laeuft(guildId); + if (!uebernimmtSofort(jetzt)) return false; + // Ohne eigene Angabe der Kanal, in dem der Bot schon steht. + const ziel = jetzt?.channelId ?? kanalId; + if (!ziel) return false; + const q = await weiter(client, guildId, { erzwungen: true, kanalId: ziel }); return Boolean(q); } +/** + * Die Regel als eigener Satz — weil genau sie falsch war. + * + * Sie steckte als Bedingung mitten in `ggfAnwerfen` (`if (laeuft(guildId)) + * return false`) und war von aussen weder zu lesen noch zu prüfen. Hier hat + * sie einen Namen und lässt sich mit allen drei Eingaben durchspielen. + * + * @param {object|null} jetzt Der laufende Eintrag, oder null + * @returns {boolean} true = der neue Titel fängt sofort an + */ +export function uebernimmtSofort(jetzt) { + // Nur ein laufender YouTube-Titel wird nicht unterbrochen. Ein Sender + // schon — er ist die Grundstellung, kein Vorrang. + return jetzt?.quelle?.art !== 'youtube'; +} + // ── Suchtreffer zwischenlagern ──────────────────────────────────────────── // // Ein Discord-Auswahlmenü gibt nur die `value` zurück, und da passt keine diff --git a/src/bot/radio.js b/src/bot/radio.js index 6fd63ff..59026bb 100644 --- a/src/bot/radio.js +++ b/src/bot/radio.js @@ -51,7 +51,7 @@ import { import { moduleEnabled } from '../modules.js'; import { listStations, getStation, radioState, radioStates, setRadioState, clearRadioState, setSetting, - queueNext, queueAdd, queueVor, + queueNext, queueAdd, queueVor, queueStand, } from '../db.js'; import { senderGrundstock } from './radio-sender.js'; import { tonstrom, ytdlpPruefen, ytdlpVorhanden } from './youtube.js'; @@ -815,6 +815,11 @@ export async function weiter(client, guildId, { erzwungen = false, kanalId: star } throw error; } + // Der Wechsel gehört ins Log: von aussen sieht „YouTube uebernimmt" + // genauso aus wie „nichts passiert", und der Unterschied ist genau + // der, den es hier zu sehen gibt. + console.log(`[radio] ${quelle.art === 'youtube' ? '▶️' : '📻'} ${quelleName(quelle)}` + + `${naechster ? ` (noch ${queueStand(guildId).n} in der Liste)` : ' — Warteschlange leer'}`); const tafel = radioState(guildId); setRadioState({ guildId,