diff --git a/CHANGELOG.md b/CHANGELOG.md index 3038d5e06..b0f2e51a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ - Fixed notices getting created and deleted in a loop. - Removed unused dependencies. - Fixed missing channel causing voting on verifications to fail. +- Fixed node failing to play a track causing the bot to get stuck. +- Fixed not being able to connect to the audio node. ## 5.1.0 diff --git a/assets/localisations/commands/cs.json b/assets/localisations/commands/cs.json index 9527d4b54..84339e4c8 100644 --- a/assets/localisations/commands/cs.json +++ b/assets/localisations/commands/cs.json @@ -264,7 +264,7 @@ "music.options.pause.description": "Pozastaví aktuálně přehrávanou skladbu nebo kolekci skladeb.", "music.options.pause.strings.paused.title": "Pauza", "music.options.pause.strings.paused.description": "Pozastavil přehrávání hudby.", - "music.options.play.name": "přehrát", + "music.options.play.name": "hrát", "music.options.play.description": "Umožňuje uživateli přehrávat hudbu v hlasovém kanálu.", "music.options.play.options.stream.name": "stream", "music.options.play.options.stream.description": "Přehrává zvukový proud.", diff --git a/assets/localisations/commands/fi.json b/assets/localisations/commands/fi.json index 36bc74694..5974b2746 100644 --- a/assets/localisations/commands/fi.json +++ b/assets/localisations/commands/fi.json @@ -365,7 +365,7 @@ "music.options.stop.description": "Lopettaa nykyisen kuunteluistunnon ja tyhjentää jonon ja kappaleiden historian.", "music.options.stop.strings.stopped.title": "Pysähtyi", "music.options.stop.strings.stopped.description": "Kuunteluistunto on lopetettu, ja kappalejono ja historia on tyhjennetty.", - "music.options.unskip.name": "ohita", + "music.options.unskip.name": "tuo-takaisin", "music.options.unskip.description": "Palauttaa viimeksi soitetun kappaleen.", "music.options.unskip.strings.historyEmpty.title": "Historia on tyhjä", "music.options.unskip.strings.historyEmpty.description": "Palautettavia biisilistoja ei ole.", diff --git a/assets/localisations/commands/ja.json b/assets/localisations/commands/ja.json index 967f024c2..7d4f582d2 100644 --- a/assets/localisations/commands/ja.json +++ b/assets/localisations/commands/ja.json @@ -325,7 +325,7 @@ "music.options.resume.strings.notPaused.description": "現在の曲は一時停止されない。", "music.options.resume.strings.resumed.title": "再開", "music.options.resume.strings.resumed.description": "音楽再生が再開された。", - "music.options.skip-to.name": "スキップ・トゥ", + "music.options.skip-to.name": "スキップ-トゥ", "music.options.skip-to.description": "現在再生中の曲の指定した箇所までスキップする。", "music.options.skip-to.strings.noSong.title": "タイムスタンプを求める曲がない", "music.options.skip-to.strings.noSong.description": "タイムスタンプを求める曲がない。", diff --git a/assets/localisations/commands/ko.json b/assets/localisations/commands/ko.json index 9fc0fc34c..78e82e895 100644 --- a/assets/localisations/commands/ko.json +++ b/assets/localisations/commands/ko.json @@ -325,7 +325,7 @@ "music.options.resume.strings.notPaused.description": "현재 노래가 일시정지되지 않습니다.", "music.options.resume.strings.resumed.title": "재개됨", "music.options.resume.strings.resumed.description": "음악 재생이 재개되었습니다.", - "music.options.skip-to.name": "건너뛰기", + "music.options.skip-to.name": "건너뛰기-위치", "music.options.skip-to.description": "현재 재생 중인 노래의 지정된 지점으로 건너뜁니다.", "music.options.skip-to.strings.noSong.title": "타임스탬프를 찾을 노래가 없습니다.", "music.options.skip-to.strings.noSong.description": "타임스탬프를 찾을 노래가 없습니다.", @@ -364,7 +364,7 @@ "music.options.stop.description": "현재 듣기 세션을 중지하고 대기열과 노래 기록을 지웁니다.", "music.options.stop.strings.stopped.title": "중지됨", "music.options.stop.strings.stopped.description": "듣기 세션이 중지되고 노래 대기열과 기록이 지워졌습니다.", - "music.options.unskip.name": "건너뛰기", + "music.options.unskip.name": "건너뛰기-해제", "music.options.unskip.description": "마지막으로 재생한 노래를 다시 재생합니다.", "music.options.unskip.strings.historyEmpty.title": "기록이 비어 있습니다.", "music.options.unskip.strings.historyEmpty.description": "가져올 노래 목록이 없습니다.", diff --git a/assets/localisations/commands/sv-SE.json b/assets/localisations/commands/sv-SE.json index 8f4299a22..56acb2fd1 100644 --- a/assets/localisations/commands/sv-SE.json +++ b/assets/localisations/commands/sv-SE.json @@ -364,7 +364,7 @@ "music.options.stop.description": "Avbryter den aktuella lyssningssessionen och rensar kö och låthistorik.", "music.options.stop.strings.stopped.title": "Stoppad", "music.options.stop.strings.stopped.description": "Lyssningssessionen har avbrutits och låtkön och historiken har rensats.", - "music.options.unskip.name": "hoppa-över", + "music.options.unskip.name": "ta-tillbaka", "music.options.unskip.description": "Återställer den senast spelade låten.", "music.options.unskip.strings.historyEmpty.title": "Historien är tom", "music.options.unskip.strings.historyEmpty.description": "Det finns inga låtlistor att ta med tillbaka.", diff --git a/assets/localisations/commands/th.json b/assets/localisations/commands/th.json index d993055fe..014c33a07 100644 --- a/assets/localisations/commands/th.json +++ b/assets/localisations/commands/th.json @@ -364,7 +364,7 @@ "music.options.stop.description": "หยุดการฟังปัจจุบัน ล้างคิวและประวัติเพลง", "music.options.stop.strings.stopped.title": "หยุด", "music.options.stop.strings.stopped.description": "การฟังเพลงได้ถูกหยุดแล้ว และคิวเพลงกับประวัติการฟังได้ถูกล้างแล้ว", - "music.options.unskip.name": "ข้าม", + "music.options.unskip.name": "เลิกข้าม", "music.options.unskip.description": "นำเพลงที่เล่นล่าสุดกลับมา", "music.options.unskip.strings.historyEmpty.title": "ประวัติว่างเปล่า", "music.options.unskip.strings.historyEmpty.description": "ไม่มีรายการเพลงที่จะนำกลับมา", diff --git a/assets/localisations/commands/uk.json b/assets/localisations/commands/uk.json index 5a793fb61..7d864a92c 100644 --- a/assets/localisations/commands/uk.json +++ b/assets/localisations/commands/uk.json @@ -243,7 +243,7 @@ "music.options.loop.strings.disabled.title": "Цикл вимкнено", "music.options.loop.strings.disabled.description.song": "Поточна пісня більше не буде зациклюватися.", "music.options.loop.strings.disabled.description.songCollection": "Поточна підбірка пісень більше не буде зациклюватися.", - "music.options.now.name": "зараз.", + "music.options.now.name": "зараз", "music.options.now.description": "Відображає поточну пісню, що відтворюється.", "music.options.now.strings.noSong.title": "Не грає пісня", "music.options.now.strings.noSong.description": "Пісні немає, щоб показати інформацію про неї.", @@ -364,7 +364,7 @@ "music.options.stop.description": "Зупиняє поточний сеанс прослуховування, очищаючи чергу та історію пісень.", "music.options.stop.strings.stopped.title": "Зупинився.", "music.options.stop.strings.stopped.description": "Сеанс прослуховування було зупинено, а чергу пісень та історію було очищено.", - "music.options.unskip.name": "пропустити", + "music.options.unskip.name": "повернути", "music.options.unskip.description": "Повертає останню відтворену пісню.", "music.options.unskip.strings.historyEmpty.title": "Історія порожня", "music.options.unskip.strings.historyEmpty.description": "Немає жодних списків пісень, які можна було б повернути.", diff --git a/assets/localisations/commands/vi.json b/assets/localisations/commands/vi.json index c8dc903ad..adef07faf 100644 --- a/assets/localisations/commands/vi.json +++ b/assets/localisations/commands/vi.json @@ -325,7 +325,7 @@ "music.options.resume.strings.notPaused.description": "Bài hát hiện tại không bị tạm dừng.", "music.options.resume.strings.resumed.title": "Tiếp tục", "music.options.resume.strings.resumed.description": "Phát nhạc đã được tiếp tục.", - "music.options.skip-to.name": "bỏ-qua", + "music.options.skip-to.name": "bỏ-qua-vị-trí", "music.options.skip-to.description": "Bỏ qua đến một điểm nhất định trong bài hát đang phát.", "music.options.skip-to.strings.noSong.title": "Không có bài hát để tìm dấu thời gian", "music.options.skip-to.strings.noSong.description": "Không có bài hát nào để tìm dấu thời gian.", diff --git a/assets/localisations/parameters/ja.json b/assets/localisations/parameters/ja.json index c11e91de0..44efd6253 100644 --- a/assets/localisations/parameters/ja.json +++ b/assets/localisations/parameters/ja.json @@ -15,6 +15,6 @@ "parameters.collection.description": "trueに設定すると、代わりにソングコレクションに対してアクションが実行される。", "parameters.by.name": "による", "parameters.by.description": "スキップする曲や曲リストの数。", - "parameters.to.name": "に変更する。", + "parameters.to.name": "に変更する", "parameters.to.description": "スキップするトラックのインデックス。" } diff --git a/source/library/commands/handlers/music/play.ts b/source/library/commands/handlers/music/play.ts index 2d32e83b1..832c43099 100644 --- a/source/library/commands/handlers/music/play.ts +++ b/source/library/commands/handlers/music/play.ts @@ -33,14 +33,21 @@ async function handleRequestQueryPlayback( return; } + await client.postponeReply(interaction); + const listing = await resolveToSongListing(client, interaction, { query: interaction.parameters.query }); + if (listing === null) { + client.deleteReply(interaction).ignore(); + return; + } + if (listing === undefined) { const strings = constants.contexts.songNotFound({ localise: client.localise, locale: interaction.locale, }); client - .warning(interaction, { + .warned(interaction, { title: strings.title, description: `${strings.description.notFound}\n\n${strings.description.tryDifferentQuery}`, }) @@ -49,7 +56,7 @@ async function handleRequestQueryPlayback( return; } - client.acknowledge(interaction).ignore(); + client.deleteReply(interaction).ignore(); await handleRequestPlayback(client, interaction, listing); } diff --git a/source/library/commands/resolvers/resolver.ts b/source/library/commands/resolvers/resolver.ts index 56152f1b3..10d9cf803 100644 --- a/source/library/commands/resolvers/resolver.ts +++ b/source/library/commands/resolvers/resolver.ts @@ -5,6 +5,6 @@ type SongListingResolver = ( client: Client, interaction: Rost.Interaction, { query }: { query: string }, -) => Promise; +) => Promise; export type { SongListingResolver }; diff --git a/source/library/commands/resolvers/youtube.ts b/source/library/commands/resolvers/youtube.ts index 08c7fc052..31d062007 100644 --- a/source/library/commands/resolvers/youtube.ts +++ b/source/library/commands/resolvers/youtube.ts @@ -36,14 +36,14 @@ async function resolveYouTubeSongListings( return undefined; } -async function search(client: Client, interaction: Rost.Interaction, query: string): Promise { +async function search(client: Client, interaction: Rost.Interaction, query: string): Promise { const resultsAll = await youtube.search(query, { limit: 20, type: "all", safeSearch: false }); const results = resultsAll.items.filter((element) => isPlaylist(element) || isVideo(element)); if (results.length === 0) { return undefined; } - const { promise, resolve } = Promise.withResolvers(); + const { promise, resolve } = Promise.withResolvers(); const selectMenuSelection = new InteractionCollector(client, { only: [interaction.user.id], isSingle: true }); @@ -52,23 +52,23 @@ async function search(client: Client, interaction: Rost.Interaction, query: stri const indexString = selection.data?.values?.at(0); if (indexString === undefined) { - return resolve(undefined); + return resolve(null); } const index = Number(indexString); if (!Number.isSafeInteger(index)) { - return resolve(undefined); + return resolve(null); } const result = results.at(index); if (result === undefined) { - return resolve(undefined); + return resolve(null); } if (isPlaylist(result)) { const playlist = await youtube.getPlaylist(result.id); if (playlist === undefined) { - return resolve(undefined); + return resolve(null); } return resolve(getSongListingFromPlaylist(playlist, interaction.user.id)); @@ -77,7 +77,7 @@ async function search(client: Client, interaction: Rost.Interaction, query: stri return resolve(getSongListingFromVideo(result, interaction.user.id)); }); - selectMenuSelection.onDone(() => resolve(undefined)); + selectMenuSelection.onDone(() => resolve(null)); await client.registerInteractionCollector(selectMenuSelection); @@ -103,7 +103,7 @@ async function search(client: Client, interaction: Rost.Interaction, query: stri const strings = constants.contexts.selectSong({ localise: client.localise, locale: interaction.locale }); client - .notice(interaction, { + .noticed(interaction, { embeds: [ { title: strings.title, diff --git a/source/library/services/lavalink.ts b/source/library/services/lavalink.ts index 60d02d546..28b25bdc6 100644 --- a/source/library/services/lavalink.ts +++ b/source/library/services/lavalink.ts @@ -151,7 +151,7 @@ function patchShoukakuWebSockets(): void { this.reconnects = 0; this.state = shoukaku.Constants.State.NEARLY; }; - shoukaku.Node.prototype.connect = function () { + shoukaku.Node.prototype.connect = async function () { if (!this.manager.id) { throw new Error("Don't connect a node when the library is not yet ready"); } diff --git a/source/library/services/music.ts b/source/library/services/music.ts index 1c9fbad3d..cd83d18f7 100644 --- a/source/library/services/music.ts +++ b/source/library/services/music.ts @@ -535,6 +535,8 @@ class MusicSession extends EventEmitter { )} on ${this.client.diagnostics.guild(this.service.guildId)}.`, ), ); + + await this.advanceQueue(); } async receiveListing({ listing }: { listing: SongListing }): Promise { @@ -639,6 +641,7 @@ class MusicSession extends EventEmitter { async play({ playable }: { playable: Playable }): Promise { const track = await this.#getTrack({ playable }); if (track === undefined) { + await this.advanceQueue(); return false; }