spacecommands 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +519 -0
- package/dist/Command.js +384 -0
- package/dist/CommandHandler.js +339 -0
- package/dist/FeatureHandler.js +89 -0
- package/dist/SlashCommands.js +220 -0
- package/dist/command-checks/channel-specific.js +30 -0
- package/dist/command-checks/guild-only-check.js +24 -0
- package/dist/command-checks/has-entitlement.js +52 -0
- package/dist/command-checks/has-permissions.js +39 -0
- package/dist/command-checks/has-roles.js +69 -0
- package/dist/command-checks/has-valid-arguments.js +54 -0
- package/dist/command-checks/in-cooldown.js +42 -0
- package/dist/command-checks/is-enabled.js +31 -0
- package/dist/command-checks/is-not-test-only.js +8 -0
- package/dist/command-checks/owner-only-check.js +22 -0
- package/dist/commands/channelonly.js +88 -0
- package/dist/commands/command.js +87 -0
- package/dist/commands/help/!ReactionListener.js +217 -0
- package/dist/commands/help/!get-first-embed.js +57 -0
- package/dist/commands/help/help.js +97 -0
- package/dist/commands/language.js +52 -0
- package/dist/commands/prefix.js +42 -0
- package/dist/commands/requiredrole.js +61 -0
- package/dist/commands/slash.js +102 -0
- package/dist/enums/CommandErrors.js +12 -0
- package/dist/enums/Events.js +9 -0
- package/dist/features/message-upsert.js +15 -0
- package/dist/get-all-files.js +25 -0
- package/dist/handlers/AutoModHandler.js +316 -0
- package/dist/handlers/ComponentHandler.js +110 -0
- package/dist/handlers/ContextMenuHandler.js +113 -0
- package/dist/handlers/EntitlementHandler.js +193 -0
- package/dist/handlers/ModalHandler.js +71 -0
- package/dist/handlers/PollHandler.js +230 -0
- package/dist/index.js +339 -0
- package/dist/message-handler.js +118 -0
- package/dist/models/channel-commands.js +49 -0
- package/dist/models/cooldown.js +51 -0
- package/dist/models/disabled-commands.js +45 -0
- package/dist/models/languages.js +46 -0
- package/dist/models/prefixes.js +46 -0
- package/dist/models/required-roles.js +49 -0
- package/dist/mongo.js +25 -0
- package/dist/permissions.js +39 -0
- package/dist/utils/ComponentBuilder.js +144 -0
- package/dist/utils/InteractionCollector.js +80 -0
- package/messages.json +391 -0
- package/package.json +72 -0
- package/typings.d.ts +276 -0
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.addReactions = void 0;
|
|
7
|
+
const _get_first_embed_1 = __importDefault(require("./!get-first-embed"));
|
|
8
|
+
const /**
|
|
9
|
+
* Recursively adds reactions to the message
|
|
10
|
+
* @param message The message to react to
|
|
11
|
+
* @param reactions A list of reactions to add
|
|
12
|
+
*/ addReactions = (message, reactions) => {
|
|
13
|
+
const emoji = reactions.shift();
|
|
14
|
+
if (emoji) {
|
|
15
|
+
message.react(emoji);
|
|
16
|
+
addReactions(message, reactions);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
exports.addReactions = addReactions;
|
|
20
|
+
class ReactionHandler {
|
|
21
|
+
instance;
|
|
22
|
+
reaction;
|
|
23
|
+
user;
|
|
24
|
+
message;
|
|
25
|
+
embed;
|
|
26
|
+
guild = null;
|
|
27
|
+
emojiName = '';
|
|
28
|
+
emojiId = '';
|
|
29
|
+
door = '🚪';
|
|
30
|
+
pageLimit = 3;
|
|
31
|
+
constructor(instance, reaction, user) {
|
|
32
|
+
this.instance = instance;
|
|
33
|
+
this.reaction = reaction;
|
|
34
|
+
this.user = user;
|
|
35
|
+
this.message = reaction.message;
|
|
36
|
+
this.init();
|
|
37
|
+
}
|
|
38
|
+
init = async () => {
|
|
39
|
+
if (this.message.partial) {
|
|
40
|
+
await this.message.fetch();
|
|
41
|
+
}
|
|
42
|
+
const { embeds, guild } = this.message;
|
|
43
|
+
if (this.user.bot || !embeds || embeds.length !== 1) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
this.embed = embeds[0];
|
|
47
|
+
this.guild = guild;
|
|
48
|
+
if (!this.canUserInteract()) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
this.emojiName = this.reaction.emoji.name;
|
|
52
|
+
this.emojiId = this.reaction.emoji.id || '';
|
|
53
|
+
this.handleEmoji();
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* @returns If the bot has access to remove reactions from the help menu
|
|
57
|
+
*/
|
|
58
|
+
canBotRemoveReaction = () => {
|
|
59
|
+
return (this.message.channel.type !== 'DM' &&
|
|
60
|
+
this.message.member?.permissions.has('ManageMessages'));
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* @returns If the user is allowed to interact with this help menu
|
|
64
|
+
*/
|
|
65
|
+
canUserInteract = () => {
|
|
66
|
+
// Check if the title of the embed is correct
|
|
67
|
+
const displayName = this.instance.displayName
|
|
68
|
+
? this.instance.displayName + ' '
|
|
69
|
+
: '';
|
|
70
|
+
const isSameTitle = this.embed.title ===
|
|
71
|
+
`${displayName}${this.instance.messageHandler.getEmbed(this.guild, 'HELP_MENU', 'TITLE')}`;
|
|
72
|
+
if (!isSameTitle) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
// Check if the user's ID is in the footer
|
|
76
|
+
if (this.embed.footer) {
|
|
77
|
+
const { text } = this.embed.footer;
|
|
78
|
+
const id = text?.split('#')[1];
|
|
79
|
+
if (id !== this.user.id) {
|
|
80
|
+
if (this.canBotRemoveReaction()) {
|
|
81
|
+
this.reaction.users.remove(this.user.id);
|
|
82
|
+
}
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return true;
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Invoked when the user returns to the main menu
|
|
90
|
+
*/
|
|
91
|
+
returnToMainMenu = () => {
|
|
92
|
+
const { embed: newEmbed, reactions } = (0, _get_first_embed_1.default)(this.message, this.instance);
|
|
93
|
+
this.embed.setDescription(newEmbed.description || '');
|
|
94
|
+
this.message.edit({ embeds: [this.embed] });
|
|
95
|
+
if (this.canBotRemoveReaction()) {
|
|
96
|
+
this.message.reactions.removeAll();
|
|
97
|
+
}
|
|
98
|
+
addReactions(this.message, reactions);
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* @param commandLength How many commands are in the category
|
|
102
|
+
* @returns An array of [page, maxPages]
|
|
103
|
+
*/
|
|
104
|
+
getMaxPages = (commandLength) => {
|
|
105
|
+
let page = 1;
|
|
106
|
+
if (this.embed && this.embed.description) {
|
|
107
|
+
const split = this.embed.description.split('\n');
|
|
108
|
+
const lastLine = split[split.length - 1];
|
|
109
|
+
if (lastLine.startsWith('Page ')) {
|
|
110
|
+
page = parseInt(lastLine.split(' ')[1]);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return [page, Math.ceil(commandLength / this.pageLimit)];
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* @returns An object containing information regarding the commands
|
|
117
|
+
*/
|
|
118
|
+
getCommands = () => {
|
|
119
|
+
let category = this.instance.getCategory(this.emojiId || this.emojiName);
|
|
120
|
+
const commandsString = this.instance.messageHandler.getEmbed(this.guild, 'HELP_MENU', 'COMMANDS');
|
|
121
|
+
if (this.embed.description) {
|
|
122
|
+
const split = this.embed.description.split('\n');
|
|
123
|
+
const cmdStr = ' ' + commandsString;
|
|
124
|
+
if (split[0].endsWith(cmdStr)) {
|
|
125
|
+
category = split[0].replace(cmdStr, '');
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const commands = this.instance.commandHandler.getCommandsByCategory(category);
|
|
129
|
+
return {
|
|
130
|
+
length: commands.length,
|
|
131
|
+
commands,
|
|
132
|
+
commandsString,
|
|
133
|
+
category,
|
|
134
|
+
};
|
|
135
|
+
};
|
|
136
|
+
static getHelp = (command, instance, guild) => {
|
|
137
|
+
const { description, syntax, names } = command;
|
|
138
|
+
if (names === undefined) {
|
|
139
|
+
console.error('SpaceCommands > A command does not have a name assigned to it.');
|
|
140
|
+
return '';
|
|
141
|
+
}
|
|
142
|
+
const mainName = typeof names === 'string' ? names : names.shift();
|
|
143
|
+
let desc = `**${mainName}**${description ? ' - ' : ''}${description}`;
|
|
144
|
+
if (names.length && typeof names !== 'string') {
|
|
145
|
+
desc += `\n${instance.messageHandler.getEmbed(guild, 'HELP_MENU', 'ALIASES')}: "${names.join('", "')}"`;
|
|
146
|
+
}
|
|
147
|
+
desc += `\n${instance.messageHandler.getEmbed(guild, 'HELP_MENU', 'SYNTAX')}: "${instance.getPrefix(guild)}${mainName}${syntax ? ' ' : ''}${syntax || ''}"`;
|
|
148
|
+
return desc;
|
|
149
|
+
};
|
|
150
|
+
/**
|
|
151
|
+
* Generates the actual menu
|
|
152
|
+
*/
|
|
153
|
+
generateMenu = (page, maxPages) => {
|
|
154
|
+
const { length, commands, commandsString, category } = this.getCommands();
|
|
155
|
+
const hasMultiplePages = length > this.pageLimit;
|
|
156
|
+
let desc = `${category} ${commandsString}\n\n${this.instance.messageHandler.getEmbed(this.guild, 'HELP_MENU', 'DESCRIPTION_FIRST_LINE')}`;
|
|
157
|
+
if (hasMultiplePages) {
|
|
158
|
+
desc += `\n\n${this.instance.messageHandler.getEmbed(this.guild, 'HELP_MENU', 'DESCRIPTION_SECOND_LINE')}`;
|
|
159
|
+
}
|
|
160
|
+
const start = (page - 1) * this.pageLimit;
|
|
161
|
+
for (let a = start, counter = a; a < commands.length && a < start + this.pageLimit; ++a) {
|
|
162
|
+
const command = commands[a];
|
|
163
|
+
let { hidden, category, names } = command;
|
|
164
|
+
if (!hidden && category === category) {
|
|
165
|
+
if (typeof names === 'string') {
|
|
166
|
+
// @ts-ignore
|
|
167
|
+
names = [...names];
|
|
168
|
+
}
|
|
169
|
+
desc += `\n\n#${++counter}) ${ReactionHandler.getHelp(command, this.instance, this.guild)}`;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
desc += `\n\nPage ${page} / ${maxPages}.`;
|
|
173
|
+
this.embed.setDescription(desc);
|
|
174
|
+
this.message.edit({ embeds: [this.embed] });
|
|
175
|
+
if (this.canBotRemoveReaction()) {
|
|
176
|
+
this.message.reactions.removeAll();
|
|
177
|
+
}
|
|
178
|
+
const reactions = [];
|
|
179
|
+
if (hasMultiplePages) {
|
|
180
|
+
reactions.push('⬅');
|
|
181
|
+
reactions.push('âž¡');
|
|
182
|
+
}
|
|
183
|
+
reactions.push('🚪');
|
|
184
|
+
addReactions(this.message, reactions);
|
|
185
|
+
};
|
|
186
|
+
/**
|
|
187
|
+
* Handles the input from the emoji
|
|
188
|
+
*/
|
|
189
|
+
handleEmoji = () => {
|
|
190
|
+
if (this.emojiName === this.door) {
|
|
191
|
+
this.returnToMainMenu();
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
const { length } = this.getCommands();
|
|
195
|
+
let [page, maxPages] = this.getMaxPages(length);
|
|
196
|
+
if (this.emojiName === '⬅') {
|
|
197
|
+
if (page <= 1) {
|
|
198
|
+
if (this.canBotRemoveReaction()) {
|
|
199
|
+
this.reaction.users.remove(this.user.id);
|
|
200
|
+
}
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
--page;
|
|
204
|
+
}
|
|
205
|
+
else if (this.emojiName === 'âž¡') {
|
|
206
|
+
if (page >= maxPages) {
|
|
207
|
+
if (this.canBotRemoveReaction()) {
|
|
208
|
+
this.reaction.users.remove(this.user.id);
|
|
209
|
+
}
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
++page;
|
|
213
|
+
}
|
|
214
|
+
this.generateMenu(page, maxPages);
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
exports.default = ReactionHandler;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
// @ts-nocheck
|
|
4
|
+
const discord_js_1 = require("discord.js");
|
|
5
|
+
const getFirstEmbed = (message, instance) => {
|
|
6
|
+
const { guild, member } = message;
|
|
7
|
+
const { commandHandler: { commands }, messageHandler, } = instance;
|
|
8
|
+
const embed = new discord_js_1.EmbedBuilder()
|
|
9
|
+
.setTitle(`${instance.displayName} ${messageHandler.getEmbed(guild, 'HELP_MENU', 'TITLE')}`)
|
|
10
|
+
.setDescription(messageHandler.getEmbed(guild, 'HELP_MENU', 'SELECT_A_CATEGORY'))
|
|
11
|
+
.setFooter(`ID #${message.author?.id}`);
|
|
12
|
+
if (instance.color) {
|
|
13
|
+
embed.setColor(instance.color);
|
|
14
|
+
}
|
|
15
|
+
const categories = {};
|
|
16
|
+
const isAdmin = member && member.permissions.has('Administrator');
|
|
17
|
+
for (const { category, testOnly } of commands) {
|
|
18
|
+
if (!category ||
|
|
19
|
+
(testOnly && guild && !instance.testServers.includes(guild.id)) ||
|
|
20
|
+
(!isAdmin && instance.hiddenCategories.includes(category))) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
if (categories[category]) {
|
|
24
|
+
++categories[category].amount;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
categories[category] = {
|
|
28
|
+
amount: 1,
|
|
29
|
+
emoji: instance.getEmoji(category),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const reactions = [];
|
|
34
|
+
const keys = Object.keys(categories);
|
|
35
|
+
for (let a = 0; a < keys.length; ++a) {
|
|
36
|
+
const key = keys[a];
|
|
37
|
+
const { emoji } = categories[key];
|
|
38
|
+
if (!emoji) {
|
|
39
|
+
console.warn(`SpaceCommands > Category "${key}" does not have an emoji icon.`);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
const visibleCommands = instance.commandHandler.getCommandsByCategory(key, true);
|
|
43
|
+
const amount = visibleCommands.length;
|
|
44
|
+
if (amount === 0) {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const reaction = emoji;
|
|
48
|
+
reactions.push(reaction);
|
|
49
|
+
embed.setDescription(embed.description +
|
|
50
|
+
`\n\n**${reaction} - ${key}** - ${amount} command${amount === 1 ? '' : 's'}`);
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
embed,
|
|
54
|
+
reactions,
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
exports.default = getFirstEmbed;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
// @ts-nocheck
|
|
40
|
+
const discord_js_1 = require("discord.js");
|
|
41
|
+
const _get_first_embed_1 = __importDefault(require("./!get-first-embed"));
|
|
42
|
+
const _ReactionListener_1 = __importStar(require("./!ReactionListener"));
|
|
43
|
+
const sendHelpMenu = (message, instance) => {
|
|
44
|
+
const { embed, reactions } = (0, _get_first_embed_1.default)(message, instance);
|
|
45
|
+
message.channel
|
|
46
|
+
.send({
|
|
47
|
+
embeds: [embed],
|
|
48
|
+
})
|
|
49
|
+
.then((message) => {
|
|
50
|
+
(0, _ReactionListener_1.addReactions)(message, reactions);
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
module.exports = {
|
|
54
|
+
description: "Displays this bot's commands",
|
|
55
|
+
category: 'Help',
|
|
56
|
+
aliases: 'commands',
|
|
57
|
+
maxArgs: 1,
|
|
58
|
+
expectedArgs: '[command]',
|
|
59
|
+
init: (client, instance) => {
|
|
60
|
+
client.on('messageReactionAdd', async (reaction, user) => {
|
|
61
|
+
new _ReactionListener_1.default(instance, reaction, user);
|
|
62
|
+
});
|
|
63
|
+
},
|
|
64
|
+
callback: (options) => {
|
|
65
|
+
const { message, channel, instance, args } = options;
|
|
66
|
+
const { guild } = channel;
|
|
67
|
+
if (guild && !guild.me?.permissions.has('SEND_MESSAGES')) {
|
|
68
|
+
console.warn(`SpaceCommands > Could not send message due to no permissions in channel for ${guild.name}`);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (guild && !guild.me?.permissions.has('ADD_REACTIONS')) {
|
|
72
|
+
return instance.messageHandler.get(guild, 'NO_REACT_PERMS');
|
|
73
|
+
}
|
|
74
|
+
// Typical "!help" syntax for the menu
|
|
75
|
+
if (args.length === 0) {
|
|
76
|
+
sendHelpMenu(message, instance);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// If the user is looking for info on a specific command
|
|
80
|
+
// Ex: "!help prefix"
|
|
81
|
+
const arg = args.shift()?.toLowerCase();
|
|
82
|
+
const command = instance.commandHandler.getICommand(arg);
|
|
83
|
+
if (!command) {
|
|
84
|
+
return instance.messageHandler.get(guild, 'UNKNOWN_COMMAND', {
|
|
85
|
+
COMMAND: arg,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
const description = _ReactionListener_1.default.getHelp(command, instance, guild);
|
|
89
|
+
const embed = new discord_js_1.EmbedBuilder()
|
|
90
|
+
.setTitle(`${instance.displayName} ${instance.messageHandler.getEmbed(guild, 'HELP_MENU', 'TITLE')} - ${arg}`)
|
|
91
|
+
.setDescription(description);
|
|
92
|
+
if (instance.color) {
|
|
93
|
+
embed.setColor(instance.color);
|
|
94
|
+
}
|
|
95
|
+
return embed;
|
|
96
|
+
},
|
|
97
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
// @ts-nocheck
|
|
6
|
+
const languages_1 = __importDefault(require("../models/languages"));
|
|
7
|
+
const Events_1 = __importDefault(require("../enums/Events"));
|
|
8
|
+
module.exports = {
|
|
9
|
+
description: 'Displays or sets the language for this Discord server',
|
|
10
|
+
category: 'Configuration',
|
|
11
|
+
aliases: ['lang'],
|
|
12
|
+
permissions: ['Administrator'],
|
|
13
|
+
maxArgs: 1,
|
|
14
|
+
expectedArgs: '[language]',
|
|
15
|
+
cooldown: '2s',
|
|
16
|
+
slash: 'both',
|
|
17
|
+
callback: async (options) => {
|
|
18
|
+
const { channel, text, instance } = options;
|
|
19
|
+
const { guild } = channel;
|
|
20
|
+
if (!guild) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const { messageHandler } = instance;
|
|
24
|
+
if (!instance.isDBConnected()) {
|
|
25
|
+
return instance.messageHandler.get(guild, 'NO_DATABASE_FOUND');
|
|
26
|
+
}
|
|
27
|
+
const lang = text.toLowerCase();
|
|
28
|
+
if (!lang) {
|
|
29
|
+
return instance.messageHandler.get(guild, 'CURRENT_LANGUAGE', {
|
|
30
|
+
LANGUAGE: instance.messageHandler.getLanguage(guild),
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
if (!messageHandler.languages().includes(lang)) {
|
|
34
|
+
instance.emit(Events_1.default.LANGUAGE_NOT_SUPPORTED, guild, lang);
|
|
35
|
+
return messageHandler.get(guild, 'LANGUAGE_NOT_SUPPORTED', {
|
|
36
|
+
LANGUAGE: lang,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
instance.messageHandler.setLanguage(guild, lang);
|
|
40
|
+
await languages_1.default.findOneAndUpdate({
|
|
41
|
+
_id: guild.id,
|
|
42
|
+
}, {
|
|
43
|
+
_id: guild.id,
|
|
44
|
+
language: lang,
|
|
45
|
+
}, {
|
|
46
|
+
upsert: true,
|
|
47
|
+
});
|
|
48
|
+
return instance.messageHandler.get(guild, 'NEW_LANGUAGE', {
|
|
49
|
+
LANGUAGE: lang,
|
|
50
|
+
});
|
|
51
|
+
},
|
|
52
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
const prefixes_1 = __importDefault(require("../models/prefixes"));
|
|
6
|
+
module.exports = {
|
|
7
|
+
description: 'Displays or sets the prefix for the current guild',
|
|
8
|
+
category: 'Configuration',
|
|
9
|
+
permissions: ['Administrator'],
|
|
10
|
+
maxArgs: 1,
|
|
11
|
+
expectedArgs: '[prefix]',
|
|
12
|
+
cooldown: '2s',
|
|
13
|
+
slash: 'both',
|
|
14
|
+
callback: async (options) => {
|
|
15
|
+
const { channel, args, text, instance } = options;
|
|
16
|
+
const { guild } = channel;
|
|
17
|
+
if (args.length === 0) {
|
|
18
|
+
return instance.messageHandler.get(guild, 'CURRENT_PREFIX', {
|
|
19
|
+
PREFIX: instance.getPrefix(guild),
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
if (guild) {
|
|
23
|
+
const { id } = guild;
|
|
24
|
+
if (!instance.isDBConnected()) {
|
|
25
|
+
return instance.messageHandler.get(guild, 'NO_DATABASE_FOUND');
|
|
26
|
+
}
|
|
27
|
+
await prefixes_1.default.findOneAndUpdate({
|
|
28
|
+
_id: id,
|
|
29
|
+
}, {
|
|
30
|
+
_id: id,
|
|
31
|
+
prefix: text,
|
|
32
|
+
}, {
|
|
33
|
+
upsert: true,
|
|
34
|
+
});
|
|
35
|
+
instance.setPrefix(guild, text);
|
|
36
|
+
return instance.messageHandler.get(guild, 'SET_PREFIX', {
|
|
37
|
+
PREFIX: text,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return instance.messageHandler.get(guild, 'CANNOT_SET_PREFIX_IN_DMS');
|
|
41
|
+
},
|
|
42
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
const required_roles_1 = __importDefault(require("../models/required-roles"));
|
|
6
|
+
module.exports = {
|
|
7
|
+
description: 'Specifies what role each command requires.',
|
|
8
|
+
category: 'Configuration',
|
|
9
|
+
permissions: ['Administrator'],
|
|
10
|
+
aliases: ['requiredroles', 'requirerole', 'requireroles'],
|
|
11
|
+
minArgs: 2,
|
|
12
|
+
maxArgs: 2,
|
|
13
|
+
expectedArgs: '<command> <none-or-roleid>',
|
|
14
|
+
cooldown: '2s',
|
|
15
|
+
slash: 'both',
|
|
16
|
+
callback: async (options) => {
|
|
17
|
+
const { channel, args, instance } = options;
|
|
18
|
+
const name = (args.shift() || '').toLowerCase();
|
|
19
|
+
const roleId = (args.shift() || '').toLowerCase();
|
|
20
|
+
const { guild } = channel;
|
|
21
|
+
if (!guild) {
|
|
22
|
+
return instance.messageHandler.get(guild, 'CANNOT_CHANGE_REQUIRED_ROLES_IN_DMS');
|
|
23
|
+
}
|
|
24
|
+
if (!instance.isDBConnected()) {
|
|
25
|
+
return instance.messageHandler.get(guild, 'NO_DATABASE_FOUND');
|
|
26
|
+
}
|
|
27
|
+
const command = instance.commandHandler.getCommand(name);
|
|
28
|
+
if (command) {
|
|
29
|
+
if (roleId === 'none') {
|
|
30
|
+
command.removeRequiredRole(guild.id, roleId);
|
|
31
|
+
await required_roles_1.default.deleteOne({
|
|
32
|
+
guildId: guild.id,
|
|
33
|
+
command: command.names[0],
|
|
34
|
+
});
|
|
35
|
+
return instance.messageHandler.get(guild, 'REMOVED_ALL_REQUIRED_ROLES', {
|
|
36
|
+
COMMAND: command.names[0],
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
command.addRequiredRole(guild.id, roleId);
|
|
40
|
+
await required_roles_1.default.findOneAndUpdate({
|
|
41
|
+
guildId: guild.id,
|
|
42
|
+
command: command.names[0],
|
|
43
|
+
}, {
|
|
44
|
+
guildId: guild.id,
|
|
45
|
+
command: command.names[0],
|
|
46
|
+
$addToSet: {
|
|
47
|
+
requiredRoles: roleId,
|
|
48
|
+
},
|
|
49
|
+
}, {
|
|
50
|
+
upsert: true,
|
|
51
|
+
});
|
|
52
|
+
return instance.messageHandler.get(guild, 'ADDED_REQUIRED_ROLE', {
|
|
53
|
+
ROLE: roleId,
|
|
54
|
+
COMMAND: command.names[0],
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return instance.messageHandler.get(guild, 'UNKNOWN_COMMAND', {
|
|
58
|
+
COMMAND: name,
|
|
59
|
+
});
|
|
60
|
+
},
|
|
61
|
+
};
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const discord_js_1 = require("discord.js");
|
|
3
|
+
module.exports = {
|
|
4
|
+
description: 'Allows the bot developers to manage existing slash commands',
|
|
5
|
+
category: 'Configuration',
|
|
6
|
+
permissions: ['Administrator'],
|
|
7
|
+
maxArgs: 1,
|
|
8
|
+
expectedArgs: '[command-id]',
|
|
9
|
+
ownerOnly: true,
|
|
10
|
+
hidden: true,
|
|
11
|
+
slash: 'both',
|
|
12
|
+
callback: async (options) => {
|
|
13
|
+
const { channel, instance, text } = options;
|
|
14
|
+
const { guild } = channel;
|
|
15
|
+
const { slashCommands } = instance;
|
|
16
|
+
const global = await slashCommands.get();
|
|
17
|
+
if (text) {
|
|
18
|
+
let useGuild = true;
|
|
19
|
+
try {
|
|
20
|
+
global?.forEach((cmd) => {
|
|
21
|
+
if (cmd.id === text) {
|
|
22
|
+
useGuild = false;
|
|
23
|
+
throw new Error('');
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
catch (ignored) { }
|
|
28
|
+
slashCommands.delete(text, useGuild ? guild.id : undefined);
|
|
29
|
+
if (useGuild) {
|
|
30
|
+
return `Slash command with the ID "${text}" has been deleted from guild "${guild.id}".`;
|
|
31
|
+
}
|
|
32
|
+
return `Slash command with the ID "${text}" has been deleted. This may take up to 1 hour to be seen on all servers using your bot.`;
|
|
33
|
+
}
|
|
34
|
+
let counter = 0;
|
|
35
|
+
let allSlashCommands = [];
|
|
36
|
+
if (global.size) {
|
|
37
|
+
global.forEach((cmd) => {
|
|
38
|
+
if (cmd && cmd.name) {
|
|
39
|
+
const newString = `${cmd.name}: ${cmd.id}\n`;
|
|
40
|
+
if ((allSlashCommands[counter] || []).length + newString.length <
|
|
41
|
+
1024) {
|
|
42
|
+
allSlashCommands[counter] ??= '';
|
|
43
|
+
allSlashCommands[counter] += newString;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
++counter;
|
|
47
|
+
allSlashCommands[counter] ??= '';
|
|
48
|
+
allSlashCommands[counter] += newString;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
allSlashCommands.push('None');
|
|
55
|
+
}
|
|
56
|
+
const embed = new discord_js_1.EmbedBuilder().addFields({
|
|
57
|
+
name: 'How to delete a slash command:',
|
|
58
|
+
value: `${instance.getPrefix(guild)}slash <command-id>`,
|
|
59
|
+
});
|
|
60
|
+
for (let a = 0; a < allSlashCommands.length; ++a) {
|
|
61
|
+
embed.addFields({
|
|
62
|
+
name: `Global slash commands:${a === 0 ? '' : ' (Continued)'}`,
|
|
63
|
+
value: allSlashCommands[a],
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
if (guild) {
|
|
67
|
+
const guildOnly = await slashCommands.get(guild.id);
|
|
68
|
+
counter = 0;
|
|
69
|
+
let guildOnlyCommands = [];
|
|
70
|
+
if (guildOnly.size) {
|
|
71
|
+
guildOnly.forEach((cmd) => {
|
|
72
|
+
if (cmd && cmd.name) {
|
|
73
|
+
const newString = `${cmd.name}: ${cmd.id}\n`;
|
|
74
|
+
if ((guildOnlyCommands[counter] || []).length + newString.length <
|
|
75
|
+
1024) {
|
|
76
|
+
guildOnlyCommands[counter] ??= '';
|
|
77
|
+
guildOnlyCommands[counter] += newString;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
++counter;
|
|
81
|
+
guildOnlyCommands[counter] ??= '';
|
|
82
|
+
guildOnlyCommands[counter] += newString;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
guildOnlyCommands[0] = 'None';
|
|
89
|
+
}
|
|
90
|
+
for (let a = 0; a < guildOnlyCommands.length; ++a) {
|
|
91
|
+
embed.addFields({
|
|
92
|
+
name: `Guild slash commands:${a === 0 ? '' : ' (Continued)'}`,
|
|
93
|
+
value: guildOnlyCommands[a],
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (instance.color) {
|
|
98
|
+
embed.setColor(instance.color);
|
|
99
|
+
}
|
|
100
|
+
return embed;
|
|
101
|
+
},
|
|
102
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var CommandErrors;
|
|
4
|
+
(function (CommandErrors) {
|
|
5
|
+
CommandErrors["EXCEPTION"] = "EXCEPTION";
|
|
6
|
+
CommandErrors["COOLDOWN"] = "COOLDOWN";
|
|
7
|
+
CommandErrors["INVALID_ARGUMENTS"] = "INVALID ARGUMENTS";
|
|
8
|
+
CommandErrors["MISSING_PERMISSIONS"] = "MISSING PERMISSIONS";
|
|
9
|
+
CommandErrors["MISSING_ROLES"] = "MISSING ROLES";
|
|
10
|
+
CommandErrors["COMMAND_DISABLED"] = "COMMAND DISABLED";
|
|
11
|
+
})(CommandErrors || (CommandErrors = {}));
|
|
12
|
+
exports.default = CommandErrors;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var Events;
|
|
4
|
+
(function (Events) {
|
|
5
|
+
Events["DATABASE_CONNECTED"] = "databaseConnected";
|
|
6
|
+
Events["LANGUAGE_NOT_SUPPORTED"] = "languageNotSupported";
|
|
7
|
+
Events["COMMAND_EXCEPTION"] = "commandException";
|
|
8
|
+
})(Events || (Events = {}));
|
|
9
|
+
exports.default = Events;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = void 0;
|
|
4
|
+
exports.default = (client) => {
|
|
5
|
+
client.on('messageCreate', (message) => {
|
|
6
|
+
client.emit('messageUpsert', message);
|
|
7
|
+
});
|
|
8
|
+
client.on('messageUpdate', (oldMessage, newMessage) => {
|
|
9
|
+
client.emit('messageUpsert', newMessage, oldMessage);
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
exports.config = {
|
|
13
|
+
displayName: 'Message Upsert',
|
|
14
|
+
dbName: 'MESSAGE-UPSERT',
|
|
15
|
+
};
|