diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index ab0303d..733c59c 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -46,6 +46,9 @@
+
+
+
@@ -58,6 +61,7 @@
+
@@ -101,6 +105,11 @@
+
+
+
+
+
@@ -147,6 +156,11 @@
+
+
+
+
+
diff --git a/package.json b/package.json
index 6732ec5..4fab491 100644
--- a/package.json
+++ b/package.json
@@ -180,6 +180,10 @@
"switch": {
"before": true,
"after": false
+ },
+ "for": {
+ "before": true,
+ "after": false
}
}
}
diff --git a/src/commands/utils/vm.ts b/src/commands/utils/vm.ts
index 7c61d93..c4d5b08 100644
--- a/src/commands/utils/vm.ts
+++ b/src/commands/utils/vm.ts
@@ -15,15 +15,30 @@
* along with ArgonBot. If not, see .
*/
import Command from '@structures/command';
+
+import type { Client, Message } from 'discord.js';
import i18next from 'i18next';
import { transpile } from 'typescript';
import { NodeVM } from 'vm2';
-import type { Client, Message } from 'discord.js';
-
export class vm extends Command {
public constructor(client: Client, file: string) {
- super(client, file);
+ super(client, file, {
+ shortDescription: i18next.t('commands:vm.shortDescription'),
+ extendedDescription: i18next.t('commands:vm.extendedDescription'),
+ args: [
+ {
+ name: 'language',
+ acceptedValues: ['js', 'javascript', 'ts', 'typescript'],
+ description: i18next.t('commands:vm.languageArg'),
+ },
+ {
+ name: 'code',
+ goToEnd: true,
+ description: i18next.t('commands:vm.codeArg'),
+ },
+ ],
+ });
}
public async run(message: Message, vmLang: string, ...codeArray: string[]): Promise {
diff --git a/src/index.ts b/src/index.ts
index 72858e3..d687a01 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -87,18 +87,20 @@ client.on('message', async (msg) => {
if(!findCommand) return;
+ await msg.channel.startTyping();
+
if(findCommand.options.ownerOnly && msg.author.id !== config.get('owner')) {
- await msg.reply('Only the bot owner can run this command!');
+ await msg.reply(i18next.t('commands:errors.ownerOnly'));
return;
}
if((findCommand.options.runIn === ECommandRunIn.DM) && msg.channel.type !== 'dm') {
- await msg.reply('You can only run this command in DMs!');
+ await msg.reply(i18next.t('commands:errors.dmsOnly'));
return;
}
if((findCommand.options.runIn === ECommandRunIn.Server) && msg.channel.type !== 'text') {
- await msg.reply('You can only run this command in a server!');
+ await msg.reply(i18next.t('commands:errors.serverOnly'));
return;
}
@@ -106,10 +108,11 @@ client.on('message', async (msg) => {
info(`Command ${findCommand.options.name} is being ran in ${msg.guild ? msg.guild.name : 'DMs'}`, ELoggingScope.Command);
await findCommand.run(msg, ...args);
info(`Finished running ${findCommand.options.name} in ${msg.guild ? msg.guild.name : `${msg.author.username} DMs`}`, ELoggingScope.Command);
+ msg.channel.stopTyping();
} catch(e) {
error(`An error has occurred while running ${findCommand.options.name}!\n${e.message}`, ELoggingScope.Command);
- msg.reply('I\'m sorry but an error has occurred while running this command! Please file an issue to' +
- ` https://code.relms.dev/Relms/ArgonBot!\n\`\`\`${e.message}\`\`\``);
+ await msg.reply(i18next.t('commands:errors.runError', { error: e.message }));
+ msg.channel.stopTyping();
}
});
diff --git a/src/lib/structures/command.ts b/src/lib/structures/command.ts
index 3cb685c..325534b 100644
--- a/src/lib/structures/command.ts
+++ b/src/lib/structures/command.ts
@@ -14,11 +14,11 @@
* You should have received a copy of the GNU General Public License
* along with ArgonBot. If not, see .
*/
-import config from 'config';
-import path from 'path';
-
import type { ICommandOptions } from '@utils/types';
+import { ECommandRunIn } from '@utils/types';
+import config from 'config';
import type { Client, Message } from 'discord.js';
+import path from 'path';
export default abstract class Command {
public readonly client: Client;
@@ -32,6 +32,10 @@ export default abstract class Command {
const defaultOptions: ICommandOptions = {
name: path.basename(this.file, path.extname(this.file)),
group: path.basename(path.dirname(this.file)) === 'commands' ? '' : path.basename(path.dirname(this.file)),
+ ownerOnly: false,
+ runIn: ECommandRunIn.Both,
+ shortDescription: '',
+ extendedDescription: '',
};
this.options = config.util.extendDeep(defaultOptions, options);
diff --git a/src/lib/utils/types.ts b/src/lib/utils/types.ts
index 9c4cfaf..948b1c1 100644
--- a/src/lib/utils/types.ts
+++ b/src/lib/utils/types.ts
@@ -37,6 +37,13 @@ export interface ICommandOptions {
group?: string;
ownerOnly?: boolean;
runIn?: ECommandRunIn;
+ args?: {
+ name: string;
+ description?: string;
+ acceptedValues?: string[];
+ goToEnd?: boolean;
+ optional?: boolean;
+ }[];
}
// Type Aliases
diff --git a/translations/en-US/commands.json b/translations/en-US/commands.json
index 72b0b8e..2542338 100644
--- a/translations/en-US/commands.json
+++ b/translations/en-US/commands.json
@@ -1,7 +1,22 @@
{
"vm": {
+ "shortDescription": "Runs code in a safe sandbox for testing",
+ "extendedDescription": "Runs code in a secure and safe sandbox for prototyping & testing code while preventing access to the system",
+ "languageArg": "The language to use (JavaScript/TypeScript)",
+ "codeArg": "The code to run in the VM",
"computing": "Computing { $language } code... Please wait!",
- "error": "An error has occurred while executing JavaScript code!\n```\n{{ $error }}\n```",
+ "error": "An error has occurred while executing JavaScript code!\n```\n{ $error }\n```",
"unknown": "Unknown language given!"
+ },
+ "errors": {
+ "ownerOnly": "Only the bot owner can run this command!",
+ "dmsOnly": "You can only run this command in DMs!",
+ "serverOnly": "You can only run this command in a server!",
+ "runError": "I'm sorry but an error has occurred while running this command! Please file an issue to https://code.relms.dev/Relms/ArgonBot!\n```{ $error }```"
+ },
+ "generic": {
+ "noShortDescription": "No short description given!",
+ "noExtendedDescription": "No extended description given!",
+ "noArgsDescription": "No description for { $arg } has been given!"
}
}
diff --git a/translations/en-US/common.json b/translations/en-US/common.json
index e69de29..0967ef4 100644
--- a/translations/en-US/common.json
+++ b/translations/en-US/common.json
@@ -0,0 +1 @@
+{}