From bb96788a3ab48776229985ca0a02f9c5c124b65a Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Mon, 15 May 2023 16:06:04 -0300 Subject: WIP socket shenanigans [!!!] this commit is mostly trash lol [!!!] Editor's note: Okay, after rebasing this commit is *super* spooky! It's interacting with a bunch of stuff that was previously handled in a merge commit and the revised changes may or may not be totally broken. If in doubt, assume this commit is the root of all evil (probably). --- socket.js | 166 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 155 insertions(+), 11 deletions(-) (limited to 'socket.js') diff --git a/socket.js b/socket.js index c91a1af..525be82 100644 --- a/socket.js +++ b/socket.js @@ -239,7 +239,11 @@ function validateCommand(command) { command.sender === 'server' ) || !command.startingTrack ) - case 'share-with-party': + case 'added queue player': + return ( + typeof command.id === 'string' + ) + case 'share with party': return ( typeof command.item === 'string' || Array.isArray(command.item) @@ -389,8 +393,6 @@ export function makeSocketServer() { if (readySockets && !readySockets.includes(socketId)) { readySockets.push(socketId) if (readySockets.length === Object.keys(socketMap).length) { - const QP = server.canonicalBackend.queuePlayers.find(QP => QP.id === command.queuePlayer) - silenceEvents(QP, ['set-pause'], () => QP.setPause(false)) for (const socket of Object.values(socketMap)) { socket.write(serializeCommandToData({ sender: 'server', @@ -641,6 +643,9 @@ export function attachBackendToSocketClient(backend, client) { case 'unqueue': actionmsg = `removed ${itemToMessage(command.topItem)} from the queue` break + case 'added queue player': + actionmsg = `created a new playback queue` + break case 'status': isVerbose = true switch (command.status) { @@ -707,11 +712,14 @@ export function attachBackendToSocketClient(backend, client) { backend.loadSharedSources(socketId, sharedSources) } await restoreBackend(backend, command.backend) - backend.on('playing', QP => { - QP.once('received time data', () => { - client.sendCommand({code: 'status', status: 'sync-playback'}) - }) - }) + attachPlaybackBackendListeners() + // Commented out as part of a merge commit catching up + // socket-mtui with main. Spooky! // + // backend.on('playing', QP => { + // QP.once('received time data', () => { + // client.sendCommand({code: 'status', status: 'sync-playback'}) + // }) + // }) return } // Again, no break. Client commands can come from the server. @@ -766,9 +774,9 @@ export function attachBackendToSocketClient(backend, client) { queuePlayer: QP.id }) }) - silenceEvents(QP, ['playing'], () => QP.play( - restoreNewItem(command.track, getPlaylistSources()) - )) + silenceEvents(QP, ['playing'], () => { + QP.play(restoreNewItem(command.track, getPlaylistSources())) + }) } return case 'queue': @@ -798,6 +806,8 @@ export function attachBackendToSocketClient(backend, client) { return } case 'set-pause': { + // All this code looks very scary??? + /* // TODO: there's an event leak here when toggling pause while // nothing is playing let playingThisTrack = true @@ -809,6 +819,15 @@ export function attachBackendToSocketClient(backend, client) { if (QP) silenceEvents(QP, ['set-pause'], () => QP.setPause(command.paused)) } }, command.startingTrack ? 500 : 0) + */ + silenceEvents(QP, ['set pause'], () => QP.setPause(command.paused)) + return + } + case 'added queue player': { + silenceEvents(backend, ['added queue player'], () => { + const QP = backend.addQueuePlayer() + QP.id = command.id + }) return } case 'share-with-party': { @@ -972,6 +991,131 @@ export function attachBackendToSocketClient(backend, client) { }) } }) + + backend.on('set party nickname', nickname => { + let oldNickname = client.nickname + sharedSources.name = namePartySources(nickname) + client.nickname = nickname + client.sendCommand({code: 'set nickname', nickname, oldNickname}) + }) + + function attachPlaybackBackendListeners() { + backend.on('QP: clear queue', queuePlayer => { + client.sendCommand({ + code: 'clear queue', + queuePlayer: queuePlayer.id + }) + }) + + backend.on('QP: clear queue past', (queuePlayer, track) => { + client.sendCommand({ + code: 'clear queue past', + queuePlayer: queuePlayer.id, + track: saveItemReference(track) + }) + }) + + backend.on('QP: clear queue up to', (queuePlayer, track) => { + client.sendCommand({ + code: 'clear queue up to', + queuePlayer: queuePlayer.id, + track: saveItemReference(track) + }) + }) + + backend.on('QP: distribute queue', (queuePlayer, topItem, opts) => { + client.sendCommand({ + code: 'distribute queue', + queuePlayer: queuePlayer.id, + topItem: saveItemReference(topItem), + opts + }) + }) + + backend.on('QP: done playing', queuePlayer => { + client.sendCommand({ + code: 'status', + status: 'done playing', + queuePlayer: queuePlayer.id + }) + }) + + backend.on('QP: playing', (queuePlayer, track) => { + if (track) { + client.sendCommand({ + code: 'play', + queuePlayer: queuePlayer.id, + track: saveItemReference(track) + }) + queuePlayer.once('received time data', data => { + client.sendCommand({ + code: 'status', + status: 'ready to resume', + queuePlayer: queuePlayer.id + }) + }) + } else { + client.sendCommand({ + code: 'stop playing', + queuePlayer: queuePlayer.id + }) + } + }) + + backend.on('QP: queue', (queuePlayer, topItem, afterItem, opts) => { + client.sendCommand({ + code: 'queue', + queuePlayer: queuePlayer.id, + topItem: saveItemReference(topItem), + afterItem: saveItemReference(afterItem), + opts + }) + }) + + function handleSeek(queuePlayer) { + client.sendCommand({ + code: 'seek to', + queuePlayer: queuePlayer.id, + time: queuePlayer.time + }) + } + + backend.on('QP: seek ahead', handleSeek) + backend.on('QP: seek back', handleSeek) + backend.on('QP: seek to', handleSeek) + + backend.on('QP: shuffle queue', queuePlayer => { + client.sendCommand({ + code: 'restore queue', + why: 'shuffle', + queuePlayer: queuePlayer.id, + tracks: queuePlayer.queueGrouplike.items.map(saveItemReference) + }) + }) + + backend.on('QP: toggle pause', queuePlayer => { + client.sendCommand({ + code: 'set pause', + queuePlayer: queuePlayer.id, + paused: queuePlayer.player.isPaused + }) + }) + + backend.on('QP: unqueue', (queuePlayer, topItem) => { + client.sendCommand({ + code: 'unqueue', + queuePlayer: queuePlayer.id, + topItem: saveItemReference(topItem) + }) + }) + + backend.on('added queue player', (queuePlayer) => { + client.sendCommand({ + code: 'added queue player', + id: queuePlayer.id, + }) + }) + } } export function attachSocketServerToBackend(server, backend) { -- cgit 1.3.0-6-gf8a5