Beim Sender kam die Warteschlange nie dran
Deploy / check (push) Canceled after 0s
Deploy / deploy (push) Canceled after 0s

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".
This commit is contained in:
2026-08-28 14:09:09 +02:00
parent c46581a548
commit e6f8e3c3c5
2 changed files with 50 additions and 9 deletions
+44 -8
View File
@@ -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