From 1681a450696f190cb24538a0bd45fac5035a5235 Mon Sep 17 00:00:00 2001 From: Dragory <2606411+Dragory@users.noreply.github.com> Date: Thu, 22 Aug 2019 02:58:32 +0300 Subject: [PATCH] More documentation work --- dashboard/src/components/docs/CodeBlock.vue | 7 ++- dashboard/src/components/docs/Layout.vue | 5 +- dashboard/src/components/docs/Plugin.vue | 67 +++++++++++++++++++-- src/api/docs.ts | 52 ++++++++++++++++ src/plugins/AutoReactionsPlugin.ts | 11 +++- src/plugins/Automod.ts | 2 +- src/plugins/BotControl.ts | 2 +- src/plugins/Cases.ts | 11 +++- src/plugins/Censor.ts | 11 +++- src/plugins/ChannelArchiver.ts | 1 + src/plugins/CompanionChannels.ts | 13 +++- src/plugins/CustomEvents.ts | 2 +- src/plugins/GlobalZeppelinPlugin.ts | 2 +- src/plugins/LocateUser.ts | 22 ++++++- src/plugins/Logs.ts | 8 ++- src/plugins/MessageSaver.ts | 2 +- src/plugins/ModActions.ts | 13 ++-- src/plugins/Mutes.ts | 6 +- src/plugins/NameHistory.ts | 2 +- src/plugins/Persist.ts | 6 +- src/plugins/PingableRolesPlugin.ts | 6 +- src/plugins/Post.ts | 6 +- src/plugins/ReactionRoles.ts | 6 +- src/plugins/Reminders.ts | 6 +- src/plugins/SelfGrantableRolesPlugin.ts | 2 +- src/plugins/Slowmode.ts | 6 +- src/plugins/Spam.ts | 6 +- src/plugins/Starboard.ts | 2 +- src/plugins/Tags.ts | 6 +- src/plugins/Utility.ts | 14 ++++- src/plugins/WelcomeMessage.ts | 8 ++- src/plugins/ZeppelinPlugin.ts | 8 ++- src/utils.ts | 22 ++++++- 33 files changed, 286 insertions(+), 57 deletions(-) diff --git a/dashboard/src/components/docs/CodeBlock.vue b/dashboard/src/components/docs/CodeBlock.vue index 95c984c0..b716e7a0 100644 --- a/dashboard/src/components/docs/CodeBlock.vue +++ b/dashboard/src/components/docs/CodeBlock.vue @@ -1,16 +1,17 @@ diff --git a/dashboard/src/components/docs/Layout.vue b/dashboard/src/components/docs/Layout.vue index 3bb85ed9..5b9de5f1 100644 --- a/dashboard/src/components/docs/Layout.vue +++ b/dashboard/src/components/docs/Layout.vue @@ -105,8 +105,9 @@ } .docs-sidebar-content { - position: sticky; - top: 20px; + /* can't scroll with a long list before reaching the end of the page, figure out */ + /*position: sticky;*/ + /*top: 20px;*/ } .docs-sidebar .menu { diff --git a/dashboard/src/components/docs/Plugin.vue b/dashboard/src/components/docs/Plugin.vue index b8d58297..6f2aee6e 100644 --- a/dashboard/src/components/docs/Plugin.vue +++ b/dashboard/src/components/docs/Plugin.vue @@ -8,16 +8,28 @@ Name in config: {{ data.name }}

-
-

Description

-
-
+
-

Default configuration

+

+ To enable this plugin with default configuration, add {{ data.name }}: {} to the plugins list in config +

+ +

Default configuration

{{ renderConfiguration(data.options) }} + +
+

Config schema

+ + + +
+
+ {{ data.configSchema }} +
+
-

Commands

+

Commands

!{{ command.trigger }}

@@ -30,6 +42,40 @@ Shortcut: !{{ alias }}
+
+ + +
+

Additional information

+ + + +
+
+ Signatures: +
    +
  • + + !{{ command.trigger }} + {{ renderParameter(param) }} + +
  • +
+ +
+ Command arguments: +
    +
  • + {{ renderParameter(param) }} + {{ param.type || 'string' }} +
    + {{ renderMarkdown(command.config.info.parameterDescriptions[param.name]) }} +
    +
  • +
+
+
+
@@ -59,6 +105,15 @@ [this.pluginName]: options, }); }, + renderParameter(param) { + let str = `${param.name}`; + if (param.rest) str += '...'; + if (param.required) { + return `<${str}>`; + } else { + return `[${str}]`; + } + }, }, data() { return { diff --git a/src/api/docs.ts b/src/api/docs.ts index d35e8ab6..324a1079 100644 --- a/src/api/docs.ts +++ b/src/api/docs.ts @@ -3,9 +3,58 @@ import { availablePlugins } from "../plugins/availablePlugins"; import { ZeppelinPlugin } from "../plugins/ZeppelinPlugin"; import { notFound } from "./responses"; import { CommandManager, ICommandConfig } from "knub/dist/CommandManager"; +import { dropPropertiesByName, indentLines } from "../utils"; const commandManager = new CommandManager(); +function formatConfigSchema(schema) { + if (schema._tag === "InterfaceType" || schema._tag === "PartialType") { + return ( + `{\n` + + Object.entries(schema.props) + .map(([k, value]) => indentLines(`${k}: ${formatConfigSchema(value)}`, 2)) + .join("\n") + + "\n}" + ); + } else if (schema._tag === "DictionaryType") { + return "{\n" + indentLines(`[string]: ${formatConfigSchema(schema.codomain)}`, 2) + "\n}"; + } else { + return schema.name; + } +} + +function formatTypeName(typeName) { + let result = ""; + let indent = 0; + let skip = false; + for (const char of [...typeName]) { + if (skip) { + skip = false; + continue; + } + + if (char === "}") { + result += "\n"; + indent--; + skip = true; + } + + result += char; + + if (char === "{") { + result += "\n"; + indent++; + skip = true; + } + + if (char === ",") { + result += "\n"; + skip = true; + } + } + return result; +} + export function initDocs(app: express.Express) { const docsPlugins = availablePlugins.filter(pluginClass => pluginClass.showInDocs); @@ -60,9 +109,12 @@ export function initDocs(app: express.Express) { const options = (pluginClass as typeof ZeppelinPlugin).getStaticDefaultOptions(); + const configSchema = pluginClass.configSchema && formatConfigSchema(pluginClass.configSchema); + res.json({ name: pluginClass.pluginName, info: pluginClass.pluginInfo || {}, + configSchema, options, commands, }); diff --git a/src/plugins/AutoReactionsPlugin.ts b/src/plugins/AutoReactionsPlugin.ts index bb070613..45e1d653 100644 --- a/src/plugins/AutoReactionsPlugin.ts +++ b/src/plugins/AutoReactionsPlugin.ts @@ -4,7 +4,7 @@ import { SavedMessage } from "../data/entities/SavedMessage"; import { GuildAutoReactions } from "../data/GuildAutoReactions"; import { Message } from "eris"; import { customEmojiRegex, errorMessage, isEmoji, successMessage } from "../utils"; -import { ZeppelinPlugin } from "./ZeppelinPlugin"; +import { trimPluginDescription, ZeppelinPlugin } from "./ZeppelinPlugin"; import * as t from "io-ts"; const ConfigSchema = t.type({ @@ -14,7 +14,14 @@ type TConfigSchema = t.TypeOf; export class AutoReactionsPlugin extends ZeppelinPlugin { public static pluginName = "auto_reactions"; - protected static configSchema = ConfigSchema; + public static configSchema = ConfigSchema; + + public static pluginInfo = { + prettyName: "Auto-reactions", + description: trimPluginDescription(` + Allows setting up automatic reactions to all new messages on a channel + `), + }; protected savedMessages: GuildSavedMessages; protected autoReactions: GuildAutoReactions; diff --git a/src/plugins/Automod.ts b/src/plugins/Automod.ts index f67b9f79..5b90959f 100644 --- a/src/plugins/Automod.ts +++ b/src/plugins/Automod.ts @@ -309,7 +309,7 @@ const inviteCache = new SimpleCache(10 * MINUTES); export class AutomodPlugin extends ZeppelinPlugin { public static pluginName = "automod"; - protected static configSchema = ConfigSchema; + public static configSchema = ConfigSchema; public static dependencies = ["mod_actions", "mutes"]; protected unloaded = false; diff --git a/src/plugins/BotControl.ts b/src/plugins/BotControl.ts index 25eedc64..8ab6af4f 100644 --- a/src/plugins/BotControl.ts +++ b/src/plugins/BotControl.ts @@ -23,7 +23,7 @@ type TConfigSchema = t.TypeOf; */ export class BotControlPlugin extends GlobalZeppelinPlugin { public static pluginName = "bot_control"; - protected static configSchema = ConfigSchema; + public static configSchema = ConfigSchema; protected archives: GuildArchives; diff --git a/src/plugins/Cases.ts b/src/plugins/Cases.ts index ff265591..a08db070 100644 --- a/src/plugins/Cases.ts +++ b/src/plugins/Cases.ts @@ -4,7 +4,7 @@ import { CaseTypes } from "../data/CaseTypes"; import { Case } from "../data/entities/Case"; import moment from "moment-timezone"; import { CaseTypeColors } from "../data/CaseTypeColors"; -import { ZeppelinPlugin } from "./ZeppelinPlugin"; +import { trimPluginDescription, ZeppelinPlugin } from "./ZeppelinPlugin"; import { GuildArchives } from "../data/GuildArchives"; import { IPluginOptions } from "knub"; import { GuildLogs } from "../data/GuildLogs"; @@ -45,7 +45,14 @@ export type CaseNoteArgs = { export class CasesPlugin extends ZeppelinPlugin { public static pluginName = "cases"; - protected static configSchema = ConfigSchema; + public static configSchema = ConfigSchema; + + public static pluginInfo = { + prettyName: "Cases", + description: trimPluginDescription(` + This plugin contains basic configuration for cases created by other plugins + `), + }; protected cases: GuildCases; protected archives: GuildArchives; diff --git a/src/plugins/Censor.ts b/src/plugins/Censor.ts index 791403ed..4647bb77 100644 --- a/src/plugins/Censor.ts +++ b/src/plugins/Censor.ts @@ -14,7 +14,7 @@ import { import { ZalgoRegex } from "../data/Zalgo"; import { GuildSavedMessages } from "../data/GuildSavedMessages"; import { SavedMessage } from "../data/entities/SavedMessage"; -import { ZeppelinPlugin } from "./ZeppelinPlugin"; +import { trimPluginDescription, ZeppelinPlugin } from "./ZeppelinPlugin"; import cloneDeep from "lodash.clonedeep"; import * as t from "io-ts"; import { TSafeRegex } from "../validatorUtils"; @@ -38,7 +38,14 @@ type TConfigSchema = t.TypeOf; export class CensorPlugin extends ZeppelinPlugin { public static pluginName = "censor"; - protected static configSchema = ConfigSchema; + public static configSchema = ConfigSchema; + + public static pluginInfo = { + prettyName: "Censor", + description: trimPluginDescription(` + Censor words, tokens, links, regex, etc. + `), + }; protected serverLogs: GuildLogs; protected savedMessages: GuildSavedMessages; diff --git a/src/plugins/ChannelArchiver.ts b/src/plugins/ChannelArchiver.ts index 3ce48be9..93af4cc5 100644 --- a/src/plugins/ChannelArchiver.ts +++ b/src/plugins/ChannelArchiver.ts @@ -15,6 +15,7 @@ const MAX_ATTACHMENT_REHOST_SIZE = 1024 * 1024 * 8; export class ChannelArchiverPlugin extends ZeppelinPlugin { public static pluginName = "channel_archiver"; + public static showInDocs = false; protected isOwner(userId) { const owners = this.knub.getGlobalConfig().owners || []; diff --git a/src/plugins/CompanionChannels.ts b/src/plugins/CompanionChannels.ts index dc3f16c9..fc371d54 100644 --- a/src/plugins/CompanionChannels.ts +++ b/src/plugins/CompanionChannels.ts @@ -1,5 +1,5 @@ import { decorators as d, IPluginOptions, logger } from "knub"; -import { ZeppelinPlugin } from "./ZeppelinPlugin"; +import { trimPluginDescription, ZeppelinPlugin } from "./ZeppelinPlugin"; import { Member, Channel, GuildChannel, PermissionOverwrite, Permission, Message, TextChannel } from "eris"; import * as t from "io-ts"; import { tNullable } from "../utils"; @@ -28,7 +28,16 @@ const defaultCompanionChannelOpts: Partial = { export class CompanionChannelPlugin extends ZeppelinPlugin { public static pluginName = "companion_channels"; - protected static configSchema = ConfigSchema; + public static configSchema = ConfigSchema; + + public static pluginInfo = { + prettyName: "Companion channels", + description: trimPluginDescription(` + Set up 'companion channels' between text and voice channels. + Once set up, any time a user joins one of the specified voice channels, + they'll get channel permissions applied to them for the text channels. + `), + }; public static getStaticDefaultOptions(): IPluginOptions { return { diff --git a/src/plugins/CustomEvents.ts b/src/plugins/CustomEvents.ts index a2c89ab9..d2e8281d 100644 --- a/src/plugins/CustomEvents.ts +++ b/src/plugins/CustomEvents.ts @@ -72,7 +72,7 @@ export class CustomEventsPlugin extends ZeppelinPlugin { public static pluginName = "custom_events"; public static showInDocs = false; public static dependencies = ["cases"]; - protected static configSchema = ConfigSchema; + public static configSchema = ConfigSchema; private clearTriggers: () => void; diff --git a/src/plugins/GlobalZeppelinPlugin.ts b/src/plugins/GlobalZeppelinPlugin.ts index 50d40689..73f21cef 100644 --- a/src/plugins/GlobalZeppelinPlugin.ts +++ b/src/plugins/GlobalZeppelinPlugin.ts @@ -13,7 +13,7 @@ import { mergeConfig } from "knub/dist/configUtils"; const SLOW_RESOLVE_THRESHOLD = 1500; export class GlobalZeppelinPlugin extends GlobalPlugin { - protected static configSchema: t.TypeC; + public static configSchema: t.TypeC; public static dependencies = []; /** diff --git a/src/plugins/LocateUser.ts b/src/plugins/LocateUser.ts index e9cf853e..d859f17c 100644 --- a/src/plugins/LocateUser.ts +++ b/src/plugins/LocateUser.ts @@ -1,5 +1,5 @@ import { decorators as d, IPluginOptions, getInviteLink, logger } from "knub"; -import { ZeppelinPlugin } from "./ZeppelinPlugin"; +import { trimPluginDescription, ZeppelinPlugin } from "./ZeppelinPlugin"; import humanizeDuration from "humanize-duration"; import { Message, Member, Guild, TextableChannel, VoiceChannel, Channel, User } from "eris"; import { GuildVCAlerts } from "../data/GuildVCAlerts"; @@ -17,7 +17,16 @@ const ALERT_LOOP_TIME = 30 * 1000; export class LocatePlugin extends ZeppelinPlugin { public static pluginName = "locate_user"; - protected static configSchema = ConfigSchema; + public static configSchema = ConfigSchema; + + public static pluginInfo = { + prettyName: "Locate user", + description: trimPluginDescription(` + This plugin allows users with access to the commands the following: + * Instantly receive an invite to the voice channel of a user + * Be notified as soon as a user switches or joins a voice channel + `), + }; private alerts: GuildVCAlerts; private outdatedAlertsTimeout; @@ -68,7 +77,11 @@ export class LocatePlugin extends ZeppelinPlugin { }); } - @d.command("where", "", {}) + @d.command("where", "", { + info: { + description: "Posts an instant invite to the voice channel that `` is in", + }, + }) @d.permission("can_where") async whereCmd(msg: Message, args: { member: Member; time?: number; reminder?: string }) { const member = await resolveMember(this.bot, this.guild, args.member.id); @@ -77,6 +90,9 @@ export class LocatePlugin extends ZeppelinPlugin { @d.command("vcalert", " [duration:delay] [reminder:string$]", { aliases: ["vca"], + info: { + description: "Sets up an alert that notifies you any time `` switches or joins voice channels", + }, }) @d.permission("can_alert") async vcalertCmd(msg: Message, args: { member: Member; duration?: number; reminder?: string }) { diff --git a/src/plugins/Logs.ts b/src/plugins/Logs.ts index 349f8eb3..d2ab4380 100644 --- a/src/plugins/Logs.ts +++ b/src/plugins/Logs.ts @@ -22,7 +22,7 @@ import { GuildSavedMessages } from "../data/GuildSavedMessages"; import { SavedMessage } from "../data/entities/SavedMessage"; import { GuildArchives } from "../data/GuildArchives"; import { GuildCases } from "../data/GuildCases"; -import { ZeppelinPlugin } from "./ZeppelinPlugin"; +import { trimPluginDescription, ZeppelinPlugin } from "./ZeppelinPlugin"; import { renderTemplate, TemplateParseError } from "../templateFormatter"; import cloneDeep from "lodash.clonedeep"; import * as t from "io-ts"; @@ -53,7 +53,11 @@ type TConfigSchema = t.TypeOf; export class LogsPlugin extends ZeppelinPlugin { public static pluginName = "logs"; - protected static configSchema = ConfigSchema; + public static configSchema = ConfigSchema; + + public static pluginInfo = { + prettyName: "Logs", + }; protected guildLogs: GuildLogs; protected savedMessages: GuildSavedMessages; diff --git a/src/plugins/MessageSaver.ts b/src/plugins/MessageSaver.ts index a8c3bb89..d8567b05 100644 --- a/src/plugins/MessageSaver.ts +++ b/src/plugins/MessageSaver.ts @@ -13,7 +13,7 @@ type TConfigSchema = t.TypeOf; export class MessageSaverPlugin extends ZeppelinPlugin { public static pluginName = "message_saver"; public static showInDocs = false; - protected static configSchema = ConfigSchema; + public static configSchema = ConfigSchema; protected savedMessages: GuildSavedMessages; diff --git a/src/plugins/ModActions.ts b/src/plugins/ModActions.ts index 2b6edd42..093e9629 100644 --- a/src/plugins/ModActions.ts +++ b/src/plugins/ModActions.ts @@ -26,7 +26,7 @@ import { GuildMutes } from "../data/GuildMutes"; import { CaseTypes } from "../data/CaseTypes"; import { GuildLogs } from "../data/GuildLogs"; import { LogType } from "../data/LogType"; -import { ZeppelinPlugin } from "./ZeppelinPlugin"; +import { trimPluginDescription, ZeppelinPlugin } from "./ZeppelinPlugin"; import { Case } from "../data/entities/Case"; import { renderTemplate } from "../templateFormatter"; import { CaseArgs, CasesPlugin } from "./Cases"; @@ -108,18 +108,13 @@ type WarnMemberNotifyRetryCallback = () => boolean | Promise; export class ModActionsPlugin extends ZeppelinPlugin { public static pluginName = "mod_actions"; public static dependencies = ["cases", "mutes"]; - protected static configSchema = ConfigSchema; + public static configSchema = ConfigSchema; public static pluginInfo = { prettyName: "Mod actions", - description: trimIndents( - trimEmptyStartEndLines(` - Testing **things** - - Multiline haHAA + description: trimPluginDescription(` + This plugin contains the 'typical' mod actions such as warning, muting, kicking, banning, etc. `), - 6, - ), }; protected mutes: GuildMutes; diff --git a/src/plugins/Mutes.ts b/src/plugins/Mutes.ts index e86e93d4..f6ca8b98 100644 --- a/src/plugins/Mutes.ts +++ b/src/plugins/Mutes.ts @@ -64,7 +64,11 @@ const FIRST_CHECK_INCREMENT = 5 * 1000; export class MutesPlugin extends ZeppelinPlugin { public static pluginName = "mutes"; - protected static configSchema = ConfigSchema; + public static configSchema = ConfigSchema; + + public static pluginInfo = { + prettyName: "Mutes", + }; protected mutes: GuildMutes; protected cases: GuildCases; diff --git a/src/plugins/NameHistory.ts b/src/plugins/NameHistory.ts index d8756c1e..19ce73f2 100644 --- a/src/plugins/NameHistory.ts +++ b/src/plugins/NameHistory.ts @@ -14,7 +14,7 @@ type TConfigSchema = t.TypeOf; export class NameHistoryPlugin extends ZeppelinPlugin { public static pluginName = "name_history"; public static showInDocs = false; - protected static configSchema = ConfigSchema; + public static configSchema = ConfigSchema; protected nicknameHistory: GuildNicknameHistory; protected usernameHistory: UsernameHistory; diff --git a/src/plugins/Persist.ts b/src/plugins/Persist.ts index 801c7b08..240f5518 100644 --- a/src/plugins/Persist.ts +++ b/src/plugins/Persist.ts @@ -17,7 +17,11 @@ type TConfigSchema = t.TypeOf; export class PersistPlugin extends ZeppelinPlugin { public static pluginName = "persist"; - protected static configSchema = ConfigSchema; + public static configSchema = ConfigSchema; + + public static pluginInfo = { + prettyName: "Persist", + }; protected persistedData: GuildPersistedData; protected logs: GuildLogs; diff --git a/src/plugins/PingableRolesPlugin.ts b/src/plugins/PingableRolesPlugin.ts index 95998436..895f042f 100644 --- a/src/plugins/PingableRolesPlugin.ts +++ b/src/plugins/PingableRolesPlugin.ts @@ -15,7 +15,11 @@ const TIMEOUT = 10 * 1000; export class PingableRolesPlugin extends ZeppelinPlugin { public static pluginName = "pingable_roles"; - protected static configSchema = ConfigSchema; + public static configSchema = ConfigSchema; + + public static pluginInfo = { + prettyName: "Pingable roles", + }; protected pingableRoles: GuildPingableRoles; protected cache: Map; diff --git a/src/plugins/Post.ts b/src/plugins/Post.ts index 46e74dc4..b949bb62 100644 --- a/src/plugins/Post.ts +++ b/src/plugins/Post.ts @@ -38,7 +38,11 @@ const SCHEDULED_POST_PREVIEW_TEXT_LENGTH = 50; export class PostPlugin extends ZeppelinPlugin { public static pluginName = "post"; - protected static configSchema = ConfigSchema; + public static configSchema = ConfigSchema; + + public static pluginInfo = { + prettyName: "Post", + }; protected savedMessages: GuildSavedMessages; protected scheduledPosts: GuildScheduledPosts; diff --git a/src/plugins/ReactionRoles.ts b/src/plugins/ReactionRoles.ts index 0d6dc570..c2218544 100644 --- a/src/plugins/ReactionRoles.ts +++ b/src/plugins/ReactionRoles.ts @@ -44,7 +44,11 @@ type PendingMemberRoleChanges = { export class ReactionRolesPlugin extends ZeppelinPlugin { public static pluginName = "reaction_roles"; - protected static configSchema = ConfigSchema; + public static configSchema = ConfigSchema; + + public static pluginInfo = { + prettyName: "Reaction roles", + }; protected reactionRoles: GuildReactionRoles; protected savedMessages: GuildSavedMessages; diff --git a/src/plugins/Reminders.ts b/src/plugins/Reminders.ts index 3be96382..b97dc72d 100644 --- a/src/plugins/Reminders.ts +++ b/src/plugins/Reminders.ts @@ -24,7 +24,11 @@ const MAX_TRIES = 3; export class RemindersPlugin extends ZeppelinPlugin { public static pluginName = "reminders"; - protected static configSchema = ConfigSchema; + public static configSchema = ConfigSchema; + + public static pluginInfo = { + prettyName: "Reminders", + }; protected reminders: GuildReminders; protected tries: Map; diff --git a/src/plugins/SelfGrantableRolesPlugin.ts b/src/plugins/SelfGrantableRolesPlugin.ts index 370a81dc..232898be 100644 --- a/src/plugins/SelfGrantableRolesPlugin.ts +++ b/src/plugins/SelfGrantableRolesPlugin.ts @@ -15,7 +15,7 @@ type TConfigSchema = t.TypeOf; export class SelfGrantableRolesPlugin extends ZeppelinPlugin { public static pluginName = "self_grantable_roles"; public static showInDocs = false; - protected static configSchema = ConfigSchema; + public static configSchema = ConfigSchema; protected selfGrantableRoles: GuildSelfGrantableRoles; diff --git a/src/plugins/Slowmode.ts b/src/plugins/Slowmode.ts index bd402397..0fc58751 100644 --- a/src/plugins/Slowmode.ts +++ b/src/plugins/Slowmode.ts @@ -33,7 +33,11 @@ const BOT_SLOWMODE_CLEAR_INTERVAL = 60 * 1000; export class SlowmodePlugin extends ZeppelinPlugin { public static pluginName = "slowmode"; - protected static configSchema = ConfigSchema; + public static configSchema = ConfigSchema; + + public static pluginInfo = { + prettyName: "Slowmode", + }; protected slowmodes: GuildSlowmodes; protected savedMessages: GuildSavedMessages; diff --git a/src/plugins/Spam.ts b/src/plugins/Spam.ts index 6c7687db..6447d791 100644 --- a/src/plugins/Spam.ts +++ b/src/plugins/Spam.ts @@ -74,7 +74,11 @@ const SPAM_ARCHIVE_EXPIRY_DAYS = 90; export class SpamPlugin extends ZeppelinPlugin { public static pluginName = "spam"; - protected static configSchema = ConfigSchema; + public static configSchema = ConfigSchema; + + public static pluginInfo = { + prettyName: "Spam protection", + }; protected logs: GuildLogs; protected archives: GuildArchives; diff --git a/src/plugins/Starboard.ts b/src/plugins/Starboard.ts index 89ac79a8..2556acc3 100644 --- a/src/plugins/Starboard.ts +++ b/src/plugins/Starboard.ts @@ -26,7 +26,7 @@ type TConfigSchema = t.TypeOf; export class StarboardPlugin extends ZeppelinPlugin { public static pluginName = "starboard"; public static showInDocs = false; - protected static configSchema = ConfigSchema; + public static configSchema = ConfigSchema; protected starboards: GuildStarboards; protected savedMessages: GuildSavedMessages; diff --git a/src/plugins/Tags.ts b/src/plugins/Tags.ts index cd17c4a8..a6570600 100644 --- a/src/plugins/Tags.ts +++ b/src/plugins/Tags.ts @@ -23,7 +23,11 @@ type TConfigSchema = t.TypeOf; export class TagsPlugin extends ZeppelinPlugin { public static pluginName = "tags"; - protected static configSchema = ConfigSchema; + public static configSchema = ConfigSchema; + + public static pluginInfo = { + prettyName: "Tags", + }; protected archives: GuildArchives; protected tags: GuildTags; diff --git a/src/plugins/Utility.ts b/src/plugins/Utility.ts index 4ffc733a..ae4037e4 100644 --- a/src/plugins/Utility.ts +++ b/src/plugins/Utility.ts @@ -82,7 +82,11 @@ type MemberSearchParams = { export class UtilityPlugin extends ZeppelinPlugin { public static pluginName = "utility"; - protected static configSchema = ConfigSchema; + public static configSchema = ConfigSchema; + + public static pluginInfo = { + prettyName: "Utility", + }; protected logs: GuildLogs; protected cases: GuildCases; @@ -698,7 +702,9 @@ export class UtilityPlugin extends ZeppelinPlugin { msg.channel.createMessage({ embed }); } - @d.command(/(?:nickname|nick) reset/, "") + @d.command("nickname reset", "", { + aliases: ["nick reset"], + }) @d.permission("can_nickname") async nicknameResetCmd(msg: Message, args: { member: Member }) { if (msg.member.id !== args.member.id && !this.canActOn(msg.member, args.member)) { @@ -718,7 +724,9 @@ export class UtilityPlugin extends ZeppelinPlugin { msg.channel.createMessage(successMessage(`The nickname of <@!${args.member.id}> has been reset`)); } - @d.command(/nickname|nick/, " ") + @d.command("nickname", " ", { + aliases: ["nick"], + }) @d.permission("can_nickname") async nicknameCmd(msg: Message, args: { member: Member; nickname: string }) { if (msg.member.id !== args.member.id && !this.canActOn(msg.member, args.member)) { diff --git a/src/plugins/WelcomeMessage.ts b/src/plugins/WelcomeMessage.ts index 9a27ff14..330858c6 100644 --- a/src/plugins/WelcomeMessage.ts +++ b/src/plugins/WelcomeMessage.ts @@ -16,11 +16,15 @@ type TConfigSchema = t.TypeOf; export class WelcomeMessagePlugin extends ZeppelinPlugin { public static pluginName = "welcome_message"; - protected static configSchema = ConfigSchema; + public static configSchema = ConfigSchema; + + public static pluginInfo = { + prettyName: "Welcome message", + }; protected logs: GuildLogs; - protected getDefaultOptions(): IPluginOptions { + public static getStaticDefaultOptions(): IPluginOptions { return { config: { send_dm: false, diff --git a/src/plugins/ZeppelinPlugin.ts b/src/plugins/ZeppelinPlugin.ts index e76a36b1..db16e904 100644 --- a/src/plugins/ZeppelinPlugin.ts +++ b/src/plugins/ZeppelinPlugin.ts @@ -11,6 +11,8 @@ import { resolveMember, resolveUser, resolveUserId, + trimEmptyStartEndLines, + trimIndents, UnknownUser, } from "../utils"; import { Member, User } from "eris"; @@ -34,11 +36,15 @@ export interface CommandInfo { }; } +export function trimPluginDescription(str) { + return trimIndents(trimEmptyStartEndLines(str), 6); +} + export class ZeppelinPlugin extends Plugin { public static pluginInfo: PluginInfo; public static showInDocs: boolean = true; - protected static configSchema: t.TypeC; + public static configSchema: t.TypeC; public static dependencies = []; protected throwPluginRuntimeError(message: string) { diff --git a/src/utils.ts b/src/utils.ts index 669d3dbf..f57367f8 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -39,7 +39,16 @@ export const HOURS = 60 * MINUTES; export const DAYS = 24 * HOURS; export function tNullable>(type: T) { - return t.union([type, t.undefined, t.null]); + return t.union([type, t.undefined, t.null], type.name); +} + +export function dropPropertiesByName(obj, propName) { + if (obj.hasOwnProperty(propName)) delete obj[propName]; + for (const value of Object.values(obj)) { + if (typeof value === "object" && value !== null && !Array.isArray(value)) { + dropPropertiesByName(value, propName); + } + } } /** @@ -275,6 +284,17 @@ export function trimIndents(str: string, indentLength: number) { .join("\n"); } +export function indentLine(str: string, indentLength: number) { + return " ".repeat(indentLength) + str; +} + +export function indentLines(str: string, indentLength: number) { + return str + .split("\n") + .map(line => indentLine(line, indentLength)) + .join("\n"); +} + export const emptyEmbedValue = "\u200b"; export const embedPadding = "\n" + emptyEmbedValue;