From 118f71928be9ae996f981d012e6f92323a7d8460 Mon Sep 17 00:00:00 2001 From: Henry Xu Date: Mon, 8 Feb 2021 17:28:31 -0500 Subject: [PATCH] Fix wrong audio stream, improve debugging (#69) --- package-lock.json | 18 +++++++++--------- package.json | 2 +- src/GlobalContext.ts | 7 +++++++ src/commands/debug/Status.ts | 11 +++++++---- src/voice/ConnectionHandler.ts | 8 +++++++- 5 files changed, 31 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index c14e0ef..0f1ba12 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { "name": "evebot", - "version": "1.0.8", + "version": "1.0.9", "lockfileVersion": 2, "requires": true, "packages": { "": { - "version": "1.0.8", + "version": "1.0.9", "license": "Apache-2.0", "dependencies": { "@discordjs/opus": "^0.4.0", @@ -35,7 +35,7 @@ "wav": "^1.0.2", "yargs-parser": "^20.0.0", "youtube-search": "^1.1.4", - "ytdl-core": "^4.2.1", + "ytdl-core": "^4.4.5", "ytpl": "^2.0.3", "ytsr": "^3.0.0", "zlib-sync": "^0.1.7" @@ -7031,9 +7031,9 @@ } }, "node_modules/ytdl-core": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ytdl-core/-/ytdl-core-4.2.1.tgz", - "integrity": "sha512-7zAoJiWpaBGgiAUCQuvKBuWom7tmSCV0A70gRdrPxR96yQoJOrCZkW6Wg1CofvPtAeQVWTVWThC8bXRsE+SBeA==", + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/ytdl-core/-/ytdl-core-4.4.5.tgz", + "integrity": "sha512-/ugilIF2PskxNfQgkYZ/esvkp+fiB/mOPdIExW/En+1QTbq5VeTVqgf2hETTen0Co2lHMM4eRxPaczDHTmkb7A==", "dependencies": { "m3u8stream": "^0.8.3", "miniget": "^4.0.0", @@ -12874,9 +12874,9 @@ } }, "ytdl-core": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ytdl-core/-/ytdl-core-4.2.1.tgz", - "integrity": "sha512-7zAoJiWpaBGgiAUCQuvKBuWom7tmSCV0A70gRdrPxR96yQoJOrCZkW6Wg1CofvPtAeQVWTVWThC8bXRsE+SBeA==", + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/ytdl-core/-/ytdl-core-4.4.5.tgz", + "integrity": "sha512-/ugilIF2PskxNfQgkYZ/esvkp+fiB/mOPdIExW/En+1QTbq5VeTVqgf2hETTen0Co2lHMM4eRxPaczDHTmkb7A==", "requires": { "m3u8stream": "^0.8.3", "miniget": "^4.0.0", diff --git a/package.json b/package.json index 0d64e9a..75ff65a 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "wav": "^1.0.2", "yargs-parser": "^20.0.0", "youtube-search": "^1.1.4", - "ytdl-core": "^4.2.1", + "ytdl-core": "^4.4.5", "ytpl": "^2.0.3", "ytsr": "^3.0.0", "zlib-sync": "^0.1.7" diff --git a/src/GlobalContext.ts b/src/GlobalContext.ts index e75d06d..8a88ec3 100644 --- a/src/GlobalContext.ts +++ b/src/GlobalContext.ts @@ -5,6 +5,7 @@ import {Config} from './guild/Config'; import {FileUtils} from './utils/FileUtils'; import {DefaultConfig} from './guild/DefaultConfig'; import {Directory} from './Directory'; +import {Utils} from './utils/Utils'; const guildContexts: Map = new Map(); const client = new Client(); @@ -43,9 +44,11 @@ export namespace GlobalContext { export function getMemoryUsage(): number[] { return [ + process.memoryUsage().heapUsed / 1000000, process.memoryUsage().heapTotal / 1000000, process.memoryUsage().external / 1000000, process.memoryUsage().rss / 1000000, + process.memoryUsage().arrayBuffers, ]; } @@ -59,4 +62,8 @@ export namespace GlobalContext { } return version; } + + export function getUptime(): string { + return Utils.convertSecondsToTimeString(process.uptime()); + } } diff --git a/src/commands/debug/Status.ts b/src/commands/debug/Status.ts index 803eb81..41c8527 100644 --- a/src/commands/debug/Status.ts +++ b/src/commands/debug/Status.ts @@ -85,7 +85,8 @@ function getStatusResponse(context: GuildContext): string { tableData3.push([GuildUtils.parseUserFromUserID(context, userID)!.username]); }); response += `${TableGenerator.createTable(tableHeader3, tableData3)}\n`; - response += `Version: ${GlobalContext.getBotVersion()}`; + response += `Version: ${GlobalContext.getBotVersion()}\n`; + response += `Uptime: ${GlobalContext.getUptime()}`; return response; } @@ -93,8 +94,10 @@ function getMemoryResponse(): string { const tableHeaders = ['Type', 'Allocated (MBs)']; const tableData: string[][] = []; const memory = GlobalContext.getMemoryUsage(); - tableData.push(['heapTotal', memory[0].toString()]); - tableData.push(['external', memory[1].toString()]); - tableData.push(['rss', memory[2].toString()]); + tableData.push(['heapUsed', memory[0].toString()]); + tableData.push(['heapTotal', memory[1].toString()]); + tableData.push(['external', memory[2].toString()]); + tableData.push(['rss', memory[3].toString()]); + tableData.push(['arrayBuffers', memory[4].toString()]); return TableGenerator.createTable(tableHeaders, tableData); } diff --git a/src/voice/ConnectionHandler.ts b/src/voice/ConnectionHandler.ts index 9fff388..a824eb2 100644 --- a/src/voice/ConnectionHandler.ts +++ b/src/voice/ConnectionHandler.ts @@ -9,6 +9,7 @@ import {CachingStream} from '../utils/CachingStream'; import SilenceInsertionHandler from './SilenceInsertionHandler'; import SilenceDetectingStream from '../utils/SilenceDetectingStream'; import {AudioUtils} from '../utils/AudioUtils'; +import { Transform } from 'stream'; const USER_REJOIN_THRESHOLD = 15000; const NO_USER_TIMEOUT = 60 * 1000; @@ -24,6 +25,7 @@ export default class VoiceConnectionHandler { private readonly isListeningToCommand: Map = new Map(); private noUsersInVoiceChannelTimeout: NodeJS.Timeout | undefined; private userJoinedFromBrowser: Set = new Set(); + private readonly opusDecoderStreamReferences: Map = new Map(); private readonly silenceInsertionHandler = new SilenceInsertionHandler(this.voiceStreams); private readonly mergeStream: MergingStream = new MergingStream(this.voiceStreams); @@ -177,6 +179,8 @@ export default class VoiceConnectionHandler { const timeout = setTimeout(() => { Logger.i(VoiceConnectionHandler.name, `Removing ${user.tag} [${user.id}]`, this.context); this.voiceStreams.delete(user.id); + this.opusDecoderStreamReferences.get(user.id)?.destroy(); + this.opusDecoderStreamReferences.delete(user.id); this.removedTimeouts.delete(user.id); }, USER_REJOIN_THRESHOLD); this.removedTimeouts.set(user.id, timeout); @@ -197,9 +201,11 @@ export default class VoiceConnectionHandler { console.log(`Error when decoding stream, unable to listen to ${user.tag}, Error: ${err}`); opusStream.removeAllListeners(); opusStream.destroy(); + decodedAudioStream.destroy(); this.userJoinedFromBrowser.add(user.id); return; }); + this.opusDecoderStreamReferences.set(user.id, decodedAudioStream); // Currently Broken, Need to manually decode in order to catch exception // const audio = connection.receiver.createStream(user, { @@ -208,7 +214,7 @@ export default class VoiceConnectionHandler { // }); const previousStream = this.voiceStreams.get(user.id); const recorderStream = previousStream || new RecordingStream(true); - opusStream.pipe(recorderStream, {end: false}); + decodedAudioStream.pipe(recorderStream, {end: false}); this.voiceStreams.set(user.id, recorderStream); const speechRecognizer = this.context.getVoiceDependencyProvider().getSpeechRecognizer(); const hotwordEngine = this.context.getVoiceDependencyProvider().getHotwordEngine();