zappyzep/backend/src/plugins/ModActions/ModActionsPlugin.ts

223 lines
7.4 KiB
TypeScript
Raw Normal View History

2021-08-15 22:14:04 +02:00
import { GuildMember, Message, Snowflake } from "discord.js";
import { EventEmitter } from "events";
import { GuildCases } from "../../data/GuildCases";
import { GuildLogs } from "../../data/GuildLogs";
import { GuildMutes } from "../../data/GuildMutes";
import { GuildTempbans } from "../../data/GuildTempbans";
import { mapToPublicFn } from "../../pluginUtils";
import { Queue } from "../../Queue";
import { MINUTES, trimPluginDescription } from "../../utils";
2020-07-23 00:37:33 +03:00
import { CasesPlugin } from "../Cases/CasesPlugin";
import { MutesPlugin } from "../Mutes/MutesPlugin";
import { TimeAndDatePlugin } from "../TimeAndDate/TimeAndDatePlugin";
import { zeppelinGuildPlugin } from "../ZeppelinPluginBlueprint";
import { AddCaseCmd } from "./commands/AddCaseCmd";
import { BanCmd } from "./commands/BanCmd";
import { CaseCmd } from "./commands/CaseCmd";
import { CasesModCmd } from "./commands/CasesModCmd";
import { CasesUserCmd } from "./commands/CasesUserCmd";
import { DeleteCaseCmd } from "./commands/DeleteCaseCmd";
import { ForcebanCmd } from "./commands/ForcebanCmd";
import { ForcemuteCmd } from "./commands/ForcemuteCmd";
import { ForceUnmuteCmd } from "./commands/ForceunmuteCmd";
import { HideCaseCmd } from "./commands/HideCaseCmd";
import { KickCmd } from "./commands/KickCmd";
import { MassbanCmd } from "./commands/MassBanCmd";
import { MassmuteCmd } from "./commands/MassmuteCmd";
import { MassunbanCmd } from "./commands/MassUnbanCmd";
import { MuteCmd } from "./commands/MuteCmd";
import { NoteCmd } from "./commands/NoteCmd";
import { SoftbanCmd } from "./commands/SoftbanCommand";
import { UnbanCmd } from "./commands/UnbanCmd";
import { UnhideCaseCmd } from "./commands/UnhideCaseCmd";
import { UnmuteCmd } from "./commands/UnmuteCmd";
import { UpdateCmd } from "./commands/UpdateCmd";
import { WarnCmd } from "./commands/WarnCmd";
import { CreateBanCaseOnManualBanEvt } from "./events/CreateBanCaseOnManualBanEvt";
import { CreateUnbanCaseOnManualUnbanEvt } from "./events/CreateUnbanCaseOnManualUnbanEvt";
import { PostAlertOnMemberJoinEvt } from "./events/PostAlertOnMemberJoinEvt";
import { banUserId } from "./functions/banUserId";
import { hasMutePermission } from "./functions/hasMutePerm";
import { kickMember } from "./functions/kickMember";
2021-02-14 16:58:02 +02:00
import { offModActionsEvent } from "./functions/offModActionsEvent";
import { onModActionsEvent } from "./functions/onModActionsEvent";
import { updateCase } from "./functions/updateCase";
import { warnMember } from "./functions/warnMember";
import { BanOptions, ConfigSchema, KickOptions, ModActionsPluginType, WarnOptions } from "./types";
2021-08-18 01:51:42 +03:00
import { LogsPlugin } from "../Logs/LogsPlugin";
import { onGuildEvent } from "../../data/GuildEvents";
import { clearTempban } from "./functions/clearTempban";
2020-07-23 00:37:33 +03:00
const defaultOptions = {
config: {
dm_on_warn: true,
dm_on_kick: false,
dm_on_ban: false,
message_on_warn: false,
message_on_kick: false,
message_on_ban: false,
message_channel: null,
warn_message: "You have received a warning on the {guildName} server: {reason}",
kick_message: "You have been kicked from the {guildName} server. Reason given: {reason}",
ban_message: "You have been banned from the {guildName} server. Reason given: {reason}",
2021-01-28 00:20:55 +01:00
tempban_message: "You have been banned from the {guildName} server for {banTime}. Reason given: {reason}",
2020-07-23 00:37:33 +03:00
alert_on_rejoin: false,
alert_channel: null,
warn_notify_enabled: false,
warn_notify_threshold: 5,
warn_notify_message:
"The user already has **{priorWarnings}** warnings!\n Please check their prior cases and assess whether or not to warn anyways.\n Proceed with the warning?",
ban_delete_message_days: 1,
can_note: false,
can_warn: false,
can_mute: false,
can_kick: false,
can_ban: false,
can_unban: false,
2020-07-23 00:37:33 +03:00
can_view: false,
can_addcase: false,
2021-01-28 00:23:35 +01:00
can_massunban: false,
2020-07-23 00:37:33 +03:00
can_massban: false,
can_massmute: false,
2020-07-23 00:37:33 +03:00
can_hidecase: false,
2020-08-09 22:44:07 +03:00
can_deletecase: false,
2020-07-23 00:37:33 +03:00
can_act_as_other: false,
create_cases_for_manual_actions: true,
2020-07-23 00:37:33 +03:00
},
overrides: [
{
level: ">=50",
config: {
can_note: true,
can_warn: true,
can_mute: true,
can_kick: true,
can_ban: true,
can_unban: true,
2020-07-23 00:37:33 +03:00
can_view: true,
can_addcase: true,
},
},
{
level: ">=100",
config: {
2021-01-28 00:23:35 +01:00
can_massunban: true,
2020-07-23 00:37:33 +03:00
can_massban: true,
can_massmute: true,
2020-07-23 00:37:33 +03:00
can_hidecase: true,
can_act_as_other: true,
},
},
],
};
export const ModActionsPlugin = zeppelinGuildPlugin<ModActionsPluginType>()({
name: "mod_actions",
2020-07-30 13:08:06 +03:00
showInDocs: true,
info: {
prettyName: "Mod actions",
description: trimPluginDescription(`
This plugin contains the 'typical' mod actions such as warning, muting, kicking, banning, etc.
`),
},
dependencies: () => [TimeAndDatePlugin, CasesPlugin, MutesPlugin, LogsPlugin],
2020-07-23 00:37:33 +03:00
configSchema: ConfigSchema,
defaultOptions,
events: [CreateBanCaseOnManualBanEvt, CreateUnbanCaseOnManualUnbanEvt, PostAlertOnMemberJoinEvt],
commands: [
UpdateCmd,
NoteCmd,
WarnCmd,
MuteCmd,
ForcemuteCmd,
UnmuteCmd,
ForceUnmuteCmd,
KickCmd,
SoftbanCmd,
BanCmd,
UnbanCmd,
ForcebanCmd,
MassbanCmd,
MassmuteCmd,
2021-01-28 00:23:35 +01:00
MassunbanCmd,
AddCaseCmd,
CaseCmd,
CasesUserCmd,
CasesModCmd,
HideCaseCmd,
UnhideCaseCmd,
2020-08-09 22:44:07 +03:00
DeleteCaseCmd,
],
2020-07-23 00:37:33 +03:00
public: {
warnMember(pluginData) {
return (member: GuildMember, reason: string, warnOptions?: WarnOptions) => {
warnMember(pluginData, member, reason, warnOptions);
};
},
kickMember(pluginData) {
return (member: GuildMember, reason: string, kickOptions?: KickOptions) => {
kickMember(pluginData, member, reason, kickOptions);
};
},
banUserId(pluginData) {
2021-04-28 21:42:54 +02:00
return (userId: string, reason?: string, banOptions?: BanOptions, banTime?: number) => {
banUserId(pluginData, userId, reason, banOptions, banTime);
};
},
2021-02-14 16:58:02 +02:00
updateCase(pluginData) {
return (msg: Message, caseNumber: number | null, note: string) => {
updateCase(pluginData, msg, { caseNumber, note });
};
},
hasMutePermission(pluginData) {
return (member: GuildMember, channelId: Snowflake) => {
return hasMutePermission(pluginData, member, channelId);
};
},
2021-02-14 16:58:02 +02:00
on: mapToPublicFn(onModActionsEvent),
off: mapToPublicFn(offModActionsEvent),
getEventEmitter(pluginData) {
return () => pluginData.state.events;
},
},
beforeLoad(pluginData) {
const { state, guild } = pluginData;
state.mutes = GuildMutes.getGuildInstance(guild.id);
state.cases = GuildCases.getGuildInstance(guild.id);
2021-01-28 00:20:55 +01:00
state.tempbans = GuildTempbans.getGuildInstance(guild.id);
state.serverLogs = new GuildLogs(guild.id);
2021-01-28 00:20:55 +01:00
state.unloaded = false;
state.ignoredEvents = [];
2021-05-22 13:47:10 +03:00
// Massbans can take a while depending on rate limits,
// so we're giving each massban 15 minutes to complete before launching the next massban
state.massbanQueue = new Queue(15 * MINUTES);
2021-01-28 00:20:55 +01:00
2021-02-14 16:58:02 +02:00
state.events = new EventEmitter();
},
2021-02-14 16:58:02 +02:00
afterLoad(pluginData) {
pluginData.state.unregisterGuildEventListener = onGuildEvent(pluginData.guild.id, "expiredTempban", (tempban) =>
clearTempban(pluginData, tempban),
);
2021-01-28 00:20:55 +01:00
},
beforeUnload(pluginData) {
2021-01-28 00:20:55 +01:00
pluginData.state.unloaded = true;
pluginData.state.unregisterGuildEventListener();
2021-02-14 16:58:02 +02:00
pluginData.state.events.removeAllListeners();
},
2020-07-23 00:37:33 +03:00
});