muse/src/services/natural-language-commands.ts

126 lines
3.4 KiB
TypeScript
Raw Normal View History

2020-03-18 23:15:45 +01:00
import {inject, injectable} from 'inversify';
import {Message, Guild, GuildMember} from 'discord.js';
import {TYPES} from '../types.js';
import PlayerManager from '../managers/player.js';
import {QueuedSong} from '../services/player.js';
import {getMostPopularVoiceChannel, getMemberVoiceChannel} from '../utils/channels.js';
2020-03-18 23:15:45 +01:00
@injectable()
export default class {
private readonly playerManager: PlayerManager;
2020-03-21 02:47:04 +01:00
constructor(@inject(TYPES.Managers.Player) playerManager: PlayerManager) {
2020-03-18 23:15:45 +01:00
this.playerManager = playerManager;
}
async execute(msg: Message): Promise<boolean> {
if (msg.content.startsWith('say') && msg.content.endsWith('muse')) {
const res = msg.content.slice(3, msg.content.indexOf('muse')).trim();
await msg.channel.send(res);
return true;
}
if (msg.content.toLowerCase().includes('packers')) {
await Promise.all([
msg.channel.send('GO PACKERS GO!!!'),
this.playClip(msg.guild!, msg.member!, {
title: 'GO PACKERS!',
artist: 'Unknown',
url: 'https://www.youtube.com/watch?v=qkdtID7mY3E',
length: 204,
playlist: null,
isLive: false,
2021-09-20 04:24:46 +02:00
addedInChannelId: msg.channel.id,
}, 8, 10),
]);
2020-03-18 23:15:45 +01:00
return true;
}
2020-03-18 23:15:45 +01:00
if (msg.content.toLowerCase().includes('bears')) {
await Promise.all([
msg.channel.send('F*** THE BEARS'),
this.playClip(msg.guild!, msg.member!, {
title: 'GO PACKERS!',
artist: 'Charlie Berens',
url: 'https://www.youtube.com/watch?v=UaqlE9Pyy_Q',
length: 385,
playlist: null,
isLive: false,
2021-09-20 04:24:46 +02:00
addedInChannelId: msg.channel.id,
}, 358, 5.5),
]);
2020-03-18 23:15:45 +01:00
return true;
}
2020-03-18 23:15:45 +01:00
2021-04-29 01:17:19 +02:00
if (msg.content.toLowerCase().includes('bitconnect')) {
await Promise.all([
msg.channel.send('🌊 🌊 🌊 🌊'),
this.playClip(msg.guild!, msg.member!, {
title: 'BITCONNEEECCT',
artist: 'Carlos Matos',
url: 'https://www.youtube.com/watch?v=lCcwn6bGUtU',
length: 227,
playlist: null,
isLive: false,
2021-09-20 04:24:46 +02:00
addedInChannelId: msg.channel.id,
}, 50, 13),
2021-04-29 01:17:19 +02:00
]);
return true;
}
return false;
}
2020-03-18 23:15:45 +01:00
private async playClip(guild: Guild, member: GuildMember, song: QueuedSong, position: number, duration: number): Promise<void> {
const player = this.playerManager.get(guild.id);
2020-03-18 23:15:45 +01:00
const [channel, n] = getMemberVoiceChannel(member) ?? getMostPopularVoiceChannel(guild);
2020-03-18 23:15:45 +01:00
if (!player.voiceConnection && n === 0) {
return;
}
2020-03-21 02:47:04 +01:00
if (!player.voiceConnection) {
await player.connect(channel);
}
2020-03-18 23:15:45 +01:00
const isPlaying = player.getCurrent() !== null;
let oldPosition = 0;
2020-03-18 23:15:45 +01:00
player.add(song, {immediate: true});
2020-03-24 01:40:54 +01:00
if (isPlaying) {
oldPosition = player.getPosition();
2020-03-18 23:15:45 +01:00
2021-04-23 18:30:31 +02:00
player.manualForward(1);
2020-03-18 23:15:45 +01:00
}
await player.seek(position);
return new Promise((resolve, reject) => {
try {
setTimeout(async () => {
if (player.getCurrent()?.title === song.title) {
player.removeCurrent();
if (isPlaying) {
await player.back();
await player.seek(oldPosition);
} else {
player.disconnect();
}
}
resolve();
}, duration * 1000);
2020-10-24 18:32:43 +02:00
} catch (error: unknown) {
reject(error);
}
});
2020-03-18 23:15:45 +01:00
}
}