Add playback commands

This commit is contained in:
Manuel Ruwe 2022-12-16 16:10:16 +01:00
parent f5c1cb71a6
commit 3d9ba8ede7
12 changed files with 238 additions and 4 deletions

View File

@ -30,6 +30,7 @@
"@nestjs/core": "^9.0.0",
"@nestjs/event-emitter": "^1.3.1",
"@nestjs/platform-express": "^9.0.0",
"date-fns": "^2.29.3",
"discord.js": "^14.7.1",
"jellyfin-apiclient": "^1.10.0",
"joi": "^17.7.0",

View File

@ -3,11 +3,30 @@ import { DiscordModule } from '@discord-nestjs/core';
import { HelpCommand } from './help.command';
import { StatusCommand } from './status.command';
import { CurrentTrackCommand } from './current.command';
import { DisconnectCommand } from './disconnect.command';
import { EnqueueCommand } from './enqueue.command';
import { PausePlaybackCommand } from './pause.command';
import { PlayCommand } from './play.command';
import { SkipTrackCommand } from './skip.command';
import { StopPlaybackCommand } from './stop.command';
import { SummonCommand } from './summon.command';
@Module({
imports: [DiscordModule.forFeature()],
controllers: [],
providers: [HelpCommand, StatusCommand],
providers: [
HelpCommand,
StatusCommand,
CurrentTrackCommand,
DisconnectCommand,
EnqueueCommand,
PausePlaybackCommand,
PlayCommand,
SkipTrackCommand,
StopPlaybackCommand,
SummonCommand,
],
exports: [],
})
export class CommandModule {}

View File

@ -0,0 +1,23 @@
import { TransformPipe } from '@discord-nestjs/common';
import {
Command,
DiscordTransformedCommand,
TransformedCommandExecutionContext,
UsePipes,
} from '@discord-nestjs/core';
import { InteractionReplyOptions } from 'discord.js';
@Command({
name: 'current',
description: 'Print the current track information',
})
@UsePipes(TransformPipe)
export class CurrentTrackCommand implements DiscordTransformedCommand<unknown> {
handler(
dto: unknown,
executionContext: TransformedCommandExecutionContext<any>,
): InteractionReplyOptions | string {
return 'nice';
}
}

View File

@ -0,0 +1,23 @@
import { TransformPipe } from '@discord-nestjs/common';
import {
Command,
DiscordTransformedCommand,
TransformedCommandExecutionContext,
UsePipes,
} from '@discord-nestjs/core';
import { InteractionReplyOptions } from 'discord.js';
@Command({
name: 'disconnect',
description: 'Join your current voice channel',
})
@UsePipes(TransformPipe)
export class DisconnectCommand implements DiscordTransformedCommand<unknown> {
handler(
dto: unknown,
executionContext: TransformedCommandExecutionContext<any>,
): InteractionReplyOptions | string {
return 'nice';
}
}

View File

@ -0,0 +1,23 @@
import { TransformPipe } from '@discord-nestjs/common';
import {
Command,
DiscordTransformedCommand,
TransformedCommandExecutionContext,
UsePipes,
} from '@discord-nestjs/core';
import { InteractionReplyOptions } from 'discord.js';
@Command({
name: 'enqueue',
description: 'Enqueue a track to the current playlist',
})
@UsePipes(TransformPipe)
export class EnqueueCommand implements DiscordTransformedCommand<unknown> {
handler(
dto: unknown,
executionContext: TransformedCommandExecutionContext<any>,
): InteractionReplyOptions | string {
return 'nice';
}
}

View File

@ -0,0 +1,25 @@
import { TransformPipe } from '@discord-nestjs/common';
import {
Command,
DiscordTransformedCommand,
TransformedCommandExecutionContext,
UsePipes,
} from '@discord-nestjs/core';
import { InteractionReplyOptions } from 'discord.js';
@Command({
name: 'pause',
description: 'Pause or resume the playback of the current track',
})
@UsePipes(TransformPipe)
export class PausePlaybackCommand
implements DiscordTransformedCommand<unknown>
{
handler(
dto: unknown,
executionContext: TransformedCommandExecutionContext<any>,
): InteractionReplyOptions | string {
return 'nice';
}
}

View File

@ -0,0 +1,23 @@
import { TransformPipe } from '@discord-nestjs/common';
import {
Command,
DiscordTransformedCommand,
TransformedCommandExecutionContext,
UsePipes,
} from '@discord-nestjs/core';
import { InteractionReplyOptions } from 'discord.js';
@Command({
name: 'play',
description: 'Immediately play a track',
})
@UsePipes(TransformPipe)
export class PlayCommand implements DiscordTransformedCommand<unknown> {
handler(
dto: unknown,
executionContext: TransformedCommandExecutionContext<any>,
): InteractionReplyOptions | string {
return 'nice';
}
}

