v3.0 (#145)
* Change rules.txt to rules.json (#31) * Migrate to yarn * Add role configs to config template * Install packges and setup typescript * Migrate entry point * Migrate about command * Migrate ban command * Migrate clear command * Migrate kick command * Migrate mute command * Migrate poll command * Migrate bunny command * Update required roles checker * Migrate role command * Migrate unmute command * Migrate warn command * Migrate eval command * Migrate help command * Migrate rules command * Migrate events to typescript * Update about command to use the PublicEmbed class * Update ErrorMessage to ChannelNotFound * Update messageDelete event to ignore bots * Feature/74 merge vylbot core (#80) * Merge VylBot-Core * Update commands to new system * Fix issue where events would not load * Feature/12 create tests (#102) * Fix tests * Update coverage * Remove unrequired mock files * Add about command test * Update about tests * Ban command tests * eval command tests * Start help command tests * Add help command tests * Add kick command tests * Mute command tests * Poll command tests * Add role command tests Signed-off-by: Ethan Lane <ethan@vylpes.com> * Add rules command tests * Add unmute command tests * Add warn command tests * Add MemberEvents tests * Add GuildMemberUpdate tests Signed-off-by: Ethan Lane <ethan@vylpes.com> * Add MessageEvents tests * Add StringTools test Signed-off-by: Ethan Lane <ethan@vylpes.com> * Add embed tests Signed-off-by: Ethan Lane <ethan@vylpes.com> * Add GitHub Actions Signed-off-by: Ethan Lane <ethan@vylpes.com> * Move to tslint Signed-off-by: Ethan Lane <ethan@vylpes.com> * Remove tslint Signed-off-by: Ethan Lane <ethan@vylpes.com> * Remove linting script Signed-off-by: Ethan Lane <ethan@vylpes.com> * Update rules with blog website and event spoilers rule" (#106) Signed-off-by: Ethan Lane <ethan@vylpes.com> * Containerise bot (#107) * Add moderator names to audit reason (#108) * Feature/48 database (#114) * Add database and default values * Add ability to save a setting to the database * Get commands and events to use database * Setup and config command * Update commands to check roles per server * Different rules per server Signed-off-by: Ethan Lane <ethan@vylpes.com> * Different prefix per server Signed-off-by: Ethan Lane <ethan@vylpes.com> * Add verification system Signed-off-by: Ethan Lane <ethan@vylpes.com> * Disabled commands per server * Add devmode for default prefix * Update embeds * Fix broken tests * Feature/66 add different commands per server (#122) * Add ability for server exclusive commands * Add MankBot server-exclusive commands * Add lobby entity to database * Add documentation * Add setup command for lobby (#123) * Update bot to discord.js v13 (#125) * Update bot to discord.js v13 * Remove debug code * 110 commandshelp about command errors which causes command to not run (#126) * Change onMessage to onMessageCreate * Fix help command * Add override for bot owner and server owner (#135) * Change help command so exclusive commands can only be seen for the server they're assigned to (#136) * Change parsing to not crash if invalid (#142) * 137 role command cannot read properties of undefined (#141) * Fix issue with bot crashing * Fix server prefix not showing * Add easy way to configure role command * Move help text to its own directory * Make role config command to use role id * Get lobby command to use IDs instead of names (#144) Co-authored-by: Vylpes <getgravitysoftware@gmail.com>
This commit is contained in:
parent
1168898e57
commit
04a4a6204c
118 changed files with 13966 additions and 4027 deletions
25
src/commands/501231711271780357/entry.ts
Normal file
25
src/commands/501231711271780357/entry.ts
Normal file
|
@ -0,0 +1,25 @@
|
|||
import { ICommandContext } from "../../contracts/ICommandContext";
|
||||
import PublicEmbed from "../../helpers/embeds/PublicEmbed";
|
||||
import SettingsHelper from "../../helpers/SettingsHelper";
|
||||
import { Command } from "../../type/command";
|
||||
|
||||
export default class Entry extends Command {
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
super.Category = "Moderation";
|
||||
super.Roles = [
|
||||
"moderator"
|
||||
];
|
||||
}
|
||||
|
||||
public override async execute(context: ICommandContext) {
|
||||
if (!context.message.guild) return;
|
||||
|
||||
const rulesChannelId = await SettingsHelper.GetSetting("channels.rules", context.message.guild.id) || "rules";
|
||||
|
||||
const embedInfo = new PublicEmbed(context, "", `Welcome to the server! Please make sure to read the rules in the <#${rulesChannelId}> channel and type the code found there in here to proceed to the main part of the server.`);
|
||||
|
||||
embedInfo.SendToCurrentChannel();
|
||||
}
|
||||
}
|
143
src/commands/501231711271780357/lobby.ts
Normal file
143
src/commands/501231711271780357/lobby.ts
Normal file
|
@ -0,0 +1,143 @@
|
|||
import { TextChannel } from "discord.js";
|
||||
import { ICommandContext } from "../../contracts/ICommandContext";
|
||||
import { Command } from "../../type/command";
|
||||
import { default as eLobby } from "../../entity/501231711271780357/Lobby";
|
||||
import SettingsHelper from "../../helpers/SettingsHelper";
|
||||
import PublicEmbed from "../../helpers/embeds/PublicEmbed";
|
||||
import { readFileSync } from "fs";
|
||||
import ErrorEmbed from "../../helpers/embeds/ErrorEmbed";
|
||||
import BaseEntity from "../../contracts/BaseEntity";
|
||||
|
||||
export default class Lobby extends Command {
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
super.Category = "General";
|
||||
}
|
||||
|
||||
public override async execute(context: ICommandContext) {
|
||||
if (!context.message.guild) return;
|
||||
|
||||
switch (context.args[0]) {
|
||||
case "config":
|
||||
await this.UseConfig(context);
|
||||
break;
|
||||
default:
|
||||
await this.UseDefault(context);
|
||||
}
|
||||
}
|
||||
|
||||
// =======
|
||||
// Default
|
||||
// =======
|
||||
|
||||
private async UseDefault(context: ICommandContext) {
|
||||
const channel = context.message.channel as TextChannel;
|
||||
const channelId = channel.id;
|
||||
|
||||
const lobby = await eLobby.FetchOneByChannelId(channelId);
|
||||
|
||||
if (!lobby) {
|
||||
this.SendDisabled(context);
|
||||
return;
|
||||
}
|
||||
|
||||
const timeNow = Date.now();
|
||||
const timeLength = lobby.Cooldown * 60 * 1000; // x minutes in ms
|
||||
const timeAgo = timeNow - timeLength;
|
||||
|
||||
// If it was less than x minutes ago
|
||||
if (lobby.LastUsed.getTime() > timeAgo) {
|
||||
this.SendOnCooldown(context, timeLength, new Date(timeNow), lobby.LastUsed);
|
||||
return;
|
||||
}
|
||||
|
||||
await this.RequestLobby(context, lobby);
|
||||
}
|
||||
|
||||
private async RequestLobby(context: ICommandContext, lobby: eLobby) {
|
||||
lobby.MarkAsUsed();
|
||||
await lobby.Save(eLobby, lobby);
|
||||
|
||||
context.message.channel.send(`${context.message.author} would like to organise a lobby of **${lobby.Name}**! <@&${lobby.RoleId}>`);
|
||||
}
|
||||
|
||||
private SendOnCooldown(context: ICommandContext, timeLength: number, timeNow: Date, timeUsed: Date) {
|
||||
const timeLeft = Math.ceil((timeLength - (timeNow.getTime() - timeUsed.getTime())) / 1000 / 60);
|
||||
|
||||
context.message.reply(`Requesting a lobby for this game is on cooldown! Please try again in **${timeLeft} minutes**.`);
|
||||
}
|
||||
|
||||
private SendDisabled(context: ICommandContext) {
|
||||
context.message.reply("This channel hasn't been setup for lobbies.");
|
||||
}
|
||||
|
||||
// ======
|
||||
// Config
|
||||
// ======
|
||||
private async UseConfig(context: ICommandContext) {
|
||||
const moderatorRole = await SettingsHelper.GetSetting("role.moderator", context.message.guild!.id);
|
||||
|
||||
if (!context.message.member?.roles.cache.find(x => x.name == moderatorRole)) {
|
||||
const errorEmbed = new ErrorEmbed(context, "Sorry, you must be a moderator to be able to configure this command");
|
||||
errorEmbed.SendToCurrentChannel();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
switch (context.args[1]) {
|
||||
case "add":
|
||||
await this.AddLobbyConfig(context);
|
||||
break;
|
||||
case "remove":
|
||||
await this.RemoveLobbyConfig(context);
|
||||
break;
|
||||
case "help":
|
||||
default:
|
||||
this.SendConfigHelp(context);
|
||||
}
|
||||
}
|
||||
|
||||
private SendConfigHelp(context: ICommandContext) {
|
||||
const helpText = readFileSync(`${process.cwd()}/data/usage/lobby.txt`).toString();
|
||||
|
||||
const embed = new PublicEmbed(context, "Configure Lobby Command", helpText);
|
||||
embed.SendToCurrentChannel();
|
||||
}
|
||||
|
||||
private async AddLobbyConfig(context: ICommandContext) {
|
||||
const channel = context.message.guild!.channels.cache.find(x => x.id == context.args[2]);
|
||||
const role = context.message.guild!.roles.cache.find(x => x.id == context.args[3]);
|
||||
const cooldown = Number(context.args[4]) || 30;
|
||||
const gameName = context.args.splice(5).join(" ");
|
||||
|
||||
if (!channel || !role) {
|
||||
this.SendConfigHelp(context);
|
||||
return;
|
||||
}
|
||||
|
||||
const entity = new eLobby(channel.id, role.id, cooldown, gameName);
|
||||
await entity.Save(eLobby, entity);
|
||||
|
||||
const embed = new PublicEmbed(context, "", `Added \`${channel.name}\` as a new lobby channel with a cooldown of \`${cooldown} minutes\` and will ping \`${role.name}\` on use`);
|
||||
embed.SendToCurrentChannel();
|
||||
}
|
||||
|
||||
private async RemoveLobbyConfig(context: ICommandContext) {
|
||||
const channel = context.message.guild!.channels.cache.find(x => x.id == context.args[2]);
|
||||
|
||||
if (!channel) {
|
||||
this.SendConfigHelp(context);
|
||||
return;
|
||||
}
|
||||
|
||||
const entity = await eLobby.FetchOneByChannelId(channel.id);
|
||||
|
||||
if (entity) {
|
||||
await BaseEntity.Remove<eLobby>(eLobby, entity);
|
||||
}
|
||||
|
||||
const embed = new PublicEmbed(context, "", `Removed \`${channel.name}\` from the list of lobby channels`);
|
||||
embed.SendToCurrentChannel();
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue