Pause fuer YouTube -- und der Bot bleibt draussen, wenn er rausgeht
Zwei Befunde aus dem Betrieb. 1. Der Bot ging aus dem leeren Kanal und kam sofort wieder rein. `stoppen()` hielt erst den Spieler an und loeschte dann aus `laufend`. `player.stop()` meldet den Leerlauf aber SYNCHRON -- gemessen mit @discordjs/voice 0.19: der Idle-Melder laeuft mitten in stop(), noch vor der naechsten Zeile. Er fand den Eintrag also noch, hielt das Ende fuer "Titel vorbei" und schaltete weiter: naechster Titel oder zurueck auf den Heimsender. Von aussen genau das gemeldete Bild. Jetzt wird erst geloescht, dann angehalten. Nachgestellt mit einem echten AudioPlayer und beiden Reihenfolgen -- die Kontrolle ist dabei die alte Reihenfolge: sie schaltet nachweislich weiter (1x), die neue nicht (0x). Ohne diese Gegenprobe koennte der Test etwas ganz anderes messen. 2. Im YouTube-Modus fehlte die Pause. `pausieren()` gibt es jetzt, ausdruecklich nur fuer YouTube. Ein Sender laesst sich nicht sinnvoll anhalten: er laeuft beim Betreiber weiter, waehrend hier die Leitung volllaeuft, und beim Fortsetzen kaeme eine Konserve, die immer weiter hinterherhinkt. Fuer einen Sender heisst Pause Stopp -- dafuer gibt es den Stopp-Knopf, und der Pause-Knopf graut aus. Die verstrichene Zeit rechnet Pausen heraus, sonst liefe der Fortschrittsbalken nach dem Fortsetzen um die Pausenlaenge voraus. `verstrichen()` steht an EINER Stelle, die sich Discord-Tafel und Panel teilen -- zwei Rechnungen waeren zwei Gelegenheiten, die Pause zu vergessen. Die Musik-Tafel bekommt eine zweite Knopfreihe: mit der Pause waeren es sechs Knoepfe, Discord laesst fuenf je Reihe zu. Platz ist reichlich (vier von fuenf Reihen), und die Trennung ist ohnehin sinnvoller -- oben, was gerade klingt, unten, was mit der Liste passiert. Nachgezaehlt: 2 Reihen ohne Liste, 4 mit. Beim Quellenwechsel wird ausdruecklich fortgesetzt: der Spieler ueberlebt den Wechsel, und stand er auf Pause, waere der neue Titel stumm gestartet waehrend der Eintrag "laeuft" sagt. Nebenbei: mein Feld-Abgleich hielt eine zweite Kopie der Feldliste von `radioStand()` und driftete beim ersten neuen Feld prompt ab -- er meldete `pausiert` als fehlend, obwohl die API es liefert. Er liest die Form jetzt aus der Quelle, statt sie doppelt zu pflegen.
This commit is contained in:
+16
-3
@@ -40,7 +40,7 @@ import { lastResults, GAME_ICONS, spielName, spielListe, zugangStand } from '../
|
||||
import { istLsServer, modBasis } from '../bot/ls-farm.js';
|
||||
import {
|
||||
titelHolen, laeuft, spielen, stoppen, weiter, radioQuelle,
|
||||
lautstaerkeSetzen, ffmpegVorhanden, tafelnMelden, titelMerken,
|
||||
lautstaerkeSetzen, ffmpegVorhanden, tafelnMelden, titelMerken, pausieren, verstrichen,
|
||||
} from '../bot/radio.js';
|
||||
import { einreihen, eintraegeAufnehmen, ggfAnwerfen } from '../bot/radio-musik.js';
|
||||
import {
|
||||
@@ -469,8 +469,10 @@ export function registerApiRoutes(app, client) {
|
||||
kanal: t?.kanal ?? null,
|
||||
// Sekunden statt eines Zeitstempels: der Browser muesste sonst
|
||||
// gegen die Uhr des Servers rechnen, und die beiden gehen selten
|
||||
// gleich.
|
||||
verstrichen: Math.floor((Date.now() - jetzt.seit) / 1000),
|
||||
// gleich. `verstrichen()` zieht Pausen ab -- dieselbe Rechnung
|
||||
// wie in der Discord-Tafel, nicht eine zweite daneben.
|
||||
verstrichen: verstrichen(jetzt),
|
||||
pausiert: Boolean(jetzt.pausiertSeit),
|
||||
dauer: t ? t.dauer : null,
|
||||
kanalId: jetzt.channelId,
|
||||
kanalName: kanal?.name ?? null,
|
||||
@@ -540,6 +542,17 @@ export function registerApiRoutes(app, client) {
|
||||
// das am Ergebnis sehen.
|
||||
await tafelnMelden(client, guildId);
|
||||
return { ok: true, lautstaerke: wert, laeuft: radioStand(guild) };
|
||||
} else if (aktion === 'pause') {
|
||||
// Gibt null zurueck, wenn nichts oder ein Sender laeuft --
|
||||
// dann ist Pause nicht vorgesehen, und das wird gesagt statt
|
||||
// still nichts zu tun.
|
||||
const neu = pausieren(guildId, b.wert === undefined ? null : Boolean(b.wert));
|
||||
if (neu === null) {
|
||||
return reply.code(400).send({
|
||||
error: 'Pause gibt es nur bei YouTube -- ein Sender laesst sich nicht anhalten, '
|
||||
+ 'nur stoppen.',
|
||||
});
|
||||
}
|
||||
} else if (aktion === 'skip') {
|
||||
const kanalId = zielId();
|
||||
if (!kanalId) return reply.code(400).send({ error: 'Kein Sprachkanal.' });
|
||||
|
||||
Reference in New Issue
Block a user