diff --git a/backend/src/api/auth.ts b/backend/src/api/auth.ts index 8708b759..e5566a3f 100644 --- a/backend/src/api/auth.ts +++ b/backend/src/api/auth.ts @@ -1,5 +1,5 @@ import express, { Request, Response } from "express"; -import passport, { Strategy } from "passport"; +import passport from "passport"; import OAuth2Strategy from "passport-oauth2"; import { Strategy as CustomStrategy } from "passport-custom"; import { ApiLogins } from "../data/ApiLogins"; diff --git a/backend/src/api/docs.ts b/backend/src/api/docs.ts index ceede873..3f85ea37 100644 --- a/backend/src/api/docs.ts +++ b/backend/src/api/docs.ts @@ -2,8 +2,6 @@ import express from "express"; import { guildPlugins } from "../plugins/availablePlugins"; import { notFound } from "./responses"; import { indentLines } from "../utils"; -import { getPluginName } from "knub/dist/plugins/pluginUtils"; -import { ZeppelinPluginBlueprint } from "src/plugins/ZeppelinPluginBlueprint"; function formatConfigSchema(schema) { if (schema._tag === "InterfaceType" || schema._tag === "PartialType") { @@ -48,12 +46,12 @@ export function initDocs(app: express.Express) { app.get("/docs/plugins/:pluginName", (req: express.Request, res: express.Response) => { // prettier-ignore - const plugin = docsPlugins.find(obj => getPluginName(obj) === req.params.pluginName); + const plugin = docsPlugins.find(_plugin => _plugin.name === req.params.pluginName); if (!plugin) { return notFound(res); } - const name = getPluginName(plugin); + const name = plugin.name; const info = plugin.info || {}; const commands = (plugin.commands || []).map(cmd => ({ diff --git a/backend/src/api/start.ts b/backend/src/api/start.ts index 07a10ca8..e8975238 100644 --- a/backend/src/api/start.ts +++ b/backend/src/api/start.ts @@ -5,10 +5,7 @@ import { initAuth } from "./auth"; import { initGuildsAPI } from "./guilds"; import { initArchives } from "./archives"; import { initDocs } from "./docs"; -import { connect } from "../data/db"; -import path from "path"; import { TokenError } from "passport-oauth2"; -import { PluginError } from "knub"; const app = express(); diff --git a/backend/src/commandTypes.ts b/backend/src/commandTypes.ts index 4d46bfa5..9341120b 100644 --- a/backend/src/commandTypes.ts +++ b/backend/src/commandTypes.ts @@ -1,12 +1,5 @@ -import { - convertDelayStringToMS, - deactivateMentions, - disableCodeBlocks, - resolveMember, - resolveUser, - UnknownUser, -} from "./utils"; -import { Client, GuildChannel, Member, Message, User } from "eris"; +import { convertDelayStringToMS, disableCodeBlocks, resolveMember, resolveUser, UnknownUser } from "./utils"; +import { GuildChannel, Member, User } from "eris"; import { baseTypeConverters, baseTypeHelpers, CommandContext, TypeConversionError } from "knub"; import { createTypeHelper } from "knub-command-manager"; diff --git a/backend/src/configValidator.ts b/backend/src/configValidator.ts index 8245111f..b6931819 100644 --- a/backend/src/configValidator.ts +++ b/backend/src/configValidator.ts @@ -1,19 +1,13 @@ import * as t from "io-ts"; -import { pipe } from "fp-ts/lib/pipeable"; -import { fold } from "fp-ts/lib/Either"; -import { PathReporter } from "io-ts/lib/PathReporter"; import { guildPlugins } from "./plugins/availablePlugins"; -import { ZeppelinPluginClass } from "./plugins/ZeppelinPluginClass"; import { decodeAndValidateStrict, StrictValidationError } from "./validatorUtils"; import { ZeppelinPlugin } from "./plugins/ZeppelinPlugin"; -import { getPluginName } from "knub/dist/plugins/pluginUtils"; import { IZeppelinGuildConfig } from "./types"; import { PluginOptions } from "knub"; const pluginNameToPlugin = new Map(); for (const plugin of guildPlugins) { - const pluginName = getPluginName(plugin); - pluginNameToPlugin.set(pluginName, plugin); + pluginNameToPlugin.set(plugin.name, plugin); } const guildConfigRootSchema = t.type({ @@ -45,10 +39,16 @@ export function validateGuildConfig(config: any): string[] | null { } const plugin = pluginNameToPlugin.get(pluginName); - let pluginErrors = plugin.configPreprocessor(pluginOptions as PluginOptions); - if (pluginErrors) { - pluginErrors = pluginErrors.map(err => `${pluginName}: ${err}`); - return pluginErrors; + try { + plugin.configPreprocessor(pluginOptions as PluginOptions); + } catch (err) { + if (err instanceof StrictValidationError) { + return err.getErrors().map(err => { + return `${pluginName}: ${err.toString()}`; + }); + } + + throw err; } } } diff --git a/backend/src/data/AllowedGuilds.ts b/backend/src/data/AllowedGuilds.ts index bf104790..4c0564c2 100644 --- a/backend/src/data/AllowedGuilds.ts +++ b/backend/src/data/AllowedGuilds.ts @@ -1,13 +1,5 @@ import { AllowedGuild } from "./entities/AllowedGuild"; -import { - getConnection, - getRepository, - Repository, - Transaction, - TransactionManager, - TransactionRepository, -} from "typeorm"; -import { BaseGuildRepository } from "./BaseGuildRepository"; +import { getRepository, Repository } from "typeorm"; import { BaseRepository } from "./BaseRepository"; import { ApiPermissionTypes } from "./ApiPermissionAssignments"; diff --git a/backend/src/data/ApiLogins.ts b/backend/src/data/ApiLogins.ts index 2b775cdf..f08e1ebd 100644 --- a/backend/src/data/ApiLogins.ts +++ b/backend/src/data/ApiLogins.ts @@ -3,11 +3,9 @@ import { ApiLogin } from "./entities/ApiLogin"; import { BaseRepository } from "./BaseRepository"; import crypto from "crypto"; import moment from "moment-timezone"; - // tslint:disable-next-line:no-submodule-imports import uuidv4 from "uuid/v4"; import { DBDateFormat } from "../utils"; -import { log } from "util"; export class ApiLogins extends BaseRepository { private apiLogins: Repository; diff --git a/backend/src/data/GuildArchives.ts b/backend/src/data/GuildArchives.ts index 13cc4d82..206abd0e 100644 --- a/backend/src/data/GuildArchives.ts +++ b/backend/src/data/GuildArchives.ts @@ -1,11 +1,10 @@ -import uuid from "uuid/v4"; // tslint:disable-line import moment from "moment-timezone"; import { ArchiveEntry } from "./entities/ArchiveEntry"; import { getRepository, Repository } from "typeorm"; import { BaseGuildRepository } from "./BaseGuildRepository"; import { trimLines } from "../utils"; import { SavedMessage } from "./entities/SavedMessage"; -import { Channel, Guild, User } from "eris"; +import { Guild } from "eris"; import { renderTemplate } from "../templateFormatter"; const DEFAULT_EXPIRY_DAYS = 30; diff --git a/backend/src/data/GuildMutes.ts b/backend/src/data/GuildMutes.ts index 94cfb28f..697a0e26 100644 --- a/backend/src/data/GuildMutes.ts +++ b/backend/src/data/GuildMutes.ts @@ -1,7 +1,7 @@ import moment from "moment-timezone"; import { Mute } from "./entities/Mute"; import { BaseGuildRepository } from "./BaseGuildRepository"; -import { getRepository, Repository, Brackets } from "typeorm"; +import { Brackets, getRepository, Repository } from "typeorm"; export class GuildMutes extends BaseGuildRepository { private mutes: Repository; diff --git a/backend/src/data/GuildNicknameHistory.ts b/backend/src/data/GuildNicknameHistory.ts index 91d9d533..e1fd292a 100644 --- a/backend/src/data/GuildNicknameHistory.ts +++ b/backend/src/data/GuildNicknameHistory.ts @@ -1,7 +1,7 @@ import { BaseGuildRepository } from "./BaseGuildRepository"; import { getRepository, In, Repository } from "typeorm"; import { NicknameHistoryEntry } from "./entities/NicknameHistoryEntry"; -import { MINUTES, SECONDS, sorter } from "../utils"; +import { MINUTES, SECONDS } from "../utils"; import { MAX_USERNAME_ENTRIES_PER_USER } from "./UsernameHistory"; import { isAPI } from "../globals"; import { cleanupNicknames } from "./cleanup/nicknames"; diff --git a/backend/src/data/GuildSavedMessages.ts b/backend/src/data/GuildSavedMessages.ts index 76047dcd..474f8003 100644 --- a/backend/src/data/GuildSavedMessages.ts +++ b/backend/src/data/GuildSavedMessages.ts @@ -1,12 +1,11 @@ -import { getRepository, In, Repository } from "typeorm"; +import { getRepository, Repository } from "typeorm"; import { BaseGuildRepository } from "./BaseGuildRepository"; import { ISavedMessageData, SavedMessage } from "./entities/SavedMessage"; import { QueuedEventEmitter } from "../QueuedEventEmitter"; import { GuildChannel, Message } from "eris"; import moment from "moment-timezone"; -import { DAYS, DBDateFormat, MINUTES, SECONDS } from "../utils"; +import { MINUTES, SECONDS } from "../utils"; import { isAPI } from "../globals"; -import { connection } from "./db"; import { cleanupMessages } from "./cleanup/messages"; if (!isAPI()) { diff --git a/backend/src/data/GuildStarboardReactions.ts b/backend/src/data/GuildStarboardReactions.ts index 6f81f735..3edc3d2c 100644 --- a/backend/src/data/GuildStarboardReactions.ts +++ b/backend/src/data/GuildStarboardReactions.ts @@ -1,5 +1,5 @@ import { BaseGuildRepository } from "./BaseGuildRepository"; -import { Repository, getRepository } from "typeorm"; +import { getRepository, Repository } from "typeorm"; import { StarboardReaction } from "./entities/StarboardReaction"; export class GuildStarboardReactions extends BaseGuildRepository { diff --git a/backend/src/data/GuildStats.ts b/backend/src/data/GuildStats.ts index 46c7497b..a0ca75a6 100644 --- a/backend/src/data/GuildStats.ts +++ b/backend/src/data/GuildStats.ts @@ -1,5 +1,4 @@ import { BaseGuildRepository } from "./BaseGuildRepository"; -import { connection } from "./db"; import { getRepository, Repository } from "typeorm"; import { StatValue } from "./entities/StatValue"; diff --git a/backend/src/data/UsernameHistory.ts b/backend/src/data/UsernameHistory.ts index 0d334adb..09a4057c 100644 --- a/backend/src/data/UsernameHistory.ts +++ b/backend/src/data/UsernameHistory.ts @@ -1,8 +1,7 @@ import { getRepository, In, Repository } from "typeorm"; import { UsernameHistoryEntry } from "./entities/UsernameHistoryEntry"; -import { MINUTES, SECONDS, sorter } from "../utils"; +import { MINUTES, SECONDS } from "../utils"; import { BaseRepository } from "./BaseRepository"; -import { connection } from "./db"; import { isAPI } from "../globals"; import { cleanupUsernames } from "./cleanup/usernames"; diff --git a/backend/src/data/entities/AllowedGuild.ts b/backend/src/data/entities/AllowedGuild.ts index aa8ebba5..e12c4247 100644 --- a/backend/src/data/entities/AllowedGuild.ts +++ b/backend/src/data/entities/AllowedGuild.ts @@ -1,4 +1,4 @@ -import { Entity, Column, PrimaryColumn, CreateDateColumn } from "typeorm"; +import { Column, Entity, PrimaryColumn } from "typeorm"; @Entity("allowed_guilds") export class AllowedGuild { diff --git a/backend/src/data/entities/AntiraidLevel.ts b/backend/src/data/entities/AntiraidLevel.ts index 374ed358..dad4f50c 100644 --- a/backend/src/data/entities/AntiraidLevel.ts +++ b/backend/src/data/entities/AntiraidLevel.ts @@ -1,4 +1,4 @@ -import { Entity, Column, PrimaryColumn } from "typeorm"; +import { Column, Entity, PrimaryColumn } from "typeorm"; @Entity("antiraid_levels") export class AntiraidLevel { diff --git a/backend/src/data/entities/ApiLogin.ts b/backend/src/data/entities/ApiLogin.ts index 5dc7ebeb..25f2405a 100644 --- a/backend/src/data/entities/ApiLogin.ts +++ b/backend/src/data/entities/ApiLogin.ts @@ -1,4 +1,4 @@ -import { Entity, Column, PrimaryColumn, OneToOne, ManyToOne, JoinColumn } from "typeorm"; +import { Column, Entity, JoinColumn, ManyToOne, PrimaryColumn } from "typeorm"; import { ApiUserInfo } from "./ApiUserInfo"; @Entity("api_logins") diff --git a/backend/src/data/entities/ApiPermissionAssignment.ts b/backend/src/data/entities/ApiPermissionAssignment.ts index c454206c..fcea7595 100644 --- a/backend/src/data/entities/ApiPermissionAssignment.ts +++ b/backend/src/data/entities/ApiPermissionAssignment.ts @@ -1,4 +1,4 @@ -import { Entity, Column, PrimaryColumn, ManyToOne, JoinColumn } from "typeorm"; +import { Column, Entity, JoinColumn, ManyToOne, PrimaryColumn } from "typeorm"; import { ApiUserInfo } from "./ApiUserInfo"; @Entity("api_permissions") diff --git a/backend/src/data/entities/ApiUserInfo.ts b/backend/src/data/entities/ApiUserInfo.ts index e546db60..32c3a1b0 100644 --- a/backend/src/data/entities/ApiUserInfo.ts +++ b/backend/src/data/entities/ApiUserInfo.ts @@ -1,4 +1,4 @@ -import { Entity, Column, PrimaryColumn, OneToMany } from "typeorm"; +import { Column, Entity, OneToMany, PrimaryColumn } from "typeorm"; import { ApiLogin } from "./ApiLogin"; import { ApiPermissionAssignment } from "./ApiPermissionAssignment"; diff --git a/backend/src/data/entities/ArchiveEntry.ts b/backend/src/data/entities/ArchiveEntry.ts index cb9698b2..22e97096 100644 --- a/backend/src/data/entities/ArchiveEntry.ts +++ b/backend/src/data/entities/ArchiveEntry.ts @@ -1,4 +1,4 @@ -import { Entity, Column, PrimaryGeneratedColumn } from "typeorm"; +import { Column, Entity, PrimaryGeneratedColumn } from "typeorm"; @Entity("archives") export class ArchiveEntry { diff --git a/backend/src/data/entities/AutoReaction.ts b/backend/src/data/entities/AutoReaction.ts index bb9a7278..9383d115 100644 --- a/backend/src/data/entities/AutoReaction.ts +++ b/backend/src/data/entities/AutoReaction.ts @@ -1,5 +1,4 @@ -import { Entity, Column, PrimaryColumn } from "typeorm"; -import { ISavedMessageData } from "./SavedMessage"; +import { Column, Entity, PrimaryColumn } from "typeorm"; @Entity("auto_reactions") export class AutoReaction { diff --git a/backend/src/data/entities/Case.ts b/backend/src/data/entities/Case.ts index 5b65e75a..29fc9061 100644 --- a/backend/src/data/entities/Case.ts +++ b/backend/src/data/entities/Case.ts @@ -1,4 +1,4 @@ -import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from "typeorm"; +import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm"; import { CaseNote } from "./CaseNote"; @Entity("cases") diff --git a/backend/src/data/entities/CaseNote.ts b/backend/src/data/entities/CaseNote.ts index 4541717c..3f2e8125 100644 --- a/backend/src/data/entities/CaseNote.ts +++ b/backend/src/data/entities/CaseNote.ts @@ -1,4 +1,4 @@ -import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from "typeorm"; +import { Column, Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn } from "typeorm"; import { Case } from "./Case"; @Entity("case_notes") diff --git a/backend/src/data/entities/Config.ts b/backend/src/data/entities/Config.ts index 36bcef95..8e16514e 100644 --- a/backend/src/data/entities/Config.ts +++ b/backend/src/data/entities/Config.ts @@ -1,4 +1,4 @@ -import { Entity, Column, PrimaryColumn, CreateDateColumn, ManyToOne, JoinColumn } from "typeorm"; +import { Column, Entity, JoinColumn, ManyToOne, PrimaryColumn } from "typeorm"; import { ApiUserInfo } from "./ApiUserInfo"; @Entity("configs") diff --git a/backend/src/data/entities/Mute.ts b/backend/src/data/entities/Mute.ts index 6544b441..ab1e8d41 100644 --- a/backend/src/data/entities/Mute.ts +++ b/backend/src/data/entities/Mute.ts @@ -1,4 +1,4 @@ -import { Entity, Column, PrimaryColumn } from "typeorm"; +import { Column, Entity, PrimaryColumn } from "typeorm"; @Entity("mutes") export class Mute { diff --git a/backend/src/data/entities/NicknameHistoryEntry.ts b/backend/src/data/entities/NicknameHistoryEntry.ts index b3eed3b0..6339707e 100644 --- a/backend/src/data/entities/NicknameHistoryEntry.ts +++ b/backend/src/data/entities/NicknameHistoryEntry.ts @@ -1,4 +1,4 @@ -import { Entity, Column, PrimaryColumn } from "typeorm"; +import { Column, Entity, PrimaryColumn } from "typeorm"; @Entity("nickname_history") export class NicknameHistoryEntry { diff --git a/backend/src/data/entities/PersistedData.ts b/backend/src/data/entities/PersistedData.ts index cb1d8ea6..03c196b4 100644 --- a/backend/src/data/entities/PersistedData.ts +++ b/backend/src/data/entities/PersistedData.ts @@ -1,4 +1,4 @@ -import { Entity, Column, PrimaryColumn } from "typeorm"; +import { Column, Entity, PrimaryColumn } from "typeorm"; @Entity("persisted_data") export class PersistedData { diff --git a/backend/src/data/entities/PingableRole.ts b/backend/src/data/entities/PingableRole.ts index 8d7264a4..7153290d 100644 --- a/backend/src/data/entities/PingableRole.ts +++ b/backend/src/data/entities/PingableRole.ts @@ -1,5 +1,4 @@ -import { Entity, Column, PrimaryColumn } from "typeorm"; -import { ISavedMessageData } from "./SavedMessage"; +import { Column, Entity, PrimaryColumn } from "typeorm"; @Entity("pingable_roles") export class PingableRole { diff --git a/backend/src/data/entities/ReactionRole.ts b/backend/src/data/entities/ReactionRole.ts index 38cb256d..532d3895 100644 --- a/backend/src/data/entities/ReactionRole.ts +++ b/backend/src/data/entities/ReactionRole.ts @@ -1,4 +1,4 @@ -import { Entity, Column, PrimaryColumn } from "typeorm"; +import { Column, Entity, PrimaryColumn } from "typeorm"; @Entity("reaction_roles") export class ReactionRole { diff --git a/backend/src/data/entities/Reminder.ts b/backend/src/data/entities/Reminder.ts index d7e33972..344b3090 100644 --- a/backend/src/data/entities/Reminder.ts +++ b/backend/src/data/entities/Reminder.ts @@ -1,4 +1,4 @@ -import { Entity, Column, PrimaryColumn } from "typeorm"; +import { Column, Entity, PrimaryColumn } from "typeorm"; @Entity("reminders") export class Reminder { diff --git a/backend/src/data/entities/SavedMessage.ts b/backend/src/data/entities/SavedMessage.ts index 5a4f3283..1301e45c 100644 --- a/backend/src/data/entities/SavedMessage.ts +++ b/backend/src/data/entities/SavedMessage.ts @@ -1,4 +1,4 @@ -import { Entity, Column, PrimaryColumn } from "typeorm"; +import { Column, Entity, PrimaryColumn } from "typeorm"; export interface ISavedMessageData { attachments?: object[]; diff --git a/backend/src/data/entities/ScheduledPost.ts b/backend/src/data/entities/ScheduledPost.ts index 3295c6b1..000c309e 100644 --- a/backend/src/data/entities/ScheduledPost.ts +++ b/backend/src/data/entities/ScheduledPost.ts @@ -1,4 +1,4 @@ -import { Entity, Column, PrimaryColumn } from "typeorm"; +import { Column, Entity, PrimaryColumn } from "typeorm"; import { Attachment } from "eris"; import { StrictMessageContent } from "../../utils"; diff --git a/backend/src/data/entities/SlowmodeChannel.ts b/backend/src/data/entities/SlowmodeChannel.ts index 4ae31a84..b83541b0 100644 --- a/backend/src/data/entities/SlowmodeChannel.ts +++ b/backend/src/data/entities/SlowmodeChannel.ts @@ -1,4 +1,4 @@ -import { Entity, Column, PrimaryColumn } from "typeorm"; +import { Column, Entity, PrimaryColumn } from "typeorm"; @Entity("slowmode_channels") export class SlowmodeChannel { diff --git a/backend/src/data/entities/SlowmodeUser.ts b/backend/src/data/entities/SlowmodeUser.ts index 9b70193d..e3b522a7 100644 --- a/backend/src/data/entities/SlowmodeUser.ts +++ b/backend/src/data/entities/SlowmodeUser.ts @@ -1,4 +1,4 @@ -import { Entity, Column, PrimaryColumn } from "typeorm"; +import { Column, Entity, PrimaryColumn } from "typeorm"; @Entity("slowmode_users") export class SlowmodeUser { diff --git a/backend/src/data/entities/StarboardMessage.ts b/backend/src/data/entities/StarboardMessage.ts index 50c9c241..405222c1 100644 --- a/backend/src/data/entities/StarboardMessage.ts +++ b/backend/src/data/entities/StarboardMessage.ts @@ -1,4 +1,4 @@ -import { Entity, Column, PrimaryColumn, OneToMany, ManyToOne, JoinColumn, OneToOne } from "typeorm"; +import { Column, Entity, JoinColumn, OneToOne, PrimaryColumn } from "typeorm"; import { SavedMessage } from "./SavedMessage"; @Entity("starboard_messages") diff --git a/backend/src/data/entities/StarboardReaction.ts b/backend/src/data/entities/StarboardReaction.ts index 020b3a03..8e04a8fb 100644 --- a/backend/src/data/entities/StarboardReaction.ts +++ b/backend/src/data/entities/StarboardReaction.ts @@ -1,4 +1,4 @@ -import { Entity, Column, PrimaryColumn, JoinColumn, OneToOne } from "typeorm"; +import { Column, Entity, JoinColumn, OneToOne, PrimaryColumn } from "typeorm"; import { SavedMessage } from "./SavedMessage"; @Entity("starboard_reactions") diff --git a/backend/src/data/entities/StatValue.ts b/backend/src/data/entities/StatValue.ts index 78978a28..22c86226 100644 --- a/backend/src/data/entities/StatValue.ts +++ b/backend/src/data/entities/StatValue.ts @@ -1,4 +1,4 @@ -import { Entity, Column, PrimaryColumn, CreateDateColumn } from "typeorm"; +import { Column, Entity, PrimaryColumn } from "typeorm"; @Entity("stats") export class StatValue { diff --git a/backend/src/data/entities/Supporter.ts b/backend/src/data/entities/Supporter.ts index 4189b087..bf09acbf 100644 --- a/backend/src/data/entities/Supporter.ts +++ b/backend/src/data/entities/Supporter.ts @@ -1,4 +1,4 @@ -import { Entity, Column, PrimaryColumn } from "typeorm"; +import { Column, Entity, PrimaryColumn } from "typeorm"; @Entity("supporters") export class Supporter { diff --git a/backend/src/data/entities/Tag.ts b/backend/src/data/entities/Tag.ts index 948e0f14..e607ff61 100644 --- a/backend/src/data/entities/Tag.ts +++ b/backend/src/data/entities/Tag.ts @@ -1,4 +1,4 @@ -import { Entity, Column, PrimaryColumn, CreateDateColumn } from "typeorm"; +import { Column, Entity, PrimaryColumn } from "typeorm"; @Entity("tags") export class Tag { diff --git a/backend/src/data/entities/TagResponse.ts b/backend/src/data/entities/TagResponse.ts index 7fa00c8d..b9c19c52 100644 --- a/backend/src/data/entities/TagResponse.ts +++ b/backend/src/data/entities/TagResponse.ts @@ -1,4 +1,4 @@ -import { Entity, Column, PrimaryColumn, CreateDateColumn } from "typeorm"; +import { Column, Entity, PrimaryColumn } from "typeorm"; @Entity("tag_responses") export class TagResponse { diff --git a/backend/src/data/entities/UsernameHistoryEntry.ts b/backend/src/data/entities/UsernameHistoryEntry.ts index 1774335f..d651417f 100644 --- a/backend/src/data/entities/UsernameHistoryEntry.ts +++ b/backend/src/data/entities/UsernameHistoryEntry.ts @@ -1,4 +1,4 @@ -import { Entity, Column, PrimaryColumn } from "typeorm"; +import { Column, Entity, PrimaryColumn } from "typeorm"; @Entity("username_history") export class UsernameHistoryEntry { diff --git a/backend/src/data/entities/VCAlert.ts b/backend/src/data/entities/VCAlert.ts index e627afa6..81b6bc81 100644 --- a/backend/src/data/entities/VCAlert.ts +++ b/backend/src/data/entities/VCAlert.ts @@ -1,4 +1,4 @@ -import { Entity, Column, PrimaryColumn } from "typeorm"; +import { Column, Entity, PrimaryColumn } from "typeorm"; @Entity("vc_alerts") export class VCAlert { diff --git a/backend/src/index.ts b/backend/src/index.ts index 89187f4e..c6e9de6d 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -2,12 +2,27 @@ import path from "path"; import yaml from "js-yaml"; import fs from "fs"; -const fsp = fs.promises; - -import { Knub, logger, PluginError, pluginUtils } from "knub"; +import { Knub, PluginError } from "knub"; import { SimpleError } from "./SimpleError"; import { Configs } from "./data/Configs"; +// Always use UTC internally +// This is also enforced for the database in data/db.ts +import moment from "moment-timezone"; +import { Client, TextChannel } from "eris"; +import { connect } from "./data/db"; +import { globalPlugins, guildPlugins } from "./plugins/availablePlugins"; +import { errorMessage, isDiscordHTTPError, isDiscordRESTError, successMessage } from "./utils"; +import { startUptimeCounter } from "./uptime"; +import { AllowedGuilds } from "./data/AllowedGuilds"; +import { IZeppelinGlobalConfig, IZeppelinGuildConfig } from "./types"; +import { RecoverablePluginError } from "./RecoverablePluginError"; +import { GuildLogs } from "./data/GuildLogs"; +import { LogType } from "./data/LogType"; +import { ZeppelinPlugin } from "./plugins/ZeppelinPlugin"; +import { logger } from "./logger"; + +const fsp = fs.promises; require("dotenv").config({ path: path.resolve(process.cwd(), "bot.env") }); @@ -80,23 +95,8 @@ for (const [i, part] of actualVersionParts.entries()) { throw new SimpleError(`Unsupported Node.js version! Must be at least ${REQUIRED_NODE_VERSION}`); } -// Always use UTC internally -// This is also enforced for the database in data/db.ts -import moment from "moment-timezone"; moment.tz.setDefault("UTC"); -import { Client, TextChannel } from "eris"; -import { connect } from "./data/db"; -import { guildPlugins, globalPlugins } from "./plugins/availablePlugins"; -import { errorMessage, isDiscordHTTPError, isDiscordRESTError, successMessage } from "./utils"; -import { startUptimeCounter } from "./uptime"; -import { AllowedGuilds } from "./data/AllowedGuilds"; -import { IZeppelinGuildConfig, IZeppelinGlobalConfig } from "./types"; -import { RecoverablePluginError } from "./RecoverablePluginError"; -import { GuildLogs } from "./data/GuildLogs"; -import { LogType } from "./data/LogType"; -import { ZeppelinPlugin } from "./plugins/ZeppelinPlugin"; - logger.info("Connecting to database"); connect().then(async () => { const client = new Client(`Bot ${process.env.TOKEN}`, { @@ -152,8 +152,12 @@ connect().then(async () => { logFn: (level, msg) => { if (level === "debug") return; - // tslint:disable-next-line - console.log(`[${level.toUpperCase()}] ${msg}`); + + if (logger[level]) { + logger[level](msg); + } else { + logger.log(`[${level.toUpperCase()}] ${msg}`); + } }, performanceDebug: { diff --git a/backend/src/logger.ts b/backend/src/logger.ts new file mode 100644 index 00000000..6b3f1b96 --- /dev/null +++ b/backend/src/logger.ts @@ -0,0 +1,23 @@ +// tslint-disable:no-console + +export const logger = { + info(...args: Parameters) { + console.log("[INFO]", ...args); + }, + + warn(...args: Parameters) { + console.warn("[WARN]", ...args); + }, + + error(...args: Parameters) { + console.error("[ERROR]", ...args); + }, + + debug(...args: Parameters) { + console.log("[DEBUG]", ...args); + }, + + log(...args: Parameters) { + console.log(...args); + }, +}; diff --git a/backend/src/migrateConfigsToDB.ts b/backend/src/migrateConfigsToDB.ts index b30c8ce6..a814a63d 100644 --- a/backend/src/migrateConfigsToDB.ts +++ b/backend/src/migrateConfigsToDB.ts @@ -3,6 +3,7 @@ import { connect } from "./data/db"; import { Configs } from "./data/Configs"; import path from "path"; import * as _fs from "fs"; + const fs = _fs.promises; const authorId = process.argv[2]; diff --git a/backend/src/migrations/1547392046629-AddIndexToArchivesExpiresAt.ts b/backend/src/migrations/1547392046629-AddIndexToArchivesExpiresAt.ts index b6011797..2bf7c0bf 100644 --- a/backend/src/migrations/1547392046629-AddIndexToArchivesExpiresAt.ts +++ b/backend/src/migrations/1547392046629-AddIndexToArchivesExpiresAt.ts @@ -1,4 +1,4 @@ -import { MigrationInterface, QueryRunner, TableColumn, TableIndex } from "typeorm"; +import { MigrationInterface, QueryRunner, TableIndex } from "typeorm"; export class AddIndexToArchivesExpiresAt1547392046629 implements MigrationInterface { public async up(queryRunner: QueryRunner): Promise { diff --git a/backend/src/migrations/1561111990357-CreateConfigsTable.ts b/backend/src/migrations/1561111990357-CreateConfigsTable.ts index bb1fb015..1fe42bb7 100644 --- a/backend/src/migrations/1561111990357-CreateConfigsTable.ts +++ b/backend/src/migrations/1561111990357-CreateConfigsTable.ts @@ -1,4 +1,4 @@ -import { MigrationInterface, QueryRunner, Table, TableIndex } from "typeorm"; +import { MigrationInterface, QueryRunner, Table } from "typeorm"; export class CreateConfigsTable1561111990357 implements MigrationInterface { public async up(queryRunner: QueryRunner): Promise { diff --git a/backend/src/migrations/1573248462469-MoveStarboardsToConfig.ts b/backend/src/migrations/1573248462469-MoveStarboardsToConfig.ts index 39313a0f..f4ce3090 100644 --- a/backend/src/migrations/1573248462469-MoveStarboardsToConfig.ts +++ b/backend/src/migrations/1573248462469-MoveStarboardsToConfig.ts @@ -1,4 +1,4 @@ -import { MigrationInterface, QueryRunner, Table, TableColumn, createQueryBuilder } from "typeorm"; +import { MigrationInterface, QueryRunner, Table, TableColumn } from "typeorm"; export class MoveStarboardsToConfig1573248462469 implements MigrationInterface { public async up(queryRunner: QueryRunner): Promise { diff --git a/backend/src/pluginUtils.ts b/backend/src/pluginUtils.ts index c5efa2cd..89184e7e 100644 --- a/backend/src/pluginUtils.ts +++ b/backend/src/pluginUtils.ts @@ -2,13 +2,12 @@ * @file Utility functions that are plugin-instance-specific (i.e. use PluginData) */ -import { Member, TextChannel } from "eris"; -import { configUtils, helpers, Knub, PluginData, PluginOptions } from "knub"; +import { Member } from "eris"; +import { configUtils, helpers, PluginData, PluginOptions } from "knub"; import { decodeAndValidateStrict, StrictValidationError } from "./validatorUtils"; import { deepKeyIntersect, errorMessage, successMessage } from "./utils"; -import { ZeppelinPluginClass } from "./plugins/ZeppelinPluginClass"; import { ZeppelinPluginBlueprint } from "./plugins/ZeppelinPluginBlueprint"; -import { IZeppelinGlobalConfig, IZeppelinGuildConfig, TZeppelinKnub } from "./types"; +import { TZeppelinKnub } from "./types"; const { getMemberLevel } = helpers; @@ -22,33 +21,34 @@ export function canActOn(pluginData: PluginData, member1: Member, member2: return allowSameLevel ? ourLevel >= memberLevel : ourLevel > memberLevel; } -export function pluginConfigPreprocessor( - this: typeof ZeppelinPluginClass | ZeppelinPluginBlueprint, - options: PluginOptions, -) { - const decodedConfig = this.configSchema ? decodeAndValidateStrict(this.configSchema, options.config) : options.config; - if (decodedConfig instanceof StrictValidationError) { - throw decodedConfig; - } - - const decodedOverrides = []; - for (const override of options.overrides || []) { - const overrideConfigMergedWithBaseConfig = configUtils.mergeConfig(options.config, override.config || {}); - const decodedOverrideConfig = this.configSchema - ? decodeAndValidateStrict(this.configSchema, overrideConfigMergedWithBaseConfig) - : overrideConfigMergedWithBaseConfig; - if (decodedOverrideConfig instanceof StrictValidationError) { - throw decodedOverrideConfig; +export function getPluginConfigPreprocessor(blueprint: ZeppelinPluginBlueprint) { + return (options: PluginOptions) => { + const decodedConfig = blueprint.configSchema + ? decodeAndValidateStrict(blueprint.configSchema, options.config) + : options.config; + if (decodedConfig instanceof StrictValidationError) { + throw decodedConfig; } - decodedOverrides.push({ - ...override, - config: deepKeyIntersect(decodedOverrideConfig, override.config || {}), - }); - } - return { - config: decodedConfig, - overrides: decodedOverrides, + const decodedOverrides = []; + for (const override of options.overrides || []) { + const overrideConfigMergedWithBaseConfig = configUtils.mergeConfig(options.config, override.config || {}); + const decodedOverrideConfig = blueprint.configSchema + ? decodeAndValidateStrict(blueprint.configSchema, overrideConfigMergedWithBaseConfig) + : overrideConfigMergedWithBaseConfig; + if (decodedOverrideConfig instanceof StrictValidationError) { + throw decodedOverrideConfig; + } + decodedOverrides.push({ + ...override, + config: deepKeyIntersect(decodedOverrideConfig, override.config || {}), + }); + } + + return { + config: decodedConfig, + overrides: decodedOverrides, + }; }; } diff --git a/backend/src/plugins/AutoReactions/AutoReactionsPlugin.ts b/backend/src/plugins/AutoReactions/AutoReactionsPlugin.ts index 811b819e..44d673ab 100644 --- a/backend/src/plugins/AutoReactions/AutoReactionsPlugin.ts +++ b/backend/src/plugins/AutoReactions/AutoReactionsPlugin.ts @@ -1,5 +1,5 @@ import { zeppelinPlugin } from "../ZeppelinPluginBlueprint"; -import { ConfigSchema, AutoReactionsPluginType } from "./types"; +import { AutoReactionsPluginType, ConfigSchema } from "./types"; import { PluginOptions } from "knub"; import { NewAutoReactionsCmd } from "./commands/NewAutoReactionsCmd"; import { DisableAutoReactionsCmd } from "./commands/DisableAutoReactionsCmd"; diff --git a/backend/src/plugins/AutoReactions/commands/NewAutoReactionsCmd.ts b/backend/src/plugins/AutoReactions/commands/NewAutoReactionsCmd.ts index d649a205..f7444642 100644 --- a/backend/src/plugins/AutoReactions/commands/NewAutoReactionsCmd.ts +++ b/backend/src/plugins/AutoReactions/commands/NewAutoReactionsCmd.ts @@ -1,6 +1,6 @@ import { autoReactionsCmd } from "../types"; import { commandTypeHelpers as ct } from "../../../commandTypes"; -import { isEmoji, customEmojiRegex, canUseEmoji } from "src/utils"; +import { canUseEmoji, customEmojiRegex, isEmoji } from "src/utils"; import { sendErrorMessage, sendSuccessMessage } from "src/pluginUtils"; export const NewAutoReactionsCmd = autoReactionsCmd({ diff --git a/backend/src/plugins/AutoReactions/events/AddReactionsEvt.ts b/backend/src/plugins/AutoReactions/events/AddReactionsEvt.ts index d9ddde4c..bbab0bb5 100644 --- a/backend/src/plugins/AutoReactions/events/AddReactionsEvt.ts +++ b/backend/src/plugins/AutoReactions/events/AddReactionsEvt.ts @@ -1,7 +1,7 @@ import { autoReactionsEvt } from "../types"; import { isDiscordRESTError } from "src/utils"; -import { logger } from "knub"; import { LogType } from "src/data/LogType"; +import { logger } from "../../../logger"; export const AddReactionsEvt = autoReactionsEvt({ event: "messageCreate", diff --git a/backend/src/plugins/Cases/CasesPlugin.ts b/backend/src/plugins/Cases/CasesPlugin.ts index 5ee1eb28..5a10b0f8 100644 --- a/backend/src/plugins/Cases/CasesPlugin.ts +++ b/backend/src/plugins/Cases/CasesPlugin.ts @@ -1,6 +1,5 @@ import { zeppelinPlugin } from "../ZeppelinPluginBlueprint"; import { CaseArgs, CaseNoteArgs, CasesPluginType, ConfigSchema } from "./types"; -import { resolveUser } from "../../utils"; import { createCase } from "./functions/createCase"; import { GuildLogs } from "../../data/GuildLogs"; import { GuildArchives } from "../../data/GuildArchives"; diff --git a/backend/src/plugins/Cases/functions/createCase.ts b/backend/src/plugins/Cases/functions/createCase.ts index c6610b46..8cc31d3a 100644 --- a/backend/src/plugins/Cases/functions/createCase.ts +++ b/backend/src/plugins/Cases/functions/createCase.ts @@ -2,7 +2,8 @@ import { CaseArgs, CasesPluginType } from "../types"; import { resolveUser } from "../../../utils"; import { PluginData } from "knub"; import { createCaseNote } from "./createCaseNote"; -import { postToCaseLogChannel } from "./postToCaseLogChannel"; +import { postCaseToCaseLogChannel } from "./postToCaseLogChannel"; +import { logger } from "../../../logger"; export async function createCase(pluginData: PluginData, args: CaseArgs) { const user = await resolveUser(pluginData.client, args.userId); @@ -21,7 +22,7 @@ export async function createCase(pluginData: PluginData, args: const existingAuditLogCase = await pluginData.state.cases.findByAuditLogId(args.auditLogId); if (existingAuditLogCase) { delete args.auditLogId; - console.warn(`Duplicate audit log ID for mod case: ${args.auditLogId}`); + logger.warn(`Duplicate audit log ID for mod case: ${args.auditLogId}`); } } @@ -66,7 +67,7 @@ export async function createCase(pluginData: PluginData, args: (!args.automatic || config.log_automatic_actions) && args.postInCaseLogOverride !== false ) { - await postToCaseLogChannel(pluginData, createdCase); + await postCaseToCaseLogChannel(pluginData, createdCase); } return createdCase; diff --git a/backend/src/plugins/Cases/functions/postToCaseLogChannel.ts b/backend/src/plugins/Cases/functions/postToCaseLogChannel.ts index 68ea216e..40b76283 100644 --- a/backend/src/plugins/Cases/functions/postToCaseLogChannel.ts +++ b/backend/src/plugins/Cases/functions/postToCaseLogChannel.ts @@ -1,4 +1,4 @@ -import { plugin, PluginData } from "knub"; +import { PluginData } from "knub"; import { CasesPluginType } from "../types"; import { Message, MessageContent, MessageFile, TextChannel } from "eris"; import { isDiscordRESTError } from "../../../utils"; @@ -6,6 +6,7 @@ import { LogType } from "../../../data/LogType"; import { Case } from "../../../data/entities/Case"; import { getCaseEmbed } from "./getCaseEmbed"; import { resolveCaseId } from "./resolveCaseId"; +import { logger } from "../../../logger"; export async function postToCaseLogChannel( pluginData: PluginData, @@ -23,7 +24,7 @@ export async function postToCaseLogChannel( result = await caseLogChannel.createMessage(content, file); } catch (e) { if (isDiscordRESTError(e) && (e.code === 50013 || e.code === 50001)) { - console.warn( + logger.warn( `Missing permissions to post mod cases in <#${caseLogChannel.id}> in guild ${pluginData.guild.name} (${pluginData.guild.id})`, ); pluginData.state.logs.log(LogType.BOT_ALERT, { diff --git a/backend/src/plugins/Cases/types.ts b/backend/src/plugins/Cases/types.ts index 79ce1220..f6f1d8cd 100644 --- a/backend/src/plugins/Cases/types.ts +++ b/backend/src/plugins/Cases/types.ts @@ -4,9 +4,7 @@ import { CaseTypes } from "../../data/CaseTypes"; import { BasePluginType } from "knub"; import { GuildLogs } from "../../data/GuildLogs"; import { GuildCases } from "../../data/GuildCases"; -import { GuildSavedMessages } from "../../data/GuildSavedMessages"; import { GuildArchives } from "../../data/GuildArchives"; -import { Supporters } from "../../data/Supporters"; export const ConfigSchema = t.type({ log_automatic_actions: t.boolean, diff --git a/backend/src/plugins/GuildConfigReloader/types.ts b/backend/src/plugins/GuildConfigReloader/types.ts index fd6ce95a..ded863ee 100644 --- a/backend/src/plugins/GuildConfigReloader/types.ts +++ b/backend/src/plugins/GuildConfigReloader/types.ts @@ -1,8 +1,4 @@ import { BasePluginType } from "knub"; -import { GuildMutes } from "../../data/GuildMutes"; -import { GuildCases } from "../../data/GuildCases"; -import { GuildLogs } from "../../data/GuildLogs"; -import { GuildArchives } from "../../data/GuildArchives"; import { TConfigSchema } from "../Mutes/types"; import { Configs } from "../../data/Configs"; import Timeout = NodeJS.Timeout; diff --git a/backend/src/plugins/LocateUser/LocateUserPlugin.ts b/backend/src/plugins/LocateUser/LocateUserPlugin.ts index 6c003029..c8a44f5f 100644 --- a/backend/src/plugins/LocateUser/LocateUserPlugin.ts +++ b/backend/src/plugins/LocateUser/LocateUserPlugin.ts @@ -1,13 +1,13 @@ import { PluginOptions } from "knub"; -import { LocateUserPluginType, ConfigSchema } from "./types"; +import { ConfigSchema, LocateUserPluginType } from "./types"; import { zeppelinPlugin } from "../ZeppelinPluginBlueprint"; import { GuildVCAlerts } from "src/data/GuildVCAlerts"; import { outdatedAlertsLoop } from "./utils/outdatedLoop"; import { fillActiveAlertsList } from "./utils/fillAlertsList"; import { WhereCmd } from "./commands/WhereCmd"; import { FollowCmd } from "./commands/FollowCmd"; -import { ListFollowCmd, DeleteFollowCmd } from "./commands/ListFollowCmd"; -import { ChannelJoinAlertsEvt, ChannelSwitchAlertsEvt, ChannelLeaveAlertsEvt } from "./events/SendAlertsEvts"; +import { DeleteFollowCmd, ListFollowCmd } from "./commands/ListFollowCmd"; +import { ChannelJoinAlertsEvt, ChannelLeaveAlertsEvt, ChannelSwitchAlertsEvt } from "./events/SendAlertsEvts"; import { GuildBanRemoveAlertsEvt } from "./events/BanRemoveAlertsEvt"; const defaultOptions: PluginOptions = { @@ -40,9 +40,9 @@ export const LocateUserPlugin = zeppelinPlugin()("locate_u // prettier-ignore events: [ - ChannelJoinAlertsEvt, - ChannelSwitchAlertsEvt, - ChannelLeaveAlertsEvt, + ChannelJoinAlertsEvt, + ChannelSwitchAlertsEvt, + ChannelLeaveAlertsEvt, GuildBanRemoveAlertsEvt ], diff --git a/backend/src/plugins/LocateUser/commands/ListFollowCmd.ts b/backend/src/plugins/LocateUser/commands/ListFollowCmd.ts index 6f77a0b7..dc8e4754 100644 --- a/backend/src/plugins/LocateUser/commands/ListFollowCmd.ts +++ b/backend/src/plugins/LocateUser/commands/ListFollowCmd.ts @@ -1,7 +1,7 @@ import { locateUserCommand } from "../types"; import { sendErrorMessage, sendSuccessMessage } from "src/pluginUtils"; import { commandTypeHelpers as ct } from "../../../commandTypes"; -import { sorter, createChunkedMessage } from "src/utils"; +import { createChunkedMessage, sorter } from "src/utils"; export const ListFollowCmd = locateUserCommand({ trigger: ["follows", "fs"], diff --git a/backend/src/plugins/LocateUser/events/SendAlertsEvts.ts b/backend/src/plugins/LocateUser/events/SendAlertsEvts.ts index f18393af..687c39c6 100644 --- a/backend/src/plugins/LocateUser/events/SendAlertsEvts.ts +++ b/backend/src/plugins/LocateUser/events/SendAlertsEvts.ts @@ -1,6 +1,6 @@ import { locateUserEvent } from "../types"; import { sendAlerts } from "../utils/sendAlerts"; -import { VoiceChannel, TextableChannel } from "eris"; +import { TextableChannel, VoiceChannel } from "eris"; export const ChannelJoinAlertsEvt = locateUserEvent({ event: "voiceChannelJoin", diff --git a/backend/src/plugins/LocateUser/utils/moveMember.ts b/backend/src/plugins/LocateUser/utils/moveMember.ts index 82de1174..51d5ea97 100644 --- a/backend/src/plugins/LocateUser/utils/moveMember.ts +++ b/backend/src/plugins/LocateUser/utils/moveMember.ts @@ -9,7 +9,7 @@ export async function moveMember( target: Member, errorChannel: TextableChannel, ) { - const modMember: Member = await this.bot.getRESTGuildMember(pluginData.guild.id, toMoveID); + const modMember: Member = await pluginData.client.getRESTGuildMember(pluginData.guild.id, toMoveID); if (modMember.voiceState.channelID != null) { try { await modMember.edit({ diff --git a/backend/src/plugins/LocateUser/utils/outdatedLoop.ts b/backend/src/plugins/LocateUser/utils/outdatedLoop.ts index 92d81ef9..192b9cd4 100644 --- a/backend/src/plugins/LocateUser/utils/outdatedLoop.ts +++ b/backend/src/plugins/LocateUser/utils/outdatedLoop.ts @@ -12,6 +12,6 @@ export async function outdatedAlertsLoop(pluginData) { } if (!pluginData.state.unloaded) { - pluginData.state.outdatedAlertsTimeout = setTimeout(() => this.outdatedAlertsLoop(pluginData), ALERT_LOOP_TIME); + pluginData.state.outdatedAlertsTimeout = setTimeout(() => outdatedAlertsLoop(pluginData), ALERT_LOOP_TIME); } } diff --git a/backend/src/plugins/LocateUser/utils/sendAlerts.ts b/backend/src/plugins/LocateUser/utils/sendAlerts.ts index 14ac1405..adbb8bbb 100644 --- a/backend/src/plugins/LocateUser/utils/sendAlerts.ts +++ b/backend/src/plugins/LocateUser/utils/sendAlerts.ts @@ -12,7 +12,7 @@ export async function sendAlerts(pluginData: PluginData, u triggeredAlerts.forEach(alert => { const prepend = `<@!${alert.requestor_id}>, an alert requested by you has triggered!\nReminder: \`${alert.body}\`\n`; const txtChannel = pluginData.client.getChannel(alert.channel_id) as TextableChannel; - sendWhere.call(this, pluginData.guild, member, txtChannel, prepend); + sendWhere(pluginData, member, txtChannel, prepend); if (alert.active) { moveMember(pluginData, alert.requestor_id, member, txtChannel); } diff --git a/backend/src/plugins/LocateUser/utils/sendWhere.ts b/backend/src/plugins/LocateUser/utils/sendWhere.ts index 87d0c690..92842f11 100644 --- a/backend/src/plugins/LocateUser/utils/sendWhere.ts +++ b/backend/src/plugins/LocateUser/utils/sendWhere.ts @@ -1,9 +1,17 @@ -import { Guild, Member, TextableChannel, VoiceChannel } from "eris"; +import { Member, TextableChannel, VoiceChannel } from "eris"; import { getInviteLink } from "knub/dist/helpers"; import { createOrReuseInvite } from "./createOrReuseInvite"; +import { PluginData } from "knub"; +import { LocateUserPluginType } from "../types"; +import { sendErrorMessage } from "../../../pluginUtils"; -export async function sendWhere(guild: Guild, member: Member, channel: TextableChannel, prepend: string) { - const voice = guild.channels.get(member.voiceState.channelID) as VoiceChannel; +export async function sendWhere( + pluginData: PluginData, + member: Member, + channel: TextableChannel, + prepend: string, +) { + const voice = pluginData.guild.channels.get(member.voiceState.channelID) as VoiceChannel; if (voice == null) { channel.createMessage(prepend + "That user is not in a channel"); @@ -12,7 +20,7 @@ export async function sendWhere(guild: Guild, member: Member, channel: TextableC try { invite = await createOrReuseInvite(voice); } catch (e) { - this.sendErrorMessage(channel, "Cannot create an invite to that channel!"); + sendErrorMessage(pluginData, channel, "Cannot create an invite to that channel!"); return; } channel.createMessage( diff --git a/backend/src/plugins/MessageSaver/MessageSaverPlugin.ts b/backend/src/plugins/MessageSaver/MessageSaverPlugin.ts index 2e2f7e2e..3b4dd5a5 100644 --- a/backend/src/plugins/MessageSaver/MessageSaverPlugin.ts +++ b/backend/src/plugins/MessageSaver/MessageSaverPlugin.ts @@ -2,7 +2,7 @@ import { zeppelinPlugin } from "../ZeppelinPluginBlueprint"; import { ConfigSchema, MessageSaverPluginType } from "./types"; import { GuildSavedMessages } from "../../data/GuildSavedMessages"; import { PluginOptions } from "knub"; -import { MessageCreateEvt, MessageUpdateEvt, MessageDeleteEvt, MessageDeleteBulkEvt } from "./events/SaveMessagesEvts"; +import { MessageCreateEvt, MessageDeleteBulkEvt, MessageDeleteEvt, MessageUpdateEvt } from "./events/SaveMessagesEvts"; import { SaveMessagesToDBCmd } from "./commands/SaveMessagesToDB"; import { SavePinsToDBCmd } from "./commands/SavePinsToDB"; diff --git a/backend/src/plugins/MessageSaver/commands/SaveMessagesToDB.ts b/backend/src/plugins/MessageSaver/commands/SaveMessagesToDB.ts index 431acb13..3bddb273 100644 --- a/backend/src/plugins/MessageSaver/commands/SaveMessagesToDB.ts +++ b/backend/src/plugins/MessageSaver/commands/SaveMessagesToDB.ts @@ -1,7 +1,6 @@ import { messageSaverCmd } from "../types"; import { commandTypeHelpers as ct } from "../../../commandTypes"; import { saveMessagesToDB } from "../saveMessagesToDB"; -import { TextChannel } from "eris"; import { sendSuccessMessage } from "src/pluginUtils"; export const SaveMessagesToDBCmd = messageSaverCmd({ diff --git a/backend/src/plugins/MessageSaver/saveMessagesToDB.ts b/backend/src/plugins/MessageSaver/saveMessagesToDB.ts index 7dd6e575..20920225 100644 --- a/backend/src/plugins/MessageSaver/saveMessagesToDB.ts +++ b/backend/src/plugins/MessageSaver/saveMessagesToDB.ts @@ -1,6 +1,6 @@ import { MessageSaverPluginType } from "./types"; import { PluginData } from "knub"; -import { TextChannel, Message } from "eris"; +import { Message, TextChannel } from "eris"; export async function saveMessagesToDB( pluginData: PluginData, diff --git a/backend/src/plugins/Mutes/commands/ClearMutesCmd.ts b/backend/src/plugins/Mutes/commands/ClearMutesCmd.ts index 0ada21c9..87fa730d 100644 --- a/backend/src/plugins/Mutes/commands/ClearMutesCmd.ts +++ b/backend/src/plugins/Mutes/commands/ClearMutesCmd.ts @@ -1,6 +1,5 @@ import { command } from "knub"; import { MutesPluginType } from "../types"; -import { User } from "eris"; import { sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils"; import { commandTypeHelpers as ct } from "../../../commandTypes"; diff --git a/backend/src/plugins/Mutes/commands/ClearMutesWithoutRoleCmd.ts b/backend/src/plugins/Mutes/commands/ClearMutesWithoutRoleCmd.ts index 42966ee1..b463a9ba 100644 --- a/backend/src/plugins/Mutes/commands/ClearMutesWithoutRoleCmd.ts +++ b/backend/src/plugins/Mutes/commands/ClearMutesWithoutRoleCmd.ts @@ -1,6 +1,5 @@ import { command } from "knub"; import { MutesPluginType } from "../types"; -import { User } from "eris"; import { sendSuccessMessage } from "../../../pluginUtils"; import { resolveMember } from "../../../utils"; diff --git a/backend/src/plugins/Mutes/functions/muteUser.ts b/backend/src/plugins/Mutes/functions/muteUser.ts index b838ba9d..bd929998 100644 --- a/backend/src/plugins/Mutes/functions/muteUser.ts +++ b/backend/src/plugins/Mutes/functions/muteUser.ts @@ -2,14 +2,7 @@ import { PluginData } from "knub"; import { MuteOptions, MutesPluginType } from "../types"; import { ERRORS, RecoverablePluginError } from "../../../RecoverablePluginError"; import humanizeDuration from "humanize-duration"; -import { - notifyUser, - resolveMember, - resolveUser, - stripObjectToScalars, - ucfirst, - UserNotificationResult, -} from "../../../utils"; +import { notifyUser, resolveUser, stripObjectToScalars, ucfirst, UserNotificationResult } from "../../../utils"; import { renderTemplate } from "../../../templateFormatter"; import { TextChannel, User } from "eris"; import { CasesPlugin } from "../../Cases/CasesPlugin"; diff --git a/backend/src/plugins/Mutes/types.ts b/backend/src/plugins/Mutes/types.ts index e3014838..d780d618 100644 --- a/backend/src/plugins/Mutes/types.ts +++ b/backend/src/plugins/Mutes/types.ts @@ -8,8 +8,8 @@ import { GuildLogs } from "../../data/GuildLogs"; import { GuildCases } from "../../data/GuildCases"; import { GuildArchives } from "../../data/GuildArchives"; import { GuildMutes } from "../../data/GuildMutes"; -import Timeout = NodeJS.Timeout; import { CaseArgs } from "../Cases/types"; +import Timeout = NodeJS.Timeout; export const ConfigSchema = t.type({ mute_role: tNullable(t.string), diff --git a/backend/src/plugins/NameHistory/NameHistoryPlugin.ts b/backend/src/plugins/NameHistory/NameHistoryPlugin.ts index 19dabb02..9c6f7559 100644 --- a/backend/src/plugins/NameHistory/NameHistoryPlugin.ts +++ b/backend/src/plugins/NameHistory/NameHistoryPlugin.ts @@ -1,5 +1,5 @@ import { PluginOptions } from "knub"; -import { NameHistoryPluginType, ConfigSchema } from "./types"; +import { ConfigSchema, NameHistoryPluginType } from "./types"; import { zeppelinPlugin } from "../ZeppelinPluginBlueprint"; import { GuildNicknameHistory } from "src/data/GuildNicknameHistory"; import { UsernameHistory } from "src/data/UsernameHistory"; diff --git a/backend/src/plugins/NameHistory/commands/NamesCmd.ts b/backend/src/plugins/NameHistory/commands/NamesCmd.ts index 3e5889c3..56b35c3b 100644 --- a/backend/src/plugins/NameHistory/commands/NamesCmd.ts +++ b/backend/src/plugins/NameHistory/commands/NamesCmd.ts @@ -1,6 +1,6 @@ import { nameHistoryCmd } from "../types"; import { commandTypeHelpers as ct } from "../../../commandTypes"; -import { disableCodeBlocks, createChunkedMessage } from "knub/dist/helpers"; +import { createChunkedMessage, disableCodeBlocks } from "knub/dist/helpers"; import { NICKNAME_RETENTION_PERIOD } from "src/data/cleanup/nicknames"; import { DAYS } from "src/utils"; import { MAX_NICKNAME_ENTRIES_PER_USER } from "src/data/GuildNicknameHistory"; diff --git a/backend/src/plugins/Persist/PersistPlugin.ts b/backend/src/plugins/Persist/PersistPlugin.ts index 6233d696..1cdc7e1f 100644 --- a/backend/src/plugins/Persist/PersistPlugin.ts +++ b/backend/src/plugins/Persist/PersistPlugin.ts @@ -1,6 +1,6 @@ import { PluginOptions } from "knub"; import { zeppelinPlugin } from "../ZeppelinPluginBlueprint"; -import { PersistPluginType, ConfigSchema } from "./types"; +import { ConfigSchema, PersistPluginType } from "./types"; import { GuildPersistedData } from "src/data/GuildPersistedData"; import { GuildLogs } from "src/data/GuildLogs"; import { StoreDataEvt } from "./events/StoreDataEvt"; diff --git a/backend/src/plugins/PingableRoles/PingableRolesPlugin.ts b/backend/src/plugins/PingableRoles/PingableRolesPlugin.ts index 50c705c3..88d33836 100644 --- a/backend/src/plugins/PingableRoles/PingableRolesPlugin.ts +++ b/backend/src/plugins/PingableRoles/PingableRolesPlugin.ts @@ -1,10 +1,10 @@ import { PluginOptions } from "knub"; -import { PingableRolesPluginType, ConfigSchema } from "./types"; +import { ConfigSchema, PingableRolesPluginType } from "./types"; import { zeppelinPlugin } from "../ZeppelinPluginBlueprint"; import { GuildPingableRoles } from "src/data/GuildPingableRoles"; import { PingableRoleEnableCmd } from "./commands/PingableRoleEnableCmd"; import { PingableRoleDisableCmd } from "./commands/PingableRoleDisableCmd"; -import { TypingEnablePingableEvt, MessageCreateDisablePingableEvt } from "./events/ChangePingableEvts"; +import { MessageCreateDisablePingableEvt, TypingEnablePingableEvt } from "./events/ChangePingableEvts"; const defaultOptions: PluginOptions = { config: { diff --git a/backend/src/plugins/PingableRoles/types.ts b/backend/src/plugins/PingableRoles/types.ts index 3c8db322..15c3886b 100644 --- a/backend/src/plugins/PingableRoles/types.ts +++ b/backend/src/plugins/PingableRoles/types.ts @@ -1,5 +1,5 @@ import * as t from "io-ts"; -import { BasePluginType, eventListener, command } from "knub"; +import { BasePluginType, command, eventListener } from "knub"; import { GuildPingableRoles } from "src/data/GuildPingableRoles"; import { PingableRole } from "src/data/entities/PingableRole"; diff --git a/backend/src/plugins/Reminders/commands/RemindCmd.ts b/backend/src/plugins/Reminders/commands/RemindCmd.ts index faeacb70..e2dfab86 100644 --- a/backend/src/plugins/Reminders/commands/RemindCmd.ts +++ b/backend/src/plugins/Reminders/commands/RemindCmd.ts @@ -45,7 +45,8 @@ export const RemindCmd = remindersCommand({ return; } - const reminderBody = args.reminder || `https://discord.com/channels/${this.guildId}/${msg.channel.id}/${msg.id}`; + const reminderBody = + args.reminder || `https://discord.com/channels/${pluginData.guild.id}/${msg.channel.id}/${msg.id}`; await pluginData.state.reminders.add( msg.author.id, msg.channel.id, diff --git a/backend/src/plugins/Reminders/commands/RemindersCmd.ts b/backend/src/plugins/Reminders/commands/RemindersCmd.ts index 0273880d..82cceaea 100644 --- a/backend/src/plugins/Reminders/commands/RemindersCmd.ts +++ b/backend/src/plugins/Reminders/commands/RemindersCmd.ts @@ -1,6 +1,6 @@ import { remindersCommand } from "../types"; import { sendErrorMessage } from "src/pluginUtils"; -import { sorter, createChunkedMessage } from "src/utils"; +import { createChunkedMessage, sorter } from "src/utils"; import moment from "moment-timezone"; import humanizeDuration from "humanize-duration"; diff --git a/backend/src/plugins/Utility/commands/ContextCmd.ts b/backend/src/plugins/Utility/commands/ContextCmd.ts index 400460a9..3ef71e8d 100644 --- a/backend/src/plugins/Utility/commands/ContextCmd.ts +++ b/backend/src/plugins/Utility/commands/ContextCmd.ts @@ -21,12 +21,12 @@ export const ContextCmd = utilityCmd({ return; } - const previousMessage = (await this.bot.getMessages(args.channel.id, 1, args.messageId))[0]; + const previousMessage = (await pluginData.client.getMessages(args.channel.id, 1, args.messageId))[0]; if (!previousMessage) { sendErrorMessage(pluginData, msg.channel, "Message context not found"); return; } - msg.channel.createMessage(messageLink(this.guildId, previousMessage.channel.id, previousMessage.id)); + msg.channel.createMessage(messageLink(pluginData.guild.id, previousMessage.channel.id, previousMessage.id)); }, }); diff --git a/backend/src/plugins/Utility/commands/HelpCmd.ts b/backend/src/plugins/Utility/commands/HelpCmd.ts index 3c477cff..d7468537 100644 --- a/backend/src/plugins/Utility/commands/HelpCmd.ts +++ b/backend/src/plugins/Utility/commands/HelpCmd.ts @@ -18,7 +18,7 @@ export const HelpCmd = utilityCmd({ const searchStr = args.command.toLowerCase(); const matchingCommands: Array<{ - plugin: LoadedPlugin; + plugin: LoadedPlugin; command: PluginCommandDefinition; }> = []; @@ -62,12 +62,10 @@ export const HelpCmd = utilityCmd({ .toLowerCase() .replace(/\s/g, "-"); - const pluginName = plugin.blueprint?.name || plugin.class?.pluginName; - let snippet = `**${prefix}${trigger}**`; if (description) snippet += `\n${description}`; if (usage) snippet += `\nBasic usage: \`${usage}\``; - snippet += `\n`; + snippet += `\n`; return snippet; }); diff --git a/backend/src/plugins/WelcomeMessage/WelcomeMessagePlugin.ts b/backend/src/plugins/WelcomeMessage/WelcomeMessagePlugin.ts index 786678a2..3d313754 100644 --- a/backend/src/plugins/WelcomeMessage/WelcomeMessagePlugin.ts +++ b/backend/src/plugins/WelcomeMessage/WelcomeMessagePlugin.ts @@ -1,6 +1,6 @@ import { zeppelinPlugin } from "../ZeppelinPluginBlueprint"; import { PluginOptions } from "knub"; -import { WelcomeMessagePluginType, ConfigSchema } from "./types"; +import { ConfigSchema, WelcomeMessagePluginType } from "./types"; import { GuildLogs } from "src/data/GuildLogs"; import { SendWelcomeMessageEvt } from "./events/SendWelcomeMessageEvt"; diff --git a/backend/src/plugins/WelcomeMessage/events/SendWelcomeMessageEvt.ts b/backend/src/plugins/WelcomeMessage/events/SendWelcomeMessageEvt.ts index fcff7923..1e943643 100644 --- a/backend/src/plugins/WelcomeMessage/events/SendWelcomeMessageEvt.ts +++ b/backend/src/plugins/WelcomeMessage/events/SendWelcomeMessageEvt.ts @@ -1,6 +1,6 @@ import { welcomeEvent } from "../types"; import { renderTemplate } from "src/templateFormatter"; -import { stripObjectToScalars, createChunkedMessage } from "src/utils"; +import { createChunkedMessage, stripObjectToScalars } from "src/utils"; import { LogType } from "src/data/LogType"; import { TextChannel } from "eris"; diff --git a/backend/src/plugins/ZeppelinPlugin.ts b/backend/src/plugins/ZeppelinPlugin.ts index c1ace03c..41ff2d98 100644 --- a/backend/src/plugins/ZeppelinPlugin.ts +++ b/backend/src/plugins/ZeppelinPlugin.ts @@ -1,7 +1,3 @@ -import { ZeppelinPluginClass } from "./ZeppelinPluginClass"; import { ZeppelinPluginBlueprint } from "./ZeppelinPluginBlueprint"; -// prettier-ignore -export type ZeppelinPlugin = - | typeof ZeppelinPluginClass - | ZeppelinPluginBlueprint; +export type ZeppelinPlugin = ZeppelinPluginBlueprint; diff --git a/backend/src/plugins/ZeppelinPluginBlueprint.ts b/backend/src/plugins/ZeppelinPluginBlueprint.ts index 330c9649..ac3bb54d 100644 --- a/backend/src/plugins/ZeppelinPluginBlueprint.ts +++ b/backend/src/plugins/ZeppelinPluginBlueprint.ts @@ -1,6 +1,6 @@ import { BasePluginType, plugin, PluginBlueprint } from "knub"; import * as t from "io-ts"; -import { pluginConfigPreprocessor } from "../pluginUtils"; +import { getPluginConfigPreprocessor } from "../pluginUtils"; export interface ZeppelinPluginBlueprint extends PluginBlueprint { @@ -23,7 +23,7 @@ export function zeppelinPlugin(): < export function zeppelinPlugin(...args) { if (args.length) { const blueprint: ZeppelinPluginBlueprint = plugin(...(args as Parameters)); - blueprint.configPreprocessor = pluginConfigPreprocessor.bind(blueprint); + blueprint.configPreprocessor = getPluginConfigPreprocessor(blueprint); return blueprint; } else { return zeppelinPlugin; diff --git a/backend/src/plugins/ZeppelinPluginClass.ts b/backend/src/plugins/ZeppelinPluginClass.ts deleted file mode 100644 index 4056a807..00000000 --- a/backend/src/plugins/ZeppelinPluginClass.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { BasePluginType, PluginClass, PluginOptions } from "knub"; -import * as t from "io-ts"; -import { TZeppelinKnub, ZeppelinPluginInfo } from "../types"; -import { pluginConfigPreprocessor } from "../pluginUtils"; - -export class ZeppelinPluginClass extends PluginClass { - public static pluginInfo: ZeppelinPluginInfo; - public static showInDocs: boolean = true; - public static configSchema: t.TypeC; - - protected readonly knub: TZeppelinKnub; - - public static configPreprocessor(options: PluginOptions) { - return pluginConfigPreprocessor.bind(this)(options); - } -} diff --git a/backend/src/templateFormatter.ts b/backend/src/templateFormatter.ts index e798b2ff..942786de 100644 --- a/backend/src/templateFormatter.ts +++ b/backend/src/templateFormatter.ts @@ -1,4 +1,4 @@ -import { has, get } from "./utils"; +import { get, has } from "./utils"; import seedrandom from "seedrandom"; const TEMPLATE_CACHE_SIZE = 200; diff --git a/backend/src/utils.ts b/backend/src/utils.ts index f727aeba..a58f751b 100644 --- a/backend/src/utils.ts +++ b/backend/src/utils.ts @@ -23,19 +23,17 @@ import emojiRegex from "emoji-regex"; import * as t from "io-ts"; import fs from "fs"; -const fsp = fs.promises; - import https from "https"; import tmp from "tmp"; -import { logger, helpers } from "knub"; +import { helpers } from "knub"; import { SavedMessage } from "./data/entities/SavedMessage"; import { decodeAndValidateStrict, StrictValidationError } from "./validatorUtils"; import { either } from "fp-ts/lib/Either"; -import safeRegex from "safe-regex"; import moment from "moment-timezone"; -import { performance } from "perf_hooks"; -import { ERRORS } from "./RecoverablePluginError"; import { SimpleCache } from "./SimpleCache"; +import { logger } from "./logger"; + +const fsp = fs.promises; const delayStringMultipliers = { w: 1000 * 60 * 60 * 24 * 7, @@ -946,9 +944,9 @@ export function resolveUserId(bot: Client, value: string) { * Finds a matching User for the passed user id, user mention, or full username (with discriminator). * If a user is not found, returns an UnknownUser instead. */ -export function getUser(userResolvable: string): User | UnknownUser { - const id = resolveUserId(this.client, userResolvable); - return id ? this.client.users.get(id) || new UnknownUser({ id }) : new UnknownUser(); +export function getUser(client: Client, userResolvable: string): User | UnknownUser { + const id = resolveUserId(client, userResolvable); + return id ? client.users.get(id) || new UnknownUser({ id }) : new UnknownUser(); } /** @@ -1058,12 +1056,12 @@ export async function resolveRoleId(bot: Client, guildId: string, value: string) const inviteCache = new SimpleCache>(10 * MINUTES, 200); -export async function resolveInvite(code: string): Promise { +export async function resolveInvite(client: Client, code: string): Promise { if (inviteCache.has(code)) { return inviteCache.get(code); } - const promise = this.client.getInvite(code).catch(() => null); + const promise = client.getInvite(code).catch(() => null); inviteCache.set(code, promise); return promise; diff --git a/backend/src/validation.test.ts b/backend/src/validation.test.ts index a916fff9..e1019a85 100644 --- a/backend/src/validation.test.ts +++ b/backend/src/validation.test.ts @@ -2,7 +2,6 @@ import { tDeepPartial } from "./utils"; import * as t from "io-ts"; import * as validatorUtils from "./validatorUtils"; import test from "ava"; -import util from "util"; test("tDeepPartial works", ava => { const originalSchema = t.type({ diff --git a/backend/src/validatorUtils.ts b/backend/src/validatorUtils.ts index b5743030..3ced8eaf 100644 --- a/backend/src/validatorUtils.ts +++ b/backend/src/validatorUtils.ts @@ -1,6 +1,6 @@ import * as t from "io-ts"; import { pipe } from "fp-ts/lib/pipeable"; -import { fold, either } from "fp-ts/lib/Either"; +import { either, fold } from "fp-ts/lib/Either"; import { noop } from "./utils"; import deepDiff from "deep-diff"; import safeRegex from "safe-regex";