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 }}
-
+
- Default configuration
+
+ To enable this plugin with default configuration, add {{ data.name }}: {}
to the plugins
list in config
+
+
+ Default configuration
{{ renderConfiguration(data.options) }}
+
+
+
+ {{ data.configSchema }}
+
+
-
Commands
+
Commands
!{{ command.trigger }}
@@ -30,6 +42,40 @@
Shortcut:
!{{ alias }}
+
+
+
+
+
+ Signatures:
+
+ -
+
+ !{{ command.trigger }}
+ {{ renderParameter(param) }}
+
+
+
+
+
+
+
@@ -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;