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:
+32
-9
@@ -28,6 +28,7 @@ import {
|
||||
} from '../db.js';
|
||||
import {
|
||||
laeuft, weiter, spielen, beiAenderung, tafelAktualisieren, tafelnMelden, radioQuelle,
|
||||
pausieren, verstrichen,
|
||||
} from './radio.js';
|
||||
import {
|
||||
aufloesen, ytdlpVorhanden, letzterFehler, TREFFER,
|
||||
@@ -95,9 +96,10 @@ export function musikEmbed(client, guildId) {
|
||||
|
||||
if (jetzt?.quelle?.art === 'youtube') {
|
||||
const t = jetzt.quelle.titel;
|
||||
const verstrichen = Math.floor((Date.now() - jetzt.seit) / 1000);
|
||||
const balken = fortschritt(verstrichen, t.dauer);
|
||||
embed.setDescription(`**${kurz(t.titel, 200)}**\n`
|
||||
// Pausen abgezogen — sonst behauptet der Balken, ein angehaltener
|
||||
// Titel liefe weiter, und läuft beim Fortsetzen voraus.
|
||||
const balken = fortschritt(verstrichen(jetzt), t.dauer);
|
||||
embed.setDescription(`${jetzt.pausiertSeit ? '⏸️ ' : ''}**${kurz(t.titel, 200)}**\n`
|
||||
+ `${t.kanal ? `_${kurz(t.kanal, 80)}_\n` : ''}`
|
||||
+ (balken ? `${balken}\n` : '🔴 _Livestream_\n')
|
||||
+ `in <#${jetzt.channelId}>`);
|
||||
@@ -149,7 +151,7 @@ export function musikKomponenten(guildId) {
|
||||
const reihen = [];
|
||||
|
||||
if (liste.length > 0) {
|
||||
const optionen = (praefix) => liste.map((e, i) => {
|
||||
const optionen = () => liste.map((e, i) => {
|
||||
const o = new StringSelectMenuOptionBuilder()
|
||||
.setLabel(kurz(`${i + 1}. ${e.titel}`, 100))
|
||||
.setValue(String(e.id));
|
||||
@@ -171,13 +173,30 @@ export function musikKomponenten(guildId) {
|
||||
// an der Radio-Tafel: ein Knopf, der sich drücken lässt und nichts
|
||||
// bewirkt, sieht aus wie ein kaputter Knopf.
|
||||
const nichtsDa = liste.length === 0;
|
||||
const ytLaeuft = jetzt?.quelle?.art === 'youtube';
|
||||
const pausiert = Boolean(jetzt?.pausiertSeit);
|
||||
|
||||
// Zwei Knopfreihen statt einer: mit der Pause wären es sechs Knöpfe, und
|
||||
// Discord lässt nur fünf je Reihe zu. Platz ist da — zwei Auswahlmenüs
|
||||
// plus zwei Knopfreihen sind vier von fünf möglichen Reihen.
|
||||
//
|
||||
// Die Trennung ist ausserdem die sinnvollere: oben, was gerade klingt,
|
||||
// unten, was mit der Liste passiert.
|
||||
reihen.push(new ActionRowBuilder().addComponents(
|
||||
// Pause gibt es nur bei YouTube. Warum, steht bei `pausieren()` in
|
||||
// `radio.js` — kurz: einen Dauerstrom anzuhalten heisst, ihm
|
||||
// hinterherzuhinken.
|
||||
pausiert
|
||||
? knopf('musik_pause', 'Weiter', '▶️', ButtonStyle.Success)
|
||||
: knopf('musik_pause', 'Pause', '⏸️', ButtonStyle.Primary, !ytLaeuft),
|
||||
knopf('musik_skip', 'Überspringen', '⏭️', ButtonStyle.Primary,
|
||||
nichtsDa && !ytLaeuft),
|
||||
knopf('musik_heim', 'Zum Radio', '📻', ButtonStyle.Secondary,
|
||||
!ytLaeuft || !jetzt.heimStationId),
|
||||
));
|
||||
reihen.push(new ActionRowBuilder().addComponents(
|
||||
knopf('musik_add', 'Einreihen…', '▶️', ButtonStyle.Success),
|
||||
knopf('musik_skip', 'Überspringen', '⏭️', ButtonStyle.Primary,
|
||||
nichtsDa && jetzt?.quelle?.art !== 'youtube'),
|
||||
knopf('musik_leeren', 'Leeren', '🗑️', ButtonStyle.Danger, nichtsDa),
|
||||
knopf('musik_heim', 'Zum Radio', '📻', ButtonStyle.Secondary,
|
||||
!jetzt || jetzt.quelle?.art !== 'youtube' || !jetzt.heimStationId),
|
||||
knopf('musik_refresh', 'Aktualisieren', '🔄'),
|
||||
));
|
||||
return reihen;
|
||||
@@ -336,7 +355,7 @@ async function zielKanal(interaction) {
|
||||
}
|
||||
|
||||
const IDS = ['musik_add', 'musik_skip', 'musik_leeren', 'musik_heim', 'musik_refresh',
|
||||
'musik_vor', 'musik_weg'];
|
||||
'musik_pause', 'musik_vor', 'musik_weg'];
|
||||
|
||||
/** Knöpfe, Menüs und das Eingabefenster der Musik-Tafel */
|
||||
export async function handleMusikInteraction(interaction) {
|
||||
@@ -438,6 +457,10 @@ export async function handleMusikInteraction(interaction) {
|
||||
// und das über den drei Sekunden liegt.
|
||||
await interaction.deferUpdate();
|
||||
await weiter(interaction.client, guildId, { erzwungen: true, kanalId: kanal.id });
|
||||
} else if (customId === 'musik_pause') {
|
||||
// Kein Aufschub nötig: Anhalten passiert im Speicher, ohne Netz.
|
||||
pausieren(guildId);
|
||||
await interaction.deferUpdate();
|
||||
} else if (customId === 'musik_leeren') {
|
||||
queueClear(guildId);
|
||||
await interaction.deferUpdate();
|
||||
|
||||
Reference in New Issue
Block a user