From 1cc4982e91854eda5ccd4fab5e5e8949183ffd00 Mon Sep 17 00:00:00 2001 From: Miqhtie Date: Wed, 10 Feb 2021 14:00:58 -0500 Subject: [PATCH 1/2] global settings --- .gitignore | 3 ++- package.json | 2 ++ src/structures/Client.ts | 7 +++++- src/utils/settings/Settings.ts | 35 +++++++++++++++++++++++++++++ yarn.lock | 41 ++++++++++++++++++++++++++++++++++ 5 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 src/utils/settings/Settings.ts diff --git a/.gitignore b/.gitignore index 8cd2ca9..b7603b7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .env node_modules build -logs \ No newline at end of file +logs +settings.json \ No newline at end of file diff --git a/package.json b/package.json index ff97a17..764a6d0 100644 --- a/package.json +++ b/package.json @@ -7,9 +7,11 @@ "start:dev": "ts-node src/bot.ts" }, "dependencies": { + "@types/fs-extra": "^9.0.6", "axios": "^0.21.1", "discord.js": "^12.5.1", "dotenv": "^8.2.0", + "fs-extra": "^9.1.0", "mongoose": "^5.11.6", "winston": "^3.3.3" }, diff --git a/src/structures/Client.ts b/src/structures/Client.ts index e3be1a0..d88edf9 100644 --- a/src/structures/Client.ts +++ b/src/structures/Client.ts @@ -4,6 +4,7 @@ import { promisify } from "util"; import Discord from "discord.js"; import Database from "../utils/database/Database"; import logger from "../utils/logger/Logger"; +import { ISettings, getSettings } from "../utils/settings/Settings" const readdir = promisify(fs.readdir); @@ -12,6 +13,7 @@ export default class Client extends Discord.Client { version = "2.12.1"; commands = new Discord.Collection(); aliases = new Discord.Collection(); + settings: ISettings | undefined; constructor() { super({ @@ -19,8 +21,11 @@ export default class Client extends Discord.Client { partials: ["GUILD_MEMBER", "USER", "MESSAGE", "REACTION", "CHANNEL"], }); - logger.verbose("t"); + Database.initialize(`mongodb+srv://${process.env.MONGO_USERNAME}:${process.env.MONGO_PASSWORD}@${process.env.MONGO_HOST}/${process.env.MONGO_DBNAME}?retryWrites=true&w=majority`, this); + getSettings().then((settings) => { + this.settings = settings; + }); } async loadEvents(eventsDir: string) { diff --git a/src/utils/settings/Settings.ts b/src/utils/settings/Settings.ts new file mode 100644 index 0000000..b958927 --- /dev/null +++ b/src/utils/settings/Settings.ts @@ -0,0 +1,35 @@ +import fs from "fs-extra"; +import logger from "../logger/Logger"; + +export interface ISettings { + test: string; +} + +export const defaultSettings: ISettings = { + test: "a" +} + +const settingsPath = "./settings.json"; + +export async function getSettings(): Promise { + return new Promise((resolve, reject) => { + fs.readJson(settingsPath) + .then((settings: any) => { + resolve(Object.assign(settings, defaultSettings)); + }) + .catch(() => { + logger.warn("No settings file provided, using default settings!"); + resolve(defaultSettings); + }); + }) +} + +export function saveSettings(settings: ISettings) { + fs.writeJson(settingsPath, settings) + .then(() => { + logger.info(`Saved settings ${JSON.stringify(settings)}`); + }) + .catch((err) => { + logger.error(`Error saving settings ${JSON.stringify(err)}`); + }); +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index eddb8ce..3e4c357 100644 --- a/yarn.lock +++ b/yarn.lock @@ -32,6 +32,13 @@ dependencies: "@types/node" "*" +"@types/fs-extra@^9.0.6": + version "9.0.6" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.6.tgz#488e56b77299899a608b8269719c1d133027a6ab" + integrity sha512-ecNRHw4clCkowNOBJH1e77nvbPxHYnWIXMv1IAoG/9+MYGkgoyr3Ppxr7XYFNL41V422EDhyV4/4SSK8L2mlig== + dependencies: + "@types/node" "*" + "@types/mongodb@^3.5.27": version "3.6.3" resolved "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.3.tgz" @@ -67,6 +74,11 @@ asynckit@^0.4.0: resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + axios@^0.21.1: version "0.21.1" resolved "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz" @@ -249,6 +261,16 @@ follow-redirects@^1.10.0: resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz" integrity sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg== +fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -266,6 +288,11 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -294,6 +321,15 @@ isarray@~1.0.0: resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + kareem@2.3.2: version "2.3.2" resolved "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz" @@ -607,6 +643,11 @@ typescript@^4.1.2: resolved "https://registry.npmjs.org/typescript/-/typescript-4.1.2.tgz" integrity sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ== +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" From e1a2a07030d22164e12ccd3b83625f8f3226fe85 Mon Sep 17 00:00:00 2001 From: Miqhtie Date: Wed, 10 Feb 2021 21:55:46 -0500 Subject: [PATCH 2/2] add maintenance --- src/commands/help.ts | 1 + src/commands/maintenance.ts | 26 ++++++++++++++++++++++++++ src/events/message.ts | 1 + src/structures/Client.ts | 3 ++- src/utils/settings/Settings.ts | 6 ++++-- 5 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 src/commands/maintenance.ts diff --git a/src/commands/help.ts b/src/commands/help.ts index 65bf7c8..0038fa1 100644 --- a/src/commands/help.ts +++ b/src/commands/help.ts @@ -43,6 +43,7 @@ module.exports = { if (!categoryID) { var categoryIcon = ":grey_question:"; } + if(categoryID !== "Developers") embed.addField(`${categoryIcon} ${categoryID} (${category.size})`, category.map((cmd: any) => `${cmd.name}`).join(" **|** ")); } embed.addField(":question: Command Information", `${client.prefix}help `); diff --git a/src/commands/maintenance.ts b/src/commands/maintenance.ts new file mode 100644 index 0000000..12f7be6 --- /dev/null +++ b/src/commands/maintenance.ts @@ -0,0 +1,26 @@ +import { Message, MessageManager } from "discord.js"; +import Client from "../structures/Client"; +import { saveSettings } from "../utils/settings/Settings"; +module.exports = { + name: "maintenance", + description: "Puts bot into maintenance!", + category: "Developers", + usage: "maintenance ", + run: async function run(client: Client, message: Message, args: string[]) { + if(!client.developers.includes(message.author.id)) return message.channel.send("Missing permissions."); + if(client.settings.disabled) { + client.settings.disabled = false; + client.settings.disabledReason = undefined; + saveSettings(client.settings); + return message.channel.send("Turned off maintenance!"); + } + + if(args.length === 0) return message.channel.send("Please give a reason!"); + + const reason = args.join(" "); + client.settings.disabled = true; + client.settings.disabledReason = reason; + saveSettings(client.settings); + return message.channel.send("Turned on maintenance!"); + }, +}; diff --git a/src/events/message.ts b/src/events/message.ts index e65d36e..79c6aec 100644 --- a/src/events/message.ts +++ b/src/events/message.ts @@ -44,6 +44,7 @@ module.exports = async function message(client: DiscordClient, message: Message) } if (!cmd) return; if (cmd) { + if (!client.developers.includes(message.author.id) && client.settings.disabled) return message.channel.send('The bot is currently in maintenance for ' + client.settings.disabledReason); if (guildSettings.disabledCommands.includes(cmd.name)) return; if (cmd.name !== "admin" && guildSettings.sleep) return message.channel.send("Bot is in sleep mode! Do c!admin sleep to turn it back on!"); diff --git a/src/structures/Client.ts b/src/structures/Client.ts index d88edf9..f5fb8c4 100644 --- a/src/structures/Client.ts +++ b/src/structures/Client.ts @@ -14,6 +14,7 @@ export default class Client extends Discord.Client { commands = new Discord.Collection(); aliases = new Discord.Collection(); settings: ISettings | undefined; + developers = ["438057670042320896" /*Miqhtie*/ , "234576713005137920" /*Joel*/ ] constructor() { super({ @@ -60,4 +61,4 @@ export default class Client extends Discord.Client { }); logger.info(`Done loading ${c} commands.`); } -} +} \ No newline at end of file diff --git a/src/utils/settings/Settings.ts b/src/utils/settings/Settings.ts index b958927..1cbb4df 100644 --- a/src/utils/settings/Settings.ts +++ b/src/utils/settings/Settings.ts @@ -2,11 +2,13 @@ import fs from "fs-extra"; import logger from "../logger/Logger"; export interface ISettings { - test: string; + disabled: boolean, + disabledReason: string | undefined } export const defaultSettings: ISettings = { - test: "a" + disabled: false, + disabledReason: undefined } const settingsPath = "./settings.json";