View File

@ -0,0 +1,23 @@
import { TransformPipe } from '@discord-nestjs/common';
import {
Command,
DiscordTransformedCommand,
TransformedCommandExecutionContext,
UsePipes,
} from '@discord-nestjs/core';
import { InteractionReplyOptions } from 'discord.js';
@Command({
name: 'skip',
description: 'Skip the current track',
})
@UsePipes(TransformPipe)
export class SkipTrackCommand implements DiscordTransformedCommand<unknown> {
handler(
dto: unknown,
executionContext: TransformedCommandExecutionContext<any>,
): InteractionReplyOptions | string {
return 'nice';
}
}

View File

@ -8,9 +8,12 @@ import {
UsePipes,
} from '@discord-nestjs/core';
import { EmbedBuilder } from '@discordjs/builders';
import { Client, InteractionReplyOptions } from 'discord.js';
import { Client, InteractionReplyOptions, Status } from 'discord.js';
import { DefaultJellyfinColor } from 'src/types/colors';
import { formatDuration, intervalToDuration } from 'date-fns';
import { Constants } from 'src/utils/constants';
@Command({
name: 'status',
description: 'Display the current status for troubleshooting',
@ -27,6 +30,13 @@ export class StatusCommand implements DiscordTransformedCommand<unknown> {
executionContext: TransformedCommandExecutionContext<any>,
): InteractionReplyOptions {
const ping = this.client.ws.ping;
const status = Status[this.client.ws.status];
const interval = intervalToDuration({
start: this.client.uptime,
end: 0,
});
const formattedDuration = formatDuration(interval);
return {
embeds: [
@ -34,14 +44,24 @@ export class StatusCommand implements DiscordTransformedCommand<unknown> {
.setTitle('Online and ready')
.setColor(DefaultJellyfinColor)
.addFields([
{
name: 'Version',
value: Constants.Metadata.Version,
inline: false,
},
{
name: 'Ping',
value: `${ping}ms`,
inline: true,
},
{
name: 'Source code',
value: 'https://github.com/manuel-rw/jellyfin-discord-music-bot',
name: 'Status',
value: `${status}`,
inline: true,
},
{
name: 'Uptime',
value: `${formattedDuration}`,
inline: true,
},
])

View File

@ -0,0 +1,23 @@
import { TransformPipe } from '@discord-nestjs/common';
import {
Command,
DiscordTransformedCommand,
TransformedCommandExecutionContext,
UsePipes,
} from '@discord-nestjs/core';
import { InteractionReplyOptions } from 'discord.js';
@Command({
name: 'stop',
description: 'Stop playback entirely and clear the current playlist',
})
@UsePipes(TransformPipe)
export class StopPlaybackCommand implements DiscordTransformedCommand<unknown> {
handler(
dto: unknown,
executionContext: TransformedCommandExecutionContext<any>,
): InteractionReplyOptions | string {
return 'nice';
}
}

View File

@ -0,0 +1,23 @@
import { TransformPipe } from '@discord-nestjs/common';
import {
Command,
DiscordTransformedCommand,
TransformedCommandExecutionContext,
UsePipes,
} from '@discord-nestjs/core';
import { InteractionReplyOptions } from 'discord.js';
@Command({
name: 'summon',
description: 'Join your current voice channel',
})
@UsePipes(TransformPipe)
export class SummonCommand implements DiscordTransformedCommand<unknown> {
handler(
dto: unknown,
executionContext: TransformedCommandExecutionContext<any>,
): InteractionReplyOptions | string {
return 'nice';
}
}

View File

@ -2892,6 +2892,13 @@ __metadata:
languageName: node
linkType: hard
"date-fns@npm:^2.29.3":
version: 2.29.3
resolution: "date-fns@npm:2.29.3"
checksum: e01cf5b62af04e05dfff921bb9c9933310ed0e1ae9a81eb8653452e64dc841acf7f6e01e1a5ae5644d0337e9a7f936175fd2cb6819dc122fdd9c5e86c56be484
languageName: node
linkType: hard
"debug@npm:2.6.9":
version: 2.6.9
resolution: "debug@npm:2.6.9"
@ -4446,6 +4453,7 @@ __metadata:
"@types/supertest": ^2.0.11
"@typescript-eslint/eslint-plugin": ^5.0.0
"@typescript-eslint/parser": ^5.0.0
date-fns: ^2.29.3
discord.js: ^14.7.1
eslint: ^8.0.1
eslint-config-prettier: ^8.3.0