3
0
Fork 0
mirror of https://github.com/ZeppelinBot/Zeppelin.git synced 2025-03-15 05:41:51 +00:00

Update to Knub30.0.0-beta.37 and Eris 0.15, first pass

This commit is contained in:
Dragory 2021-05-23 14:35:16 +03:00
parent 84da543205
commit f6be4f4af6
No known key found for this signature in database
GPG key ID: 5F387BA66DF8AAC1
133 changed files with 6507 additions and 380 deletions

6126
backend/package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -31,7 +31,7 @@
"deep-diff": "^1.0.2", "deep-diff": "^1.0.2",
"dotenv": "^4.0.0", "dotenv": "^4.0.0",
"emoji-regex": "^8.0.0", "emoji-regex": "^8.0.0",
"eris": "github:abalabahaha/eris#dev", "eris": "^0.15.1",
"erlpack": "github:abalabahaha/erlpack", "erlpack": "github:abalabahaha/erlpack",
"escape-string-regexp": "^1.0.5", "escape-string-regexp": "^1.0.5",
"express": "^4.17.0", "express": "^4.17.0",
@ -39,7 +39,7 @@
"humanize-duration": "^3.15.0", "humanize-duration": "^3.15.0",
"io-ts": "^2.0.0", "io-ts": "^2.0.0",
"js-yaml": "^3.13.1", "js-yaml": "^3.13.1",
"knub": "^30.0.0-beta.35", "knub": "^30.0.0-beta.37",
"knub-command-manager": "^8.1.2", "knub-command-manager": "^8.1.2",
"last-commit-log": "^2.1.0", "last-commit-log": "^2.1.0",
"lodash.chunk": "^4.2.0", "lodash.chunk": "^4.2.0",

View file

