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.
Files changed (50) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +519 -0
  3. package/dist/Command.js +384 -0
  4. package/dist/CommandHandler.js +339 -0
  5. package/dist/FeatureHandler.js +89 -0
  6. package/dist/SlashCommands.js +220 -0
  7. package/dist/command-checks/channel-specific.js +30 -0
  8. package/dist/command-checks/guild-only-check.js +24 -0
  9. package/dist/command-checks/has-entitlement.js +52 -0
  10. package/dist/command-checks/has-permissions.js +39 -0
  11. package/dist/command-checks/has-roles.js +69 -0
  12. package/dist/command-checks/has-valid-arguments.js +54 -0
  13. package/dist/command-checks/in-cooldown.js +42 -0
  14. package/dist/command-checks/is-enabled.js +31 -0
  15. package/dist/command-checks/is-not-test-only.js +8 -0
  16. package/dist/command-checks/owner-only-check.js +22 -0
  17. package/dist/commands/channelonly.js +88 -0
  18. package/dist/commands/command.js +87 -0
  19. package/dist/commands/help/!ReactionListener.js +217 -0
  20. package/dist/commands/help/!get-first-embed.js +57 -0
  21. package/dist/commands/help/help.js +97 -0
  22. package/dist/commands/language.js +52 -0
  23. package/dist/commands/prefix.js +42 -0
  24. package/dist/commands/requiredrole.js +61 -0
  25. package/dist/commands/slash.js +102 -0
  26. package/dist/enums/CommandErrors.js +12 -0
  27. package/dist/enums/Events.js +9 -0
  28. package/dist/features/message-upsert.js +15 -0
  29. package/dist/get-all-files.js +25 -0
  30. package/dist/handlers/AutoModHandler.js +316 -0
  31. package/dist/handlers/ComponentHandler.js +110 -0
  32. package/dist/handlers/ContextMenuHandler.js +113 -0
  33. package/dist/handlers/EntitlementHandler.js +193 -0
  34. package/dist/handlers/ModalHandler.js +71 -0
  35. package/dist/handlers/PollHandler.js +230 -0
  36. package/dist/index.js +339 -0
  37. package/dist/message-handler.js +118 -0
  38. package/dist/models/channel-commands.js +49 -0
  39. package/dist/models/cooldown.js +51 -0
  40. package/dist/models/disabled-commands.js +45 -0
  41. package/dist/models/languages.js +46 -0
  42. package/dist/models/prefixes.js +46 -0
  43. package/dist/models/required-roles.js +49 -0
  44. package/dist/mongo.js +25 -0
  45. package/dist/permissions.js +39 -0
  46. package/dist/utils/ComponentBuilder.js +144 -0
  47. package/dist/utils/InteractionCollector.js +80 -0
  48. package/messages.json +391 -0
  49. package/package.json +72 -0
  50. package/typings.d.ts +276 -0
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ module.exports = (guild, command, instance, member, user, reply) => {
3
+ const { guildOnly } = command;
4
+ // If this command doesn't care if it's in a guild or not then just simply return true
5
+ if (!guildOnly) {
6
+ return true;
7
+ }
8
+ if (!guild) {
9
+ reply(instance.messageHandler.get(guild, 'GUILD_ONLY_COMMAND')).then((message) => {
10
+ if (!message) {
11
+ return;
12
+ }
13
+ if (instance.delErrMsgCooldown === -1 || !message.deletable) {
14
+ return;
15
+ }
16
+ setTimeout(() => {
17
+ message.delete();
18
+ }, 1000 * instance.delErrMsgCooldown);
19
+ });
20
+ return false;
21
+ }
22
+ // The guild exists
23
+ return true;
24
+ };
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ module.exports = async (guild, command, instance, member, user, reply) => {
3
+ const { requiredEntitlements, premiumOnly } = command;
4
+ // If no entitlements are required, allow the command
5
+ if (!requiredEntitlements.length && !premiumOnly) {
6
+ return true;
7
+ }
8
+ const entitlementHandler = instance.entitlementHandler;
9
+ if (!entitlementHandler) {
10
+ console.warn('SpaceCommands > Command requires entitlements but EntitlementHandler is not initialized.');
11
+ return true;
12
+ }
13
+ // Check if user has required entitlements
14
+ if (requiredEntitlements.length > 0) {
15
+ const { hasEntitlement } = await entitlementHandler.hasAnyEntitlement(user.id, requiredEntitlements);
16
+ if (!hasEntitlement) {
17
+ reply(instance.messageHandler.get(guild, 'MISSING_ENTITLEMENT') ||
18
+ 'You need a premium subscription to use this command.').then((message) => {
19
+ if (!message) {
20
+ return;
21
+ }
22
+ if (instance.delErrMsgCooldown === -1 || !message.deletable) {
23
+ return;
24
+ }
25
+ setTimeout(() => {
26
+ message.delete();
27
+ }, 1000 * instance.delErrMsgCooldown);
28
+ });
29
+ return false;
30
+ }
31
+ }
32
+ // If premiumOnly is set, check for any active entitlement
33
+ if (premiumOnly) {
34
+ const allEntitlements = await entitlementHandler.getUserEntitlements(user.id);
35
+ if (allEntitlements.length === 0) {
36
+ reply(instance.messageHandler.get(guild, 'PREMIUM_ONLY') ||
37
+ 'This command is only available to premium subscribers.').then((message) => {
38
+ if (!message) {
39
+ return;
40
+ }
41
+ if (instance.delErrMsgCooldown === -1 || !message.deletable) {
42
+ return;
43
+ }
44
+ setTimeout(() => {
45
+ message.delete();
46
+ }, 1000 * instance.delErrMsgCooldown);
47
+ });
48
+ return false;
49
+ }
50
+ }
51
+ return true;
52
+ };
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ const CommandErrors_1 = __importDefault(require("../enums/CommandErrors"));
6
+ module.exports = (guild, command, instance, member, user, reply) => {
7
+ if (!guild || !member) {
8
+ return true;
9
+ }
10
+ const { requiredPermissions, error } = command;
11
+ for (const perm of requiredPermissions || []) {
12
+ // @ts-ignore
13
+ if (!member.permissions.has(perm)) {
14
+ if (error) {
15
+ error({
16
+ error: CommandErrors_1.default.MISSING_PERMISSIONS,
17
+ command,
18
+ });
19
+ }
20
+ else {
21
+ reply(instance.messageHandler.get(guild, 'MISSING_PERMISSION', {
22
+ PERM: perm,
23
+ })).then((message) => {
24
+ if (!message) {
25
+ return;
26
+ }
27
+ if (instance.delErrMsgCooldown === -1 || !message.deletable) {
28
+ return;
29
+ }
30
+ setTimeout(() => {
31
+ message.delete();
32
+ }, 1000 * instance.delErrMsgCooldown);
33
+ });
34
+ }
35
+ return false;
36
+ }
37
+ }
38
+ return true;
39
+ };
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ const CommandErrors_1 = __importDefault(require("../enums/CommandErrors"));
6
+ module.exports = async (guild, command, instance, member, user, reply) => {
7
+ if (!guild || !member) {
8
+ return true;
9
+ }
10
+ const { error } = command;
11
+ const roles = command.getRequiredRoles(guild.id);
12
+ if (roles && roles.length) {
13
+ const missingRoles = [];
14
+ const missingRolesNames = [];
15
+ for (const role of roles) {
16
+ const realRole = await guild.roles.fetch(role);
17
+ if (realRole !== null && !member.roles.cache.has(role)) {
18
+ missingRoles.push(role);
19
+ missingRolesNames.push(realRole.name);
20
+ }
21
+ }
22
+ if (missingRoles.length) {
23
+ if (error) {
24
+ error({
25
+ error: CommandErrors_1.default.MISSING_ROLES,
26
+ command,
27
+ message: null,
28
+ info: {
29
+ missingRoles,
30
+ },
31
+ });
32
+ }
33
+ else {
34
+ reply(instance.messageHandler.get(guild, 'MISSING_ROLES', {
35
+ ROLES: missingRolesNames.join(', '),
36
+ })).then((message) => {
37
+ if (!message) {
38
+ return;
39
+ }
40
+ if (instance.delErrMsgCooldown === -1 || !message.deletable) {
41
+ return;
42
+ }
43
+ setTimeout(() => {
44
+ message.delete();
45
+ }, 1000 * instance.delErrMsgCooldown);
46
+ });
47
+ }
48
+ return false;
49
+ }
50
+ }
51
+ else if (command.doesRequireRoles) {
52
+ reply(instance.messageHandler.get(guild, 'REQUIRE_ROLES', {
53
+ PREFIX: instance.getPrefix(guild),
54
+ COMMAND: command.names[0],
55
+ })).then((message) => {
56
+ if (!message) {
57
+ return;
58
+ }
59
+ if (instance.delErrMsgCooldown === -1 || !message.deletable) {
60
+ return;
61
+ }
62
+ setTimeout(() => {
63
+ message.delete();
64
+ }, 1000 * instance.delErrMsgCooldown);
65
+ });
66
+ return false;
67
+ }
68
+ return true;
69
+ };
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ const CommandErrors_1 = __importDefault(require("../enums/CommandErrors"));
6
+ module.exports = (guild, command, instance, member, user, reply, args, name) => {
7
+ const { minArgs, maxArgs, expectedArgs, error } = command;
8
+ const prefix = instance.getPrefix(guild).toLowerCase();
9
+ if ((minArgs !== undefined && args.length < minArgs) ||
10
+ (maxArgs !== undefined && maxArgs !== -1 && args.length > maxArgs)) {
11
+ const syntaxError = command.syntaxError || {};
12
+ const { messageHandler } = instance;
13
+ let errorMsg = syntaxError[messageHandler.getLanguage(guild)] ||
14
+ instance.messageHandler.get(guild, 'SYNTAX_ERROR');
15
+ // Replace {PREFIX} with the actual prefix
16
+ if (errorMsg) {
17
+ errorMsg = errorMsg.replace(/{PREFIX}/g, prefix);
18
+ // Replace {COMMAND} with the name of the command that was ran
19
+ errorMsg = errorMsg.replace(/{COMMAND}/g, name);
20
+ // Replace {ARGUMENTS} with the expectedArgs property from the command
21
+ // If one was not provided then replace {ARGUMENTS} with an empty string
22
+ errorMsg = errorMsg.replace(/ {ARGUMENTS}/g, expectedArgs ? ` ${expectedArgs}` : '');
23
+ }
24
+ if (error) {
25
+ error({
26
+ error: CommandErrors_1.default.INVALID_ARGUMENTS,
27
+ command,
28
+ message: null,
29
+ info: {
30
+ minArgs,
31
+ maxArgs,
32
+ length: args.length,
33
+ errorMsg,
34
+ },
35
+ });
36
+ }
37
+ else {
38
+ // Reply with the local or global syntax error
39
+ reply(errorMsg).then((message) => {
40
+ if (!message) {
41
+ return;
42
+ }
43
+ if (instance.delErrMsgCooldown === -1 || !message.deletable) {
44
+ return;
45
+ }
46
+ setTimeout(() => {
47
+ message.delete();
48
+ }, 1000 * instance.delErrMsgCooldown);
49
+ });
50
+ }
51
+ return false;
52
+ }
53
+ return true;
54
+ };
@@ -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 CommandErrors_1 = __importDefault(require("../enums/CommandErrors"));
6
+ module.exports = (guild, command, instance, member, user, reply) => {
7
+ const { cooldown, globalCooldown, error } = command;
8
+ if ((cooldown || globalCooldown) && user) {
9
+ const guildId = guild ? guild.id : 'dm';
10
+ const timeLeft = command.getCooldownSeconds(guildId, user.id);
11
+ if (timeLeft) {
12
+ if (error) {
13
+ error({
14
+ error: CommandErrors_1.default.COOLDOWN,
15
+ command,
16
+ message: null,
17
+ info: {
18
+ timeLeft,
19
+ },
20
+ });
21
+ }
22
+ else {
23
+ reply(instance.messageHandler.get(guild, 'COOLDOWN', {
24
+ COOLDOWN: timeLeft,
25
+ })).then((message) => {
26
+ if (!message) {
27
+ return;
28
+ }
29
+ if (instance.delErrMsgCooldown === -1 || !message.deletable) {
30
+ return;
31
+ }
32
+ setTimeout(() => {
33
+ message.delete();
34
+ }, 1000 * instance.delErrMsgCooldown);
35
+ });
36
+ }
37
+ return false;
38
+ }
39
+ command.setCooldown(guildId, user.id);
40
+ }
41
+ return true;
42
+ };
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ const CommandErrors_1 = __importDefault(require("../enums/CommandErrors"));
6
+ module.exports = (guild, command, instance, member, user, reply) => {
7
+ if (!guild || !command.isDisabled(guild.id)) {
8
+ return true;
9
+ }
10
+ const { error } = command;
11
+ if (error) {
12
+ error({
13
+ error: CommandErrors_1.default.COMMAND_DISABLED,
14
+ command,
15
+ });
16
+ }
17
+ else {
18
+ reply(instance.messageHandler.get(guild, 'DISABLED_COMMAND')).then((message) => {
19
+ if (!message) {
20
+ return;
21
+ }
22
+ if (instance.delErrMsgCooldown === -1 || !message.deletable) {
23
+ return;
24
+ }
25
+ setTimeout(() => {
26
+ message.delete();
27
+ }, 1000 * instance.delErrMsgCooldown);
28
+ });
29
+ }
30
+ return false;
31
+ };
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ module.exports = (guild, command, instance) => {
3
+ const { testOnly } = command;
4
+ if (!testOnly) {
5
+ return true;
6
+ }
7
+ return guild && instance.testServers.includes(guild.id);
8
+ };
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ module.exports = (guild, command, instance, member, user, reply) => {
3
+ const { ownerOnly } = command;
4
+ if (!ownerOnly) {
5
+ return true;
6
+ }
7
+ if (!instance.botOwner.includes(user.id)) {
8
+ reply(instance.messageHandler.get(guild, 'BOT_OWNERS_ONLY')).then((message) => {
9
+ if (!message) {
10
+ return;
11
+ }
12
+ if (instance.delErrMsgCooldown === -1 || !message.deletable) {
13
+ return;
14
+ }
15
+ setTimeout(() => {
16
+ message.delete();
17
+ }, 1000 * instance.delErrMsgCooldown);
18
+ });
19
+ return false;
20
+ }
21
+ return true;
22
+ };
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ const channel_commands_1 = __importDefault(require("../models/channel-commands"));
6
+ module.exports = {
7
+ description: 'Makes a command only work in some channels.',
8
+ category: 'Configuration',
9
+ permissions: ['Administrator'],
10
+ minArgs: 1,
11
+ maxArgs: 2,
12
+ expectedArgs: '<Command name> [Channel tag]',
13
+ cooldown: '2s',
14
+ guildOnly: true,
15
+ slash: 'both',
16
+ options: [
17
+ {
18
+ name: 'command',
19
+ description: 'The command name',
20
+ type: 'STRING',
21
+ required: true,
22
+ },
23
+ {
24
+ name: 'channel',
25
+ description: 'The tag of the channel',
26
+ type: 'CHANNEL',
27
+ required: false,
28
+ },
29
+ ],
30
+ callback: async (options) => {
31
+ const { message, channel, args, instance, interaction } = options;
32
+ const { guild } = channel;
33
+ const { messageHandler } = instance;
34
+ let commandName = (args.shift() || '').toLowerCase();
35
+ const command = instance.commandHandler.getCommand(commandName);
36
+ if (!instance.isDBConnected()) {
37
+ return messageHandler.get(guild, 'NO_DATABASE_FOUND');
38
+ }
39
+ if (!command || !command.names) {
40
+ return messageHandler.get(guild, 'UNKNOWN_COMMAND', {
41
+ COMMAND: commandName,
42
+ });
43
+ }
44
+ commandName = command.names[0];
45
+ if (args.length === 0) {
46
+ const results = await channel_commands_1.default.deleteMany({
47
+ guildId: guild?.id,
48
+ command: commandName,
49
+ });
50
+ // @ts-ignore
51
+ if (results.n === 0) {
52
+ return messageHandler.get(guild, 'NOT_CHANNEL_COMMAND');
53
+ }
54
+ command.setRequiredChannels(guild, commandName, []);
55
+ return messageHandler.get(guild, 'NO_LONGER_CHANNEL_COMMAND');
56
+ }
57
+ if (message?.mentions.channels.size === 0) {
58
+ return messageHandler.get(guild, 'NO_TAGGED_CHANNELS');
59
+ }
60
+ let channels;
61
+ if (message) {
62
+ channels = Array.from(message.mentions.channels.keys());
63
+ }
64
+ else {
65
+ channels = [interaction.options.getChannel('channel')];
66
+ }
67
+ const results = await channel_commands_1.default.findOneAndUpdate({
68
+ guildId: guild?.id,
69
+ command: commandName,
70
+ }, {
71
+ guildId: guild?.id,
72
+ command: commandName,
73
+ $addToSet: {
74
+ channels,
75
+ },
76
+ }, {
77
+ upsert: true,
78
+ new: true,
79
+ });
80
+ if (results) {
81
+ command.setRequiredChannels(guild, commandName, results.channels);
82
+ }
83
+ return messageHandler.get(guild, 'NOW_CHANNEL_COMMAND', {
84
+ COMMAND: commandName,
85
+ CHANNELS: args.join(' '),
86
+ });
87
+ },
88
+ };
@@ -0,0 +1,87 @@
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 disabled_commands_1 = __importDefault(require("../models/disabled-commands"));
7
+ module.exports = {
8
+ description: 'Enables or disables a command for this guild',
9
+ category: 'Configuration',
10
+ permissions: ['Administrator'],
11
+ minArgs: 2,
12
+ maxArgs: 2,
13
+ expectedArgs: '<"enable" or "disable"> <Command Name>',
14
+ cooldown: '2s',
15
+ slash: 'both',
16
+ options: [
17
+ {
18
+ name: 'action',
19
+ description: 'Either "enable" or "disable"',
20
+ required: true,
21
+ type: 'STRING',
22
+ choices: [
23
+ {
24
+ name: 'Enable',
25
+ value: 'enable',
26
+ },
27
+ { name: 'Disable', value: 'disable' },
28
+ ],
29
+ },
30
+ {
31
+ name: 'command',
32
+ description: 'The name of the command',
33
+ required: true,
34
+ type: 'STRING',
35
+ },
36
+ ],
37
+ callback: async (options) => {
38
+ const { channel, args, instance } = options;
39
+ const { guild } = channel;
40
+ const newState = args.shift()?.toLowerCase();
41
+ const name = (args.shift() || '').toLowerCase();
42
+ if (!guild) {
43
+ return instance.messageHandler.get(guild, 'CANNOT_ENABLE_DISABLE_IN_DMS');
44
+ }
45
+ if (!instance.isDBConnected()) {
46
+ return instance.messageHandler.get(guild, 'NO_DATABASE_FOUND');
47
+ }
48
+ if (newState !== 'enable' && newState !== 'disable') {
49
+ return instance.messageHandler.get(guild, 'ENABLE_DISABLE_STATE');
50
+ }
51
+ const command = instance.commandHandler.getCommand(name);
52
+ if (command) {
53
+ const mainCommand = command.names[0];
54
+ if (mainCommand === 'command') {
55
+ return instance.messageHandler.get(guild, 'CANNOT_DISABLE_THIS_COMMAND');
56
+ }
57
+ const isDisabled = command.isDisabled(guild.id);
58
+ if (newState === 'enable') {
59
+ if (!isDisabled) {
60
+ return instance.messageHandler.get(guild, 'COMMAND_ALREADY_ENABLED');
61
+ }
62
+ await disabled_commands_1.default.deleteOne({
63
+ guildId: guild.id,
64
+ command: mainCommand,
65
+ });
66
+ command.enable(guild.id);
67
+ return instance.messageHandler.get(guild, 'COMMAND_NOW_ENABLED', {
68
+ COMMAND: mainCommand,
69
+ });
70
+ }
71
+ if (isDisabled) {
72
+ return instance.messageHandler.get(guild, 'COMMAND_ALREADY_DISABLED');
73
+ }
74
+ await new disabled_commands_1.default({
75
+ guildId: guild.id,
76
+ command: mainCommand,
77
+ }).save();
78
+ command.disable(guild.id);
79
+ return instance.messageHandler.get(guild, 'COMMAND_NOW_DISABLED', {
80
+ COMMAND: mainCommand,
81
+ });
82
+ }
83
+ return instance.messageHandler.get(guild, 'UNKNOWN_COMMAND', {
84
+ COMMAND: name,
85
+ });
86
+ },
87
+ };