[RFC] Auto-announce when new song comes on (#914)

Co-authored-by: Andrew Mike <andrew@7thmagic.net>
Co-authored-by: Andrew Mike <logomancer@gmail.com>
This commit is contained in:
Andrew Mike 2024-03-03 16:43:56 -05:00 committed by GitHub
parent 1d5729fd6c
commit ccd8793cc1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 55 additions and 1 deletions

View file

@ -0,0 +1,17 @@
-- RedefineTables
PRAGMA foreign_keys=OFF;
CREATE TABLE "new_Setting" (
"guildId" TEXT NOT NULL PRIMARY KEY,
"playlistLimit" INTEGER NOT NULL DEFAULT 50,
"secondsToWaitAfterQueueEmpties" INTEGER NOT NULL DEFAULT 30,
"leaveIfNoListeners" BOOLEAN NOT NULL DEFAULT true,
"autoAnnounceNextSong" BOOLEAN NOT NULL DEFAULT false,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL
);
INSERT INTO "new_Setting" ("createdAt", "guildId", "leaveIfNoListeners", "playlistLimit", "secondsToWaitAfterQueueEmpties", "updatedAt") SELECT "createdAt", "guildId", "leaveIfNoListeners", "playlistLimit", "secondsToWaitAfterQueueEmpties", "updatedAt" FROM "Setting";
DROP TABLE "Setting";
ALTER TABLE "new_Setting" RENAME TO "Setting";
PRAGMA foreign_key_check;
PRAGMA foreign_keys=ON;

View file

@ -28,6 +28,7 @@ model Setting {
playlistLimit Int @default(50) playlistLimit Int @default(50)
secondsToWaitAfterQueueEmpties Int @default(30) secondsToWaitAfterQueueEmpties Int @default(30)
leaveIfNoListeners Boolean @default(true) leaveIfNoListeners Boolean @default(true)
autoAnnounceNextSong Boolean @default(false)
createdAt DateTime @default(now()) createdAt DateTime @default(now())
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt
} }

View file

@ -33,6 +33,13 @@ export default class implements Command {
.setName('value') .setName('value')
.setDescription('whether to leave when everyone else leaves') .setDescription('whether to leave when everyone else leaves')
.setRequired(true))) .setRequired(true)))
.addSubcommand(subcommand => subcommand
.setName('set-auto-announce-next-song')
.setDescription('set whether to announce the next song in the queue automatically')
.addBooleanOption(option => option
.setName('value')
.setDescription('whether to announce the next song in the queue automatically')
.setRequired(true)))
.addSubcommand(subcommand => subcommand .addSubcommand(subcommand => subcommand
.setName('get') .setName('get')
.setDescription('show all settings')); .setDescription('show all settings'));
@ -97,6 +104,23 @@ export default class implements Command {
break; break;
} }
case 'set-auto-announce-next-song': {
const value = interaction.options.getBoolean('value')!;
await prisma.setting.update({
where: {
guildId: interaction.guild!.id,
},
data: {
autoAnnounceNextSong: value,
},
});
await interaction.reply('👍 auto announce setting updated');
break;
}
case 'get': { case 'get': {
const embed = new EmbedBuilder().setTitle('Config'); const embed = new EmbedBuilder().setTitle('Config');
@ -108,6 +132,7 @@ export default class implements Command {
? 'never leave' ? 'never leave'
: `${config.secondsToWaitAfterQueueEmpties}s`, : `${config.secondsToWaitAfterQueueEmpties}s`,
'Leave if there are no listeners': config.leaveIfNoListeners ? 'yes' : 'no', 'Leave if there are no listeners': config.leaveIfNoListeners ? 'yes' : 'no',
'Auto announce next song in queue': config.autoAnnounceNextSong ? 'yes' : 'no',
}; };
let description = ''; let description = '';

View file

@ -19,6 +19,7 @@ import {
import FileCacheProvider from './file-cache.js'; import FileCacheProvider from './file-cache.js';
import debug from '../utils/debug.js'; import debug from '../utils/debug.js';
import {getGuildSettings} from '../utils/get-guild-settings.js'; import {getGuildSettings} from '../utils/get-guild-settings.js';
import {buildPlayingMessageEmbed} from '../utils/build-embed.js';
export enum MediaSource { export enum MediaSource {
Youtube, Youtube,
@ -64,7 +65,7 @@ export default class {
public guildId: string; public guildId: string;
public loopCurrentSong = false; public loopCurrentSong = false;
public loopCurrentQueue = false; public loopCurrentQueue = false;
private currentChannel: VoiceChannel | undefined;
private queue: QueuedSong[] = []; private queue: QueuedSong[] = [];
private queuePosition = 0; private queuePosition = 0;
private audioPlayer: AudioPlayer | null = null; private audioPlayer: AudioPlayer | null = null;
@ -102,6 +103,8 @@ export default class {
oldNetworking?.off('stateChange', networkStateChangeHandler); oldNetworking?.off('stateChange', networkStateChangeHandler);
newNetworking?.on('stateChange', networkStateChangeHandler); newNetworking?.on('stateChange', networkStateChangeHandler);
/* eslint-enable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call */ /* eslint-enable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call */
this.currentChannel = channel;
}); });
} }
@ -559,6 +562,14 @@ export default class {
if (newState.status === AudioPlayerStatus.Idle && this.status === STATUS.PLAYING) { if (newState.status === AudioPlayerStatus.Idle && this.status === STATUS.PLAYING) {
await this.forward(1); await this.forward(1);
// Auto announce the next song if configured to
const settings = await getGuildSettings(this.guildId);
const {autoAnnounceNextSong} = settings;
if (autoAnnounceNextSong && this.currentChannel) {
await this.currentChannel.send({
embeds: this.getCurrent() ? [buildPlayingMessageEmbed(this)] : [],
});
}
} }
} }