@ -12,7 +12,7 @@ import {
UnknownUser, UnknownUser,
} from "./utils"; } from "./utils";
import { GuildChannel, Member, TextChannel, User } from "eris"; import { GuildChannel, Member, TextChannel, User } from "eris";
import { baseTypeConverters, baseTypeHelpers, CommandContext, TypeConversionError } from "knub"; import { baseTypeConverters, baseCommandParameterTypeHelpers, CommandContext, TypeConversionError } from "knub";
import { createTypeHelper } from "knub-command-manager"; import { createTypeHelper } from "knub-command-manager";
import { getChannelIdFromMessageId } from "./data/getChannelIdFromMessageId"; import { getChannelIdFromMessageId } from "./data/getChannelIdFromMessageId";
import { MessageTarget, resolveMessageTarget } from "./utils/resolveMessageTarget"; import { MessageTarget, resolveMessageTarget } from "./utils/resolveMessageTarget";
@ -107,7 +107,7 @@ export const commandTypes = {
}; };
export const commandTypeHelpers = { export const commandTypeHelpers = {
...baseTypeHelpers, ...baseCommandParameterTypeHelpers,
delay: createTypeHelper<number>(commandTypes.delay), delay: createTypeHelper<number>(commandTypes.delay),
resolvedUser: createTypeHelper<Promise<User>>(commandTypes.resolvedUser), resolvedUser: createTypeHelper<Promise<User>>(commandTypes.resolvedUser),

View file

@ -37,7 +37,7 @@ export async function validateGuildConfig(config: any): Promise<string | null> {
const plugin = pluginNameToPlugin.get(pluginName)!; const plugin = pluginNameToPlugin.get(pluginName)!;
try { try {
const mergedOptions = configUtils.mergeConfig(plugin.defaultOptions || {}, pluginOptions); const mergedOptions = configUtils.mergeConfig(plugin.defaultOptions || {}, pluginOptions);
await plugin.configPreprocessor?.(mergedOptions as PluginOptions<any>); await plugin.configPreprocessor?.((mergedOptions as unknown) as PluginOptions<any>);
} catch (err) { } catch (err) {
if (err instanceof ConfigValidationError || err instanceof StrictValidationError) { if (err instanceof ConfigValidationError || err instanceof StrictValidationError) {
return `${pluginName}: ${err.message}`; return `${pluginName}: ${err.message}`;

View file

@ -2,7 +2,7 @@ import { getRepository, Repository } from "typeorm";
import { BaseGuildRepository } from "./BaseGuildRepository"; import { BaseGuildRepository } from "./BaseGuildRepository";
import { ISavedMessageData, SavedMessage } from "./entities/SavedMessage"; import { ISavedMessageData, SavedMessage } from "./entities/SavedMessage";
import { QueuedEventEmitter } from "../QueuedEventEmitter"; import { QueuedEventEmitter } from "../QueuedEventEmitter";
import { GuildChannel, Message } from "eris"; import { GuildChannel, Message, PossiblyUncachedTextableChannel } from "eris";
import moment from "moment-timezone"; import moment from "moment-timezone";
import { MINUTES, SECONDS } from "../utils"; import { MINUTES, SECONDS } from "../utils";
import { isAPI } from "../globals"; import { isAPI } from "../globals";
@ -34,7 +34,7 @@ export class GuildSavedMessages extends BaseGuildRepository {
this.toBePermanent = new Set(); this.toBePermanent = new Set();
} }
public msgToSavedMessageData(msg: Message): ISavedMessageData { public msgToSavedMessageData(msg: Message<PossiblyUncachedTextableChannel>): ISavedMessageData {
const data: ISavedMessageData = { const data: ISavedMessageData = {
author: { author: {
username: msg.author.username, username: msg.author.username,
@ -139,7 +139,7 @@ export class GuildSavedMessages extends BaseGuildRepository {
this.events.emit(`create:${data.id}`, [inserted]); this.events.emit(`create:${data.id}`, [inserted]);
} }
async createFromMsg(msg: Message, overrides = {}) { async createFromMsg(msg: Message<PossiblyUncachedTextableChannel>, overrides = {}) {
const existingSavedMsg = await this.find(msg.id); const existingSavedMsg = await this.find(msg.id);
if (existingSavedMsg) return; if (existingSavedMsg) return;
@ -222,7 +222,7 @@ export class GuildSavedMessages extends BaseGuildRepository {
this.events.emit(`update:${id}`, [newMessage, oldMessage]); this.events.emit(`update:${id}`, [newMessage, oldMessage]);
} }
async saveEditFromMsg(msg: Message) { async saveEditFromMsg(msg: Message<PossiblyUncachedTextableChannel>) {
const newData = this.msgToSavedMessageData(msg); const newData = this.msgToSavedMessageData(msg);
return this.saveEdit(msg.id, newData); return this.saveEdit(msg.id, newData);
} }

View file

@ -27,8 +27,12 @@ export function canActOn(pluginData: GuildPluginData<any>, member1: Member, memb
return allowSameLevel ? ourLevel >= memberLevel : ourLevel > memberLevel; return allowSameLevel ? ourLevel >= memberLevel : ourLevel > memberLevel;
} }
export function hasPermission(pluginData: AnyPluginData<any>, permission: string, matchParams: ExtendedMatchParams) { export async function hasPermission(
const config = pluginData.config.getMatchingConfig(matchParams); pluginData: AnyPluginData<any>,
permission: string,
matchParams: ExtendedMatchParams,
) {
const config = await pluginData.config.getMatchingConfig(matchParams);
return helpers.hasPermission(config, permission); return helpers.hasPermission(config, permission);
} }

View file

@ -16,7 +16,8 @@ const defaultOptions: PluginOptions<AutoDeletePluginType> = {
}, },
}; };
export const AutoDeletePlugin = zeppelinGuildPlugin<AutoDeletePluginType>()("auto_delete", { export const AutoDeletePlugin = zeppelinGuildPlugin<AutoDeletePluginType>()({
name: "auto_delete",
showInDocs: true, showInDocs: true,
info: { info: {
prettyName: "Auto-delete", prettyName: "Auto-delete",
@ -28,7 +29,7 @@ export const AutoDeletePlugin = zeppelinGuildPlugin<AutoDeletePluginType>()("aut
configSchema: ConfigSchema, configSchema: ConfigSchema,
defaultOptions, defaultOptions,
onLoad(pluginData) { afterLoad(pluginData) {
const { state, guild } = pluginData; const { state, guild } = pluginData;
state.guildSavedMessages = GuildSavedMessages.getGuildInstance(guild.id); state.guildSavedMessages = GuildSavedMessages.getGuildInstance(guild.id);
@ -50,7 +51,7 @@ export const AutoDeletePlugin = zeppelinGuildPlugin<AutoDeletePluginType>()("aut
state.guildSavedMessages.events.on("deleteBulk", state.onMessageDeleteBulkFn); state.guildSavedMessages.events.on("deleteBulk", state.onMessageDeleteBulkFn);
}, },
onUnload(pluginData) { beforeUnload(pluginData) {
pluginData.state.guildSavedMessages.events.off("create", pluginData.state.onMessageCreateFn); pluginData.state.guildSavedMessages.events.off("create", pluginData.state.onMessageCreateFn);
pluginData.state.guildSavedMessages.events.off("delete", pluginData.state.onMessageDeleteFn); pluginData.state.guildSavedMessages.events.off("delete", pluginData.state.onMessageDeleteFn);
pluginData.state.guildSavedMessages.events.off("deleteBulk", pluginData.state.onMessageDeleteBulkFn); pluginData.state.guildSavedMessages.events.off("deleteBulk", pluginData.state.onMessageDeleteBulkFn);

View file

@ -1,5 +1,5 @@
import * as t from "io-ts"; import * as t from "io-ts";
import { BasePluginType, guildCommand, guildEventListener } from "knub"; import { BasePluginType, typedGuildCommand, typedGuildEventListener } from "knub";
import { tDelayString, MINUTES } from "../../utils"; import { tDelayString, MINUTES } from "../../utils";
import { GuildLogs } from "../../data/GuildLogs"; import { GuildLogs } from "../../data/GuildLogs";
import { GuildSavedMessages } from "../../data/GuildSavedMessages"; import { GuildSavedMessages } from "../../data/GuildSavedMessages";

View file

@ -7,7 +7,7 @@ import { addMessageToDeletionQueue } from "./addMessageToDeletionQueue";
export async function onMessageCreate(pluginData: GuildPluginData<AutoDeletePluginType>, msg: SavedMessage) { export async function onMessageCreate(pluginData: GuildPluginData<AutoDeletePluginType>, msg: SavedMessage) {
const member = await resolveMember(pluginData.client, pluginData.guild, msg.user_id); const member = await resolveMember(pluginData.client, pluginData.guild, msg.user_id);
const config = pluginData.config.getMatchingConfig({ member, channelId: msg.channel_id }); const config = await pluginData.config.getMatchingConfig({ member, channelId: msg.channel_id });
if (config.enabled) { if (config.enabled) {
let delay = convertDelayStringToMS(config.delay)!; let delay = convertDelayStringToMS(config.delay)!;

View file

@ -23,7 +23,8 @@ const defaultOptions: PluginOptions<AutoReactionsPluginType> = {
], ],
}; };
export const AutoReactionsPlugin = zeppelinGuildPlugin<AutoReactionsPluginType>()("auto_reactions", { export const AutoReactionsPlugin = zeppelinGuildPlugin<AutoReactionsPluginType>()({
name: "auto_reactions",
showInDocs: true, showInDocs: true,
info: { info: {
prettyName: "Auto-reactions", prettyName: "Auto-reactions",
@ -47,7 +48,7 @@ export const AutoReactionsPlugin = zeppelinGuildPlugin<AutoReactionsPluginType>(
AddReactionsEvt, AddReactionsEvt,
], ],
onLoad(pluginData) { afterLoad(pluginData) {
const { state, guild } = pluginData; const { state, guild } = pluginData;
state.savedMessages = GuildSavedMessages.getGuildInstance(guild.id); state.savedMessages = GuildSavedMessages.getGuildInstance(guild.id);

View file

@ -1,5 +1,5 @@
import * as t from "io-ts"; import * as t from "io-ts";
import { BasePluginType, guildCommand, guildEventListener } from "knub"; import { BasePluginType, typedGuildCommand, typedGuildEventListener } from "knub";
import { GuildLogs } from "../../data/GuildLogs"; import { GuildLogs } from "../../data/GuildLogs";
import { GuildSavedMessages } from "../../data/GuildSavedMessages"; import { GuildSavedMessages } from "../../data/GuildSavedMessages";
import { GuildAutoReactions } from "../../data/GuildAutoReactions"; import { GuildAutoReactions } from "../../data/GuildAutoReactions";
@ -18,5 +18,5 @@ export interface AutoReactionsPluginType extends BasePluginType {
}; };
} }
export const autoReactionsCmd = guildCommand<AutoReactionsPluginType>(); export const autoReactionsCmd = typedGuildCommand<AutoReactionsPluginType>();
export const autoReactionsEvt = guildEventListener<AutoReactionsPluginType>(); export const autoReactionsEvt = typedGuildEventListener<AutoReactionsPluginType>();

View file

@ -152,7 +152,8 @@ const configPreprocessor: ConfigPreprocessorFn<AutomodPluginType> = options => {
return options; return options;
}; };
export const AutomodPlugin = zeppelinGuildPlugin<AutomodPluginType>()("automod", { export const AutomodPlugin = zeppelinGuildPlugin<AutomodPluginType>()({
name: "automod",
showInDocs: true, showInDocs: true,
info: pluginInfo, info: pluginInfo,
@ -181,22 +182,16 @@ export const AutomodPlugin = zeppelinGuildPlugin<AutomodPluginType>()("automod",
commands: [AntiraidClearCmd, SetAntiraidCmd, ViewAntiraidCmd], commands: [AntiraidClearCmd, SetAntiraidCmd, ViewAntiraidCmd],
async onLoad(pluginData) { async beforeLoad(pluginData) {
pluginData.state.queue = new Queue(); pluginData.state.queue = new Queue();
pluginData.state.regexRunner = getRegExpRunner(`guild-${pluginData.guild.id}`); pluginData.state.regexRunner = getRegExpRunner(`guild-${pluginData.guild.id}`);
pluginData.state.recentActions = []; pluginData.state.recentActions = [];
pluginData.state.clearRecentActionsInterval = setInterval(() => clearOldRecentActions(pluginData), 1 * MINUTES);
pluginData.state.recentSpam = []; pluginData.state.recentSpam = [];
pluginData.state.clearRecentSpamInterval = setInterval(() => clearOldRecentSpam(pluginData), 1 * SECONDS);
pluginData.state.recentNicknameChanges = new Map(); pluginData.state.recentNicknameChanges = new Map();
pluginData.state.clearRecentNicknameChangesInterval = setInterval(
() => clearOldRecentNicknameChanges(pluginData),
30 * SECONDS,
);
pluginData.state.ignoredRoleChanges = new Set(); pluginData.state.ignoredRoleChanges = new Set();
@ -207,16 +202,23 @@ export const AutomodPlugin = zeppelinGuildPlugin<AutomodPluginType>()("automod",
pluginData.state.antiraidLevels = GuildAntiraidLevels.getGuildInstance(pluginData.guild.id); pluginData.state.antiraidLevels = GuildAntiraidLevels.getGuildInstance(pluginData.guild.id);
pluginData.state.archives = GuildArchives.getGuildInstance(pluginData.guild.id); pluginData.state.archives = GuildArchives.getGuildInstance(pluginData.guild.id);
pluginData.state.cachedAntiraidLevel = await pluginData.state.antiraidLevels.get();
},
async afterLoad(pluginData) {
pluginData.state.clearRecentActionsInterval = setInterval(() => clearOldRecentActions(pluginData), 1 * MINUTES);
pluginData.state.clearRecentSpamInterval = setInterval(() => clearOldRecentSpam(pluginData), 1 * SECONDS);
pluginData.state.clearRecentNicknameChangesInterval = setInterval(
() => clearOldRecentNicknameChanges(pluginData),
30 * SECONDS,
);
pluginData.state.onMessageCreateFn = message => runAutomodOnMessage(pluginData, message, false); pluginData.state.onMessageCreateFn = message => runAutomodOnMessage(pluginData, message, false);
pluginData.state.savedMessages.events.on("create", pluginData.state.onMessageCreateFn); pluginData.state.savedMessages.events.on("create", pluginData.state.onMessageCreateFn);
pluginData.state.onMessageUpdateFn = message => runAutomodOnMessage(pluginData, message, true); pluginData.state.onMessageUpdateFn = message => runAutomodOnMessage(pluginData, message, true);
pluginData.state.savedMessages.events.on("update", pluginData.state.onMessageUpdateFn); pluginData.state.savedMessages.events.on("update", pluginData.state.onMessageUpdateFn);
pluginData.state.cachedAntiraidLevel = await pluginData.state.antiraidLevels.get();
},
async onAfterLoad(pluginData) {
const countersPlugin = pluginData.getPlugin(CountersPlugin); const countersPlugin = pluginData.getPlugin(CountersPlugin);
pluginData.state.onCounterTrigger = (name, triggerName, channelId, userId) => { pluginData.state.onCounterTrigger = (name, triggerName, channelId, userId) => {
@ -268,7 +270,7 @@ export const AutomodPlugin = zeppelinGuildPlugin<AutomodPluginType>()("automod",
registerEventListenersFromMap(mutesEvents, pluginData.state.mutesListeners); registerEventListenersFromMap(mutesEvents, pluginData.state.mutesListeners);
}, },
async onBeforeUnload(pluginData) { async beforeUnload(pluginData) {
const countersPlugin = pluginData.getPlugin(CountersPlugin); const countersPlugin = pluginData.getPlugin(CountersPlugin);
countersPlugin.offCounterEvent("trigger", pluginData.state.onCounterTrigger); countersPlugin.offCounterEvent("trigger", pluginData.state.onCounterTrigger);
countersPlugin.offCounterEvent("reverseTrigger", pluginData.state.onCounterReverseTrigger); countersPlugin.offCounterEvent("reverseTrigger", pluginData.state.onCounterReverseTrigger);
@ -278,9 +280,7 @@ export const AutomodPlugin = zeppelinGuildPlugin<AutomodPluginType>()("automod",
const mutesEvents = pluginData.getPlugin(MutesPlugin).getEventEmitter(); const mutesEvents = pluginData.getPlugin(MutesPlugin).getEventEmitter();
unregisterEventListenersFromMap(mutesEvents, pluginData.state.mutesListeners); unregisterEventListenersFromMap(mutesEvents, pluginData.state.mutesListeners);
},
async onUnload(pluginData) {
pluginData.state.queue.clear(); pluginData.state.queue.clear();
discardRegExpRunner(`guild-${pluginData.guild.id}`); discardRegExpRunner(`guild-${pluginData.guild.id}`);

View file

@ -1,9 +1,9 @@
import { guildCommand, GuildPluginData } from "knub"; import { typedGuildCommand, GuildPluginData } from "knub";
import { AutomodPluginType } from "../types"; import { AutomodPluginType } from "../types";
import { setAntiraidLevel } from "../functions/setAntiraidLevel"; import { setAntiraidLevel } from "../functions/setAntiraidLevel";
import { sendSuccessMessage } from "../../../pluginUtils"; import { sendSuccessMessage } from "../../../pluginUtils";
export const AntiraidClearCmd = guildCommand<AutomodPluginType>()({ export const AntiraidClearCmd = typedGuildCommand<AutomodPluginType>()({
trigger: ["antiraid clear", "antiraid reset", "antiraid none", "antiraid off"], trigger: ["antiraid clear", "antiraid reset", "antiraid none", "antiraid off"],
permission: "can_set_antiraid", permission: "can_set_antiraid",

View file

@ -1,10 +1,10 @@
import { guildCommand, GuildPluginData } from "knub"; import { typedGuildCommand, GuildPluginData } from "knub";
import { AutomodPluginType } from "../types"; import { AutomodPluginType } from "../types";
import { setAntiraidLevel } from "../functions/setAntiraidLevel"; import { setAntiraidLevel } from "../functions/setAntiraidLevel";
import { sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils"; import { sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils";
import { commandTypeHelpers as ct } from "../../../commandTypes"; import { commandTypeHelpers as ct } from "../../../commandTypes";
export const SetAntiraidCmd = guildCommand<AutomodPluginType>()({ export const SetAntiraidCmd = typedGuildCommand<AutomodPluginType>()({
trigger: "antiraid", trigger: "antiraid",
permission: "can_set_antiraid", permission: "can_set_antiraid",

View file

@ -1,10 +1,10 @@
import { guildCommand, GuildPluginData } from "knub"; import { typedGuildCommand, GuildPluginData } from "knub";
import { AutomodPluginType } from "../types"; import { AutomodPluginType } from "../types";
import { setAntiraidLevel } from "../functions/setAntiraidLevel"; import { setAntiraidLevel } from "../functions/setAntiraidLevel";
import { sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils"; import { sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils";
import { commandTypeHelpers as ct } from "../../../commandTypes"; import { commandTypeHelpers as ct } from "../../../commandTypes";
export const ViewAntiraidCmd = guildCommand<AutomodPluginType>()({ export const ViewAntiraidCmd = typedGuildCommand<AutomodPluginType>()({
trigger: "antiraid", trigger: "antiraid",
permission: "can_view_antiraid", permission: "can_view_antiraid",

View file

@ -1,11 +1,11 @@
import { guildEventListener } from "knub"; import { typedGuildEventListener } from "knub";
import { AutomodContext, AutomodPluginType } from "../types"; import { AutomodContext, AutomodPluginType } from "../types";
import { runAutomod } from "../functions/runAutomod"; import { runAutomod } from "../functions/runAutomod";
import { RecentActionType } from "../constants"; import { RecentActionType } from "../constants";
export const RunAutomodOnJoinEvt = guildEventListener<AutomodPluginType>()( export const RunAutomodOnJoinEvt = typedGuildEventListener<AutomodPluginType>()({
"guildMemberAdd", event: "guildMemberAdd",
({ pluginData, args: { member } }) => { listener({ pluginData, args: { member } }) {
const context: AutomodContext = { const context: AutomodContext = {
timestamp: Date.now(), timestamp: Date.now(),
user: member.user, user: member.user,
@ -24,4 +24,4 @@ export const RunAutomodOnJoinEvt = guildEventListener<AutomodPluginType>()(
runAutomod(pluginData, context); runAutomod(pluginData, context);
}); });
}, },
); });

View file

@ -1,13 +1,13 @@
import { guildEventListener } from "knub"; import { typedGuildEventListener } from "knub";
import { AutomodContext, AutomodPluginType } from "../types"; import { AutomodContext, AutomodPluginType } from "../types";
import { RecentActionType } from "../constants"; import { RecentActionType } from "../constants";
import { runAutomod } from "../functions/runAutomod"; import { runAutomod } from "../functions/runAutomod";
import isEqual from "lodash.isequal"; import isEqual from "lodash.isequal";
import diff from "lodash.difference"; import diff from "lodash.difference";
export const RunAutomodOnMemberUpdate = guildEventListener<AutomodPluginType>()( export const RunAutomodOnMemberUpdate = typedGuildEventListener<AutomodPluginType>()({
"guildMemberUpdate", event: "guildMemberUpdate",
({ pluginData, args: { member, oldMember } }) => { listener({ pluginData, args: { member, oldMember } }) {
if (!oldMember) return; if (!oldMember) return;
if (isEqual(oldMember.roles, member.roles)) return; if (isEqual(oldMember.roles, member.roles)) return;
@ -31,4 +31,4 @@ export const RunAutomodOnMemberUpdate = guildEventListener<AutomodPluginType>()(
}); });
} }
}, },
); });

View file

@ -15,7 +15,7 @@ export async function runAutomod(pluginData: GuildPluginData<AutomodPluginType>,
const channel = channelId ? (pluginData.guild.channels.get(channelId) as TextChannel) : null; const channel = channelId ? (pluginData.guild.channels.get(channelId) as TextChannel) : null;
const categoryId = channel?.parentID; const categoryId = channel?.parentID;
const config = pluginData.config.getMatchingConfig({ const config = await pluginData.config.getMatchingConfig({
channelId, channelId,
categoryId, categoryId,
userId, userId,

View file

@ -27,7 +27,8 @@ const defaultOptions = {
}, },
}; };
export const BotControlPlugin = zeppelinGlobalPlugin<BotControlPluginType>()("bot_control", { export const BotControlPlugin = zeppelinGlobalPlugin<BotControlPluginType>()({
name: "bot_control",
configSchema: ConfigSchema, configSchema: ConfigSchema,
defaultOptions, defaultOptions,
@ -46,7 +47,7 @@ export const BotControlPlugin = zeppelinGlobalPlugin<BotControlPluginType>()("bo
EligibleCmd, EligibleCmd,
], ],
onLoad(pluginData) { afterLoad(pluginData) {
pluginData.state.archives = new GuildArchives(0); pluginData.state.archives = new GuildArchives(0);
pluginData.state.allowedGuilds = new AllowedGuilds(); pluginData.state.allowedGuilds = new AllowedGuilds();
pluginData.state.configs = new Configs(); pluginData.state.configs = new Configs();

View file

@ -2,7 +2,8 @@ import { botControlCmd } from "../types";
import { isOwnerPreFilter, sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils"; import { isOwnerPreFilter, sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils";
import { commandTypeHelpers as ct } from "../../../commandTypes"; import { commandTypeHelpers as ct } from "../../../commandTypes";
import { ApiPermissions } from "@shared/apiPermissions"; import { ApiPermissions } from "@shared/apiPermissions";
import { resolveUser } from "../../../utils"; import { resolveUser, UnknownUser } from "../../../utils";
import { User } from "eris";
export const ListDashboardUsersCmd = botControlCmd({ export const ListDashboardUsersCmd = botControlCmd({
trigger: ["list_dashboard_users"], trigger: ["list_dashboard_users"],

View file

@ -16,6 +16,6 @@ export const ReloadGlobalPluginsCmd = botControlCmd({
setActiveReload((message.channel as TextChannel).guild?.id, message.channel.id); setActiveReload((message.channel as TextChannel).guild?.id, message.channel.id);
await message.channel.createMessage("Reloading global plugins..."); await message.channel.createMessage("Reloading global plugins...");
pluginData.getKnubInstance().reloadAllGlobalPlugins(); pluginData.getKnubInstance().reloadGlobalContext();
}, },
}); });

View file

@ -1,6 +1,6 @@
import * as t from "io-ts"; import * as t from "io-ts";
import { tNullable } from "../../utils"; import { tNullable } from "../../utils";
import { BasePluginType, globalCommand, globalEventListener } from "knub"; import { BasePluginType, typedGlobalCommand, typedGlobalEventListener } from "knub";
import { GuildArchives } from "../../data/GuildArchives"; import { GuildArchives } from "../../data/GuildArchives";
import { AllowedGuilds } from "../../data/AllowedGuilds"; import { AllowedGuilds } from "../../data/AllowedGuilds";
import { ApiPermissionAssignments } from "../../data/ApiPermissionAssignments"; import { ApiPermissionAssignments } from "../../data/ApiPermissionAssignments";
@ -23,5 +23,5 @@ export interface BotControlPluginType extends BasePluginType {
}; };
} }
export const botControlCmd = globalCommand<BotControlPluginType>(); export const botControlCmd = typedGlobalCommand<BotControlPluginType>();
export const botControlEvt = globalEventListener<BotControlPluginType>(); export const botControlEvt = typedGlobalEventListener<BotControlPluginType>();

View file

@ -28,7 +28,8 @@ const defaultOptions = {
}, },
}; };
export const CasesPlugin = zeppelinGuildPlugin<CasesPluginType>()("cases", { export const CasesPlugin = zeppelinGuildPlugin<CasesPluginType>()({
name: "cases",
showInDocs: true, showInDocs: true,
info: { info: {
prettyName: "Cases", prettyName: "Cases",
@ -73,7 +74,7 @@ export const CasesPlugin = zeppelinGuildPlugin<CasesPluginType>()("cases", {
getCaseSummary: mapToPublicFn(getCaseSummary), getCaseSummary: mapToPublicFn(getCaseSummary),
}, },
onLoad(pluginData) { afterLoad(pluginData) {
pluginData.state.logs = new GuildLogs(pluginData.guild.id); pluginData.state.logs = new GuildLogs(pluginData.guild.id);
pluginData.state.archives = GuildArchives.getGuildInstance(pluginData.guild.id); pluginData.state.archives = GuildArchives.getGuildInstance(pluginData.guild.id);
pluginData.state.cases = GuildCases.getGuildInstance(pluginData.guild.id); pluginData.state.cases = GuildCases.getGuildInstance(pluginData.guild.id);

View file

@ -46,7 +46,7 @@ export async function createCaseNote(pluginData: GuildPluginData<CasesPluginType
} }
} }
const modConfig = pluginData.config.getForUser(mod); const modConfig = await pluginData.config.getForUser(mod);
if ( if (
args.postInCaseLogOverride === true || args.postInCaseLogOverride === true ||
((!args.automatic || modConfig.log_automatic_actions) && args.postInCaseLogOverride !== false) ((!args.automatic || modConfig.log_automatic_actions) && args.postInCaseLogOverride !== false)

View file

@ -1,7 +1,7 @@
import * as t from "io-ts"; import * as t from "io-ts";
import { tDelayString, tPartialDictionary, tNullable } from "../../utils"; import { tDelayString, tPartialDictionary, tNullable } from "../../utils";
import { CaseNameToType, CaseTypes } from "../../data/CaseTypes"; import { CaseNameToType, CaseTypes } from "../../data/CaseTypes";
import { BasePluginType, guildCommand, guildEventListener } from "knub"; import { BasePluginType, typedGuildCommand, typedGuildEventListener } from "knub";
import { GuildLogs } from "../../data/GuildLogs"; import { GuildLogs } from "../../data/GuildLogs";
import { GuildCases } from "../../data/GuildCases"; import { GuildCases } from "../../data/GuildCases";
import { GuildArchives } from "../../data/GuildArchives"; import { GuildArchives } from "../../data/GuildArchives";

View file

@ -43,7 +43,8 @@ const defaultOptions: PluginOptions<CensorPluginType> = {
], ],
}; };
export const CensorPlugin = zeppelinGuildPlugin<CensorPluginType>()("censor", { export const CensorPlugin = zeppelinGuildPlugin<CensorPluginType>()({
name: "censor",
showInDocs: true, showInDocs: true,
info: { info: {
prettyName: "Censor", prettyName: "Censor",
@ -57,7 +58,7 @@ export const CensorPlugin = zeppelinGuildPlugin<CensorPluginType>()("censor", {
configSchema: ConfigSchema, configSchema: ConfigSchema,
defaultOptions, defaultOptions,
onLoad(pluginData) { afterLoad(pluginData) {
const { state, guild } = pluginData; const { state, guild } = pluginData;
state.serverLogs = new GuildLogs(guild.id); state.serverLogs = new GuildLogs(guild.id);
@ -72,7 +73,7 @@ export const CensorPlugin = zeppelinGuildPlugin<CensorPluginType>()("censor", {
state.savedMessages.events.on("update", state.onMessageUpdateFn); state.savedMessages.events.on("update", state.onMessageUpdateFn);
}, },
onUnload(pluginData) { beforeUnload(pluginData) {
discardRegExpRunner(`guild-${pluginData.guild.id}`); discardRegExpRunner(`guild-${pluginData.guild.id}`);
pluginData.state.savedMessages.events.off("create", pluginData.state.onMessageCreateFn); pluginData.state.savedMessages.events.off("create", pluginData.state.onMessageCreateFn);

View file

@ -15,7 +15,7 @@ export async function applyFiltersToMsg(
savedMessage: SavedMessage, savedMessage: SavedMessage,
): Promise<boolean> { ): Promise<boolean> {
const member = await resolveMember(pluginData.client, pluginData.guild, savedMessage.user_id); const member = await resolveMember(pluginData.client, pluginData.guild, savedMessage.user_id);
const config = pluginData.config.getMatchingConfig({ member, channelId: savedMessage.channel_id }); const config = await pluginData.config.getMatchingConfig({ member, channelId: savedMessage.channel_id });
let messageContent = savedMessage.data.content || ""; let messageContent = savedMessage.data.content || "";
if (savedMessage.data.attachments) messageContent += " " + JSON.stringify(savedMessage.data.attachments); if (savedMessage.data.attachments) messageContent += " " + JSON.stringify(savedMessage.data.attachments);

View file

@ -4,7 +4,8 @@ import { ArchiveChannelCmd } from "./commands/ArchiveChannelCmd";
import * as t from "io-ts"; import * as t from "io-ts";
import { TimeAndDatePlugin } from "../TimeAndDate/TimeAndDatePlugin"; import { TimeAndDatePlugin } from "../TimeAndDate/TimeAndDatePlugin";
export const ChannelArchiverPlugin = zeppelinGuildPlugin<ChannelArchiverPluginType>()("channel_archiver", { export const ChannelArchiverPlugin = zeppelinGuildPlugin<ChannelArchiverPluginType>()({
name: "channel_archiver",
showInDocs: false, showInDocs: false,
dependencies: [TimeAndDatePlugin], dependencies: [TimeAndDatePlugin],
@ -15,7 +16,7 @@ export const ChannelArchiverPlugin = zeppelinGuildPlugin<ChannelArchiverPluginTy
ArchiveChannelCmd, ArchiveChannelCmd,
], ],
onLoad(pluginData) { afterLoad(pluginData) {
const { state, guild } = pluginData; const { state, guild } = pluginData;
}, },
}); });

View file

@ -1,7 +1,7 @@
import { BasePluginType, guildCommand } from "knub"; import { BasePluginType, typedGuildCommand } from "knub";
export interface ChannelArchiverPluginType extends BasePluginType { export interface ChannelArchiverPluginType extends BasePluginType {
state: {}; state: {};
} }
export const channelArchiverCmd = guildCommand<ChannelArchiverPluginType>(); export const channelArchiverCmd = typedGuildCommand<ChannelArchiverPluginType>();

View file

@ -13,7 +13,8 @@ const defaultOptions = {
}, },
}; };
export const CompanionChannelsPlugin = zeppelinGuildPlugin<CompanionChannelsPluginType>()("companion_channels", { export const CompanionChannelsPlugin = zeppelinGuildPlugin<CompanionChannelsPluginType>()({
name: "companion_channels",
showInDocs: true, showInDocs: true,
info: { info: {
prettyName: "Companion channels", prettyName: "Companion channels",
@ -30,7 +31,7 @@ export const CompanionChannelsPlugin = zeppelinGuildPlugin<CompanionChannelsPlug
events: [VoiceChannelJoinEvt, VoiceChannelSwitchEvt, VoiceChannelLeaveEvt], events: [VoiceChannelJoinEvt, VoiceChannelSwitchEvt, VoiceChannelLeaveEvt],
onLoad(pluginData) { afterLoad(pluginData) {
pluginData.state.errorCooldownManager = new CooldownManager(); pluginData.state.errorCooldownManager = new CooldownManager();
}, },
}); });

View file

@ -2,9 +2,9 @@ import { companionChannelsEvt } from "../types";
import { handleCompanionPermissions } from "../functions/handleCompanionPermissions"; import { handleCompanionPermissions } from "../functions/handleCompanionPermissions";
import { stripObjectToScalars } from "../../../utils"; import { stripObjectToScalars } from "../../../utils";
export const VoiceChannelJoinEvt = companionChannelsEvt( export const VoiceChannelJoinEvt = companionChannelsEvt({
"voiceChannelJoin", event: "voiceChannelJoin",
({ pluginData, args: { member, newChannel } }) => { listener({ pluginData, args: { member, newChannel } }) {
handleCompanionPermissions(pluginData, member.id, newChannel); handleCompanionPermissions(pluginData, member.id, newChannel);
}, },
); });

View file

@ -1,9 +1,9 @@
import { companionChannelsEvt } from "../types"; import { companionChannelsEvt } from "../types";
import { handleCompanionPermissions } from "../functions/handleCompanionPermissions"; import { handleCompanionPermissions } from "../functions/handleCompanionPermissions";
export const VoiceChannelLeaveEvt = companionChannelsEvt( export const VoiceChannelLeaveEvt = companionChannelsEvt({
"voiceChannelLeave", event: "voiceChannelLeave",
({ pluginData, args: { member, oldChannel } }) => { listener({ pluginData, args: { member, oldChannel } }) {
handleCompanionPermissions(pluginData, member.id, null, oldChannel); handleCompanionPermissions(pluginData, member.id, null, oldChannel);
}, },
); });

View file

@ -1,9 +1,9 @@
import { companionChannelsEvt } from "../types"; import { companionChannelsEvt } from "../types";
import { handleCompanionPermissions } from "../functions/handleCompanionPermissions"; import { handleCompanionPermissions } from "../functions/handleCompanionPermissions";
export const VoiceChannelSwitchEvt = companionChannelsEvt( export const VoiceChannelSwitchEvt = companionChannelsEvt({
"voiceChannelSwitch", event: "voiceChannelSwitch",
({ pluginData, args: { member, oldChannel, newChannel } }) => { listener({ pluginData, args: { member, oldChannel, newChannel } }) {
handleCompanionPermissions(pluginData, member.id, newChannel, oldChannel); handleCompanionPermissions(pluginData, member.id, newChannel, oldChannel);
}, },
); });

View file

@ -6,12 +6,12 @@ const defaultCompanionChannelOpts: Partial<TCompanionChannelOpts> = {
enabled: true, enabled: true,
}; };
export function getCompanionChannelOptsForVoiceChannelId( export async function getCompanionChannelOptsForVoiceChannelId(
pluginData: GuildPluginData<CompanionChannelsPluginType>, pluginData: GuildPluginData<CompanionChannelsPluginType>,
userId: string, userId: string,
voiceChannel: VoiceChannel, voiceChannel: VoiceChannel,
): TCompanionChannelOpts[] { ): Promise<TCompanionChannelOpts[]> {
const config = pluginData.config.getMatchingConfig({ userId, channelId: voiceChannel.id }); const config = await pluginData.config.getMatchingConfig({ userId, channelId: voiceChannel.id });
return Object.values(config.entries) return Object.values(config.entries)
.filter( .filter(
opts => opts =>

View file

@ -36,10 +36,10 @@ export async function handleCompanionPermissions(
const permsToSet: Map<string, number> = new Map(); // channelId => permissions const permsToSet: Map<string, number> = new Map(); // channelId => permissions
const oldChannelOptsArr: TCompanionChannelOpts[] = oldChannel const oldChannelOptsArr: TCompanionChannelOpts[] = oldChannel
? getCompanionChannelOptsForVoiceChannelId(pluginData, userId, oldChannel) ? await getCompanionChannelOptsForVoiceChannelId(pluginData, userId, oldChannel)
: []; : [];
const newChannelOptsArr: TCompanionChannelOpts[] = voiceChannel const newChannelOptsArr: TCompanionChannelOpts[] = voiceChannel
? getCompanionChannelOptsForVoiceChannelId(pluginData, userId, voiceChannel) ? await getCompanionChannelOptsForVoiceChannelId(pluginData, userId, voiceChannel)
: []; : [];
for (const oldChannelOpts of oldChannelOptsArr) { for (const oldChannelOpts of oldChannelOptsArr) {

View file

@ -1,6 +1,6 @@
import * as t from "io-ts"; import * as t from "io-ts";
import { tNullable } from "../../utils"; import { tNullable } from "../../utils";
import { BasePluginType, CooldownManager, guildEventListener } from "knub"; import { BasePluginType, CooldownManager, typedGuildEventListener } from "knub";
import { GuildLogs } from "../../data/GuildLogs"; import { GuildLogs } from "../../data/GuildLogs";
import { GuildSavedMessages } from "../../data/GuildSavedMessages"; import { GuildSavedMessages } from "../../data/GuildSavedMessages";
@ -29,4 +29,4 @@ export interface CompanionChannelsPluginType extends BasePluginType {
}; };
} }
export const companionChannelsEvt = guildEventListener<CompanionChannelsPluginType>(); export const companionChannelsEvt = typedGuildEventListener<CompanionChannelsPluginType>();

View file

@ -106,7 +106,8 @@ const configPreprocessor: ConfigPreprocessorFn<CountersPluginType> = options =>
* A single trigger can only trigger once per user/channel/in general, depending on how specific the counter is (e.g. a per-user trigger can only trigger once per user). * A single trigger can only trigger once per user/channel/in general, depending on how specific the counter is (e.g. a per-user trigger can only trigger once per user).
* After being triggered, a trigger is "reset" if the counter value no longer matches the trigger (e.g. drops to 100 or below in the above example). After this, that trigger can be triggered again. * After being triggered, a trigger is "reset" if the counter value no longer matches the trigger (e.g. drops to 100 or below in the above example). After this, that trigger can be triggered again.
*/ */
export const CountersPlugin = zeppelinGuildPlugin<CountersPluginType>()("counters", { export const CountersPlugin = zeppelinGuildPlugin<CountersPluginType>()({
name: "counters",
showInDocs: true, showInDocs: true,
info: { info: {
prettyName: "Counters", prettyName: "Counters",
@ -145,7 +146,7 @@ export const CountersPlugin = zeppelinGuildPlugin<CountersPluginType>()("counter
ResetAllCounterValuesCmd, ResetAllCounterValuesCmd,
], ],
async onLoad(pluginData) { async afterLoad(pluginData) {
pluginData.state.counters = new GuildCounters(pluginData.guild.id); pluginData.state.counters = new GuildCounters(pluginData.guild.id);
pluginData.state.events = new EventEmitter(); pluginData.state.events = new EventEmitter();
pluginData.state.counterTriggersByCounterId = new Map(); pluginData.state.counterTriggersByCounterId = new Map();
@ -207,7 +208,7 @@ export const CountersPlugin = zeppelinGuildPlugin<CountersPluginType>()("counter
} }
}, },
onUnload(pluginData) { beforeUnload(pluginData) {
for (const interval of pluginData.state.decayTimers) { for (const interval of pluginData.state.decayTimers) {
clearInterval(interval); clearInterval(interval);
} }

View file

@ -1,4 +1,4 @@
import { guildCommand } from "knub"; import { typedGuildCommand } from "knub";
import { CountersPluginType } from "../types"; import { CountersPluginType } from "../types";
import { commandTypeHelpers as ct } from "../../../commandTypes"; import { commandTypeHelpers as ct } from "../../../commandTypes";
import { sendErrorMessage } from "../../../pluginUtils"; import { sendErrorMessage } from "../../../pluginUtils";
@ -7,7 +7,7 @@ import { TextChannel, User } from "eris";
import { resolveUser, UnknownUser } from "../../../utils"; import { resolveUser, UnknownUser } from "../../../utils";
import { changeCounterValue } from "../functions/changeCounterValue"; import { changeCounterValue } from "../functions/changeCounterValue";
export const AddCounterCmd = guildCommand<CountersPluginType>()({ export const AddCounterCmd = typedGuildCommand<CountersPluginType>()({
trigger: ["counters add", "counter add", "addcounter"], trigger: ["counters add", "counter add", "addcounter"],
permission: "can_edit", permission: "can_edit",
@ -41,7 +41,7 @@ export const AddCounterCmd = guildCommand<CountersPluginType>()({
], ],
async run({ pluginData, message, args }) { async run({ pluginData, message, args }) {
const config = pluginData.config.getForMessage(message); const config = await pluginData.config.getForMessage(message);
const counter = config.counters[args.counterName]; const counter = config.counters[args.counterName];
const counterId = pluginData.state.counterIds[args.counterName]; const counterId = pluginData.state.counterIds[args.counterName];
if (!counter || !counterId) { if (!counter || !counterId) {

View file

@ -1,17 +1,17 @@
import { guildCommand } from "knub"; import { typedGuildCommand } from "knub";
import { CountersPluginType } from "../types"; import { CountersPluginType } from "../types";
import { sendErrorMessage } from "../../../pluginUtils"; import { sendErrorMessage } from "../../../pluginUtils";
import { trimMultilineString, ucfirst } from "../../../utils"; import { trimMultilineString, ucfirst } from "../../../utils";
import { getGuildPrefix } from "../../../utils/getGuildPrefix"; import { getGuildPrefix } from "../../../utils/getGuildPrefix";
export const CountersListCmd = guildCommand<CountersPluginType>()({ export const CountersListCmd = typedGuildCommand<CountersPluginType>()({
trigger: ["counters list", "counter list", "counters"], trigger: ["counters list", "counter list", "counters"],
permission: "can_view", permission: "can_view",
signature: {}, signature: {},
async run({ pluginData, message, args }) { async run({ pluginData, message, args }) {
const config = pluginData.config.getForMessage(message); const config = await pluginData.config.getForMessage(message);
const countersToShow = Array.from(Object.values(config.counters)).filter(c => c.can_view !== false); const countersToShow = Array.from(Object.values(config.counters)).filter(c => c.can_view !== false);
if (!countersToShow.length) { if (!countersToShow.length) {

View file

@ -1,4 +1,4 @@
import { guildCommand } from "knub"; import { typedGuildCommand } from "knub";
import { CountersPluginType } from "../types"; import { CountersPluginType } from "../types";
import { commandTypeHelpers as ct } from "../../../commandTypes"; import { commandTypeHelpers as ct } from "../../../commandTypes";
import { sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils"; import { sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils";
@ -10,7 +10,7 @@ import { setCounterValue } from "../functions/setCounterValue";
import { resetAllCounterValues } from "../functions/resetAllCounterValues"; import { resetAllCounterValues } from "../functions/resetAllCounterValues";
import { counterIdLock } from "../../../utils/lockNameHelpers"; import { counterIdLock } from "../../../utils/lockNameHelpers";
export const ResetAllCounterValuesCmd = guildCommand<CountersPluginType>()({ export const ResetAllCounterValuesCmd = typedGuildCommand<CountersPluginType>()({
trigger: ["counters reset_all"], trigger: ["counters reset_all"],
permission: "can_reset_all", permission: "can_reset_all",
@ -19,7 +19,7 @@ export const ResetAllCounterValuesCmd = guildCommand<CountersPluginType>()({
}, },
async run({ pluginData, message, args }) { async run({ pluginData, message, args }) {
const config = pluginData.config.getForMessage(message); const config = await pluginData.config.getForMessage(message);
const counter = config.counters[args.counterName]; const counter = config.counters[args.counterName];
const counterId = pluginData.state.counterIds[args.counterName]; const counterId = pluginData.state.counterIds[args.counterName];
if (!counter || !counterId) { if (!counter || !counterId) {

View file

@ -1,4 +1,4 @@
import { guildCommand } from "knub"; import { typedGuildCommand } from "knub";
import { CountersPluginType } from "../types"; import { CountersPluginType } from "../types";
import { commandTypeHelpers as ct } from "../../../commandTypes"; import { commandTypeHelpers as ct } from "../../../commandTypes";
import { sendErrorMessage } from "../../../pluginUtils"; import { sendErrorMessage } from "../../../pluginUtils";
@ -7,7 +7,7 @@ import { TextChannel } from "eris";
import { resolveUser, UnknownUser } from "../../../utils"; import { resolveUser, UnknownUser } from "../../../utils";
import { setCounterValue } from "../functions/setCounterValue"; import { setCounterValue } from "../functions/setCounterValue";
export const ResetCounterCmd = guildCommand<CountersPluginType>()({ export const ResetCounterCmd = typedGuildCommand<CountersPluginType>()({
trigger: ["counters reset", "counter reset", "resetcounter"], trigger: ["counters reset", "counter reset", "resetcounter"],
permission: "can_edit", permission: "can_edit",
@ -36,7 +36,7 @@ export const ResetCounterCmd = guildCommand<CountersPluginType>()({
], ],
async run({ pluginData, message, args }) { async run({ pluginData, message, args }) {
const config = pluginData.config.getForMessage(message); const config = await pluginData.config.getForMessage(message);
const counter = config.counters[args.counterName]; const counter = config.counters[args.counterName];
const counterId = pluginData.state.counterIds[args.counterName]; const counterId = pluginData.state.counterIds[args.counterName];
if (!counter || !counterId) { if (!counter || !counterId) {

View file

@ -1,4 +1,4 @@
import { guildCommand } from "knub"; import { typedGuildCommand } from "knub";
import { CountersPluginType } from "../types"; import { CountersPluginType } from "../types";
import { commandTypeHelpers as ct } from "../../../commandTypes"; import { commandTypeHelpers as ct } from "../../../commandTypes";
import { sendErrorMessage } from "../../../pluginUtils"; import { sendErrorMessage } from "../../../pluginUtils";
@ -8,7 +8,7 @@ import { resolveUser, UnknownUser } from "../../../utils";
import { changeCounterValue } from "../functions/changeCounterValue"; import { changeCounterValue } from "../functions/changeCounterValue";
import { setCounterValue } from "../functions/setCounterValue"; import { setCounterValue } from "../functions/setCounterValue";
export const SetCounterCmd = guildCommand<CountersPluginType>()({ export const SetCounterCmd = typedGuildCommand<CountersPluginType>()({
trigger: ["counters set", "counter set", "setcounter"], trigger: ["counters set", "counter set", "setcounter"],
permission: "can_edit", permission: "can_edit",
@ -42,7 +42,7 @@ export const SetCounterCmd = guildCommand<CountersPluginType>()({
], ],
async run({ pluginData, message, args }) { async run({ pluginData, message, args }) {
const config = pluginData.config.getForMessage(message); const config = await pluginData.config.getForMessage(message);
const counter = config.counters[args.counterName]; const counter = config.counters[args.counterName];
const counterId = pluginData.state.counterIds[args.counterName]; const counterId = pluginData.state.counterIds[args.counterName];
if (!counter || !counterId) { if (!counter || !counterId) {

View file

@ -1,4 +1,4 @@
import { guildCommand } from "knub"; import { typedGuildCommand } from "knub";
import { CountersPluginType } from "../types"; import { CountersPluginType } from "../types";
import { commandTypeHelpers as ct } from "../../../commandTypes"; import { commandTypeHelpers as ct } from "../../../commandTypes";
import { sendErrorMessage } from "../../../pluginUtils"; import { sendErrorMessage } from "../../../pluginUtils";
@ -6,7 +6,7 @@ import { resolveChannel, waitForReply } from "knub/dist/helpers";
import { TextChannel, User } from "eris"; import { TextChannel, User } from "eris";
import { resolveUser, UnknownUser } from "../../../utils"; import { resolveUser, UnknownUser } from "../../../utils";
export const ViewCounterCmd = guildCommand<CountersPluginType>()({ export const ViewCounterCmd = typedGuildCommand<CountersPluginType>()({
trigger: ["counters view", "counter view", "viewcounter", "counter"], trigger: ["counters view", "counter view", "viewcounter", "counter"],
permission: "can_view", permission: "can_view",
@ -35,7 +35,7 @@ export const ViewCounterCmd = guildCommand<CountersPluginType>()({
], ],
async run({ pluginData, message, args }) { async run({ pluginData, message, args }) {
const config = pluginData.config.getForMessage(message); const config = await pluginData.config.getForMessage(message);
const counter = config.counters[args.counterName]; const counter = config.counters[args.counterName];
const counterId = pluginData.state.counterIds[args.counterName]; const counterId = pluginData.state.counterIds[args.counterName];
if (!counter || !counterId) { if (!counter || !counterId) {

View file

@ -1,6 +1,6 @@
import { zeppelinGuildPlugin } from "../ZeppelinPluginBlueprint"; import { zeppelinGuildPlugin } from "../ZeppelinPluginBlueprint";
import { ConfigSchema, CustomEventsPluginType } from "./types"; import { ConfigSchema, CustomEventsPluginType } from "./types";
import { guildCommand, parseSignature } from "knub"; import { typedGuildCommand, parseSignature } from "knub";
import { commandTypes } from "../../commandTypes"; import { commandTypes } from "../../commandTypes";
import { stripObjectToScalars } from "../../utils"; import { stripObjectToScalars } from "../../utils";
import { runEvent } from "./functions/runEvent"; import { runEvent } from "./functions/runEvent";
@ -11,18 +11,19 @@ const defaultOptions = {
}, },
}; };
export const CustomEventsPlugin = zeppelinGuildPlugin<CustomEventsPluginType>()("custom_events", { export const CustomEventsPlugin = zeppelinGuildPlugin<CustomEventsPluginType>()({
name: "custom_events",
showInDocs: false, showInDocs: false,
configSchema: ConfigSchema, configSchema: ConfigSchema,
defaultOptions, defaultOptions,
onLoad(pluginData) { afterLoad(pluginData) {
const config = pluginData.config.get(); const config = pluginData.config.get();
for (const [key, event] of Object.entries(config.events)) { for (const [key, event] of Object.entries(config.events)) {
if (event.trigger.type === "command") { if (event.trigger.type === "command") {
const signature = event.trigger.params ? parseSignature(event.trigger.params, commandTypes) : {}; const signature = event.trigger.params ? parseSignature(event.trigger.params, commandTypes) : {};
const eventCommand = guildCommand({ const eventCommand = typedGuildCommand({
trigger: event.trigger.name, trigger: event.trigger.name,
permission: `events.${key}.trigger.can_use`, permission: `events.${key}.trigger.can_use`,
signature, signature,
@ -36,7 +37,7 @@ export const CustomEventsPlugin = zeppelinGuildPlugin<CustomEventsPluginType>()(
} }
}, },
onUnload() { beforeUnload() {
// TODO: Run clearTriggers() once we actually have something there // TODO: Run clearTriggers() once we actually have something there
}, },
}); });

View file

@ -1,5 +1,5 @@
import { zeppelinGlobalPlugin } from "../ZeppelinPluginBlueprint"; import { zeppelinGlobalPlugin } from "../ZeppelinPluginBlueprint";
import { BasePluginType, globalEventListener, GlobalPluginData } from "knub"; import { BasePluginType, typedGlobalEventListener, GlobalPluginData } from "knub";
import * as t from "io-ts"; import * as t from "io-ts";
import { AllowedGuilds } from "../../data/AllowedGuilds"; import { AllowedGuilds } from "../../data/AllowedGuilds";
import { Guild } from "eris"; import { Guild } from "eris";
@ -21,16 +21,20 @@ async function checkGuild(pluginData: GlobalPluginData<GuildAccessMonitorPluginT
/** /**
* Global plugin to monitor if Zeppelin is invited to a non-whitelisted server, and leave it * Global plugin to monitor if Zeppelin is invited to a non-whitelisted server, and leave it
*/ */
export const GuildAccessMonitorPlugin = zeppelinGlobalPlugin<GuildAccessMonitorPluginType>()("guild_access_monitor", { export const GuildAccessMonitorPlugin = zeppelinGlobalPlugin<GuildAccessMonitorPluginType>()({
name: "guild_access_monitor",
configSchema: t.type({}), configSchema: t.type({}),
events: [ events: [
globalEventListener<GuildAccessMonitorPluginType>()("guildAvailable", ({ pluginData, args: { guild } }) => { typedGlobalEventListener<GuildAccessMonitorPluginType>()({
checkGuild(pluginData, guild); event: "guildAvailable",
listener({ pluginData, args: { guild } }) {
checkGuild(pluginData, guild);
},
}), }),
], ],
onLoad(pluginData) { afterLoad(pluginData) {
pluginData.state.allowedGuilds = new AllowedGuilds(); pluginData.state.allowedGuilds = new AllowedGuilds();
for (const guild of pluginData.client.guilds.values()) { for (const guild of pluginData.client.guilds.values()) {

View file

@ -4,23 +4,21 @@ import { Configs } from "../../data/Configs";
import { reloadChangedGuilds } from "./functions/reloadChangedGuilds"; import { reloadChangedGuilds } from "./functions/reloadChangedGuilds";
import * as t from "io-ts"; import * as t from "io-ts";
export const GuildConfigReloaderPlugin = zeppelinGlobalPlugin<GuildConfigReloaderPluginType>()( export const GuildConfigReloaderPlugin = zeppelinGlobalPlugin<GuildConfigReloaderPluginType>()({
"guild_config_reloader", name: "guild_config_reloader",
{ showInDocs: false,
showInDocs: false,
configSchema: t.type({}), configSchema: t.type({}),
async onLoad(pluginData) { async afterLoad(pluginData) {
pluginData.state.guildConfigs = new Configs(); pluginData.state.guildConfigs = new Configs();
pluginData.state.highestConfigId = await pluginData.state.guildConfigs.getHighestId(); pluginData.state.highestConfigId = await pluginData.state.guildConfigs.getHighestId();
reloadChangedGuilds(pluginData); reloadChangedGuilds(pluginData);
},
onUnload(pluginData) {
clearTimeout(pluginData.state.nextCheckTimeout);
pluginData.state.unloaded = true;
},
}, },
);
beforeUnload(pluginData) {
clearTimeout(pluginData.state.nextCheckTimeout);
pluginData.state.unloaded = true;
},
});

View file

@ -5,12 +5,13 @@ import { GuildInfoSaverPluginType } from "./types";
import { MINUTES } from "../../utils"; import { MINUTES } from "../../utils";
import * as t from "io-ts"; import * as t from "io-ts";
export const GuildInfoSaverPlugin = zeppelinGuildPlugin<GuildInfoSaverPluginType>()("guild_info_saver", { export const GuildInfoSaverPlugin = zeppelinGuildPlugin<GuildInfoSaverPluginType>()({
name: "guild_info_saver",
showInDocs: false, showInDocs: false,
configSchema: t.type({}), configSchema: t.type({}),
onLoad(pluginData) { afterLoad(pluginData) {
const { state, guild } = pluginData; const { state, guild } = pluginData;
state.allowedGuilds = new AllowedGuilds(); state.allowedGuilds = new AllowedGuilds();

View file

@ -28,7 +28,8 @@ const defaultOptions: PluginOptions<LocateUserPluginType> = {
], ],
}; };
export const LocateUserPlugin = zeppelinGuildPlugin<LocateUserPluginType>()("locate_user", { export const LocateUserPlugin = zeppelinGuildPlugin<LocateUserPluginType>()({
name: "locate_user",
showInDocs: true, showInDocs: true,
info: { info: {
prettyName: "Locate user", prettyName: "Locate user",
@ -58,7 +59,7 @@ export const LocateUserPlugin = zeppelinGuildPlugin<LocateUserPluginType>()("loc
GuildBanRemoveAlertsEvt GuildBanRemoveAlertsEvt
], ],
onLoad(pluginData) { afterLoad(pluginData) {
const { state, guild } = pluginData; const { state, guild } = pluginData;
state.alerts = GuildVCAlerts.getGuildInstance(guild.id); state.alerts = GuildVCAlerts.getGuildInstance(guild.id);
@ -70,7 +71,7 @@ export const LocateUserPlugin = zeppelinGuildPlugin<LocateUserPluginType>()("loc
fillActiveAlertsList(pluginData); fillActiveAlertsList(pluginData);
}, },
onUnload(pluginData) { beforeUnload(pluginData) {
clearTimeout(pluginData.state.outdatedAlertsTimeout as Timeout); clearTimeout(pluginData.state.outdatedAlertsTimeout as Timeout);
pluginData.state.unloaded = true; pluginData.state.unloaded = true;
}, },

View file

@ -1,5 +1,5 @@
import * as t from "io-ts"; import * as t from "io-ts";
import { BasePluginType, guildCommand, guildEventListener } from "knub"; import { BasePluginType, typedGuildCommand, typedGuildEventListener } from "knub";
import { GuildVCAlerts } from "../../data/GuildVCAlerts"; import { GuildVCAlerts } from "../../data/GuildVCAlerts";
import Timeout = NodeJS.Timeout; import Timeout = NodeJS.Timeout;
@ -19,5 +19,5 @@ export interface LocateUserPluginType extends BasePluginType {
}; };
} }
export const locateUserCmd = guildCommand<LocateUserPluginType>(); export const locateUserCmd = typedGuildCommand<LocateUserPluginType>();
export const locateUserEvt = guildEventListener<LocateUserPluginType>(); export const locateUserEvt = typedGuildEventListener<LocateUserPluginType>();

View file

@ -47,7 +47,8 @@ const defaultOptions: PluginOptions<LogsPluginType> = {
], ],
}; };
export const LogsPlugin = zeppelinGuildPlugin<LogsPluginType>()("logs", { export const LogsPlugin = zeppelinGuildPlugin<LogsPluginType>()({
name: "logs",
showInDocs: true, showInDocs: true,
info: { info: {
prettyName: "Logs", prettyName: "Logs",
@ -84,7 +85,7 @@ export const LogsPlugin = zeppelinGuildPlugin<LogsPluginType>()("logs", {
}, },
}, },
onLoad(pluginData) { afterLoad(pluginData) {
const { state, guild } = pluginData; const { state, guild } = pluginData;
state.guildLogs = new GuildLogs(guild.id); state.guildLogs = new GuildLogs(guild.id);
@ -122,7 +123,7 @@ export const LogsPlugin = zeppelinGuildPlugin<LogsPluginType>()("logs", {
state.regexRunner.on("repeatedTimeout", state.regexRunnerRepeatedTimeoutListener); state.regexRunner.on("repeatedTimeout", state.regexRunnerRepeatedTimeoutListener);
}, },
onUnload(pluginData) { beforeUnload(pluginData) {
pluginData.state.guildLogs.removeListener("log", pluginData.state.logListener); pluginData.state.guildLogs.removeListener("log", pluginData.state.logListener);
pluginData.state.savedMessages.events.off("delete", pluginData.state.onMessageDeleteFn); pluginData.state.savedMessages.events.off("delete", pluginData.state.onMessageDeleteFn);

View file

@ -1,5 +1,5 @@
import * as t from "io-ts"; import * as t from "io-ts";
import { BasePluginType, guildEventListener } from "knub"; import { BasePluginType, typedGuildEventListener } from "knub";
import { TRegex } from "../../validatorUtils"; import { TRegex } from "../../validatorUtils";
import { GuildLogs } from "../../data/GuildLogs"; import { GuildLogs } from "../../data/GuildLogs";
import { GuildSavedMessages } from "../../data/GuildSavedMessages"; import { GuildSavedMessages } from "../../data/GuildSavedMessages";
@ -72,4 +72,4 @@ export interface LogsPluginType extends BasePluginType {
}; };
} }
export const logsEvt = guildEventListener<LogsPluginType>(); export const logsEvt = typedGuildEventListener<LogsPluginType>();

View file

@ -59,7 +59,7 @@ export async function getLogMessage(
member = await resolveMember(pluginData.client, pluginData.guild, user.id); member = await resolveMember(pluginData.client, pluginData.guild, user.id);
} }
const memberConfig = pluginData.config.getMatchingConfig({ member, userId: user.id }) || ({} as any); const memberConfig = (await pluginData.config.getMatchingConfig({ member, userId: user.id })) || ({} as any);
// Revert to old behavior (verbose name w/o ping if allow_user_mentions is enabled (for whatever reason)) // Revert to old behavior (verbose name w/o ping if allow_user_mentions is enabled (for whatever reason))
if (config.allow_user_mentions) { if (config.allow_user_mentions) {

View file

@ -20,7 +20,8 @@ const defaultOptions: PluginOptions<MessageSaverPluginType> = {
], ],
}; };
export const MessageSaverPlugin = zeppelinGuildPlugin<MessageSaverPluginType>()("message_saver", { export const MessageSaverPlugin = zeppelinGuildPlugin<MessageSaverPluginType>()({
name: "message_saver",
showInDocs: false, showInDocs: false,
configSchema: ConfigSchema, configSchema: ConfigSchema,
@ -40,7 +41,7 @@ export const MessageSaverPlugin = zeppelinGuildPlugin<MessageSaverPluginType>()(
MessageDeleteBulkEvt, MessageDeleteBulkEvt,
], ],
onLoad(pluginData) { afterLoad(pluginData) {
const { state, guild } = pluginData; const { state, guild } = pluginData;
state.savedMessages = GuildSavedMessages.getGuildInstance(guild.id); state.savedMessages = GuildSavedMessages.getGuildInstance(guild.id);
}, },

View file

@ -1,5 +1,5 @@
import * as t from "io-ts"; import * as t from "io-ts";
import { BasePluginType, guildCommand, guildEventListener } from "knub"; import { BasePluginType, typedGuildCommand, typedGuildEventListener } from "knub";
import { GuildSavedMessages } from "../../data/GuildSavedMessages"; import { GuildSavedMessages } from "../../data/GuildSavedMessages";
export const ConfigSchema = t.type({ export const ConfigSchema = t.type({
@ -14,5 +14,5 @@ export interface MessageSaverPluginType extends BasePluginType {
}; };
} }
export const messageSaverCmd = guildCommand<MessageSaverPluginType>(); export const messageSaverCmd = typedGuildCommand<MessageSaverPluginType>();
export const messageSaverEvt = guildEventListener<MessageSaverPluginType>(); export const messageSaverEvt = typedGuildEventListener<MessageSaverPluginType>();

View file

@ -110,7 +110,8 @@ const defaultOptions = {
], ],
}; };
export const ModActionsPlugin = zeppelinGuildPlugin<ModActionsPluginType>()("mod_actions", { export const ModActionsPlugin = zeppelinGuildPlugin<ModActionsPluginType>()({
name: "mod_actions",
showInDocs: true, showInDocs: true,
info: { info: {
prettyName: "Mod actions", prettyName: "Mod actions",
@ -187,7 +188,7 @@ export const ModActionsPlugin = zeppelinGuildPlugin<ModActionsPluginType>()("mod
}, },
}, },
onLoad(pluginData) { afterLoad(pluginData) {
const { state, guild } = pluginData; const { state, guild } = pluginData;
state.mutes = GuildMutes.getGuildInstance(guild.id); state.mutes = GuildMutes.getGuildInstance(guild.id);
@ -207,7 +208,7 @@ export const ModActionsPlugin = zeppelinGuildPlugin<ModActionsPluginType>()("mod
outdatedTempbansLoop(pluginData); outdatedTempbansLoop(pluginData);
}, },
onUnload(pluginData) { beforeUnload(pluginData) {
pluginData.state.unloaded = true; pluginData.state.unloaded = true;
pluginData.state.events.removeAllListeners(); pluginData.state.events.removeAllListeners();
}, },

View file

@ -44,7 +44,7 @@ export const AddCaseCmd = modActionsCmd({
// The moderator who did the action is the message author or, if used, the specified -mod // The moderator who did the action is the message author or, if used, the specified -mod
let mod = msg.member; let mod = msg.member;
if (args.mod) { if (args.mod) {
if (!hasPermission(pluginData, "can_act_as_other", { message: msg })) { if (!(await hasPermission(pluginData, "can_act_as_other", { message: msg }))) {
sendErrorMessage(pluginData, msg.channel, "You don't have permission to use -mod"); sendErrorMessage(pluginData, msg.channel, "You don't have permission to use -mod");
return; return;
} }

View file

@ -54,7 +54,7 @@ export const BanCmd = modActionsCmd({
// The moderator who did the action is the message author or, if used, the specified -mod // The moderator who did the action is the message author or, if used, the specified -mod
let mod = msg.member; let mod = msg.member;
if (args.mod) { if (args.mod) {
if (!hasPermission(pluginData, "can_act_as_other", { message: msg, channelId: msg.channel.id })) { if (!(await hasPermission(pluginData, "can_act_as_other", { message: msg, channelId: msg.channel.id }))) {
sendErrorMessage(pluginData, msg.channel, "You don't have permission to use -mod"); sendErrorMessage(pluginData, msg.channel, "You don't have permission to use -mod");
return; return;
} }
@ -160,7 +160,8 @@ export const BanCmd = modActionsCmd({
return; return;
} }
const deleteMessageDays = args["delete-days"] ?? pluginData.config.getForMessage(msg).ban_delete_message_days; const deleteMessageDays =
args["delete-days"] ?? (await pluginData.config.getForMessage(msg)).ban_delete_message_days;
const banResult = await banUserId( const banResult = await banUserId(
pluginData, pluginData,
user.id, user.id,

View file

@ -53,7 +53,7 @@ export const ForcebanCmd = modActionsCmd({
// The moderator who did the action is the message author or, if used, the specified -mod // The moderator who did the action is the message author or, if used, the specified -mod
let mod = msg.member; let mod = msg.member;
if (args.mod) { if (args.mod) {
if (!hasPermission(pluginData, "can_act_as_other", { message: msg })) { if (!(await hasPermission(pluginData, "can_act_as_other", { message: msg }))) {
sendErrorMessage(pluginData, msg.channel, "You don't have permission to use -mod"); sendErrorMessage(pluginData, msg.channel, "You don't have permission to use -mod");
return; return;
} }

View file

@ -36,7 +36,7 @@ export const UnbanCmd = modActionsCmd({
// The moderator who did the action is the message author or, if used, the specified -mod // The moderator who did the action is the message author or, if used, the specified -mod
let mod = msg.member; let mod = msg.member;
if (args.mod) { if (args.mod) {
if (!hasPermission(pluginData, "can_act_as_other", { message: msg, channelId: msg.channel.id })) { if (!(await hasPermission(pluginData, "can_act_as_other", { message: msg, channelId: msg.channel.id }))) {
sendErrorMessage(pluginData, msg.channel, "You don't have permission to use -mod"); sendErrorMessage(pluginData, msg.channel, "You don't have permission to use -mod");
return; return;
} }

View file

@ -56,7 +56,7 @@ export const WarnCmd = modActionsCmd({
// The moderator who did the action is the message author or, if used, the specified -mod // The moderator who did the action is the message author or, if used, the specified -mod
let mod = msg.member; let mod = msg.member;
if (args.mod) { if (args.mod) {
if (!hasPermission(pluginData, "can_act_as_other", { message: msg })) { if (!(await hasPermission(pluginData, "can_act_as_other", { message: msg }))) {
msg.channel.createMessage(errorMessage("You don't have permission to use -mod")); msg.channel.createMessage(errorMessage("You don't have permission to use -mod"));
return; return;
} }

View file

@ -13,9 +13,9 @@ import { Case } from "../../../data/entities/Case";
* Create a BAN case automatically when a user is banned manually. * Create a BAN case automatically when a user is banned manually.
* Attempts to find the ban's details in the audit log. * Attempts to find the ban's details in the audit log.
*/ */
export const CreateBanCaseOnManualBanEvt = modActionsEvt( export const CreateBanCaseOnManualBanEvt = modActionsEvt({
"guildBanAdd", event: "guildBanAdd",
async ({ pluginData, args: { guild, user } }) => { async listener({ pluginData, args: { guild, user } }) {
if (isEventIgnored(pluginData, IgnoredEventType.Ban, user.id)) { if (isEventIgnored(pluginData, IgnoredEventType.Ban, user.id)) {
clearIgnoredEvents(pluginData, IgnoredEventType.Ban, user.id); clearIgnoredEvents(pluginData, IgnoredEventType.Ban, user.id);
return; return;
@ -39,7 +39,7 @@ export const CreateBanCaseOnManualBanEvt = modActionsEvt(
mod = await resolveUser(pluginData.client, modId); mod = await resolveUser(pluginData.client, modId);
const config = mod instanceof UnknownUser ? pluginData.config.get() : pluginData.config.getForUser(mod); const config = mod instanceof UnknownUser ? pluginData.config.get() : await pluginData.config.getForUser(mod);
if (config.create_cases_for_manual_actions) { if (config.create_cases_for_manual_actions) {
reason = relevantAuditLogEntry.reason || ""; reason = relevantAuditLogEntry.reason || "";
@ -72,4 +72,4 @@ export const CreateBanCaseOnManualBanEvt = modActionsEvt(
pluginData.state.events.emit("ban", user.id, reason); pluginData.state.events.emit("ban", user.id, reason);
}, },
); });

View file

@ -14,9 +14,9 @@ import { Case } from "../../../data/entities/Case";
* Create a KICK case automatically when a user is kicked manually. * Create a KICK case automatically when a user is kicked manually.
* Attempts to find the kick's details in the audit log. * Attempts to find the kick's details in the audit log.
*/ */
export const CreateKickCaseOnManualKickEvt = modActionsEvt( export const CreateKickCaseOnManualKickEvt = modActionsEvt({
"guildMemberRemove", event: "guildMemberRemove",
async ({ pluginData, args: { member } }) => { async listener({ pluginData, args: { member } }) {
if (isEventIgnored(pluginData, IgnoredEventType.Kick, member.id)) { if (isEventIgnored(pluginData, IgnoredEventType.Kick, member.id)) {
clearIgnoredEvents(pluginData, IgnoredEventType.Kick, member.id); clearIgnoredEvents(pluginData, IgnoredEventType.Kick, member.id);
return; return;
@ -42,7 +42,7 @@ export const CreateKickCaseOnManualKickEvt = modActionsEvt(
} else { } else {
mod = await resolveUser(pluginData.client, kickAuditLogEntry.user.id); mod = await resolveUser(pluginData.client, kickAuditLogEntry.user.id);
const config = mod instanceof UnknownUser ? pluginData.config.get() : pluginData.config.getForUser(mod); const config = mod instanceof UnknownUser ? pluginData.config.get() : await pluginData.config.getForUser(mod);
if (config.create_cases_for_manual_actions) { if (config.create_cases_for_manual_actions) {
const casesPlugin = pluginData.getPlugin(CasesPlugin); const casesPlugin = pluginData.getPlugin(CasesPlugin);
@ -67,4 +67,4 @@ export const CreateKickCaseOnManualKickEvt = modActionsEvt(
pluginData.state.events.emit("kick", member.id, kickAuditLogEntry.reason || undefined); pluginData.state.events.emit("kick", member.id, kickAuditLogEntry.reason || undefined);
} }
}, },
); });

View file

@ -13,9 +13,9 @@ import { Case } from "../../../data/entities/Case";
* Create an UNBAN case automatically when a user is unbanned manually. * Create an UNBAN case automatically when a user is unbanned manually.
* Attempts to find the unban's details in the audit log. * Attempts to find the unban's details in the audit log.
*/ */
export const CreateUnbanCaseOnManualUnbanEvt = modActionsEvt( export const CreateUnbanCaseOnManualUnbanEvt = modActionsEvt({
"guildBanRemove", event: "guildBanRemove",
async ({ pluginData, args: { guild, user } }) => { async listener({ pluginData, args: { guild, user } }) {
if (isEventIgnored(pluginData, IgnoredEventType.Unban, user.id)) { if (isEventIgnored(pluginData, IgnoredEventType.Unban, user.id)) {
clearIgnoredEvents(pluginData, IgnoredEventType.Unban, user.id); clearIgnoredEvents(pluginData, IgnoredEventType.Unban, user.id);
return; return;
@ -38,7 +38,7 @@ export const CreateUnbanCaseOnManualUnbanEvt = modActionsEvt(
mod = await resolveUser(pluginData.client, modId); mod = await resolveUser(pluginData.client, modId);
const config = mod instanceof UnknownUser ? pluginData.config.get() : pluginData.config.getForUser(mod); const config = mod instanceof UnknownUser ? pluginData.config.get() : await pluginData.config.getForUser(mod);
if (config.create_cases_for_manual_actions) { if (config.create_cases_for_manual_actions) {
createdCase = await casesPlugin.createCase({ createdCase = await casesPlugin.createCase({
@ -69,4 +69,4 @@ export const CreateUnbanCaseOnManualUnbanEvt = modActionsEvt(
pluginData.state.events.emit("unban", user.id); pluginData.state.events.emit("unban", user.id);
}, },
); });

View file

@ -8,9 +8,9 @@ import { hasDiscordPermissions } from "../../../utils/hasDiscordPermissions";
/** /**
* Show an alert if a member with prior notes joins the server * Show an alert if a member with prior notes joins the server
*/ */
export const PostAlertOnMemberJoinEvt = modActionsEvt( export const PostAlertOnMemberJoinEvt = modActionsEvt({
"guildMemberAdd", event: "guildMemberAdd",
async ({ pluginData, args: { guild, member } }) => { async listener({ pluginData, args: { guild, member } }) {
const config = pluginData.config.get(); const config = pluginData.config.get();
if (!config.alert_on_rejoin) return; if (!config.alert_on_rejoin) return;
@ -51,4 +51,4 @@ export const PostAlertOnMemberJoinEvt = modActionsEvt(
); );
} }
}, },
); });

View file

@ -51,7 +51,7 @@ export async function actualKickMemberCmd(
// The moderator who did the action is the message author or, if used, the specified -mod // The moderator who did the action is the message author or, if used, the specified -mod
let mod = msg.member; let mod = msg.member;
if (args.mod) { if (args.mod) {
if (!hasPermission(pluginData.config.getForMessage(msg), "can_act_as_other")) { if (!(await hasPermission(await pluginData.config.getForMessage(msg), "can_act_as_other"))) {
sendErrorMessage(pluginData, msg.channel, "You don't have permission to use -mod"); sendErrorMessage(pluginData, msg.channel, "You don't have permission to use -mod");
return; return;
} }

View file

@ -1,4 +1,4 @@
import { Member, Message, TextChannel, User } from "eris"; import { GuildTextableChannel, Member, Message, TextChannel, User } from "eris";
import { asSingleLine, isDiscordRESTError, UnknownUser } from "../../../utils"; import { asSingleLine, isDiscordRESTError, UnknownUser } from "../../../utils";
import { hasPermission, sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils"; import { hasPermission, sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils";
import { GuildPluginData } from "knub"; import { GuildPluginData } from "knub";
@ -10,7 +10,6 @@ import { MutesPlugin } from "../../Mutes/MutesPlugin";
import { readContactMethodsFromArgs } from "./readContactMethodsFromArgs"; import { readContactMethodsFromArgs } from "./readContactMethodsFromArgs";
import { ERRORS, RecoverablePluginError } from "../../../RecoverablePluginError"; import { ERRORS, RecoverablePluginError } from "../../../RecoverablePluginError";
import { logger } from "../../../logger"; import { logger } from "../../../logger";
import { GuildMessage } from "knub/dist/helpers";
/** /**
* The actual function run by both !mute and !forcemute. * The actual function run by both !mute and !forcemute.
@ -19,7 +18,7 @@ import { GuildMessage } from "knub/dist/helpers";
export async function actualMuteUserCmd( export async function actualMuteUserCmd(
pluginData: GuildPluginData<ModActionsPluginType>, pluginData: GuildPluginData<ModActionsPluginType>,
user: User | UnknownUser, user: User | UnknownUser,
msg: GuildMessage, msg: Message<GuildTextableChannel>,
args: { time?: number; reason?: string; mod: Member; notify?: string; "notify-channel"?: TextChannel }, args: { time?: number; reason?: string; mod: Member; notify?: string; "notify-channel"?: TextChannel },
) { ) {
// The moderator who did the action is the message author or, if used, the specified -mod // The moderator who did the action is the message author or, if used, the specified -mod
@ -27,7 +26,7 @@ export async function actualMuteUserCmd(
let pp: User | null = null; let pp: User | null = null;
if (args.mod) { if (args.mod) {
if (!hasPermission(pluginData, "can_act_as_other", { message: msg })) { if (!(await hasPermission(pluginData, "can_act_as_other", { message: msg }))) {
sendErrorMessage(pluginData, msg.channel, "You don't have permission to use -mod"); sendErrorMessage(pluginData, msg.channel, "You don't have permission to use -mod");
return; return;
} }

View file

@ -18,7 +18,7 @@ export async function actualUnmuteCmd(
let pp: User | null = null; let pp: User | null = null;
if (args.mod) { if (args.mod) {
if (!hasPermission(pluginData, "can_act_as_other", { message: msg, channelId: msg.channel.id })) { if (!(await hasPermission(pluginData, "can_act_as_other", { message: msg, channelId: msg.channel.id }))) {
sendErrorMessage(pluginData, msg.channel, "You don't have permission to use -mod"); sendErrorMessage(pluginData, msg.channel, "You don't have permission to use -mod");
return; return;
} }

View file

@ -1,6 +1,6 @@
import * as t from "io-ts"; import * as t from "io-ts";
import { tNullable, UserNotificationMethod, UserNotificationResult } from "../../utils"; import { tNullable, UserNotificationMethod, UserNotificationResult } from "../../utils";
import { BasePluginType, guildCommand, guildEventListener } from "knub"; import { BasePluginType, typedGuildCommand, typedGuildEventListener } from "knub";
import { GuildMutes } from "../../data/GuildMutes"; import { GuildMutes } from "../../data/GuildMutes";
import { GuildCases } from "../../data/GuildCases"; import { GuildCases } from "../../data/GuildCases";
import { GuildLogs } from "../../data/GuildLogs"; import { GuildLogs } from "../../data/GuildLogs";
@ -148,5 +148,5 @@ export interface BanOptions {
export type ModActionType = "note" | "warn" | "mute" | "unmute" | "kick" | "ban" | "unban"; export type ModActionType = "note" | "warn" | "mute" | "unmute" | "kick" | "ban" | "unban";
export const modActionsCmd = guildCommand<ModActionsPluginType>(); export const modActionsCmd = typedGuildCommand<ModActionsPluginType>();
export const modActionsEvt = guildEventListener<ModActionsPluginType>(); export const modActionsEvt = typedGuildEventListener<ModActionsPluginType>();

View file

@ -61,7 +61,8 @@ const EXPIRED_MUTE_CHECK_INTERVAL = 60 * 1000;
let FIRST_CHECK_TIME = Date.now(); let FIRST_CHECK_TIME = Date.now();
const FIRST_CHECK_INCREMENT = 5 * 1000; const FIRST_CHECK_INCREMENT = 5 * 1000;
export const MutesPlugin = zeppelinGuildPlugin<MutesPluginType>()("mutes", { export const MutesPlugin = zeppelinGuildPlugin<MutesPluginType>()({
name: "mutes",
showInDocs: true, showInDocs: true,
info: { info: {
prettyName: "Mutes", prettyName: "Mutes",
@ -104,7 +105,7 @@ export const MutesPlugin = zeppelinGuildPlugin<MutesPluginType>()("mutes", {
}, },
}, },
onLoad(pluginData) { afterLoad(pluginData) {
pluginData.state.mutes = GuildMutes.getGuildInstance(pluginData.guild.id); pluginData.state.mutes = GuildMutes.getGuildInstance(pluginData.guild.id);
pluginData.state.cases = GuildCases.getGuildInstance(pluginData.guild.id); pluginData.state.cases = GuildCases.getGuildInstance(pluginData.guild.id);
pluginData.state.serverLogs = new GuildLogs(pluginData.guild.id); pluginData.state.serverLogs = new GuildLogs(pluginData.guild.id);
@ -125,7 +126,7 @@ export const MutesPlugin = zeppelinGuildPlugin<MutesPluginType>()("mutes", {
}, firstCheckTime - Date.now()); }, firstCheckTime - Date.now());
}, },
onUnload(pluginData) { beforeUnload(pluginData) {
clearInterval(pluginData.state.muteClearIntervalId); clearInterval(pluginData.state.muteClearIntervalId);
pluginData.state.events.removeAllListeners(); pluginData.state.events.removeAllListeners();
}, },

View file

@ -3,9 +3,12 @@ import { mutesEvt } from "../types";
/** /**
* Clear active mute from the member if the member is banned * Clear active mute from the member if the member is banned
*/ */
export const ClearActiveMuteOnMemberBanEvt = mutesEvt("guildBanAdd", async ({ pluginData, args: { user } }) => { export const ClearActiveMuteOnMemberBanEvt = mutesEvt({
const mute = await pluginData.state.mutes.findExistingMuteForUserId(user.id); event: "guildBanAdd",
if (mute) { async listener({ pluginData, args: { user } }) {
pluginData.state.mutes.clear(user.id); const mute = await pluginData.state.mutes.findExistingMuteForUserId(user.id);
} if (mute) {
pluginData.state.mutes.clear(user.id);
}
},
}); });

View file

@ -4,9 +4,9 @@ import { memberHasMutedRole } from "../functions/memberHasMutedRole";
/** /**
* Clear active mute if the mute role is removed manually * Clear active mute if the mute role is removed manually
*/ */
export const ClearActiveMuteOnRoleRemovalEvt = mutesEvt( export const ClearActiveMuteOnRoleRemovalEvt = mutesEvt({
"guildMemberUpdate", event: "guildMemberUpdate",
async ({ pluginData, args: { member } }) => { async listener({ pluginData, args: { member } }) {
const muteRole = pluginData.config.get().mute_role; const muteRole = pluginData.config.get().mute_role;
if (!muteRole) return; if (!muteRole) return;
@ -17,4 +17,4 @@ export const ClearActiveMuteOnRoleRemovalEvt = mutesEvt(
await pluginData.state.mutes.clear(muteRole); await pluginData.state.mutes.clear(muteRole);
} }
}, },
); });

View file

@ -6,19 +6,22 @@ import { memberRolesLock } from "../../../utils/lockNameHelpers";
/** /**
* Reapply active mutes on join * Reapply active mutes on join
*/ */
export const ReapplyActiveMuteOnJoinEvt = mutesEvt("guildMemberAdd", async ({ pluginData, args: { member } }) => { export const ReapplyActiveMuteOnJoinEvt = mutesEvt({
const mute = await pluginData.state.mutes.findExistingMuteForUserId(member.id); event: "guildMemberAdd",
if (mute) { async listener({ pluginData, args: { member } }) {
const muteRole = pluginData.config.get().mute_role; const mute = await pluginData.state.mutes.findExistingMuteForUserId(member.id);
if (mute) {
const muteRole = pluginData.config.get().mute_role;
if (muteRole) { if (muteRole) {
const memberRoleLock = await pluginData.locks.acquire(memberRolesLock(member)); const memberRoleLock = await pluginData.locks.acquire(memberRolesLock(member));
await member.addRole(muteRole); await member.addRole(muteRole);
memberRoleLock.unlock(); memberRoleLock.unlock();
}
pluginData.state.serverLogs.log(LogType.MEMBER_MUTE_REJOIN, {
member: stripObjectToScalars(member, ["user", "roles"]),
});
} }
},
pluginData.state.serverLogs.log(LogType.MEMBER_MUTE_REJOIN, {
member: stripObjectToScalars(member, ["user", "roles"]),
});
}
}); });

View file

@ -52,7 +52,7 @@ export async function muteUser(
} }
const member = await resolveMember(pluginData.client, pluginData.guild, user.id, true); // Grab the fresh member so we don't have stale role info const member = await resolveMember(pluginData.client, pluginData.guild, user.id, true); // Grab the fresh member so we don't have stale role info
const config = pluginData.config.getMatchingConfig({ member, userId }); const config = await pluginData.config.getMatchingConfig({ member, userId });
let rolesToRestore: string[] = []; let rolesToRestore: string[] = [];
if (member) { if (member) {

View file

@ -3,7 +3,7 @@ import { tNullable, UserNotificationMethod, UserNotificationResult } from "../..
import { Mute } from "../../data/entities/Mute"; import { Mute } from "../../data/entities/Mute";
import { Member } from "eris"; import { Member } from "eris";
import { Case } from "../../data/entities/Case"; import { Case } from "../../data/entities/Case";
import { BasePluginType, guildCommand, guildEventListener } from "knub"; import { BasePluginType, typedGuildCommand, typedGuildEventListener } from "knub";
import { GuildLogs } from "../../data/GuildLogs"; import { GuildLogs } from "../../data/GuildLogs";
import { GuildCases } from "../../data/GuildCases"; import { GuildCases } from "../../data/GuildCases";
import { GuildArchives } from "../../data/GuildArchives"; import { GuildArchives } from "../../data/GuildArchives";
@ -78,5 +78,5 @@ export interface MuteOptions {
isAutomodAction?: boolean; isAutomodAction?: boolean;
} }
export const mutesCmd = guildCommand<MutesPluginType>(); export const mutesCmd = typedGuildCommand<MutesPluginType>();
export const mutesEvt = guildEventListener<MutesPluginType>(); export const mutesEvt = typedGuildEventListener<MutesPluginType>();

View file

@ -21,7 +21,8 @@ const defaultOptions: PluginOptions<NameHistoryPluginType> = {
], ],
}; };
export const NameHistoryPlugin = zeppelinGuildPlugin<NameHistoryPluginType>()("name_history", { export const NameHistoryPlugin = zeppelinGuildPlugin<NameHistoryPluginType>()({
name: "name_history",
showInDocs: false, showInDocs: false,
configSchema: ConfigSchema, configSchema: ConfigSchema,
@ -38,7 +39,7 @@ export const NameHistoryPlugin = zeppelinGuildPlugin<NameHistoryPluginType>()("n
MessageCreateEvt, MessageCreateEvt,
], ],
onLoad(pluginData) { afterLoad(pluginData) {
const { state, guild } = pluginData; const { state, guild } = pluginData;
state.nicknameHistory = GuildNicknameHistory.getGuildInstance(guild.id); state.nicknameHistory = GuildNicknameHistory.getGuildInstance(guild.id);

View file

@ -1,5 +1,5 @@
import * as t from "io-ts"; import * as t from "io-ts";
import { BasePluginType, guildCommand, guildEventListener } from "knub"; import { BasePluginType, typedGuildCommand, typedGuildEventListener } from "knub";
import { GuildNicknameHistory } from "../../data/GuildNicknameHistory"; import { GuildNicknameHistory } from "../../data/GuildNicknameHistory";
import { UsernameHistory } from "../../data/UsernameHistory"; import { UsernameHistory } from "../../data/UsernameHistory";
import { Queue } from "../../Queue"; import { Queue } from "../../Queue";
@ -18,5 +18,5 @@ export interface NameHistoryPluginType extends BasePluginType {
}; };
} }
export const nameHistoryCmd = guildCommand<NameHistoryPluginType>(); export const nameHistoryCmd = typedGuildCommand<NameHistoryPluginType>();
export const nameHistoryEvt = guildEventListener<NameHistoryPluginType>(); export const nameHistoryEvt = typedGuildEventListener<NameHistoryPluginType>();

View file

@ -16,7 +16,8 @@ const defaultOptions: PluginOptions<PersistPluginType> = {
}, },
}; };
export const PersistPlugin = zeppelinGuildPlugin<PersistPluginType>()("persist", { export const PersistPlugin = zeppelinGuildPlugin<PersistPluginType>()({
name: "persist",
showInDocs: true, showInDocs: true,
info: { info: {
prettyName: "Persist", prettyName: "Persist",
@ -36,7 +37,7 @@ export const PersistPlugin = zeppelinGuildPlugin<PersistPluginType>()("persist",
LoadDataEvt, LoadDataEvt,
], ],
onLoad(pluginData) { afterLoad(pluginData) {
const { state, guild } = pluginData; const { state, guild } = pluginData;
state.persistedData = GuildPersistedData.getGuildInstance(guild.id); state.persistedData = GuildPersistedData.getGuildInstance(guild.id);

View file

@ -27,12 +27,12 @@ export const LoadDataEvt = persistEvt({
} }
const toRestore: MemberOptions = {}; const toRestore: MemberOptions = {};
const config = pluginData.config.getForMember(member); const config = await pluginData.config.getForMember(member);
const restoredData: string[] = []; const restoredData: string[] = [];
// Check permissions // Check permissions
const me = pluginData.guild.members.get(pluginData.client.user.id)!; const me = pluginData.guild.members.get(pluginData.client.user.id)!;
let requiredPermissions = 0; let requiredPermissions = 0n;
if (config.persist_nicknames) requiredPermissions |= p.manageNicknames; if (config.persist_nicknames) requiredPermissions |= p.manageNicknames;
if (config.persisted_roles) requiredPermissions |= p.manageRoles; if (config.persisted_roles) requiredPermissions |= p.manageRoles;
const missingPermissions = getMissingPermissions(me.permission, requiredPermissions); const missingPermissions = getMissingPermissions(me.permission, requiredPermissions);

View file

@ -12,7 +12,7 @@ export const StoreDataEvt = persistEvt({
let persist = false; let persist = false;
const persistData: IPartialPersistData = {}; const persistData: IPartialPersistData = {};
const config = pluginData.config.getForUser(member.user); const config = await pluginData.config.getForUser(member.user);
const persistedRoles = config.persisted_roles; const persistedRoles = config.persisted_roles;
if (persistedRoles.length && member.roles) { if (persistedRoles.length && member.roles) {

View file

@ -1,5 +1,5 @@
import * as t from "io-ts"; import * as t from "io-ts";
import { BasePluginType, guildEventListener } from "knub"; import { BasePluginType, typedGuildEventListener } from "knub";
import { GuildPersistedData } from "../../data/GuildPersistedData"; import { GuildPersistedData } from "../../data/GuildPersistedData";
import { GuildLogs } from "../../data/GuildLogs"; import { GuildLogs } from "../../data/GuildLogs";
@ -19,4 +19,4 @@ export interface PersistPluginType extends BasePluginType {
}; };
} }
export const persistEvt = guildEventListener<PersistPluginType>(); export const persistEvt = typedGuildEventListener<PersistPluginType>();

View file

@ -20,7 +20,8 @@ const defaultOptions: PluginOptions<PingableRolesPluginType> = {
], ],
}; };
export const PingableRolesPlugin = zeppelinGuildPlugin<PingableRolesPluginType>()("pingable_roles", { export const PingableRolesPlugin = zeppelinGuildPlugin<PingableRolesPluginType>()({
name: "pingable_roles",
showInDocs: true, showInDocs: true,
info: { info: {
prettyName: "Pingable roles", prettyName: "Pingable roles",
@ -41,7 +42,7 @@ export const PingableRolesPlugin = zeppelinGuildPlugin<PingableRolesPluginType>(
MessageCreateDisablePingableEvt, MessageCreateDisablePingableEvt,
], ],
onLoad(pluginData) { afterLoad(pluginData) {
const { state, guild } = pluginData; const { state, guild } = pluginData;
state.pingableRoles = GuildPingableRoles.getGuildInstance(guild.id); state.pingableRoles = GuildPingableRoles.getGuildInstance(guild.id);

View file

@ -1,5 +1,5 @@
import * as t from "io-ts"; import * as t from "io-ts";
import { BasePluginType, guildCommand, guildEventListener } from "knub"; import { BasePluginType, typedGuildCommand, typedGuildEventListener } from "knub";
import { GuildPingableRoles } from "../../data/GuildPingableRoles"; import { GuildPingableRoles } from "../../data/GuildPingableRoles";
import { PingableRole } from "../../data/entities/PingableRole"; import { PingableRole } from "../../data/entities/PingableRole";
@ -18,5 +18,5 @@ export interface PingableRolesPluginType extends BasePluginType {
}; };
} }
export const pingableRolesCmd = guildCommand<PingableRolesPluginType>(); export const pingableRolesCmd = typedGuildCommand<PingableRolesPluginType>();
export const pingableRolesEvt = guildEventListener<PingableRolesPluginType>(); export const pingableRolesEvt = typedGuildEventListener<PingableRolesPluginType>();

View file

@ -28,7 +28,8 @@ const defaultOptions: PluginOptions<PostPluginType> = {
], ],
}; };
export const PostPlugin = zeppelinGuildPlugin<PostPluginType>()("post", { export const PostPlugin = zeppelinGuildPlugin<PostPluginType>()({
name: "post",
showInDocs: true, showInDocs: true,
info: { info: {
prettyName: "Post", prettyName: "Post",
@ -49,7 +50,7 @@ export const PostPlugin = zeppelinGuildPlugin<PostPluginType>()("post", {
ScheduledPostsDeleteCmd, ScheduledPostsDeleteCmd,
], ],
onLoad(pluginData) { afterLoad(pluginData) {
const { state, guild } = pluginData; const { state, guild } = pluginData;
state.savedMessages = GuildSavedMessages.getGuildInstance(guild.id); state.savedMessages = GuildSavedMessages.getGuildInstance(guild.id);
@ -59,7 +60,7 @@ export const PostPlugin = zeppelinGuildPlugin<PostPluginType>()("post", {
scheduledPostLoop(pluginData); scheduledPostLoop(pluginData);
}, },
onUnload(pluginData) { beforeUnload(pluginData) {
clearTimeout(pluginData.state.scheduledPostLoopTimeout); clearTimeout(pluginData.state.scheduledPostLoopTimeout);
}, },
}); });

View file

@ -1,5 +1,5 @@
import * as t from "io-ts"; import * as t from "io-ts";
import { BasePluginType, guildCommand } from "knub"; import { BasePluginType, typedGuildCommand } from "knub";
import { GuildSavedMessages } from "../../data/GuildSavedMessages"; import { GuildSavedMessages } from "../../data/GuildSavedMessages";
import { GuildScheduledPosts } from "../../data/GuildScheduledPosts"; import { GuildScheduledPosts } from "../../data/GuildScheduledPosts";
import { GuildLogs } from "../../data/GuildLogs"; import { GuildLogs } from "../../data/GuildLogs";
@ -20,4 +20,4 @@ export interface PostPluginType extends BasePluginType {
}; };
} }
export const postCmd = guildCommand<PostPluginType>(); export const postCmd = typedGuildCommand<PostPluginType>();

View file

@ -31,7 +31,8 @@ const defaultOptions: PluginOptions<ReactionRolesPluginType> = {
], ],
}; };
export const ReactionRolesPlugin = zeppelinGuildPlugin<ReactionRolesPluginType>()("reaction_roles", { export const ReactionRolesPlugin = zeppelinGuildPlugin<ReactionRolesPluginType>()({
name: "reaction_roles",
showInDocs: true, showInDocs: true,
info: { info: {
prettyName: "Reaction roles", prettyName: "Reaction roles",
@ -53,7 +54,7 @@ export const ReactionRolesPlugin = zeppelinGuildPlugin<ReactionRolesPluginType>(
AddReactionRoleEvt, AddReactionRoleEvt,
], ],
onLoad(pluginData) { afterLoad(pluginData) {
const { state, guild } = pluginData; const { state, guild } = pluginData;
state.reactionRoles = GuildReactionRoles.getGuildInstance(guild.id); state.reactionRoles = GuildReactionRoles.getGuildInstance(guild.id);
@ -70,7 +71,7 @@ export const ReactionRolesPlugin = zeppelinGuildPlugin<ReactionRolesPluginType>(
} }
}, },
onUnload(pluginData) { beforeUnload(pluginData) {
if (pluginData.state.autoRefreshTimeout) { if (pluginData.state.autoRefreshTimeout) {
clearTimeout(pluginData.state.autoRefreshTimeout); clearTimeout(pluginData.state.autoRefreshTimeout);
} }

View file

@ -55,7 +55,7 @@ export const AddReactionRoleEvt = reactionRolesEvt({
} }
// Remove the reaction after a small delay // Remove the reaction after a small delay
const config = pluginData.config.getForMember(member); const config = await pluginData.config.getForMember(member);
if (config.remove_user_reactions) { if (config.remove_user_reactions) {
setTimeout(() => { setTimeout(() => {
pluginData.state.reactionRemoveQueue.add(async () => { pluginData.state.reactionRemoveQueue.add(async () => {

View file

@ -1,5 +1,5 @@
import * as t from "io-ts"; import * as t from "io-ts";
import { BasePluginType, guildEventListener, guildCommand } from "knub"; import { BasePluginType, typedGuildEventListener, typedGuildCommand } from "knub";
import { GuildSavedMessages } from "../../data/GuildSavedMessages"; import { GuildSavedMessages } from "../../data/GuildSavedMessages";
import { GuildReactionRoles } from "../../data/GuildReactionRoles"; import { GuildReactionRoles } from "../../data/GuildReactionRoles";
import { Queue } from "../../Queue"; import { Queue } from "../../Queue";
@ -41,5 +41,5 @@ export interface ReactionRolesPluginType extends BasePluginType {
}; };
} }
export const reactionRolesCmd = guildCommand<ReactionRolesPluginType>(); export const reactionRolesCmd = typedGuildCommand<ReactionRolesPluginType>();
export const reactionRolesEvt = guildEventListener<ReactionRolesPluginType>(); export const reactionRolesEvt = typedGuildEventListener<ReactionRolesPluginType>();

View file

@ -22,7 +22,8 @@ const defaultOptions: PluginOptions<RemindersPluginType> = {
], ],
}; };
export const RemindersPlugin = zeppelinGuildPlugin<RemindersPluginType>()("reminders", { export const RemindersPlugin = zeppelinGuildPlugin<RemindersPluginType>()({
name: "reminders",
showInDocs: true, showInDocs: true,
info: { info: {
prettyName: "Reminders", prettyName: "Reminders",
@ -39,7 +40,7 @@ export const RemindersPlugin = zeppelinGuildPlugin<RemindersPluginType>()("remin
RemindersDeleteCmd, RemindersDeleteCmd,
], ],
onLoad(pluginData) { afterLoad(pluginData) {
const { state, guild } = pluginData; const { state, guild } = pluginData;
state.reminders = GuildReminders.getGuildInstance(guild.id); state.reminders = GuildReminders.getGuildInstance(guild.id);
@ -50,7 +51,7 @@ export const RemindersPlugin = zeppelinGuildPlugin<RemindersPluginType>()("remin
postDueRemindersLoop(pluginData); postDueRemindersLoop(pluginData);
}, },
onUnload(pluginData) { beforeUnload(pluginData) {
clearTimeout(pluginData.state.postRemindersTimeout); clearTimeout(pluginData.state.postRemindersTimeout);
pluginData.state.unloaded = true; pluginData.state.unloaded = true;
}, },

View file

@ -1,5 +1,5 @@
import * as t from "io-ts"; import * as t from "io-ts";
import { BasePluginType, guildCommand } from "knub"; import { BasePluginType, typedGuildCommand } from "knub";
import { GuildReminders } from "../../data/GuildReminders"; import { GuildReminders } from "../../data/GuildReminders";
export const ConfigSchema = t.type({ export const ConfigSchema = t.type({
@ -19,4 +19,4 @@ export interface RemindersPluginType extends BasePluginType {
}; };
} }
export const remindersCmd = guildCommand<RemindersPluginType>(); export const remindersCmd = typedGuildCommand<RemindersPluginType>();

View file

@ -30,7 +30,8 @@ const defaultOptions: PluginOptions<RolesPluginType> = {
], ],
}; };
export const RolesPlugin = zeppelinGuildPlugin<RolesPluginType>()("roles", { export const RolesPlugin = zeppelinGuildPlugin<RolesPluginType>()({
name: "roles",
showInDocs: true, showInDocs: true,
info: { info: {
prettyName: "Roles", prettyName: "Roles",
@ -50,7 +51,7 @@ export const RolesPlugin = zeppelinGuildPlugin<RolesPluginType>()("roles", {
MassRemoveRoleCmd, MassRemoveRoleCmd,
], ],
onLoad(pluginData) { afterLoad(pluginData) {
const { state, guild } = pluginData; const { state, guild } = pluginData;
state.logs = new GuildLogs(guild.id); state.logs = new GuildLogs(guild.id);

View file

@ -27,7 +27,7 @@ export const AddRoleCmd = rolesCmd({
return; return;
} }
const config = pluginData.config.getForMessage(msg); const config = await pluginData.config.getForMessage(msg);
if (!config.assignable_roles.includes(roleId)) { if (!config.assignable_roles.includes(roleId)) {
sendErrorMessage(pluginData, msg.channel, "You cannot assign that role"); sendErrorMessage(pluginData, msg.channel, "You cannot assign that role");
return; return;

View file

@ -43,7 +43,7 @@ export const MassAddRoleCmd = rolesCmd({
return; return;
} }
const config = pluginData.config.getForMessage(msg); const config = await pluginData.config.getForMessage(msg);
if (!config.assignable_roles.includes(roleId)) { if (!config.assignable_roles.includes(roleId)) {
sendErrorMessage(pluginData, msg.channel, "You cannot assign that role"); sendErrorMessage(pluginData, msg.channel, "You cannot assign that role");
return; return;

View file

@ -43,7 +43,7 @@ export const MassRemoveRoleCmd = rolesCmd({
return; return;
} }
const config = pluginData.config.getForMessage(msg); const config = await pluginData.config.getForMessage(msg);
if (!config.assignable_roles.includes(roleId)) { if (!config.assignable_roles.includes(roleId)) {
sendErrorMessage(pluginData, msg.channel, "You cannot remove that role"); sendErrorMessage(pluginData, msg.channel, "You cannot remove that role");
return; return;

View file

@ -27,7 +27,7 @@ export const RemoveRoleCmd = rolesCmd({
return; return;
} }
const config = pluginData.config.getForMessage(msg); const config = await pluginData.config.getForMessage(msg);
if (!config.assignable_roles.includes(roleId)) { if (!config.assignable_roles.includes(roleId)) {
sendErrorMessage(pluginData, msg.channel, "You cannot remove that role"); sendErrorMessage(pluginData, msg.channel, "You cannot remove that role");
return; return;

View file

@ -1,5 +1,5 @@
import * as t from "io-ts"; import * as t from "io-ts";
import { BasePluginType, guildCommand } from "knub"; import { BasePluginType, typedGuildCommand } from "knub";
import { GuildLogs } from "../../data/GuildLogs"; import { GuildLogs } from "../../data/GuildLogs";
export const ConfigSchema = t.type({ export const ConfigSchema = t.type({
@ -16,4 +16,4 @@ export interface RolesPluginType extends BasePluginType {
}; };
} }
export const rolesCmd = guildCommand<RolesPluginType>(); export const rolesCmd = typedGuildCommand<RolesPluginType>();

View file

@ -13,7 +13,8 @@ const defaultOptions: PluginOptions<SelfGrantableRolesPluginType> = {
}, },
}; };
export const SelfGrantableRolesPlugin = zeppelinGuildPlugin<SelfGrantableRolesPluginType>()("self_grantable_roles", { export const SelfGrantableRolesPlugin = zeppelinGuildPlugin<SelfGrantableRolesPluginType>()({
name: "self_grantable_roles",
showInDocs: true, showInDocs: true,
configSchema: ConfigSchema, configSchema: ConfigSchema,
@ -93,7 +94,7 @@ export const SelfGrantableRolesPlugin = zeppelinGuildPlugin<SelfGrantableRolesPl
RoleAddCmd, RoleAddCmd,
], ],
onLoad(pluginData) { afterLoad(pluginData) {
pluginData.state.cooldowns = new CooldownManager(); pluginData.state.cooldowns = new CooldownManager();
}, },
}); });

View file

@ -19,7 +19,7 @@ export const RoleAddCmd = selfGrantableRolesCmd({
async run({ message: msg, args, pluginData }) { async run({ message: msg, args, pluginData }) {
const lock = await pluginData.locks.acquire(memberRolesLock(msg.author)); const lock = await pluginData.locks.acquire(memberRolesLock(msg.author));
const applyingEntries = getApplyingEntries(pluginData, msg); const applyingEntries = await getApplyingEntries(pluginData, msg);
if (applyingEntries.length === 0) { if (applyingEntries.length === 0) {
lock.unlock(); lock.unlock();
return; return;

View file

@ -7,7 +7,7 @@ export const RoleHelpCmd = selfGrantableRolesCmd({
permission: null, permission: null,
async run({ message: msg, pluginData }) { async run({ message: msg, pluginData }) {
const applyingEntries = getApplyingEntries(pluginData, msg); const applyingEntries = await getApplyingEntries(pluginData, msg);
if (applyingEntries.length === 0) return; if (applyingEntries.length === 0) return;
const allPrimaryAliases: string[] = []; const allPrimaryAliases: string[] = [];

View file

@ -18,7 +18,7 @@ export const RoleRemoveCmd = selfGrantableRolesCmd({
async run({ message: msg, args, pluginData }) { async run({ message: msg, args, pluginData }) {
const lock = await pluginData.locks.acquire(memberRolesLock(msg.author)); const lock = await pluginData.locks.acquire(memberRolesLock(msg.author));
const applyingEntries = getApplyingEntries(pluginData, msg); const applyingEntries = await getApplyingEntries(pluginData, msg);
if (applyingEntries.length === 0) { if (applyingEntries.length === 0) {
lock.unlock(); lock.unlock();
return; return;

View file

@ -1,5 +1,5 @@
import * as t from "io-ts"; import * as t from "io-ts";
import { BasePluginType, guildCommand, CooldownManager } from "knub"; import { BasePluginType, typedGuildCommand, CooldownManager } from "knub";
const RoleMap = t.record(t.string, t.array(t.string)); const RoleMap = t.record(t.string, t.array(t.string));
@ -31,4 +31,4 @@ export interface SelfGrantableRolesPluginType extends BasePluginType {
}; };
} }
export const selfGrantableRolesCmd = guildCommand<SelfGrantableRolesPluginType>(); export const selfGrantableRolesCmd = typedGuildCommand<SelfGrantableRolesPluginType>();

Some files were not shown because too many files have changed in this diff Show more