Update discord.js
This commit is contained in:
parent
0465697b87
commit
1dc7bb2f38
26 changed files with 444 additions and 400 deletions
|
@ -24,9 +24,10 @@
|
|||
"homepage": "https://github.com/Vylpes/vylbot-app",
|
||||
"funding": "https://ko-fi.com/vylpes",
|
||||
"dependencies": {
|
||||
"@discordjs/rest": "^1.1.0",
|
||||
"@types/jest": "^27.0.3",
|
||||
"@types/uuid": "^8.3.4",
|
||||
"discord.js": "^13.6.0",
|
||||
"discord.js": "^14.3.0",
|
||||
"dotenv": "^10.0.0",
|
||||
"emoji-regex": "^9.2.0",
|
||||
"jest": "^27.4.5",
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
import { MessageActionRow, MessageButton } from "discord.js";
|
||||
import { MessageButtonStyles } from "discord.js/typings/enums";
|
||||
import { ActionRowBuilder, ButtonBuilder, ButtonStyle } from "discord.js";
|
||||
import { ICommandContext } from "../contracts/ICommandContext";
|
||||
import PublicEmbed from "../helpers/embeds/PublicEmbed";
|
||||
import { Command } from "../type/command";
|
||||
|
@ -14,29 +13,30 @@ export default class About extends Command {
|
|||
const fundingLink = process.env.ABOUT_FUNDING;
|
||||
const repoLink = process.env.ABOUT_REPO;
|
||||
|
||||
const embed = new PublicEmbed(context, "About", "")
|
||||
.addField("Version", process.env.BOT_VER!, true)
|
||||
.addField("Author", process.env.BOT_AUTHOR!, true)
|
||||
.addField("Date", process.env.BOT_DATE!, true);
|
||||
const embed = new PublicEmbed(context, "About", "Discord Bot made by Vylpes");
|
||||
|
||||
const row = new MessageActionRow();
|
||||
embed.AddField("Version", process.env.BOT_VER!, true);
|
||||
embed.AddField("Author", process.env.BOT_AUTHOR!, true);
|
||||
embed.AddField("Date", process.env.BOT_DATE!, true);
|
||||
|
||||
const row = new ActionRowBuilder<ButtonBuilder>();
|
||||
|
||||
if (repoLink) {
|
||||
row.addComponents(
|
||||
new MessageButton()
|
||||
new ButtonBuilder()
|
||||
.setURL(repoLink)
|
||||
.setLabel("Repo")
|
||||
.setStyle(MessageButtonStyles.LINK));
|
||||
.setStyle(ButtonStyle.Link));
|
||||
}
|
||||
|
||||
if (fundingLink) {
|
||||
row.addComponents(
|
||||
new MessageButton()
|
||||
new ButtonBuilder()
|
||||
.setURL(fundingLink)
|
||||
.setLabel("Funding")
|
||||
.setStyle(MessageButtonStyles.LINK));
|
||||
.setStyle(ButtonStyle.Link));
|
||||
}
|
||||
|
||||
await embed.SendToCurrentChannel({ components: [row] });
|
||||
await embed.SendToCurrentChannel({ components: [ row ] });
|
||||
}
|
||||
}
|
|
@ -57,16 +57,16 @@ export default class Audits extends Command {
|
|||
const audits = await Audit.FetchAuditsByUserId(userId, context.message.guild!.id);
|
||||
|
||||
if (!audits || audits.length == 0) {
|
||||
const publicEmbed = new PublicEmbed(context, "", "There are no audits logged for this user.");
|
||||
const publicEmbed = new PublicEmbed(context, "Audits", "There are no audits logged for this user.");
|
||||
await publicEmbed.SendToCurrentChannel();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
const publicEmbed = new PublicEmbed(context, "Audit Log", "");
|
||||
const publicEmbed = new PublicEmbed(context, "Audit Log", `Audits: ${audits.length}`);
|
||||
|
||||
for (let audit of audits) {
|
||||
publicEmbed.addField(`${audit.AuditId} // ${AuditTools.TypeToFriendlyText(audit.AuditType)}`, audit.WhenCreated.toString());
|
||||
publicEmbed.AddField(`${audit.AuditId} // ${AuditTools.TypeToFriendlyText(audit.AuditType)}`, audit.WhenCreated.toString());
|
||||
}
|
||||
|
||||
await publicEmbed.SendToCurrentChannel();
|
||||
|
@ -89,11 +89,11 @@ export default class Audits extends Command {
|
|||
return;
|
||||
}
|
||||
|
||||
const publicEmbed = new PublicEmbed(context, `Audit ${audit.AuditId.toUpperCase()}`, "");
|
||||
const publicEmbed = new PublicEmbed(context, "Audit", audit.AuditId.toUpperCase());
|
||||
|
||||
publicEmbed.addField("Reason", audit.Reason || "*none*", true);
|
||||
publicEmbed.addField("Type", AuditTools.TypeToFriendlyText(audit.AuditType), true);
|
||||
publicEmbed.addField("Moderator", `<@${audit.ModeratorId}>`, true);
|
||||
publicEmbed.AddField("Reason", audit.Reason || "*none*", true);
|
||||
publicEmbed.AddField("Type", AuditTools.TypeToFriendlyText(audit.AuditType), true);
|
||||
publicEmbed.AddField("Moderator", `<@${audit.ModeratorId}>`, true);
|
||||
|
||||
await publicEmbed.SendToCurrentChannel();
|
||||
}
|
||||
|
@ -117,7 +117,7 @@ export default class Audits extends Command {
|
|||
|
||||
await Audit.Remove(Audit, audit);
|
||||
|
||||
const publicEmbed = new PublicEmbed(context, "", "Audit cleared");
|
||||
const publicEmbed = new PublicEmbed(context, "Audit", "Audit cleared");
|
||||
await publicEmbed.SendToCurrentChannel();
|
||||
}
|
||||
|
||||
|
@ -138,7 +138,7 @@ export default class Audits extends Command {
|
|||
|
||||
await audit.Save(Audit, audit);
|
||||
|
||||
const publicEmbed = new PublicEmbed(context, "", `Created new audit with ID \`${audit.AuditId}\``);
|
||||
const publicEmbed = new PublicEmbed(context, "Audit", `Created new audit with ID \`${audit.AuditId}\``);
|
||||
await publicEmbed.SendToCurrentChannel();
|
||||
}
|
||||
}
|
|
@ -4,7 +4,6 @@ import LogEmbed from "../helpers/embeds/LogEmbed";
|
|||
import PublicEmbed from "../helpers/embeds/PublicEmbed";
|
||||
import { Command } from "../type/command";
|
||||
import { ICommandContext } from "../contracts/ICommandContext";
|
||||
import ICommandReturnContext from "../contracts/ICommandReturnContext";
|
||||
import Audit from "../entity/Audit";
|
||||
import { AuditType } from "../constants/AuditType";
|
||||
|
||||
|
@ -18,17 +17,14 @@ export default class Ban extends Command {
|
|||
];
|
||||
}
|
||||
|
||||
public override async execute(context: ICommandContext): Promise<ICommandReturnContext> {
|
||||
public override async execute(context: ICommandContext) {
|
||||
const targetUser = context.message.mentions.users.first();
|
||||
|
||||
if (!targetUser) {
|
||||
const embed = new ErrorEmbed(context, "User does not exist");
|
||||
await embed.SendToCurrentChannel();
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [embed],
|
||||
};
|
||||
return;
|
||||
}
|
||||
|
||||
const targetMember = context.message.guild?.members.cache.find(x => x.user.id == targetUser.id);
|
||||
|
@ -37,10 +33,7 @@ export default class Ban extends Command {
|
|||
const embed = new ErrorEmbed(context, "User is not in this server");
|
||||
await embed.SendToCurrentChannel();
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [embed],
|
||||
};
|
||||
return;
|
||||
}
|
||||
|
||||
const reasonArgs = context.args;
|
||||
|
@ -48,21 +41,13 @@ export default class Ban extends Command {
|
|||
|
||||
const reason = reasonArgs.join(" ");
|
||||
|
||||
if (!context.message.guild?.available) {
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [],
|
||||
};
|
||||
}
|
||||
if (!context.message.guild?.available) return;
|
||||
|
||||
if (!targetMember.bannable) {
|
||||
const embed = new ErrorEmbed(context, ErrorMessages.InsufficientBotPermissions);
|
||||
await embed.SendToCurrentChannel();
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [embed],
|
||||
};
|
||||
return;
|
||||
}
|
||||
|
||||
const logEmbed = new LogEmbed(context, "Member Banned");
|
||||
|
@ -82,10 +67,5 @@ export default class Ban extends Command {
|
|||
|
||||
await audit.Save(Audit, audit);
|
||||
}
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [logEmbed, publicEmbed],
|
||||
};
|
||||
}
|
||||
}
|
|
@ -26,10 +26,11 @@ export default class Bunny extends Command {
|
|||
const result = await randomBunny(selectedSubreddit, 'hot');
|
||||
|
||||
if (result.IsSuccess) {
|
||||
const embed = new PublicEmbed(context, result.Result!.Title, "")
|
||||
.setImage(result.Result!.Url)
|
||||
.setURL(`https://reddit.com${result.Result!.Permalink}`)
|
||||
.setFooter({ text: `r/${selectedSubreddit} · ${result.Result!.Ups} upvotes` });
|
||||
const embed = new PublicEmbed(context, result.Result!.Title, "");
|
||||
|
||||
embed.SetImage(result.Result!.Url)
|
||||
embed.SetURL(`https://reddit.com${result.Result!.Permalink}`)
|
||||
embed.SetFooter(`r/${selectedSubreddit} · ${result.Result!.Ups} upvotes`);
|
||||
|
||||
await embed.SendToCurrentChannel();
|
||||
} else {
|
||||
|
|
|
@ -3,7 +3,6 @@ import { TextChannel } from "discord.js";
|
|||
import PublicEmbed from "../helpers/embeds/PublicEmbed";
|
||||
import { Command } from "../type/command";
|
||||
import { ICommandContext } from "../contracts/ICommandContext";
|
||||
import ICommandReturnContext from "../contracts/ICommandReturnContext";
|
||||
|
||||
export default class Clear extends Command {
|
||||
constructor() {
|
||||
|
@ -15,15 +14,12 @@ export default class Clear extends Command {
|
|||
];
|
||||
}
|
||||
|
||||
public override async execute(context: ICommandContext): Promise<ICommandReturnContext> {
|
||||
public override async execute(context: ICommandContext) {
|
||||
if (context.args.length == 0) {
|
||||
const errorEmbed = new ErrorEmbed(context, "Please specify an amount between 1 and 100");
|
||||
await errorEmbed.SendToCurrentChannel();
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [errorEmbed]
|
||||
};
|
||||
return;
|
||||
}
|
||||
|
||||
const totalToClear = Number.parseInt(context.args[0]);
|
||||
|
@ -31,20 +27,13 @@ export default class Clear extends Command {
|
|||
if (!totalToClear || totalToClear <= 0 || totalToClear > 100) {
|
||||
const errorEmbed = new ErrorEmbed(context, "Please specify an amount between 1 and 100");
|
||||
await errorEmbed.SendToCurrentChannel();
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [errorEmbed]
|
||||
};
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
await (context.message.channel as TextChannel).bulkDelete(totalToClear);
|
||||
|
||||
const embed = new PublicEmbed(context, "", `${totalToClear} message(s) were removed`);
|
||||
await embed.SendToCurrentChannel();
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [embed]
|
||||
};
|
||||
}
|
||||
}
|
|
@ -1,4 +1,3 @@
|
|||
import { existsSync, readdirSync } from "fs";
|
||||
import { CoreClient } from "../client/client";
|
||||
import { ICommandContext } from "../contracts/ICommandContext";
|
||||
import ErrorEmbed from "../helpers/embeds/ErrorEmbed";
|
||||
|
@ -33,12 +32,12 @@ export default class Help extends Command {
|
|||
.filter(x => !x.ServerId || x.ServerId == context.message.guild?.id);
|
||||
const cateogries = [...new Set(allCommands.map(x => x.Command.Category))];
|
||||
|
||||
const embed = new PublicEmbed(context, "Commands", "");
|
||||
const embed = new PublicEmbed(context, "Commands", `Commands: ${allCommands.length}`);
|
||||
|
||||
cateogries.forEach(category => {
|
||||
let filtered = allCommands.filter(x => x.Command.Category == category);
|
||||
|
||||
embed.addField(StringTools.Capitalise(category || "Uncategorised"), StringTools.CapitaliseArray(filtered.flatMap(x => x.Name)).join(", "));
|
||||
embed.AddField(StringTools.Capitalise(category || "Uncategorised"), StringTools.CapitaliseArray(filtered.flatMap(x => x.Name)).join(", "));
|
||||
});
|
||||
|
||||
await embed.SendToCurrentChannel();
|
||||
|
@ -49,15 +48,15 @@ export default class Help extends Command {
|
|||
const exclusiveCommand = CoreClient.commandItems.find(x => x.Name == context.args[0] && x.ServerId == context.message.guild?.id);
|
||||
|
||||
if (exclusiveCommand) {
|
||||
const embed = new PublicEmbed(context, StringTools.Capitalise(exclusiveCommand.Name), "");
|
||||
embed.addField("Category", StringTools.Capitalise(exclusiveCommand.Command.Category || "Uncategorised"));
|
||||
embed.addField("Required Roles", StringTools.Capitalise(exclusiveCommand.Command.Roles.join(", ")) || "Everyone");
|
||||
const embed = new PublicEmbed(context, StringTools.Capitalise(exclusiveCommand.Name), "Coming Soon");
|
||||
embed.AddField("Category", StringTools.Capitalise(exclusiveCommand.Command.Category || "Uncategorised"));
|
||||
embed.AddField("Required Roles", StringTools.Capitalise(exclusiveCommand.Command.Roles.join(", ")) || "Everyone");
|
||||
|
||||
await embed.SendToCurrentChannel();
|
||||
} else if (command) {
|
||||
const embed = new PublicEmbed(context, StringTools.Capitalise(command.Name), "");
|
||||
embed.addField("Category", StringTools.Capitalise(command.Command.Category || "Uncategorised"));
|
||||
embed.addField("Required Roles", StringTools.Capitalise(command.Command.Roles.join(", ")) || "Everyone");
|
||||
const embed = new PublicEmbed(context, StringTools.Capitalise(command.Name), "Coming Soon");
|
||||
embed.AddField("Category", StringTools.Capitalise(command.Command.Category || "Uncategorised"));
|
||||
embed.AddField("Required Roles", StringTools.Capitalise(command.Command.Roles.join(", ")) || "Everyone");
|
||||
|
||||
await embed.SendToCurrentChannel();
|
||||
} else {
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
import { AuditType } from "../constants/AuditType";
|
||||
import ErrorMessages from "../constants/ErrorMessages";
|
||||
import { ICommandContext } from "../contracts/ICommandContext";
|
||||
import ICommandReturnContext from "../contracts/ICommandReturnContext";
|
||||
import Audit from "../entity/Audit";
|
||||
import ErrorEmbed from "../helpers/embeds/ErrorEmbed";
|
||||
import LogEmbed from "../helpers/embeds/LogEmbed";
|
||||
|
@ -18,17 +17,14 @@ export default class Kick extends Command {
|
|||
];
|
||||
}
|
||||
|
||||
public override async execute(context: ICommandContext): Promise<ICommandReturnContext> {
|
||||
public override async execute(context: ICommandContext) {
|
||||
const targetUser = context.message.mentions.users.first();
|
||||
|
||||
if (!targetUser) {
|
||||
const embed = new ErrorEmbed(context, "User does not exist");
|
||||
await embed.SendToCurrentChannel();
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [embed]
|
||||
};
|
||||
return;
|
||||
}
|
||||
|
||||
const targetMember = context.message.guild?.members.cache.find(x => x.user.id == targetUser.id);
|
||||
|
@ -37,10 +33,7 @@ export default class Kick extends Command {
|
|||
const embed = new ErrorEmbed(context, "User is not in this server");
|
||||
await embed.SendToCurrentChannel();
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [embed]
|
||||
};
|
||||
return;
|
||||
}
|
||||
|
||||
const reasonArgs = context.args;
|
||||
|
@ -48,21 +41,13 @@ export default class Kick extends Command {
|
|||
|
||||
const reason = reasonArgs.join(" ");
|
||||
|
||||
if (!context.message.guild?.available) {
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: []
|
||||
};
|
||||
}
|
||||
if (!context.message.guild?.available) return;
|
||||
|
||||
if (!targetMember.kickable) {
|
||||
const embed = new ErrorEmbed(context, ErrorMessages.InsufficientBotPermissions);
|
||||
await embed.SendToCurrentChannel();
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [embed]
|
||||
};
|
||||
return;
|
||||
}
|
||||
|
||||
const logEmbed = new LogEmbed(context, "Member Kicked");
|
||||
|
@ -82,10 +67,5 @@ export default class Kick extends Command {
|
|||
|
||||
await audit.Save(Audit, audit);
|
||||
}
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [logEmbed, publicEmbed]
|
||||
};
|
||||
}
|
||||
}
|
|
@ -1,7 +1,6 @@
|
|||
import { AuditType } from "../constants/AuditType";
|
||||
import ErrorMessages from "../constants/ErrorMessages";
|
||||
import { ICommandContext } from "../contracts/ICommandContext";
|
||||
import ICommandReturnContext from "../contracts/ICommandReturnContext";
|
||||
import Audit from "../entity/Audit";
|
||||
import ErrorEmbed from "../helpers/embeds/ErrorEmbed";
|
||||
import LogEmbed from "../helpers/embeds/LogEmbed";
|
||||
|
@ -18,17 +17,14 @@ export default class Mute extends Command {
|
|||
];
|
||||
}
|
||||
|
||||
public override async execute(context: ICommandContext): Promise<ICommandReturnContext> {
|
||||
public override async execute(context: ICommandContext) {
|
||||
const targetUser = context.message.mentions.users.first();
|
||||
|
||||
if (!targetUser) {
|
||||
const embed = new ErrorEmbed(context, "User does not exist");
|
||||
await embed.SendToCurrentChannel();
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [embed]
|
||||
};
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
const targetMember = context.message.guild?.members.cache.find(x => x.user.id == targetUser.id);
|
||||
|
@ -37,10 +33,7 @@ export default class Mute extends Command {
|
|||
const embed = new ErrorEmbed(context, "User is not in this server");
|
||||
await embed.SendToCurrentChannel();
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [embed]
|
||||
};
|
||||
return;
|
||||
}
|
||||
|
||||
const reasonArgs = context.args;
|
||||
|
@ -48,21 +41,13 @@ export default class Mute extends Command {
|
|||
|
||||
const reason = reasonArgs.join(" ");
|
||||
|
||||
if (!context.message.guild?.available) {
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: []
|
||||
};
|
||||
}
|
||||
if (!context.message.guild?.available) return;
|
||||
|
||||
if (!targetMember.manageable) {
|
||||
const embed = new ErrorEmbed(context, ErrorMessages.InsufficientBotPermissions);
|
||||
await embed.SendToCurrentChannel();
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [embed]
|
||||
};
|
||||
return;
|
||||
}
|
||||
|
||||
const logEmbed = new LogEmbed(context, "Member Muted");
|
||||
|
@ -79,10 +64,7 @@ export default class Mute extends Command {
|
|||
const embed = new ErrorEmbed(context, ErrorMessages.RoleNotFound);
|
||||
await embed.SendToCurrentChannel();
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [embed]
|
||||
};
|
||||
return;
|
||||
}
|
||||
|
||||
await targetMember.roles.add(mutedRole, `Moderator: ${context.message.author.tag}, Reason: ${reason || "*none*"}`);
|
||||
|
@ -95,10 +77,5 @@ export default class Mute extends Command {
|
|||
|
||||
await audit.Save(Audit, audit);
|
||||
}
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [logEmbed, publicEmbed]
|
||||
};
|
||||
}
|
||||
}
|
|
@ -1,5 +1,4 @@
|
|||
import { ICommandContext } from "../contracts/ICommandContext";
|
||||
import ICommandReturnContext from "../contracts/ICommandReturnContext";
|
||||
import ErrorEmbed from "../helpers/embeds/ErrorEmbed";
|
||||
import PublicEmbed from "../helpers/embeds/PublicEmbed";
|
||||
import { Command } from "../type/command";
|
||||
|
@ -11,7 +10,7 @@ export default class Poll extends Command {
|
|||
super.Category = "General";
|
||||
}
|
||||
|
||||
public override async execute(context: ICommandContext): Promise<ICommandReturnContext> {
|
||||
public override async execute(context: ICommandContext) {
|
||||
const argsJoined = context.args.join(" ");
|
||||
const argsSplit = argsJoined.split(";");
|
||||
|
||||
|
@ -49,7 +48,9 @@ export default class Poll extends Command {
|
|||
|
||||
const embed = new PublicEmbed(context, title, description.join("\n"));
|
||||
|
||||
const message = await context.message.channel.send({ embeds: [ embed ]});
|
||||
const message = await embed.SendToCurrentChannel();
|
||||
|
||||
if (!message) return;
|
||||
|
||||
description.forEach(async (value, index) => {
|
||||
await message.react(reactionEmojis[index]);
|
||||
|
|
|
@ -3,7 +3,6 @@ import PublicEmbed from "../helpers/embeds/PublicEmbed";
|
|||
import { Role as DiscordRole } from "discord.js";
|
||||
import { Command } from "../type/command";
|
||||
import { ICommandContext } from "../contracts/ICommandContext";
|
||||
import ICommandReturnContext from "../contracts/ICommandReturnContext";
|
||||
import SettingsHelper from "../helpers/SettingsHelper";
|
||||
import { readFileSync } from "fs";
|
||||
import { default as eRole } from "../entity/Role";
|
||||
|
@ -56,7 +55,7 @@ export default class Role extends Command {
|
|||
return stringArray;
|
||||
}
|
||||
|
||||
public async SendRolesList(context: ICommandContext, serverId: string): Promise<ICommandReturnContext> {
|
||||
public async SendRolesList(context: ICommandContext, serverId: string) {
|
||||
const roles = await this.GetRolesList(context);
|
||||
|
||||
const botPrefix = await SettingsHelper.GetServerPrefix(serverId);
|
||||
|
@ -64,14 +63,9 @@ export default class Role extends Command {
|
|||
|
||||
const embed = new PublicEmbed(context, "Roles", description);
|
||||
await embed.SendToCurrentChannel();
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [embed]
|
||||
};
|
||||
}
|
||||
|
||||
public async ToggleRole(context: ICommandContext): Promise<ICommandReturnContext> {
|
||||
public async ToggleRole(context: ICommandContext) {
|
||||
const roles = await this.GetRolesList(context);
|
||||
const requestedRole = context.args.join(" ");
|
||||
|
||||
|
@ -79,10 +73,7 @@ export default class Role extends Command {
|
|||
const errorEmbed = new ErrorEmbed(context, "This role isn't marked as assignable, to see a list of assignable roles, run this command without any parameters");
|
||||
await errorEmbed.SendToCurrentChannel();
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [errorEmbed]
|
||||
};
|
||||
return;
|
||||
}
|
||||
|
||||
const assignRole = context.message.guild?.roles.cache.find(x => x.name == requestedRole);
|
||||
|
@ -91,10 +82,7 @@ export default class Role extends Command {
|
|||
const errorEmbed = new ErrorEmbed(context, "The current server doesn't have this role. Please contact the server's moderators");
|
||||
await errorEmbed.SendToCurrentChannel();
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [errorEmbed]
|
||||
};
|
||||
return;
|
||||
}
|
||||
|
||||
const role = context.message.member?.roles.cache.find(x => x.name == requestedRole)
|
||||
|
@ -104,35 +92,20 @@ export default class Role extends Command {
|
|||
} else {
|
||||
await this.RemoveRole(context, assignRole);
|
||||
}
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: []
|
||||
};
|
||||
}
|
||||
|
||||
public async AddRole(context: ICommandContext, role: DiscordRole): Promise<ICommandReturnContext> {
|
||||
public async AddRole(context: ICommandContext, role: DiscordRole) {
|
||||
await context.message.member?.roles.add(role, "Toggled with role command");
|
||||
|
||||
const embed = new PublicEmbed(context, "", `Gave role: \`${role.name}\``);
|
||||
await embed.SendToCurrentChannel();
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [embed]
|
||||
};
|
||||
}
|
||||
|
||||
public async RemoveRole(context: ICommandContext, role: DiscordRole): Promise<ICommandReturnContext> {
|
||||
public async RemoveRole(context: ICommandContext, role: DiscordRole) {
|
||||
await context.message.member?.roles.remove(role, "Toggled with role command");
|
||||
|
||||
const embed = new PublicEmbed(context, "", `Removed role: \`${role.name}\``);
|
||||
await embed.SendToCurrentChannel();
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [embed]
|
||||
};
|
||||
}
|
||||
|
||||
// ======
|
||||
|
|
|
@ -37,8 +37,8 @@ export default class Rules extends Command {
|
|||
rules.forEach(rule => {
|
||||
const embed = new PublicEmbed(context, rule.title || "", rule.description?.join("\n") || "");
|
||||
|
||||
embed.setImage(rule.image || "");
|
||||
embed.setFooter({ text: rule.footer || "" });
|
||||
embed.SetImage(rule.image || "");
|
||||
embed.SetFooter(rule.footer || "");
|
||||
|
||||
embeds.push(embed);
|
||||
});
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
import ErrorMessages from "../constants/ErrorMessages";
|
||||
import { ICommandContext } from "../contracts/ICommandContext";
|
||||
import ICommandReturnContext from "../contracts/ICommandReturnContext";
|
||||
import ErrorEmbed from "../helpers/embeds/ErrorEmbed";
|
||||
import LogEmbed from "../helpers/embeds/LogEmbed";
|
||||
import PublicEmbed from "../helpers/embeds/PublicEmbed";
|
||||
|
@ -16,17 +15,14 @@ export default class Unmute extends Command {
|
|||
];
|
||||
}
|
||||
|
||||
public override async execute(context: ICommandContext): Promise<ICommandReturnContext> {
|
||||
public override async execute(context: ICommandContext) {
|
||||
const targetUser = context.message.mentions.users.first();
|
||||
|
||||
if (!targetUser) {
|
||||
const embed = new ErrorEmbed(context, "User does not exist");
|
||||
await embed.SendToCurrentChannel();
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [embed]
|
||||
};
|
||||
return;
|
||||
}
|
||||
|
||||
const targetMember = context.message.guild?.members.cache.find(x => x.user.id == targetUser.id);
|
||||
|
@ -35,10 +31,7 @@ export default class Unmute extends Command {
|
|||
const embed = new ErrorEmbed(context, "User is not in this server");
|
||||
await embed.SendToCurrentChannel();
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [embed]
|
||||
};
|
||||
return;
|
||||
}
|
||||
|
||||
const reasonArgs = context.args;
|
||||
|
@ -46,21 +39,13 @@ export default class Unmute extends Command {
|
|||
|
||||
const reason = reasonArgs.join(" ");
|
||||
|
||||
if (!context.message.guild?.available) {
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: []
|
||||
};
|
||||
}
|
||||
if (!context.message.guild?.available) return;
|
||||
|
||||
if (!targetMember.manageable) {
|
||||
const embed = new ErrorEmbed(context, ErrorMessages.InsufficientBotPermissions);
|
||||
await embed.SendToCurrentChannel();
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [embed]
|
||||
};
|
||||
return;
|
||||
}
|
||||
|
||||
const logEmbed = new LogEmbed(context, "Member Unmuted");
|
||||
|
@ -77,20 +62,12 @@ export default class Unmute extends Command {
|
|||
const embed = new ErrorEmbed(context, ErrorMessages.RoleNotFound);
|
||||
await embed.SendToCurrentChannel();
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [embed]
|
||||
};
|
||||
return;
|
||||
}
|
||||
|
||||
await targetMember.roles.remove(mutedRole, `Moderator: ${context.message.author.tag}, Reason: ${reason || "*none*"}`);
|
||||
|
||||
await logEmbed.SendToModLogsChannel();
|
||||
await publicEmbed.SendToCurrentChannel();
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [logEmbed, publicEmbed]
|
||||
};
|
||||
}
|
||||
}
|
|
@ -1,6 +1,5 @@
|
|||
import { AuditType } from "../constants/AuditType";
|
||||
import { ICommandContext } from "../contracts/ICommandContext";
|
||||
import ICommandReturnContext from "../contracts/ICommandReturnContext";
|
||||
import Audit from "../entity/Audit";
|
||||
import ErrorEmbed from "../helpers/embeds/ErrorEmbed";
|
||||
import LogEmbed from "../helpers/embeds/LogEmbed";
|
||||
|
@ -17,17 +16,14 @@ export default class Warn extends Command {
|
|||
];
|
||||
}
|
||||
|
||||
public override async execute(context: ICommandContext): Promise<ICommandReturnContext> {
|
||||
public override async execute(context: ICommandContext) {
|
||||
const user = context.message.mentions.users.first();
|
||||
|
||||
if (!user) {
|
||||
const errorEmbed = new ErrorEmbed(context, "User does not exist");
|
||||
await errorEmbed.SendToCurrentChannel();
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [errorEmbed]
|
||||
};
|
||||
return;
|
||||
}
|
||||
|
||||
const member = context.message.guild?.members.cache.find(x => x.user.id == user.id);
|
||||
|
@ -36,10 +32,7 @@ export default class Warn extends Command {
|
|||
const errorEmbed = new ErrorEmbed(context, "User is not in this server");
|
||||
await errorEmbed.SendToCurrentChannel();
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [errorEmbed]
|
||||
};
|
||||
return;
|
||||
}
|
||||
|
||||
const reasonArgs = context.args;
|
||||
|
@ -47,12 +40,7 @@ export default class Warn extends Command {
|
|||
|
||||
const reason = reasonArgs.join(" ");
|
||||
|
||||
if (!context.message.guild?.available) {
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: []
|
||||
};
|
||||
}
|
||||
if (!context.message.guild?.available) return;
|
||||
|
||||
const logEmbed = new LogEmbed(context, "Member Warned");
|
||||
logEmbed.AddUser("User", user, true);
|
||||
|
@ -70,10 +58,5 @@ export default class Warn extends Command {
|
|||
|
||||
await audit.Save(Audit, audit);
|
||||
}
|
||||
|
||||
return {
|
||||
commandContext: context,
|
||||
embeds: [logEmbed, publicEmbed]
|
||||
};
|
||||
}
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
import { MessageEmbed } from "discord.js";
|
||||
import { ICommandContext } from "./ICommandContext";
|
||||
|
||||
export default interface ICommandReturnContext {
|
||||
commandContext: ICommandContext,
|
||||
embeds: MessageEmbed[]
|
||||
}
|
|
@ -1,6 +0,0 @@
|
|||
import { MessageEmbed } from "discord.js";
|
||||
import { ICommandContext } from "./ICommandContext";
|
||||
|
||||
export default interface ICommandReturnContext {
|
||||
embeds: MessageEmbed[]
|
||||
}
|
|
@ -17,8 +17,8 @@ export default class MemberEvents extends Event {
|
|||
|
||||
const embed = new EventEmbed(member.client, member.guild, "Member Joined");
|
||||
embed.AddUser("User", member.user, true);
|
||||
embed.addField("Created", member.user.createdAt.toISOString());
|
||||
embed.setFooter({ text: `Id: ${member.user.id}` });
|
||||
embed.AddField("Created", member.user.createdAt.toISOString());
|
||||
embed.SetFooter(`Id: ${member.user.id}`);
|
||||
|
||||
const channel = await SettingsHelper.GetSetting("event.member.add.channel", member.guild.id);
|
||||
if (!channel || !member.guild.channels.cache.find(x => x.name == channel)) return;
|
||||
|
@ -34,8 +34,8 @@ export default class MemberEvents extends Event {
|
|||
|
||||
const embed = new EventEmbed(member.client, member.guild, "Member Left");
|
||||
embed.AddUser("User", member.user, true);
|
||||
embed.addField("Joined", member.joinedAt?.toISOString() || "n/a");
|
||||
embed.setFooter({ text: `Id: ${member.user.id}` });
|
||||
embed.AddField("Joined", member.joinedAt?.toISOString() || "n/a");
|
||||
embed.SetFooter(`Id: ${member.user.id}`);
|
||||
|
||||
const channel = await SettingsHelper.GetSetting("event.member.remove.channel", member.guild.id);
|
||||
if (!channel || !member.guild.channels.cache.find(x => x.name == channel)) return;
|
||||
|
|
|
@ -20,9 +20,9 @@ export default class GuildMemberUpdate {
|
|||
|
||||
const embed = new EventEmbed(this.oldMember.client, this.newMember.guild, "Nickname Changed");
|
||||
embed.AddUser("User", this.newMember.user, true);
|
||||
embed.addField("Before", oldNickname, true);
|
||||
embed.addField("After", newNickname, true);
|
||||
embed.setFooter({ text: `Id: ${this.newMember.user.id}` });
|
||||
embed.AddField("Before", oldNickname, true);
|
||||
embed.AddField("After", newNickname, true);
|
||||
embed.SetFooter(`Id: ${this.newMember.user.id}`);
|
||||
|
||||
const channel = await SettingsHelper.GetSetting("event.member.update.channel", this.newMember.guild.id);
|
||||
if (!channel || channel.toLowerCase() != "true") return;
|
||||
|
|
|
@ -22,11 +22,11 @@ export default class MessageEvents extends Event {
|
|||
|
||||
const embed = new EventEmbed(message.client, message.guild, "Message Deleted");
|
||||
embed.AddUser("User", message.author, true);
|
||||
embed.addField("Channel", message.channel.toString(), true);
|
||||
embed.addField("Content", `\`\`\`${message.content || "*none*"}\`\`\``);
|
||||
embed.AddField("Channel", message.channel.toString(), true);
|
||||
embed.AddField("Content", `\`\`\`${message.content || "*none*"}\`\`\``);
|
||||
|
||||
if (message.attachments.size > 0) {
|
||||
embed.addField("Attachments", `\`\`\`${message.attachments.map(x => x.url).join("\n")}\`\`\``);
|
||||
embed.AddField("Attachments", `\`\`\`${message.attachments.map(x => x.url).join("\n")}\`\`\``);
|
||||
}
|
||||
|
||||
const channel = await SettingsHelper.GetSetting("event.message.delete.channel", message.guild.id);
|
||||
|
@ -48,9 +48,9 @@ export default class MessageEvents extends Event {
|
|||
|
||||
const embed = new EventEmbed(newMessage.client, newMessage.guild, "Message Edited");
|
||||
embed.AddUser("User", newMessage.author, true);
|
||||
embed.addField("Channel", newMessage.channel.toString(), true);
|
||||
embed.addField("Before", `\`\`\`${oldMessage.content || "*none*"}\`\`\``);
|
||||
embed.addField("After", `\`\`\`${newMessage.content || "*none*"}\`\`\``);
|
||||
embed.AddField("Channel", newMessage.channel.toString(), true);
|
||||
embed.AddField("Before", `\`\`\`${oldMessage.content || "*none*"}\`\`\``);
|
||||
embed.AddField("After", `\`\`\`${newMessage.content || "*none*"}\`\`\``);
|
||||
|
||||
const channel = await SettingsHelper.GetSetting("event.message.update.channel", newMessage.guild.id);
|
||||
if (!channel || !newMessage.guild.channels.cache.find(x => x.name == channel)) return;
|
||||
|
|
|
@ -1,19 +1,46 @@
|
|||
import { MessageEmbed, Permissions, TextChannel } from "discord.js";
|
||||
import { EmbedBuilder, Message, PermissionsBitField, TextChannel } from "discord.js";
|
||||
import { ICommandContext } from "../../contracts/ICommandContext";
|
||||
|
||||
export default class ErrorEmbed extends MessageEmbed {
|
||||
export default class ErrorEmbed {
|
||||
public context: ICommandContext;
|
||||
|
||||
private _embedBuilder: EmbedBuilder;
|
||||
|
||||
constructor(context: ICommandContext, message: string) {
|
||||
super();
|
||||
|
||||
super.setColor(0xd52803);
|
||||
super.setDescription(message);
|
||||
this._embedBuilder = new EmbedBuilder()
|
||||
.setColor(0xd52803)
|
||||
.setDescription(message);
|
||||
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
public async SendToCurrentChannel() {
|
||||
// Detail Methods
|
||||
public AddField(name: string, value: string, inline: boolean = false) {
|
||||
this._embedBuilder.addFields([
|
||||
{
|
||||
name,
|
||||
value,
|
||||
inline
|
||||
}
|
||||
])
|
||||
}
|
||||
|
||||
public SetFooter(text: string) {
|
||||
this._embedBuilder.setFooter({
|
||||
text
|
||||
});
|
||||
}
|
||||
|
||||
public SetImage(imageUrl: string) {
|
||||
this._embedBuilder.setImage(imageUrl);
|
||||
}
|
||||
|
||||
public SetURL(url: string) {
|
||||
this._embedBuilder.setURL(url);
|
||||
}
|
||||
|
||||
// Send Methods
|
||||
public async SendToCurrentChannel(): Promise<Message | undefined> {
|
||||
const channel = this.context.message.channel as TextChannel;
|
||||
const botMember = await this.context.message.guild?.members.fetch({ user: this.context.message.client.user! });
|
||||
|
||||
|
@ -21,8 +48,8 @@ export default class ErrorEmbed extends MessageEmbed {
|
|||
|
||||
const permissions = channel.permissionsFor(botMember);
|
||||
|
||||
if (!permissions.has(Permissions.FLAGS.SEND_MESSAGES)) return;
|
||||
if (!permissions.has(PermissionsBitField.Flags.SendMessages)) return;
|
||||
|
||||
this.context.message.channel.send({ embeds: [ this ]});
|
||||
return this.context.message.channel.send({ embeds: [ this._embedBuilder ]});
|
||||
}
|
||||
}
|
|
@ -1,37 +1,71 @@
|
|||
import { MessageEmbed, TextChannel, User, Guild, Client, Permissions } from "discord.js";
|
||||
import { ICommandContext } from "../../contracts/ICommandContext";
|
||||
import { EmbedBuilder, TextChannel, User, Guild, Client, PermissionsBitField, Message } from "discord.js";
|
||||
import SettingsHelper from "../SettingsHelper";
|
||||
|
||||
export default class EventEmbed extends MessageEmbed {
|
||||
export default class EventEmbed {
|
||||
public guild: Guild;
|
||||
|
||||
|
||||
private client: Client;
|
||||
private _embedBuilder: EmbedBuilder;
|
||||
|
||||
constructor(client: Client, guild: Guild, title: string) {
|
||||
super();
|
||||
|
||||
super.setColor(0x3050ba);
|
||||
super.setTitle(title);
|
||||
this._embedBuilder = new EmbedBuilder()
|
||||
.setColor(0x3050ba)
|
||||
.setTitle(title);
|
||||
|
||||
this.guild = guild;
|
||||
this.client = client;
|
||||
}
|
||||
|
||||
// Detail methods
|
||||
public AddField(name: string, value: string, inline: boolean = false) {
|
||||
this._embedBuilder.addFields([
|
||||
{
|
||||
name,
|
||||
value,
|
||||
inline
|
||||
}
|
||||
])
|
||||
}
|
||||
|
||||
public SetFooter(text: string) {
|
||||
this._embedBuilder.setFooter({
|
||||
text
|
||||
});
|
||||
}
|
||||
|
||||
public SetImage(imageUrl: string) {
|
||||
this._embedBuilder.setImage(imageUrl);
|
||||
}
|
||||
|
||||
public AddUser(title: string, user: User, setThumbnail: boolean = false) {
|
||||
this.addField(title, `${user} \`${user.tag}\``, true);
|
||||
this._embedBuilder.addFields([
|
||||
{
|
||||
name: title,
|
||||
value: `${user} \`${user.tag}\``,
|
||||
inline: true,
|
||||
}
|
||||
])
|
||||
|
||||
if (setThumbnail) {
|
||||
this.setThumbnail(user.displayAvatarURL());
|
||||
this._embedBuilder.setThumbnail(user.displayAvatarURL());
|
||||
}
|
||||
}
|
||||
|
||||
public AddReason(message: string) {
|
||||
this.addField("Reason", message || "*none*");
|
||||
this._embedBuilder.addFields([
|
||||
{
|
||||
name: "Reason",
|
||||
value: message || "*none*",
|
||||
}
|
||||
])
|
||||
}
|
||||
|
||||
public SetURL(url: string) {
|
||||
this._embedBuilder.setURL(url);
|
||||
}
|
||||
|
||||
// Send methods
|
||||
public async SendToChannel(name: string) {
|
||||
public async SendToChannel(name: string): Promise<Message | undefined> {
|
||||
const channel = this.guild.channels.cache
|
||||
.find(channel => channel.name == name) as TextChannel;
|
||||
|
||||
|
@ -46,38 +80,38 @@ export default class EventEmbed extends MessageEmbed {
|
|||
|
||||
const permissions = channel.permissionsFor(botMember);
|
||||
|
||||
if (!permissions.has(Permissions.FLAGS.SEND_MESSAGES)) return;
|
||||
if (!permissions.has(PermissionsBitField.Flags.SendMessages)) return;
|
||||
|
||||
channel.send({embeds: [ this ]});
|
||||
return channel.send({embeds: [ this._embedBuilder ]});
|
||||
}
|
||||
|
||||
public async SendToMessageLogsChannel() {
|
||||
public async SendToMessageLogsChannel(): Promise<Message | undefined> {
|
||||
const channelName = await SettingsHelper.GetSetting("channels.logs.message", this.guild.id);
|
||||
|
||||
if (!channelName) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.SendToChannel(channelName);
|
||||
return this.SendToChannel(channelName);
|
||||
}
|
||||
|
||||
public async SendToMemberLogsChannel() {
|
||||
public async SendToMemberLogsChannel(): Promise<Message | undefined> {
|
||||
const channelName = await SettingsHelper.GetSetting("channels.logs.member", this.guild.id);
|
||||
|
||||
if (!channelName) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.SendToChannel(channelName);
|
||||
return this.SendToChannel(channelName);
|
||||
}
|
||||
|
||||
public async SendToModLogsChannel() {
|
||||
public async SendToModLogsChannel(): Promise<Message | undefined> {
|
||||
const channelName = await SettingsHelper.GetSetting("channels.logs.mod", this.guild.id);
|
||||
|
||||
if (!channelName) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.SendToChannel(channelName);
|
||||
return this.SendToChannel(channelName);
|
||||
}
|
||||
}
|
|
@ -1,36 +1,72 @@
|
|||
import { MessageEmbed, Permissions, TextChannel, User } from "discord.js";
|
||||
import { TextChannel, User, EmbedBuilder, PermissionsBitField, Message } from "discord.js";
|
||||
import ErrorMessages from "../../constants/ErrorMessages";
|
||||
import { ICommandContext } from "../../contracts/ICommandContext";
|
||||
import SettingsHelper from "../SettingsHelper";
|
||||
import ErrorEmbed from "./ErrorEmbed";
|
||||
|
||||
export default class LogEmbed extends MessageEmbed {
|
||||
export default class LogEmbed {
|
||||
public context: ICommandContext;
|
||||
|
||||
private _embedBuilder: EmbedBuilder;
|
||||
|
||||
constructor(context: ICommandContext, title: string) {
|
||||
super();
|
||||
|
||||
super.setColor(0x3050ba);
|
||||
super.setTitle(title);
|
||||
this._embedBuilder = new EmbedBuilder()
|
||||
.setColor(0x3050ba)
|
||||
.setTitle(title);
|
||||
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
// Detail methods
|
||||
public AddField(name: string, value: string, inline: boolean = false) {
|
||||
this._embedBuilder.addFields([
|
||||
{
|
||||
name,
|
||||
value,
|
||||
inline
|
||||
}
|
||||
])
|
||||
}
|
||||
|
||||
public SetFooter(text: string) {
|
||||
this._embedBuilder.setFooter({
|
||||
text
|
||||
});
|
||||
}
|
||||
|
||||
public SetImage(imageUrl: string) {
|
||||
this._embedBuilder.setImage(imageUrl);
|
||||
}
|
||||
|
||||
public AddUser(title: string, user: User, setThumbnail: boolean = false) {
|
||||
this.addField(title, `${user} \`${user.tag}\``, true);
|
||||
this._embedBuilder.addFields([
|
||||
{
|
||||
name: title,
|
||||
value: `${user} \`${user.tag}\``,
|
||||
inline: true,
|
||||
}
|
||||
]);
|
||||
|
||||
if (setThumbnail) {
|
||||
this.setThumbnail(user.displayAvatarURL());
|
||||
this._embedBuilder.setThumbnail(user.displayAvatarURL());
|
||||
}
|
||||
}
|
||||
|
||||
public AddReason(message: string) {
|
||||
this.addField("Reason", message || "*none*");
|
||||
this._embedBuilder.addFields([
|
||||
{
|
||||
name: "Reason",
|
||||
value: message || "*none*",
|
||||
}
|
||||
])
|
||||
}
|
||||
|
||||
public SetURL(url: string) {
|
||||
this._embedBuilder.setURL(url);
|
||||
}
|
||||
|
||||
// Send methods
|
||||
public async SendToCurrentChannel() {
|
||||
public async SendToCurrentChannel(): Promise<Message | undefined> {
|
||||
const channel = this.context.message.channel as TextChannel;
|
||||
const botMember = await this.context.message.guild?.members.fetch({ user: this.context.message.client.user! });
|
||||
|
||||
|
@ -38,51 +74,52 @@ export default class LogEmbed extends MessageEmbed {
|
|||
|
||||
const permissions = channel.permissionsFor(botMember);
|
||||
|
||||
if (!permissions.has(Permissions.FLAGS.SEND_MESSAGES)) return;
|
||||
if (!permissions.has(PermissionsBitField.Flags.SendMessages)) return;
|
||||
|
||||
this.context.message.channel.send({ embeds: [ this ]});
|
||||
return this.context.message.channel.send({ embeds: [ this._embedBuilder ]});
|
||||
}
|
||||
|
||||
public SendToChannel(name: string) {
|
||||
public async SendToChannel(name: string): Promise<Message | undefined> {
|
||||
const channel = this.context.message.guild?.channels.cache
|
||||
.find(channel => channel.name == name) as TextChannel;
|
||||
|
||||
if (!channel) {
|
||||
const errorEmbed = new ErrorEmbed(this.context, ErrorMessages.ChannelNotFound);
|
||||
errorEmbed.SendToCurrentChannel();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
channel.send({ embeds: [ this ]});
|
||||
return await channel.send({ embeds: [ this._embedBuilder ]});
|
||||
}
|
||||
|
||||
public async SendToMessageLogsChannel() {
|
||||
public async SendToMessageLogsChannel(): Promise<Message | undefined> {
|
||||
const channelName = await SettingsHelper.GetSetting("channels.logs.message", this.context.message.guild?.id!);
|
||||
|
||||
if (!channelName) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.SendToChannel(channelName);
|
||||
return this.SendToChannel(channelName);
|
||||
}
|
||||
|
||||
public async SendToMemberLogsChannel() {
|
||||
public async SendToMemberLogsChannel(): Promise<Message | undefined> {
|
||||
const channelName = await SettingsHelper.GetSetting("channels.logs.member", this.context.message.guild?.id!);
|
||||
|
||||
if (!channelName) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.SendToChannel(channelName);
|
||||
return this.SendToChannel(channelName);
|
||||
}
|
||||
|
||||
public async SendToModLogsChannel() {
|
||||
public async SendToModLogsChannel(): Promise<Message | undefined> {
|
||||
const channelName = await SettingsHelper.GetSetting("channels.logs.mod", this.context.message.guild?.id!);
|
||||
|
||||
if (!channelName) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.SendToChannel(channelName);
|
||||
return this.SendToChannel(channelName);
|
||||
}
|
||||
}
|
|
@ -1,26 +1,56 @@
|
|||
import { MessageEmbed, MessageOptions, Permissions, TextChannel } from "discord.js";
|
||||
import { EmbedBuilder, Message, MessageOptions, PermissionsBitField, TextChannel } from "discord.js";
|
||||
import { ICommandContext } from "../../contracts/ICommandContext";
|
||||
|
||||
export default class PublicEmbed extends MessageEmbed {
|
||||
export default class PublicEmbed {
|
||||
public context: ICommandContext;
|
||||
|
||||
private _embedBuilder: EmbedBuilder;
|
||||
|
||||
constructor(context: ICommandContext, title: string, description: string) {
|
||||
super();
|
||||
|
||||
super.setColor(0x3050ba);
|
||||
super.setTitle(title);
|
||||
super.setDescription(description);
|
||||
this._embedBuilder = new EmbedBuilder()
|
||||
.setColor(0x3050ba)
|
||||
.setTitle(title)
|
||||
.setDescription(description);
|
||||
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
// Detail methods
|
||||
public AddField(name: string, value: string, inline: boolean = false) {
|
||||
this._embedBuilder.addFields([
|
||||
{
|
||||
name,
|
||||
value,
|
||||
inline
|
||||
}
|
||||
])
|
||||
}
|
||||
|
||||
public SetFooter(text: string) {
|
||||
this._embedBuilder.setFooter({
|
||||
text
|
||||
});
|
||||
}
|
||||
|
||||
public SetImage(imageUrl: string) {
|
||||
this._embedBuilder.setImage(imageUrl);
|
||||
}
|
||||
|
||||
public AddReason(message: string) {
|
||||
this.addField("Reason", message || "*none*");
|
||||
this._embedBuilder.addFields([
|
||||
{
|
||||
name: "Reason",
|
||||
value: message || "*none*",
|
||||
}
|
||||
])
|
||||
}
|
||||
|
||||
public SetURL(url: string) {
|
||||
this._embedBuilder.setURL(url);
|
||||
}
|
||||
|
||||
// Send methods
|
||||
public async SendToCurrentChannel(options?: MessageOptions) {
|
||||
public async SendToCurrentChannel(options?: MessageOptions): Promise<Message | undefined> {
|
||||
const channel = this.context.message.channel as TextChannel;
|
||||
const botMember = await this.context.message.guild?.members.fetch({ user: this.context.message.client.user! });
|
||||
|
||||
|
@ -28,8 +58,8 @@ export default class PublicEmbed extends MessageEmbed {
|
|||
|
||||
const permissions = channel.permissionsFor(botMember);
|
||||
|
||||
if (!permissions.has(Permissions.FLAGS.SEND_MESSAGES)) return;
|
||||
if (!permissions.has(PermissionsBitField.Flags.SendMessages)) return;
|
||||
|
||||
this.context.message.channel.send({ embeds: [ this ], ...options});
|
||||
return this.context.message.channel.send({ embeds: [ this._embedBuilder ], ...options});
|
||||
}
|
||||
}
|
|
@ -1,7 +1,10 @@
|
|||
import { CommandResponse } from "../constants/CommandResponse";
|
||||
import { ICommandContext } from "../contracts/ICommandContext";
|
||||
import { SlashCommandBuilder } from "discord.js";
|
||||
|
||||
export class Command {
|
||||
public SlashCommandBuilder: SlashCommandBuilder;
|
||||
|
||||
public Roles: string[];
|
||||
public Category?: string;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { CoreClient } from "./client/client";
|
||||
import * as dotenv from "dotenv";
|
||||
import registry from "./registry";
|
||||
import { Intents } from "discord.js";
|
||||
import { IntentsBitField } from "discord.js";
|
||||
|
||||
dotenv.config();
|
||||
|
||||
|
@ -20,9 +20,10 @@ requiredConfigs.forEach(config => {
|
|||
});
|
||||
|
||||
const client = new CoreClient([
|
||||
Intents.FLAGS.GUILDS,
|
||||
Intents.FLAGS.GUILD_MESSAGES,
|
||||
Intents.FLAGS.GUILD_MEMBERS,
|
||||
IntentsBitField.Flags.Guilds,
|
||||
IntentsBitField.Flags.GuildMessages,
|
||||
IntentsBitField.Flags.GuildMembers,
|
||||
IntentsBitField.Flags.MessageContent,
|
||||
]);
|
||||
|
||||
registry.RegisterCommands();
|
||||
|
|
248
yarn.lock
248
yarn.lock
|
@ -286,21 +286,34 @@
|
|||
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
|
||||
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
|
||||
|
||||
"@discordjs/builders@^0.11.0":
|
||||
version "0.11.0"
|
||||
resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-0.11.0.tgz#4102abe3e0cd093501f3f71931df43eb92f5b0cc"
|
||||
integrity sha512-ZTB8yJdJKrKlq44dpWkNUrAtEJEq0gqpb7ASdv4vmq6/mZal5kOv312hQ56I/vxwMre+VIkoHquNUAfnTbiYtg==
|
||||
"@discordjs/builders@^1.2.0":
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-1.2.0.tgz#4f5059e258c30a26931ae384985ef8c6b371ba05"
|
||||
integrity sha512-ARy4BUTMU+S0ZI6605NDqfWO+qZqV2d/xfY32z3hVSsd9IaAKJBZ1ILTZLy87oIjW8+gUpQmk9Kt0ZP9bmmd8Q==
|
||||
dependencies:
|
||||
"@sindresorhus/is" "^4.2.0"
|
||||
discord-api-types "^0.26.0"
|
||||
ts-mixer "^6.0.0"
|
||||
tslib "^2.3.1"
|
||||
zod "^3.11.6"
|
||||
"@sapphire/shapeshift" "^3.5.1"
|
||||
discord-api-types "^0.37.3"
|
||||
fast-deep-equal "^3.1.3"
|
||||
ts-mixer "^6.0.1"
|
||||
tslib "^2.4.0"
|
||||
|
||||
"@discordjs/collection@^0.4.0":
|
||||
version "0.4.0"
|
||||
resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-0.4.0.tgz#b6488286a1cc7b41b644d7e6086f25a1c1e6f837"
|
||||
integrity sha512-zmjq+l/rV35kE6zRrwe8BHqV78JvIh2ybJeZavBi5NySjWXqN3hmmAKg7kYMMXSeiWtSsMoZ/+MQi0DiQWy2lw==
|
||||
"@discordjs/collection@^1.0.1", "@discordjs/collection@^1.1.0":
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-1.1.0.tgz#5f9f926404fd48ccde86a0d2268f202cbec77833"
|
||||
integrity sha512-PQ2Bv6pnT7aGPCKWbvvNRww5tYCGpggIQVgpuF9TdDPeR6n6vQYxezXiLVOS9z2B62Dp4c+qepQ15SgJbLYtCQ==
|
||||
|
||||
"@discordjs/rest@^1.1.0":
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@discordjs/rest/-/rest-1.1.0.tgz#5c283571a22b911ca334316245487af40baffe8b"
|
||||
integrity sha512-yCrthRTQeUyNThQEpCk7bvQJlwQmz6kU0tf3dcWBv2WX3Bncl41x7Wc+v5b5OsIxfNYq38PvVtWircu9jtYZug==
|
||||
dependencies:
|
||||
"@discordjs/collection" "^1.0.1"
|
||||
"@sapphire/async-queue" "^1.5.0"
|
||||
"@sapphire/snowflake" "^3.2.2"
|
||||
discord-api-types "^0.37.3"
|
||||
file-type "^17.1.6"
|
||||
tslib "^2.4.0"
|
||||
undici "^5.9.1"
|
||||
|
||||
"@istanbuljs/load-nyc-config@^1.0.0":
|
||||
version "1.1.0"
|
||||
|
@ -487,12 +500,25 @@
|
|||
"@types/yargs" "^16.0.0"
|
||||
chalk "^4.0.0"
|
||||
|
||||
"@sapphire/async-queue@^1.1.9":
|
||||
version "1.3.1"
|
||||
resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.3.1.tgz#9d861e626dbffae02d808e13f823d4510e450a78"
|
||||
integrity sha512-FFTlPOWZX1kDj9xCAsRzH5xEJfawg1lNoYAA+ecOWJMHOfiZYb1uXOI3ne9U4UILSEPwfE68p3T9wUHwIQfR0g==
|
||||
"@sapphire/async-queue@^1.5.0":
|
||||
version "1.5.0"
|
||||
resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.5.0.tgz#2f255a3f186635c4fb5a2381e375d3dfbc5312d8"
|
||||
integrity sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==
|
||||
|
||||
"@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.2.0":
|
||||
"@sapphire/shapeshift@^3.5.1":
|
||||
version "3.6.0"
|
||||
resolved "https://registry.yarnpkg.com/@sapphire/shapeshift/-/shapeshift-3.6.0.tgz#988ff6576162a581a29bc26deb5492f7d1bf419f"
|
||||
integrity sha512-tu2WLRdo5wotHRvsCkspg3qMiP6ETC3Q1dns1Q5V6zKUki+1itq6AbhMwohF9ZcLoYqg+Y8LkgRRtVxxTQVTBQ==
|
||||
dependencies:
|
||||
fast-deep-equal "^3.1.3"
|
||||
lodash.uniqwith "^4.5.0"
|
||||
|
||||
"@sapphire/snowflake@^3.2.2":
|
||||
version "3.2.2"
|
||||
resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.2.2.tgz#faacdc1b5f7c43145a71eddba917de2b707ef780"
|
||||
integrity sha512-ula2O0kpSZtX9rKXNeQMrHwNd7E4jPDJYUXmEGTFdMRfyfMw+FPyh04oKMjAiDuOi64bYgVkOV3MjK+loImFhQ==
|
||||
|
||||
"@sindresorhus/is@^4.0.0":
|
||||
version "4.6.0"
|
||||
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f"
|
||||
integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==
|
||||
|
@ -523,6 +549,11 @@
|
|||
dependencies:
|
||||
defer-to-connect "^2.0.0"
|
||||
|
||||
"@tokenizer/token@^0.3.0":
|
||||
version "0.3.0"
|
||||
resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276"
|
||||
integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==
|
||||
|
||||
"@tootallnate/once@1":
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
|
||||
|
@ -622,14 +653,6 @@
|
|||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/node-fetch@^2.5.12":
|
||||
version "2.6.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.1.tgz#8f127c50481db65886800ef496f20bbf15518975"
|
||||
integrity sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
form-data "^3.0.0"
|
||||
|
||||
"@types/node@*":
|
||||
version "18.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.0.tgz#67c7b724e1bcdd7a8821ce0d5ee184d3b4dd525a"
|
||||
|
@ -662,7 +685,7 @@
|
|||
resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc"
|
||||
integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==
|
||||
|
||||
"@types/ws@^8.2.2":
|
||||
"@types/ws@^8.5.3":
|
||||
version "8.5.3"
|
||||
resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d"
|
||||
integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==
|
||||
|
@ -1181,25 +1204,27 @@ diff-sequences@^27.4.0:
|
|||
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.4.0.tgz#d783920ad8d06ec718a060d00196dfef25b132a5"
|
||||
integrity sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==
|
||||
|
||||
discord-api-types@^0.26.0:
|
||||
version "0.26.1"
|
||||
resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.26.1.tgz#726f766ddc37d60da95740991d22cb6ef2ed787b"
|
||||
integrity sha512-T5PdMQ+Y1MEECYMV5wmyi9VEYPagEDEi4S0amgsszpWY0VB9JJ/hEvM6BgLhbdnKky4gfmZEXtEEtojN8ZKJQQ==
|
||||
discord-api-types@^0.37.3:
|
||||
version "0.37.9"
|
||||
resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.37.9.tgz#3ceba0f047c5239967c50b180fe9d72c55c82464"
|
||||
integrity sha512-mAJv7EcDDo6YztR3XSIED2IAHJcAlzWFD31Q2cHLURMKPb0CW0TM/r32HhAHO9uHw74N3cviOzJIZfZVB/e/5A==
|
||||
|
||||
discord.js@^13.6.0:
|
||||
version "13.6.0"
|
||||
resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.6.0.tgz#d8a8a591dbf25cbcf9c783d5ddf22c4694860475"
|
||||
integrity sha512-tXNR8zgsEPxPBvGk3AQjJ9ljIIC6/LOPjzKwpwz8Y1Q2X66Vi3ZqFgRHYwnHKC0jC0F+l4LzxlhmOJsBZDNg9g==
|
||||
discord.js@^14.3.0:
|
||||
version "14.3.0"
|
||||
resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-14.3.0.tgz#9e43df7e4d2d14b11f3de751236e983159c3d3d0"
|
||||
integrity sha512-CpIwoAAuELiHSgVKRMzsCADS6ZlJwAZ9RlvcJYdEgS00aW36dSvXyBgE+S3pigkc7G+jU6BEalMUWIJFveqrBQ==
|
||||
dependencies:
|
||||
"@discordjs/builders" "^0.11.0"
|
||||
"@discordjs/collection" "^0.4.0"
|
||||
"@sapphire/async-queue" "^1.1.9"
|
||||
"@types/node-fetch" "^2.5.12"
|
||||
"@types/ws" "^8.2.2"
|
||||
discord-api-types "^0.26.0"
|
||||
form-data "^4.0.0"
|
||||
node-fetch "^2.6.1"
|
||||
ws "^8.4.0"
|
||||
"@discordjs/builders" "^1.2.0"
|
||||
"@discordjs/collection" "^1.1.0"
|
||||
"@discordjs/rest" "^1.1.0"
|
||||
"@sapphire/snowflake" "^3.2.2"
|
||||
"@types/ws" "^8.5.3"
|
||||
discord-api-types "^0.37.3"
|
||||
fast-deep-equal "^3.1.3"
|
||||
lodash.snakecase "^4.1.1"
|
||||
tslib "^2.4.0"
|
||||
undici "^5.9.1"
|
||||
ws "^8.8.1"
|
||||
|
||||
domexception@^2.0.1:
|
||||
version "2.0.1"
|
||||
|
@ -1319,6 +1344,11 @@ expect@^27.4.2:
|
|||
jest-message-util "^27.4.2"
|
||||
jest-regex-util "^27.4.0"
|
||||
|
||||
fast-deep-equal@^3.1.3:
|
||||
version "3.1.3"
|
||||
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
|
||||
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
|
||||
|
||||
fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
|
||||
|
@ -1336,6 +1366,15 @@ fb-watchman@^2.0.0:
|
|||
dependencies:
|
||||
bser "2.1.1"
|
||||
|
||||
file-type@^17.1.6:
|
||||
version "17.1.6"
|
||||
resolved "https://registry.yarnpkg.com/file-type/-/file-type-17.1.6.tgz#18669e0577a4849ef6e73a41f8bdf1ab5ae21023"
|
||||
integrity sha512-hlDw5Ev+9e883s0pwUsuuYNu4tD7GgpUnOvykjv1Gya0ZIjuKumthDRua90VUn6/nlRKAjcxLUnHNTIUWwWIiw==
|
||||
dependencies:
|
||||
readable-web-to-node-stream "^3.0.2"
|
||||
strtok3 "^7.0.0-alpha.9"
|
||||
token-types "^5.0.0-alpha.2"
|
||||
|
||||
fill-range@^7.0.1:
|
||||
version "7.0.1"
|
||||
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
|
||||
|
@ -1360,15 +1399,6 @@ form-data@^3.0.0:
|
|||
combined-stream "^1.0.8"
|
||||
mime-types "^2.1.12"
|
||||
|
||||
form-data@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
|
||||
integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
|
||||
dependencies:
|
||||
asynckit "^0.4.0"
|
||||
combined-stream "^1.0.8"
|
||||
mime-types "^2.1.12"
|
||||
|
||||
fs.realpath@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
|
||||
|
@ -1559,7 +1589,7 @@ inflight@^1.0.4:
|
|||
once "^1.3.0"
|
||||
wrappy "1"
|
||||
|
||||
inherits@2, inherits@^2.0.1, inherits@~2.0.3:
|
||||
inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3:
|
||||
version "2.0.4"
|
||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
||||
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
||||
|
@ -2201,6 +2231,16 @@ lodash.memoize@4.x:
|
|||
resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
|
||||
integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
|
||||
|
||||
lodash.snakecase@^4.1.1:
|
||||
version "4.1.1"
|
||||
resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d"
|
||||
integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==
|
||||
|
||||
lodash.uniqwith@^4.5.0:
|
||||
version "4.5.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.uniqwith/-/lodash.uniqwith-4.5.0.tgz#7a0cbf65f43b5928625a9d4d0dc54b18cadc7ef3"
|
||||
integrity sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q==
|
||||
|
||||
lodash@^4.7.0:
|
||||
version "4.17.21"
|
||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
|
||||
|
@ -2323,13 +2363,6 @@ natural-compare@^1.4.0:
|
|||
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
|
||||
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
|
||||
|
||||
node-fetch@^2.6.1:
|
||||
version "2.6.7"
|
||||
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
|
||||
integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
|
||||
dependencies:
|
||||
whatwg-url "^5.0.0"
|
||||
|
||||
node-int64@^0.4.0:
|
||||
version "0.4.0"
|
||||
resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
|
||||
|
@ -2454,6 +2487,11 @@ path-parse@^1.0.6:
|
|||
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
|
||||
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
|
||||
|
||||
peek-readable@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-5.0.0.tgz#7ead2aff25dc40458c60347ea76cfdfd63efdfec"
|
||||
integrity sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==
|
||||
|
||||
picocolors@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
|
||||
|
@ -2553,6 +2591,22 @@ readable-stream@2.3.7:
|
|||
string_decoder "~1.1.1"
|
||||
util-deprecate "~1.0.1"
|
||||
|
||||
readable-stream@^3.6.0:
|
||||
version "3.6.0"
|
||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
|
||||
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
|
||||
dependencies:
|
||||
inherits "^2.0.3"
|
||||
string_decoder "^1.1.1"
|
||||
util-deprecate "^1.0.1"
|
||||
|
||||
readable-web-to-node-stream@^3.0.2:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz#5d52bb5df7b54861fd48d015e93a2cb87b3ee0bb"
|
||||
integrity sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==
|
||||
dependencies:
|
||||
readable-stream "^3.6.0"
|
||||
|
||||
reflect-metadata@^0.1.13:
|
||||
version "0.1.13"
|
||||
resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08"
|
||||
|
@ -2612,7 +2666,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
|
|||
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
|
||||
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
|
||||
|
||||
safe-buffer@^5.0.1:
|
||||
safe-buffer@^5.0.1, safe-buffer@~5.2.0:
|
||||
version "5.2.1"
|
||||
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
|
||||
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
|
||||
|
@ -2738,6 +2792,13 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
|
|||
is-fullwidth-code-point "^3.0.0"
|
||||
strip-ansi "^6.0.1"
|
||||
|
||||
string_decoder@^1.1.1:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
|
||||
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
|
||||
dependencies:
|
||||
safe-buffer "~5.2.0"
|
||||
|
||||
string_decoder@~1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
|
||||
|
@ -2762,6 +2823,14 @@ strip-final-newline@^2.0.0:
|
|||
resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
|
||||
integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
|
||||
|
||||
strtok3@^7.0.0-alpha.9:
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-7.0.0.tgz#868c428b4ade64a8fd8fee7364256001c1a4cbe5"
|
||||
integrity sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==
|
||||
dependencies:
|
||||
"@tokenizer/token" "^0.3.0"
|
||||
peek-readable "^5.0.0"
|
||||
|
||||
supports-color@^5.3.0:
|
||||
version "5.5.0"
|
||||
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
|
||||
|
@ -2849,6 +2918,14 @@ to-regex-range@^5.0.1:
|
|||
dependencies:
|
||||
is-number "^7.0.0"
|
||||
|
||||
token-types@^5.0.0-alpha.2:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.yarnpkg.com/token-types/-/token-types-5.0.1.tgz#aa9d9e6b23c420a675e55413b180635b86a093b4"
|
||||
integrity sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==
|
||||
dependencies:
|
||||
"@tokenizer/token" "^0.3.0"
|
||||
ieee754 "^1.2.1"
|
||||
|
||||
tough-cookie@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4"
|
||||
|
@ -2865,11 +2942,6 @@ tr46@^2.1.0:
|
|||
dependencies:
|
||||
punycode "^2.1.1"
|
||||
|
||||
tr46@~0.0.3:
|
||||
version "0.0.3"
|
||||
resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
|
||||
integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=
|
||||
|
||||
ts-essentials@^7.0.3:
|
||||
version "7.0.3"
|
||||
resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38"
|
||||
|
@ -2889,16 +2961,21 @@ ts-jest@^27.1.2:
|
|||
semver "7.x"
|
||||
yargs-parser "20.x"
|
||||
|
||||
ts-mixer@^6.0.0:
|
||||
ts-mixer@^6.0.1:
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.1.tgz#7c2627fb98047eb5f3c7f2fee39d1521d18fe87a"
|
||||
integrity sha512-hvE+ZYXuINrx6Ei6D6hz+PTim0Uf++dYbK9FFifLNwQj+RwKquhQpn868yZsCtJYiclZF1u8l6WZxxKi+vv7Rg==
|
||||
|
||||
tslib@^2.1.0, tslib@^2.3.1:
|
||||
tslib@^2.1.0:
|
||||
version "2.3.1"
|
||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
|
||||
integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
|
||||
|
||||
tslib@^2.4.0:
|
||||
version "2.4.0"
|
||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
|
||||
integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==
|
||||
|
||||
type-check@~0.3.2:
|
||||
version "0.3.2"
|
||||
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
|
||||
|
@ -2951,12 +3028,17 @@ typescript@^4.5.2:
|
|||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.2.tgz#8ac1fba9f52256fdb06fb89e4122fa6a346c2998"
|
||||
integrity sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==
|
||||
|
||||
undici@^5.9.1:
|
||||
version "5.10.0"
|
||||
resolved "https://registry.yarnpkg.com/undici/-/undici-5.10.0.tgz#dd9391087a90ccfbd007568db458674232ebf014"
|
||||
integrity sha512-c8HsD3IbwmjjbLvoZuRI26TZic+TSEe8FPMLLOkN1AfYRhdjnKBU6yL+IwcSCbdZiX4e5t0lfMDLDCqj4Sq70g==
|
||||
|
||||
universalify@^0.1.2:
|
||||
version "0.1.2"
|
||||
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
|
||||
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
|
||||
|
||||
util-deprecate@~1.0.1:
|
||||
util-deprecate@^1.0.1, util-deprecate@~1.0.1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
||||
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
|
||||
|
@ -2996,11 +3078,6 @@ walker@^1.0.7:
|
|||
dependencies:
|
||||
makeerror "1.0.12"
|
||||
|
||||
webidl-conversions@^3.0.0:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
|
||||
integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=
|
||||
|
||||
webidl-conversions@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff"
|
||||
|
@ -3023,14 +3100,6 @@ whatwg-mimetype@^2.3.0:
|
|||
resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
|
||||
integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
|
||||
|
||||
whatwg-url@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
|
||||
integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0=
|
||||
dependencies:
|
||||
tr46 "~0.0.3"
|
||||
webidl-conversions "^3.0.0"
|
||||
|
||||
whatwg-url@^8.0.0, whatwg-url@^8.5.0:
|
||||
version "8.7.0"
|
||||
resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77"
|
||||
|
@ -3081,10 +3150,10 @@ ws@^7.4.6:
|
|||
resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b"
|
||||
integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==
|
||||
|
||||
ws@^8.4.0:
|
||||
version "8.5.0"
|
||||
resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f"
|
||||
integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==
|
||||
ws@^8.8.1:
|
||||
version "8.8.1"
|
||||
resolved "https://registry.yarnpkg.com/ws/-/ws-8.8.1.tgz#5dbad0feb7ade8ecc99b830c1d77c913d4955ff0"
|
||||
integrity sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==
|
||||
|
||||
xml-name-validator@^3.0.0:
|
||||
version "3.0.0"
|
||||
|
@ -3167,8 +3236,3 @@ zen-observable@0.8.15:
|
|||
version "0.8.15"
|
||||
resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15"
|
||||
integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==
|
||||
|
||||
zod@^3.11.6:
|
||||
version "3.14.4"
|
||||
resolved "https://registry.yarnpkg.com/zod/-/zod-3.14.4.tgz#e678fe9e5469f4663165a5c35c8f3dc66334a5d6"
|
||||
integrity sha512-U9BFLb2GO34Sfo9IUYp0w3wJLlmcyGoMd75qU9yf+DrdGA4kEx6e+l9KOkAlyUO0PSQzZCa3TR4qVlcmwqSDuw==
|
||||
|
|
Loading…
Reference in a new issue