mirror of
https://github.com/informaticker/discord-jellyfin-bot.git
synced 2024-11-23 18:21:55 +01:00
✨ Add play track command
This commit is contained in:
parent
73f2f0eb5f
commit
ca10c0fd6d
@ -35,6 +35,7 @@
|
||||
"discord.js": "^14.7.1",
|
||||
"jellyfin-apiclient": "^1.10.0",
|
||||
"joi": "^17.7.0",
|
||||
"libsodium-wrappers": "^0.7.10",
|
||||
"reflect-metadata": "^0.1.13",
|
||||
"rimraf": "^3.0.2",
|
||||
"rxjs": "^7.2.0"
|
||||
|
@ -16,6 +16,7 @@ export class DiscordConfigService implements DiscordOptionsFactory {
|
||||
GatewayIntentBits.GuildMessages,
|
||||
GatewayIntentBits.MessageContent,
|
||||
GatewayIntentBits.GuildIntegrations,
|
||||
GatewayIntentBits.GuildVoiceStates,
|
||||
],
|
||||
},
|
||||
};
|
||||
|
@ -1,10 +1,18 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { OnModuleDestroy } from '@nestjs/common/interfaces/hooks';
|
||||
import { DiscordConfigService } from './discord.config.service';
|
||||
import { DiscordVoiceService } from './discord.voice.service';
|
||||
|
||||
@Module({
|
||||
imports: [],
|
||||
controllers: [],
|
||||
providers: [DiscordConfigService],
|
||||
providers: [DiscordConfigService, DiscordVoiceService],
|
||||
exports: [DiscordConfigService],
|
||||
})
|
||||
export class DiscordClientModule {}
|
||||
export class DiscordClientModule implements OnModuleDestroy {
|
||||
constructor(private readonly discordVoiceService: DiscordVoiceService) {}
|
||||
|
||||
onModuleDestroy() {
|
||||
this.discordVoiceService.disconnectGracefully();
|
||||
}
|
||||
}
|
||||
|
@ -1,14 +1,20 @@
|
||||
import { Injectable } from "@nestjs/common";
|
||||
import { VoiceChannel } from "discord.js";
|
||||
import { getVoiceConnections } from '@discordjs/voice';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { Logger } from '@nestjs/common/services';
|
||||
|
||||
@Injectable()
|
||||
export class DiscordVoiceService {
|
||||
|
||||
summonClient(voiceChannel: VoiceChannel) {
|
||||
// voiceChannel.join('');
|
||||
}
|
||||
|
||||
startPlayback() {
|
||||
private readonly logger = new Logger(DiscordVoiceService.name);
|
||||
disconnectGracefully() {
|
||||
const connections = getVoiceConnections();
|
||||
this.logger.debug(
|
||||
`Disonnecting gracefully from ${
|
||||
Object.keys(connections).length
|
||||
} connections`,
|
||||
);
|
||||
|
||||
connections.forEach((connection) => {
|
||||
connection.destroy();
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,23 +1,61 @@
|
||||
import { TransformPipe } from '@discord-nestjs/common';
|
||||
|
||||
import {
|
||||
Command,
|
||||
DiscordTransformedCommand,
|
||||
Payload,
|
||||
TransformedCommandExecutionContext,
|
||||
UsePipes,
|
||||
} from '@discord-nestjs/core';
|
||||
import { InteractionReplyOptions } from 'discord.js';
|
||||
import { InteractionReplyOptions, MessagePayload } from 'discord.js';
|
||||
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { TrackRequestDto } from '../models/track-request.dto';
|
||||
import {
|
||||
createAudioPlayer,
|
||||
createAudioResource,
|
||||
getVoiceConnection,
|
||||
} from '@discordjs/voice';
|
||||
import { Logger } from '@nestjs/common/services';
|
||||
|
||||
@Command({
|
||||
name: 'play',
|
||||
description: 'Immediately play a track',
|
||||
})
|
||||
@Injectable()
|
||||
@UsePipes(TransformPipe)
|
||||
export class PlayCommand implements DiscordTransformedCommand<unknown> {
|
||||
export class PlayCommand implements DiscordTransformedCommand<TrackRequestDto> {
|
||||
private readonly logger = new Logger(PlayCommand.name);
|
||||
|
||||
handler(
|
||||
dto: unknown,
|
||||
@Payload() dto: TrackRequestDto,
|
||||
executionContext: TransformedCommandExecutionContext<any>,
|
||||
): InteractionReplyOptions | string {
|
||||
return 'nice';
|
||||
):
|
||||
| string
|
||||
| void
|
||||
| MessagePayload
|
||||
| InteractionReplyOptions
|
||||
| Promise<string | void | MessagePayload | InteractionReplyOptions> {
|
||||
const player = createAudioPlayer();
|
||||
|
||||
this.logger.debug('bruh');
|
||||
|
||||
player.on('error', (error) => {
|
||||
this.logger.error(error);
|
||||
});
|
||||
|
||||
player.on('debug', (error) => {
|
||||
this.logger.debug(error);
|
||||
});
|
||||
|
||||
const resource = createAudioResource(dto.search);
|
||||
|
||||
const connection = getVoiceConnection(executionContext.interaction.guildId);
|
||||
|
||||
connection.subscribe(player);
|
||||
|
||||
player.play(resource);
|
||||
player.unpause();
|
||||
|
||||
return 'Playing Audio...';
|
||||
}
|
||||
}
|
||||
|
6
src/models/track-request.dto.ts
Normal file
6
src/models/track-request.dto.ts
Normal file
@ -0,0 +1,6 @@
|
||||
import { Param } from '@discord-nestjs/core';
|
||||
|
||||
export class TrackRequestDto {
|
||||
@Param({ required: true, description: 'Track name to search' })
|
||||
search: string;
|
||||
}
|
17
yarn.lock
17
yarn.lock
@ -4475,6 +4475,7 @@ __metadata:
|
||||
jellyfin-apiclient: ^1.10.0
|
||||
jest: 28.1.3
|
||||
joi: ^17.7.0
|
||||
libsodium-wrappers: ^0.7.10
|
||||
prettier: ^2.3.2
|
||||
reflect-metadata: ^0.1.13
|
||||
rimraf: ^3.0.2
|
||||
@ -5093,6 +5094,22 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"libsodium-wrappers@npm:^0.7.10":
|
||||
version: 0.7.10
|
||||
resolution: "libsodium-wrappers@npm:0.7.10"
|
||||
dependencies:
|
||||
libsodium: ^0.7.0
|
||||
checksum: 294ac098895a15f99e65431c62478f149e9e5cbbcd1fa1b41e832b65e0ead63856cc964b3b7c14447a48701e3334661dea9223442834ae7dd0d34285991616cd
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"libsodium@npm:^0.7.0":
|
||||
version: 0.7.10
|
||||
resolution: "libsodium@npm:0.7.10"
|
||||
checksum: 243794a0b3b753fafb304a82e9ff777eaccf11785bde6965e7f25171fd2fb35da302a89f009a91c1e922817d37724f7afc86592b128b2b58ed657d7fbe5259e6
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"lines-and-columns@npm:^1.1.6":
|
||||
version: 1.2.4
|
||||
resolution: "lines-and-columns@npm:1.2.4"
|
||||
|
Loading…
Reference in New Issue
Block a user