ts-command
ts-command is a very basic command library utilizing Typescript decorators.
It also supports reloading commands on the fly.
Getting Started
Note: you have to disable strictFunctionTypes in your tsconfig to be able to use the decorators better.
In your tsconfig set these compiler options:
{
"compilerOptions": {
"experimentalDecorators": true,
"emitDecoratorMetadata": true
}
}
In the entry file, import reflect-metadata like this:
import 'reflect-metadata';
Now you should be good to go.
- Create a
CommandManager. This class will manage all the commands and services you register.
import { CommandManager } from 'ts-command';
const manager = new CommandManager();
- Create a
CommandCollection.
import { Command, Restrict, RestrictClass, Injectable } from 'ts-command';
@Injectable()
@RestrictClass((
user: any,
instance: MyCommandCollection,
) =>
instance.service.isValid(user),
)
class MyCommandCollection {
constructor(private service: AuthService) {}
@Restrict((user: any) => user.id > 5)
@Command('my-command', 'name')
myCommand({ name }: { name: string }, user: any) {
return `Hello ${name}! -by ${user.name}`;
}
}
import { Service } from 'ts-command';
@Service()
class AuthService {
isValid(user: any) {
return !!user.id;
}
}
- Register the service and command-collection
import { CommandManager } from 'ts-command';
const manager: CommandManager = new CommandManager().registerService(AuthService).load(MyCommandCollection);
The manager expects a string like this: <command-name> [...args].
So you have to check whether it's a command (e.g. check for a prefix and remove the prefix).
const reply = await manager.onCommand(message, user);
Reloading
Currently, reloading is an opt-in feature.
You can enable it by passing either true to the CommandManager or by passing reload-options:
new CommandManager(true);
new CommandManager({
enabled: true,
restrict: (user: any) => user.isAdmin,
});
This will add a reload command. The signature is: reload <name: command or service>.