1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
import { Message, VoiceChannel } from 'discord.js';
import { BushCommand, BushMessage, BushSlashMessage } from '../../lib';
const activityMap = {
'Poker Night': '755827207812677713',
'Betrayal.io': '773336526917861400',
'Fishington.io': '814288819477020702',
'YouTube Together': '755600276941176913',
'Chess in the Park': '832012774040141894'
};
function map(phase: string) {
if (['yt', 'youtube'].includes(phase)) return activityMap['YouTube Together'];
else if (['chess', 'park'].includes(phase)) return activityMap['Chess in the Park'];
else if (['poker'].includes(phase)) return activityMap['Poker Night'];
else if (['fish', 'fishing', 'fishington'].includes(phase)) return activityMap['Fishington.io'];
else if (['betrayal'].includes(phase)) return activityMap['Betrayal.io'];
else return undefined;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const activityTypeCaster = (_message: Message, phrase: string) => {
if (!phrase) return null;
const mappedPhrase = map(phrase);
if (mappedPhrase) return mappedPhrase;
return null;
};
export default class YouTubeCommand extends BushCommand {
constructor() {
super('activity', {
aliases: ['activity', 'yt', 'youtube', 'chess', 'park', 'poker', 'fish', 'fishing', 'fishington', 'betrayal'],
category: 'utilities',
description: {
content: 'Allows you to play discord activities in voice channels.',
usage: [
'activity <channel> <`yt`|`youtube`|`chess`|`park`|`poker`|`fish`|`fishing`|`fishington`|`betrayal`>',
'yt <channel>' // you do not need to specify the activity if you use its alias.
],
examples: ['yt 785281831788216364', 'activity 785281831788216364 yt']
},
args: [
{
id: 'channel',
type: 'voiceChannel',
prompt: {
start: 'What channel would you like to use?',
retry: '{error} Choose a valid voice channel'
}
},
{
id: 'activity',
match: 'rest',
customType: activityTypeCaster
}
],
slash: true,
slashOptions: [
{
name: 'channel',
description: 'What channel would you like to use?',
type: 'CHANNEL',
required: true
},
{
name: 'activity',
description: 'What activity would you like to play?',
type: 'STRING',
required: true,
choices: [
{ name: 'Poker Night', value: '755827207812677713' },
{ name: 'Betrayal.io', value: '773336526917861400' },
{ name: 'Fishington.io', value: '814288819477020702' },
{ name: 'YouTube Together', value: '755600276941176913' },
{ name: 'Chess in the Park', value: '832012774040141894' }
]
}
],
clientPermissions: ['SEND_MESSAGES'],
userPermissions: ['SEND_MESSAGES']
});
}
public override async exec(
message: BushMessage | BushSlashMessage,
args: { channel: VoiceChannel; activity: string }
): Promise<unknown> {
if (!args.channel?.id || args.channel?.type != 'GUILD_VOICE')
return await message.util.reply(`${util.emojis.error} Choose a valid voice channel`);
let target_application_id: string;
if (message.util.isSlash) target_application_id = args.activity;
else target_application_id = target_application_id = args.activity;
// @ts-ignore: jank typings
// prettier-ignore
const invite = await this.client.api.channels(args.channel.id)
.invites.post({
data: {
validate: null,
max_age: 604800,
max_uses: 0,
target_type: 2,
target_application_id,
temporary: false
}
})
.catch(() => false);
if (!invite || !invite.code)
return await message.util.reply(`${this.client.util.emojis.error} An error occurred while generating your invite.`);
else return await message.util.send(`https://discord.gg/${invite.code}`);
}
}
|