diff options
-rw-r--r-- | backend.js | 4 | ||||
-rwxr-xr-x | index.js | 7 | ||||
-rw-r--r-- | socket.js | 28 | ||||
-rw-r--r-- | ui.js | 44 |
4 files changed, 81 insertions, 2 deletions
diff --git a/backend.js b/backend.js index 3b2343e..fe7014b 100644 --- a/backend.js +++ b/backend.js @@ -866,4 +866,8 @@ export default class Backend extends EventEmitter { async download(item) { return download(item, this.getRecordFor(item)) } + + showLogMessage(text) { + this.emit('log message', text) + } } diff --git a/index.js b/index.js index 2c352cd..efee187 100755 --- a/index.js +++ b/index.js @@ -64,6 +64,7 @@ async function main() { 'player-options': {type: 'series'}, 'stress-test': {type: 'flag'}, 'socket-client': {type: 'value'}, + 'socket-name': {type: 'value'}, 'socket-server': {type: 'value'}, 'telnet-server': {type: 'flag'}, 'skip-config-file': {type: 'flag'}, @@ -200,6 +201,12 @@ async function main() { attachBackendToSocketClient(backend, socketClient, { getPlaylistSources: () => appElement.playlistSources }) + + let nickname = process.env.USER + if (options['socket-name']) { + nickname = options['socket-name'] + } + socketClient.setNickname(nickname) } if (options['stress-test']) { diff --git a/socket.js b/socket.js index aae1504..12d08af 100644 --- a/socket.js +++ b/socket.js @@ -145,6 +145,12 @@ function validateCommand(command) { typeof command.queuePlayer === 'string' && typeof command.time === 'number' ) + case 'set-nickname': + return ( + typeof command.nickname === 'string' && + command.nickname.length >= 1 && + command.nickname.length <= 12 + ) case 'set-pause': return ( typeof command.queuePlayer === 'string' && @@ -219,6 +225,8 @@ export function makeSocketServer() { server.on('connection', socket => { sockets.push(socket) + let nickname = '(Unnamed)' + socket.on('close', () => { if (sockets.includes(socket)) { sockets.splice(sockets.indexOf(socket), 1) @@ -236,6 +244,7 @@ export function makeSocketServer() { } command.sender = 'client' + command.senderNickname = nickname if (!validateCommand(command)) { return @@ -294,6 +303,12 @@ export function makeSocketServer() { readyToResume[command.queuePlayer] = [] } + // If it's a 'set-nickname' command, save the nickname. + + if (command.code === 'set-nickname') { + nickname = command.nickname + } + // Relay the command to client sockets besides the sender. const otherSockets = sockets.filter(s => s !== socket) @@ -332,6 +347,11 @@ export function makeSocketClient() { client.sendCommand = function(command) { const data = serializeCommandToData(command) client.socket.write(data + '\n') + client.emit('sent-command', command) + } + + client.setNickname = function(nickname) { + client.sendCommand({code: 'set-nickname', nickname}) } client.socket.on('data', perLine(line => { @@ -363,7 +383,15 @@ export function attachBackendToSocketClient(backend, client, { backend.setAlwaysStartPaused(true) + function logCommand(command) { + const nickname = command.sender === 'server' ? 'the server' : command.nickname + backend.showLogMessage(`${nickname} sent ${command.code}!`) + } + + client.on('sent-command', logCommand) + client.on('command', async command => { + logCommand(command) switch (command.sender) { case 'server': switch (command.code) { diff --git a/ui.js b/ui.js index f9f8e5f..05e359e 100644 --- a/ui.js +++ b/ui.js @@ -55,7 +55,7 @@ import { } from './serialized-backend.js' /* text editor features disabled because theyre very much incomplete and havent - * gotten much use from me or anyonea afaik! + * gotten much use from me or anyone afaik! const TuiTextEditor = require('tui-text-editor') */ @@ -239,6 +239,12 @@ export default class AppElement extends FocusElement { }) */ + this.logPane = new Pane() + this.addChild(this.logPane) + + this.log = new Log() + this.logPane.addChild(this.log) + if (!this.config.showTabberPane) { this.tabberPane.visible = false } @@ -465,7 +471,8 @@ export default class AppElement extends FocusElement { 'handleQueueUpdated', 'handleAddedQueuePlayer', 'handleRemovedQueuePlayer', - 'handleSetLoopQueueAtEnd' + 'handleSetLoopQueueAtEnd', + 'handleLogMessage' ]) { this[key] = this[key].bind(this) } @@ -537,6 +544,7 @@ export default class AppElement extends FocusElement { this.backend.on('added queue player', this.handleAddedQueuePlayer) this.backend.on('removed queue player', this.handleRemovedQueuePlayer) this.backend.on('set-loop-queue-at-end', this.handleSetLoopQueueAtEnd) + this.backend.on('log message', this.handleLogMessage) } removeBackendListeners() { @@ -544,6 +552,7 @@ export default class AppElement extends FocusElement { this.backend.removeListener('added queue player', this.handleAddedQueuePlayer) this.backend.removeListener('removed queue player', this.handleRemovedQueuePlayer) this.backend.removeListener('set-loop-queue-at-end', this.handleSetLoopQueueAtEnd) + this.backend.removeListener('log message', this.handleLogMessage) } handleAddedQueuePlayer(queuePlayer) { @@ -561,6 +570,10 @@ export default class AppElement extends FocusElement { this.updateQueueLengthLabel() } + handleLogMessage(text) { + this.log.newLogMessage(text) + } + async handlePlayingDetails(track, oldTrack, startTime, queuePlayer) { const PIE = this.getPlaybackInfoElementForQueuePlayer(queuePlayer) if (PIE) { @@ -1711,10 +1724,21 @@ export default class AppElement extends FocusElement { } */ + if (this.logPane.visible) { + this.logPane.w = leftWidth + this.logPane.h = 6 + this.log.fillParent() + this.log.fixLayout() + } + if (this.tabberPane.visible) { this.tabberPane.w = leftWidth this.tabberPane.y = bottomY this.tabberPane.h = topY - this.tabberPane.y + if (this.logPane.visible) { + this.tabberPane.h -= this.logPane.h + this.logPane.y = this.tabberPane.bottom + } /* if (this.textInfoPane.visible) { this.tabberPane.h -= this.textInfoPane.h @@ -5499,3 +5523,19 @@ class NotesTextEditor extends TuiTextEditor { } } */ + +class Log extends ListScrollForm { + constructor() { + super('vertical') + } + + newLogMessage(text) { + const logMessage = new LogMessage(text) + this.addInput(logMessage) + this.fixLayout() + this.scrollToEnd() + return logMessage + } +} + +class LogMessage extends Button {} |