Feature/48 database #114
17 changed files with 111 additions and 20 deletions
|
@ -6,6 +6,7 @@ commands.disabled.message: The message to show when a disabled command is ran (D
|
||||||
|
|
||||||
role.assignable: List of roles assignable to user (Default: [])
|
role.assignable: List of roles assignable to user (Default: [])
|
||||||
role.moderator: The moderator role name (Default: "Moderator")
|
role.moderator: The moderator role name (Default: "Moderator")
|
||||||
|
role.administrator: The administrator role name (Default: "Administrator")
|
||||||
role.muted: The muted role name (Default: "Muted")
|
role.muted: The muted role name (Default: "Muted")
|
||||||
|
|
||||||
rules.file: The location of the rules file (Default: "data/rules/rules")
|
rules.file: The location of the rules file (Default: "data/rules/rules")
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
"port": 3306,
|
"port": 3306,
|
||||||
"username": "dev",
|
"username": "dev",
|
||||||
"password": "dev",
|
"password": "dev",
|
||||||
"database": "droplet",
|
"database": "vylbot",
|
||||||
"synchronize": true,
|
"synchronize": true,
|
||||||
"logging": false,
|
"logging": false,
|
||||||
"entities": [
|
"entities": [
|
||||||
|
|
|
@ -21,7 +21,7 @@ export class Events {
|
||||||
|
|
||||||
// Emit when a message is sent
|
// Emit when a message is sent
|
||||||
// Used to check for commands
|
// Used to check for commands
|
||||||
public onMessage(message: Message, commands: ICommandItem[]): IEventResponse {
|
public async onMessage(message: Message, commands: ICommandItem[]): Promise<IEventResponse> {
|
||||||
if (!message.guild) return {
|
if (!message.guild) return {
|
||||||
valid: false,
|
valid: false,
|
||||||
message: "Message was not sent in a guild, ignoring.",
|
message: "Message was not sent in a guild, ignoring.",
|
||||||
|
@ -43,7 +43,7 @@ export class Events {
|
||||||
message: "Command name was not found",
|
message: "Command name was not found",
|
||||||
};
|
};
|
||||||
|
|
||||||
const res = this._util.loadCommand(name, args, message, commands);
|
const res = await this._util.loadCommand(name, args, message, commands);
|
||||||
|
|
||||||
if (!res.valid) {
|
if (!res.valid) {
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -7,6 +7,10 @@ import { Event } from "../type/event";
|
||||||
import { ICommandContext } from "../contracts/ICommandContext";
|
import { ICommandContext } from "../contracts/ICommandContext";
|
||||||
import ICommandItem from "../contracts/ICommandItem";
|
import ICommandItem from "../contracts/ICommandItem";
|
||||||
import IEventItem from "../contracts/IEventItem";
|
import IEventItem from "../contracts/IEventItem";
|
||||||
|
import SettingsHelper from "../helpers/SettingsHelper";
|
||||||
|
import StringTools from "../helpers/StringTools";
|
||||||
|
import { CommandResponse } from "../constants/CommandResponse";
|
||||||
|
import ErrorMessages from "../constants/ErrorMessages";
|
||||||
|
|
||||||
export interface IUtilResponse extends IBaseResponse {
|
export interface IUtilResponse extends IBaseResponse {
|
||||||
context?: {
|
context?: {
|
||||||
|
@ -18,7 +22,7 @@ export interface IUtilResponse extends IBaseResponse {
|
||||||
|
|
||||||
// Util Class
|
// Util Class
|
||||||
export class Util {
|
export class Util {
|
||||||
public loadCommand(name: string, args: string[], message: Message, commands: ICommandItem[]): IUtilResponse {
|
public async loadCommand(name: string, args: string[], message: Message, commands: ICommandItem[]): Promise<IUtilResponse> {
|
||||||
if (!message.member) return {
|
if (!message.member) return {
|
||||||
valid: false,
|
valid: false,
|
||||||
message: "Member is not part of message",
|
message: "Member is not part of message",
|
||||||
|
@ -51,14 +55,27 @@ export class Util {
|
||||||
const requiredRoles = item.Command._roles;
|
const requiredRoles = item.Command._roles;
|
||||||
|
|
||||||
for (const i in requiredRoles) {
|
for (const i in requiredRoles) {
|
||||||
if (!message.member.roles.cache.find(role => role.name == requiredRoles[i])) {
|
if (message.guild) {
|
||||||
message.reply(`You require the \`${requiredRoles[i]}\` role to run this command`);
|
const setting = await SettingsHelper.GetSetting(`role.${requiredRoles[i]}`, message.guild?.id);
|
||||||
|
|
||||||
|
if (!setting) {
|
||||||
|
message.reply("Unable to verify if you have this role, please contact your bot administrator");
|
||||||
|
|
||||||
return {
|
return {
|
||||||
valid: false,
|
valid: false,
|
||||||
message: `You require the \`${requiredRoles[i]}\` role to run this command`
|
message: "Unable to verify if you have this role, please contact your bot administrator"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!message.member.roles.cache.find(role => role.name == setting)) {
|
||||||
|
message.reply(`You require the \`${StringTools.Capitalise(setting)}\` role to run this command`);
|
||||||
|
|
||||||
|
return {
|
||||||
|
valid: false,
|
||||||
|
message: `You require the \`${StringTools.Capitalise(setting)}\` role to run this command`
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const context: ICommandContext = {
|
const context: ICommandContext = {
|
||||||
|
@ -67,6 +84,27 @@ export class Util {
|
||||||
message: message
|
message: message
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const precheckResponse = item.Command.precheck(context);
|
||||||
|
const precheckAsyncResponse = await item.Command.precheckAsync(context);
|
||||||
|
|
||||||
|
if (precheckResponse != CommandResponse.Ok) {
|
||||||
|
message.reply(ErrorMessages.GetErrorMessage(precheckResponse));
|
||||||
|
|
||||||
|
return {
|
||||||
|
valid: false,
|
||||||
|
message: ErrorMessages.GetErrorMessage(precheckResponse)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (precheckAsyncResponse != CommandResponse.Ok) {
|
||||||
|
message.reply(ErrorMessages.GetErrorMessage(precheckAsyncResponse));
|
||||||
|
|
||||||
|
return {
|
||||||
|
valid: false,
|
||||||
|
message: ErrorMessages.GetErrorMessage(precheckAsyncResponse)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
item.Command.execute(context);
|
item.Command.execute(context);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -12,7 +12,7 @@ export default class Ban extends Command {
|
||||||
|
|
||||||
super._category = "Moderation";
|
super._category = "Moderation";
|
||||||
super._roles = [
|
super._roles = [
|
||||||
process.env.ROLES_MODERATOR!
|
"moderator"
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ export default class Clear extends Command {
|
||||||
|
|
||||||
super._category = "Moderation";
|
super._category = "Moderation";
|
||||||
super._roles = [
|
super._roles = [
|
||||||
process.env.ROLES_MODERATOR!
|
"moderator"
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import { Guild } from "discord.js";
|
import { Guild } from "discord.js";
|
||||||
import { readFileSync } from "fs";
|
import { readFileSync } from "fs";
|
||||||
|
import { CommandResponse } from "../constants/CommandResponse";
|
||||||
import DefaultValues from "../constants/DefaultValues";
|
import DefaultValues from "../constants/DefaultValues";
|
||||||
import { ICommandContext } from "../contracts/ICommandContext";
|
import { ICommandContext } from "../contracts/ICommandContext";
|
||||||
import ICommandReturnContext from "../contracts/ICommandReturnContext";
|
import ICommandReturnContext from "../contracts/ICommandReturnContext";
|
||||||
|
@ -13,6 +14,25 @@ export default class Config extends Command {
|
||||||
constructor() {
|
constructor() {
|
||||||
super();
|
super();
|
||||||
super._category = "Administration";
|
super._category = "Administration";
|
||||||
|
super._roles = [
|
||||||
|
"administrator"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async precheckAsync(context: ICommandContext): Promise<CommandResponse> {
|
||||||
|
if (!context.message.guild) {
|
||||||
|
return CommandResponse.ServerNotSetup;
|
||||||
|
}
|
||||||
|
|
||||||
|
const server = await Server.FetchOneById<Server>(Server, context.message.guild?.id, [
|
||||||
|
"Settings",
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (!server) {
|
||||||
|
return CommandResponse.ServerNotSetup;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CommandResponse.Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async execute(context: ICommandContext) {
|
public override async execute(context: ICommandContext) {
|
||||||
|
@ -25,8 +45,6 @@ export default class Config extends Command {
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if (!server) {
|
if (!server) {
|
||||||
const embed = new ErrorEmbed(context, "This server hasn't been setup yet, please run the setup command");
|
|
||||||
embed.SendToCurrentChannel();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ export default class Kick extends Command {
|
||||||
|
|
||||||
super._category = "Moderation";
|
super._category = "Moderation";
|
||||||
super._roles = [
|
super._roles = [
|
||||||
process.env.ROLES_MODERATOR!
|
"moderator"
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ export default class Mute extends Command {
|
||||||
|
|
||||||
super._category = "Moderation";
|
super._category = "Moderation";
|
||||||
super._roles = [
|
super._roles = [
|
||||||
process.env.ROLES_MODERATOR!
|
"moderator"
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ export default class Rules extends Command {
|
||||||
|
|
||||||
super._category = "Admin";
|
super._category = "Admin";
|
||||||
super._roles = [
|
super._roles = [
|
||||||
process.env.ROLES_MODERATOR!
|
"administrator"
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,9 @@ export default class Setup extends Command {
|
||||||
constructor() {
|
constructor() {
|
||||||
super();
|
super();
|
||||||
super._category = "Administration";
|
super._category = "Administration";
|
||||||
|
super._roles = [
|
||||||
|
"moderator"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async execute(context: ICommandContext) {
|
public override async execute(context: ICommandContext) {
|
||||||
|
|
|
@ -12,7 +12,7 @@ export default class Unmute extends Command {
|
||||||
|
|
||||||
super._category = "Moderation";
|
super._category = "Moderation";
|
||||||
super._roles = [
|
super._roles = [
|
||||||
process.env.ROLES_MODERATOR!
|
"moderator"
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ export default class Warn extends Command {
|
||||||
|
|
||||||
super._category = "Moderation";
|
super._category = "Moderation";
|
||||||
super._roles = [
|
super._roles = [
|
||||||
process.env.ROLES_MODERATOR!
|
"moderator"
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
5
src/constants/CommandResponse.ts
Normal file
5
src/constants/CommandResponse.ts
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
export enum CommandResponse {
|
||||||
|
Ok,
|
||||||
|
Unauthorised,
|
||||||
|
ServerNotSetup,
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
export default class DefaultValues {
|
export default class DefaultValues {
|
||||||
public static readonly values: ISettingValue[] = [];
|
public static values: ISettingValue[] = [];
|
||||||
|
|
||||||
public static GetValue(key: string): string | undefined {
|
public static GetValue(key: string): string | undefined {
|
||||||
this.SetValues();
|
this.SetValues();
|
||||||
|
@ -22,6 +22,7 @@ export default class DefaultValues {
|
||||||
// Role (Command)
|
// Role (Command)
|
||||||
this.values.push({ Key: "role.assignable", Value: "" });
|
this.values.push({ Key: "role.assignable", Value: "" });
|
||||||
this.values.push({ Key: "role.moderator", Value: "Moderator" });
|
this.values.push({ Key: "role.moderator", Value: "Moderator" });
|
||||||
|
this.values.push({ Key: "role.administrator", Value: "Administrator"});
|
||||||
this.values.push({ Key: "role.muted", Value: "Muted" });
|
this.values.push({ Key: "role.muted", Value: "Muted" });
|
||||||
|
|
||||||
// Rules (Command)
|
// Rules (Command)
|
||||||
|
|
|
@ -1,5 +1,21 @@
|
||||||
|
import { CommandResponse } from "./CommandResponse";
|
||||||
|
|
||||||
export default class ErrorMessages {
|
export default class ErrorMessages {
|
||||||
public static readonly InsufficientBotPermissions = "Unable to do this action, am I missing permissions?";
|
public static readonly InsufficientBotPermissions = "Unable to do this action, am I missing permissions?";
|
||||||
public static readonly ChannelNotFound = "Unable to find channel";
|
public static readonly ChannelNotFound = "Unable to find channel";
|
||||||
public static readonly RoleNotFound = "Unable to find role";
|
public static readonly RoleNotFound = "Unable to find role";
|
||||||
|
|
||||||
|
public static readonly UserUnauthorised = "You are not authorised to use this command";
|
||||||
|
public static readonly ServerNotSetup = "This server hasn't been setup yet, please run the setup command";
|
||||||
|
|
||||||
|
public static GetErrorMessage(response: CommandResponse): string {
|
||||||
|
switch (response) {
|
||||||
|
case CommandResponse.Unauthorised:
|
||||||
|
return this.UserUnauthorised;
|
||||||
|
case CommandResponse.ServerNotSetup:
|
||||||
|
return this.ServerNotSetup;
|
||||||
|
default:
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -1,3 +1,4 @@
|
||||||
|
import { CommandResponse } from "../constants/CommandResponse";
|
||||||
import { ICommandContext } from "../contracts/ICommandContext";
|
import { ICommandContext } from "../contracts/ICommandContext";
|
||||||
|
|
||||||
export class Command {
|
export class Command {
|
||||||
|
@ -9,6 +10,14 @@ export class Command {
|
||||||
this._roles = [];
|
this._roles = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public precheck(context: ICommandContext): CommandResponse {
|
||||||
|
return CommandResponse.Ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async precheckAsync(context: ICommandContext): Promise<CommandResponse> {
|
||||||
|
return CommandResponse.Ok;
|
||||||
|
}
|
||||||
|
|
||||||
public execute(context: ICommandContext) {
|
public execute(context: ICommandContext) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue