GuildActions: create overloads for known actions; refactor certain actions, using only 1 args object; mutes: move !mutes to the Mutes plugin, fix case number not showing in mute list, make mute list prettier
This commit is contained in:
parent
bdc8b85955
commit
0b0bb05eed
4 changed files with 183 additions and 127 deletions
|
@ -1,24 +1,76 @@
|
|||
import { BaseRepository } from "./BaseRepository";
|
||||
import { Member, TextableChannel } from "eris";
|
||||
import { CaseTypes } from "./CaseTypes";
|
||||
|
||||
type ActionFn = (...args: any[]) => any | Promise<any>;
|
||||
type KnownActions = "mute" | "unmute";
|
||||
|
||||
// https://github.com/Microsoft/TypeScript/issues/4183#issuecomment-382867018
|
||||
type UnknownAction<T extends string> = T extends KnownActions ? never : T;
|
||||
|
||||
type ActionFn<T> = (args: T) => any | Promise<any>;
|
||||
|
||||
type MuteActionArgs = { member: Member; muteTime?: number; reason?: string };
|
||||
type UnmuteActionArgs = { member: Member; unmuteTime?: number; reason?: string };
|
||||
type CreateCaseActionArgs = {
|
||||
userId: string;
|
||||
modId: string;
|
||||
type: CaseTypes;
|
||||
auditLogId?: string;
|
||||
reason?: string;
|
||||
automatic?: boolean;
|
||||
postInCaseLog?: boolean;
|
||||
ppId?: string;
|
||||
};
|
||||
type CreateCaseNoteActionArgs = {
|
||||
caseId: number;
|
||||
modId: string;
|
||||
note: string;
|
||||
automatic?: boolean;
|
||||
postInCaseLog?: boolean;
|
||||
};
|
||||
type PostCaseActionArgs = {
|
||||
caseId: number;
|
||||
channel: TextableChannel;
|
||||
};
|
||||
|
||||
export class GuildActions extends BaseRepository {
|
||||
private actions: Map<string, ActionFn>;
|
||||
private actions: Map<string, ActionFn<any>>;
|
||||
|
||||
constructor(guildId) {
|
||||
super(guildId);
|
||||
this.actions = new Map();
|
||||
}
|
||||
|
||||
public register(actionName: string, actionFn: ActionFn) {
|
||||
public register(actionName: "mute", actionFn: ActionFn<MuteActionArgs>): void;
|
||||
public register(actionName: "unmute", actionFn: ActionFn<UnmuteActionArgs>): void;
|
||||
public register(actionName: "createCase", actionFn: ActionFn<CreateCaseActionArgs>): void;
|
||||
public register(actionName: "createCaseNote", actionFn: ActionFn<CreateCaseNoteActionArgs>): void;
|
||||
public register(actionName: "postCase", actionFn: ActionFn<PostCaseActionArgs>): void;
|
||||
// https://github.com/Microsoft/TypeScript/issues/4183#issuecomment-382867018
|
||||
public register<T extends string & UnknownAction<U>, U extends string = T>(
|
||||
actionName: T,
|
||||
actionFn: ActionFn<any>,
|
||||
): void;
|
||||
public register(actionName, actionFn): void {
|
||||
if (this.actions.has(actionName)) {
|
||||
throw new Error("Action is already registered!");
|
||||
}
|
||||
|
||||
this.actions.set(actionName, actionFn);
|
||||
}
|
||||
|
||||
public unregister(actionName: string) {
|
||||
public unregister(actionName: string): void {
|
||||
this.actions.delete(actionName);
|
||||
}
|
||||
|
||||
public fire(actionName: string, ...args: any[]): Promise<any> {
|
||||
return this.actions.has(actionName) ? this.actions.get(actionName)(...args) : null;
|
||||
public fire(actionName: "mute", args: MuteActionArgs): Promise<any>;
|
||||
public fire(actionName: "unmute", args: UnmuteActionArgs): Promise<any>;
|
||||
public fire(actionName: "createCase", args: CreateCaseActionArgs): Promise<any>;
|
||||
public fire(actionName: "createCaseNote", args: CreateCaseNoteActionArgs): Promise<any>;
|
||||
public fire(actionName: "postCase", args: PostCaseActionArgs): Promise<any>;
|
||||
// https://github.com/Microsoft/TypeScript/issues/4183#issuecomment-382867018
|
||||
public fire<T extends string & UnknownAction<U>, U extends string = T>(actionName: T, args: any): Promise<any>;
|
||||
public fire(actionName, args): Promise<any> {
|
||||
return this.actions.has(actionName) ? this.actions.get(actionName)(args) : null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,8 +19,8 @@ export class CasesPlugin extends ZeppelinPlugin {
|
|||
return {
|
||||
config: {
|
||||
log_automatic_actions: true,
|
||||
case_log_channel: null
|
||||
}
|
||||
case_log_channel: null,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -38,16 +38,16 @@ export class CasesPlugin extends ZeppelinPlugin {
|
|||
args.reason,
|
||||
args.automatic,
|
||||
args.postInCaseLog,
|
||||
args.ppId
|
||||
args.ppId,
|
||||
);
|
||||
});
|
||||
|
||||
this.actions.register("createCaseNote", (caseOrCaseId, args) => {
|
||||
return this.createCaseNote(caseOrCaseId, args.modId, args.note, args.automatic, args.postInCaseLog);
|
||||
this.actions.register("createCaseNote", args => {
|
||||
return this.createCaseNote(args.caseId, args.modId, args.note, args.automatic, args.postInCaseLog);
|
||||
});
|
||||
|
||||
this.actions.register("postCase", async args => {
|
||||
const embed = await this.getCaseEmbed(args.case || args.caseId);
|
||||
const embed = await this.getCaseEmbed(args.caseId);
|
||||
return (args.channel as TextableChannel).createMessage(embed);
|
||||
});
|
||||
}
|
||||
|
@ -74,7 +74,7 @@ export class CasesPlugin extends ZeppelinPlugin {
|
|||
reason: string = null,
|
||||
automatic = false,
|
||||
postInCaseLogOverride = null,
|
||||
ppId = null
|
||||
ppId = null,
|
||||
): Promise<Case> {
|
||||
const user = this.bot.users.get(userId);
|
||||
const userName = user ? `${user.username}#${user.discriminator}` : "Unknown#0000";
|
||||
|
@ -96,7 +96,7 @@ export class CasesPlugin extends ZeppelinPlugin {
|
|||
mod_name: modName,
|
||||
audit_log_id: auditLogId,
|
||||
pp_id: ppId,
|
||||
pp_name: ppName
|
||||
pp_name: ppName,
|
||||
});
|
||||
|
||||
if (reason) {
|
||||
|
@ -124,7 +124,7 @@ export class CasesPlugin extends ZeppelinPlugin {
|
|||
modId: string,
|
||||
body: string,
|
||||
automatic = false,
|
||||
postInCaseLogOverride = null
|
||||
postInCaseLogOverride = null,
|
||||
): Promise<void> {
|
||||
const mod = this.bot.users.get(modId);
|
||||
const modName = mod ? `${mod.username}#${mod.discriminator}` : "Unknown#0000";
|
||||
|
@ -137,14 +137,14 @@ export class CasesPlugin extends ZeppelinPlugin {
|
|||
await this.cases.createNote(theCase.id, {
|
||||
mod_id: modId,
|
||||
mod_name: modName,
|
||||
body: body || ""
|
||||
body: body || "",
|
||||
});
|
||||
|
||||
if (theCase.mod_id == null) {
|
||||
// If the case has no moderator information, assume the first one to add a note to it did the action
|
||||
await this.cases.update(theCase.id, {
|
||||
mod_id: modId,
|
||||
mod_name: modName
|
||||
mod_name: modName,
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -174,20 +174,20 @@ export class CasesPlugin extends ZeppelinPlugin {
|
|||
const embed: any = {
|
||||
title: `${actionTypeStr} - Case #${theCase.case_number}`,
|
||||
footer: {
|
||||
text: `Case created at ${createdAt.format("YYYY-MM-DD [at] HH:mm")}`
|
||||
text: `Case created at ${createdAt.format("YYYY-MM-DD [at] HH:mm")}`,
|
||||
},
|
||||
fields: [
|
||||
{
|
||||
name: "User",
|
||||
value: `${theCase.user_name}\n<@!${theCase.user_id}>`,
|
||||
inline: true
|
||||
inline: true,
|
||||
},
|
||||
{
|
||||
name: "Moderator",
|
||||
value: `${theCase.mod_name}\n<@!${theCase.mod_id}>`,
|
||||
inline: true
|
||||
}
|
||||
]
|
||||
inline: true,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
if (theCase.pp_id) {
|
||||
|
@ -207,13 +207,13 @@ export class CasesPlugin extends ZeppelinPlugin {
|
|||
const noteDate = moment(note.created_at);
|
||||
embed.fields.push({
|
||||
name: `${note.mod_name} at ${noteDate.format("YYYY-MM-DD [at] HH:mm")}:`,
|
||||
value: note.body
|
||||
value: note.body,
|
||||
});
|
||||
});
|
||||
} else {
|
||||
embed.fields.push({
|
||||
name: "!!! THIS CASE HAS NO NOTES !!!",
|
||||
value: "\u200B"
|
||||
value: "\u200B",
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@ import {
|
|||
formatTemplateString,
|
||||
stripObjectToScalars,
|
||||
successMessage,
|
||||
trimLines
|
||||
trimLines,
|
||||
} from "../utils";
|
||||
import { GuildMutes } from "../data/GuildMutes";
|
||||
import { CaseTypes } from "../data/CaseTypes";
|
||||
|
@ -27,7 +27,7 @@ import { Mute } from "../data/entities/Mute";
|
|||
enum IgnoredEventType {
|
||||
Ban = 1,
|
||||
Unban,
|
||||
Kick
|
||||
Kick,
|
||||
}
|
||||
|
||||
interface IIgnoredEvent {
|
||||
|
@ -74,7 +74,7 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
kick_message: "You have been kicked from {guildName}. Reason given: {reason}",
|
||||
ban_message: "You have been banned from {guildName}. Reason given: {reason}",
|
||||
alert_on_rejoin: false,
|
||||
alert_channel: null
|
||||
alert_channel: null,
|
||||
},
|
||||
permissions: {
|
||||
note: false,
|
||||
|
@ -86,7 +86,7 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
addcase: false,
|
||||
massban: true,
|
||||
hidecase: false,
|
||||
act_as_other: false
|
||||
act_as_other: false,
|
||||
},
|
||||
overrides: [
|
||||
{
|
||||
|
@ -98,18 +98,18 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
kick: true,
|
||||
ban: true,
|
||||
view: true,
|
||||
addcase: true
|
||||
}
|
||||
addcase: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
level: ">=100",
|
||||
permissions: {
|
||||
massban: true,
|
||||
hidecase: true,
|
||||
act_as_other: true
|
||||
}
|
||||
}
|
||||
]
|
||||
act_as_other: true,
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -145,7 +145,7 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
const relevantAuditLogEntry = await findRelevantAuditLogEntry(
|
||||
this.guild,
|
||||
ErisConstants.AuditLogActions.MEMBER_BAN_ADD,
|
||||
user.id
|
||||
user.id,
|
||||
);
|
||||
|
||||
if (relevantAuditLogEntry) {
|
||||
|
@ -158,12 +158,12 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
type: CaseTypes.Ban,
|
||||
auditLogId,
|
||||
reason: relevantAuditLogEntry.reason,
|
||||
automatic: true
|
||||
automatic: true,
|
||||
});
|
||||
} else {
|
||||
this.actions.fire("createCase", {
|
||||
userId: user.id,
|
||||
type: CaseTypes.Ban
|
||||
type: CaseTypes.Ban,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -183,7 +183,7 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
const relevantAuditLogEntry = await findRelevantAuditLogEntry(
|
||||
this.guild,
|
||||
ErisConstants.AuditLogActions.MEMBER_BAN_REMOVE,
|
||||
user.id
|
||||
user.id,
|
||||
);
|
||||
|
||||
if (relevantAuditLogEntry) {
|
||||
|
@ -195,13 +195,13 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
modId,
|
||||
type: CaseTypes.Unban,
|
||||
auditLogId,
|
||||
automatic: true
|
||||
automatic: true,
|
||||
});
|
||||
} else {
|
||||
this.actions.fire("createCase", {
|
||||
userId: user.id,
|
||||
type: CaseTypes.Unban,
|
||||
automatic: true
|
||||
automatic: true,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -223,7 +223,7 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
alertChannel.send(
|
||||
`<@!${member.id}> (${member.user.username}#${member.user.discriminator} \`${member.id}\`) joined with ${
|
||||
actions.length
|
||||
} prior record(s)`
|
||||
} prior record(s)`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -239,7 +239,7 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
const kickAuditLogEntry = await findRelevantAuditLogEntry(
|
||||
this.guild,
|
||||
ErisConstants.AuditLogActions.MEMBER_KICK,
|
||||
member.id
|
||||
member.id,
|
||||
);
|
||||
|
||||
if (kickAuditLogEntry) {
|
||||
|
@ -249,12 +249,12 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
type: CaseTypes.Kick,
|
||||
auditLogId: kickAuditLogEntry.id,
|
||||
reason: kickAuditLogEntry.reason,
|
||||
automatic: true
|
||||
automatic: true,
|
||||
});
|
||||
|
||||
this.serverLogs.log(LogType.MEMBER_KICK, {
|
||||
user: stripObjectToScalars(member.user),
|
||||
mod: stripObjectToScalars(kickAuditLogEntry.user)
|
||||
mod: stripObjectToScalars(kickAuditLogEntry.user),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -271,9 +271,10 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
return;
|
||||
}
|
||||
|
||||
await this.actions.fire("createCaseNote", theCase, {
|
||||
await this.actions.fire("createCaseNote", {
|
||||
caseId: theCase.id,
|
||||
modId: msg.author.id,
|
||||
note: args.note
|
||||
note: args.note,
|
||||
});
|
||||
|
||||
msg.channel.createMessage(successMessage(`Case \`#${theCase.case_number}\` updated`));
|
||||
|
@ -289,14 +290,14 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
userId: args.userId,
|
||||
modId: msg.author.id,
|
||||
type: CaseTypes.Note,
|
||||
reason: args.note
|
||||
reason: args.note,
|
||||
});
|
||||
|
||||
msg.channel.createMessage(successMessage(`Note added on **${userName}** (Case #${createdCase.case_number})`));
|
||||
}
|
||||
|
||||
@d.command("warn", "<member:Member> <reason:string$>", {
|
||||
options: [{ name: "mod", type: "member" }]
|
||||
options: [{ name: "mod", type: "member" }],
|
||||
})
|
||||
@d.permission("warn")
|
||||
@d.nonBlocking()
|
||||
|
@ -326,7 +327,7 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
args.member.user,
|
||||
warnMessage,
|
||||
this.configValue("dm_on_warn"),
|
||||
this.configValue("message_on_warn")
|
||||
this.configValue("message_on_warn"),
|
||||
);
|
||||
|
||||
if (!messageSent) {
|
||||
|
@ -343,23 +344,23 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
modId: mod.id,
|
||||
type: CaseTypes.Warn,
|
||||
reason: args.reason,
|
||||
ppId: mod.id !== msg.author.id ? msg.author.id : null
|
||||
ppId: mod.id !== msg.author.id ? msg.author.id : null,
|
||||
});
|
||||
|
||||
msg.channel.createMessage(
|
||||
successMessage(
|
||||
`Warned **${args.member.user.username}#${args.member.user.discriminator}** (Case #${createdCase.case_number})`
|
||||
)
|
||||
`Warned **${args.member.user.username}#${args.member.user.discriminator}** (Case #${createdCase.case_number})`,
|
||||
),
|
||||
);
|
||||
|
||||
this.serverLogs.log(LogType.MEMBER_WARN, {
|
||||
mod: stripObjectToScalars(mod.user),
|
||||
member: stripObjectToScalars(args.member, ["user"])
|
||||
member: stripObjectToScalars(args.member, ["user"]),
|
||||
});
|
||||
}
|
||||
|
||||
@d.command("mute", "<member:Member> [time:string] [reason:string$]", {
|
||||
options: [{ name: "mod", type: "member" }]
|
||||
options: [{ name: "mod", type: "member" }],
|
||||
})
|
||||
@d.permission("mute")
|
||||
async muteCmd(msg: Message, args: { member: Member; time: string; reason: string; mod: Member }) {
|
||||
|
@ -395,7 +396,7 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
this.serverLogs.ignoreLog(LogType.MEMBER_ROLE_ADD, args.member.id);
|
||||
const mute: Mute = await this.actions.fire("mute", {
|
||||
member: args.member,
|
||||
muteTime
|
||||
muteTime,
|
||||
});
|
||||
|
||||
if (!mute) {
|
||||
|
@ -412,9 +413,10 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
|
||||
if (args.reason) {
|
||||
// Update old case
|
||||
await this.actions.fire("createCaseNote", mute.case_id, {
|
||||
await this.actions.fire("createCaseNote", {
|
||||
caseId: mute.case_id,
|
||||
modId: mod.id,
|
||||
note: args.reason
|
||||
note: args.reason,
|
||||
});
|
||||
}
|
||||
} else {
|
||||
|
@ -424,7 +426,7 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
modId: mod.id,
|
||||
type: CaseTypes.Mute,
|
||||
reason: args.reason,
|
||||
ppId: mod.id !== msg.author.id ? msg.author.id : null
|
||||
ppId: mod.id !== msg.author.id ? msg.author.id : null,
|
||||
});
|
||||
await this.mutes.setCaseId(args.member.id, theCase.id);
|
||||
}
|
||||
|
@ -437,14 +439,14 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
const muteMessage = formatTemplateString(template, {
|
||||
guildName: this.guild.name,
|
||||
reason: args.reason,
|
||||
time: timeUntilUnmute
|
||||
time: timeUntilUnmute,
|
||||
});
|
||||
|
||||
messageSent = await this.tryToMessageUser(
|
||||
args.member.user,
|
||||
muteMessage,
|
||||
this.configValue("dm_on_mute"),
|
||||
this.configValue("message_on_mute")
|
||||
this.configValue("message_on_mute"),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -468,18 +470,18 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
this.serverLogs.log(LogType.MEMBER_TIMED_MUTE, {
|
||||
mod: stripObjectToScalars(mod.user),
|
||||
member: stripObjectToScalars(args.member, ["user"]),
|
||||
time: timeUntilUnmute
|
||||
time: timeUntilUnmute,
|
||||
});
|
||||
} else {
|
||||
this.serverLogs.log(LogType.MEMBER_MUTE, {
|
||||
mod: stripObjectToScalars(mod.user),
|
||||
member: stripObjectToScalars(args.member, ["user"])
|
||||
member: stripObjectToScalars(args.member, ["user"]),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@d.command("unmute", "<member:Member> [time:string] [reason:string$]", {
|
||||
options: [{ name: "mod", type: "member" }]
|
||||
options: [{ name: "mod", type: "member" }],
|
||||
})
|
||||
@d.permission("mute")
|
||||
async unmuteCmd(msg: Message, args: any) {
|
||||
|
@ -521,7 +523,7 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
modId: mod.id,
|
||||
type: CaseTypes.Unmute,
|
||||
reason: args.reason,
|
||||
ppId: mod.id !== msg.author.id ? msg.author.id : null
|
||||
ppId: mod.id !== msg.author.id ? msg.author.id : null,
|
||||
});
|
||||
|
||||
if (unmuteTime) {
|
||||
|
@ -535,15 +537,15 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
successMessage(
|
||||
`Unmuting **${args.member.user.username}#${args.member.user.discriminator}** in ${timeUntilUnmute} (Case #${
|
||||
createdCase.case_number
|
||||
})`
|
||||
)
|
||||
})`,
|
||||
),
|
||||
);
|
||||
|
||||
// Log the action
|
||||
this.serverLogs.log(LogType.MEMBER_TIMED_UNMUTE, {
|
||||
mod: stripObjectToScalars(mod.user),
|
||||
member: stripObjectToScalars(args.member, ["user"]),
|
||||
time: timeUntilUnmute
|
||||
time: timeUntilUnmute,
|
||||
});
|
||||
} else {
|
||||
// Otherwise remove "muted" role immediately
|
||||
|
@ -555,26 +557,20 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
successMessage(
|
||||
`Unmuted **${args.member.user.username}#${args.member.user.discriminator}** (Case #${
|
||||
createdCase.case_number
|
||||
})`
|
||||
)
|
||||
})`,
|
||||
),
|
||||
);
|
||||
|
||||
// Log the action
|
||||
this.serverLogs.log(LogType.MEMBER_UNMUTE, {
|
||||
mod: stripObjectToScalars(msg.member.user),
|
||||
member: stripObjectToScalars(args.member, ["user"])
|
||||
member: stripObjectToScalars(args.member, ["user"]),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@d.command("mutes")
|
||||
@d.permission("view")
|
||||
async mutesCmd(msg: Message) {
|
||||
this.actions.fire("postMuteList", msg.channel);
|
||||
}
|
||||
|
||||
@d.command("kick", "<member:Member> [reason:string$]", {
|
||||
options: [{ name: "mod", type: "member" }]
|
||||
options: [{ name: "mod", type: "member" }],
|
||||
})
|
||||
@d.permission("kick")
|
||||
async kickCmd(msg, args: { member: Member; reason: string; mod: Member }) {
|
||||
|
@ -600,14 +596,14 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
if (args.reason) {
|
||||
const kickMessage = formatTemplateString(this.configValue("kick_message"), {
|
||||
guildName: this.guild.name,
|
||||
reason: args.reason
|
||||
reason: args.reason,
|
||||
});
|
||||
|
||||
messageSent = await this.tryToMessageUser(
|
||||
args.member.user,
|
||||
kickMessage,
|
||||
this.configValue("dm_on_kick"),
|
||||
this.configValue("message_on_kick")
|
||||
this.configValue("message_on_kick"),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -622,7 +618,7 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
modId: mod.id,
|
||||
type: CaseTypes.Kick,
|
||||
reason: args.reason,
|
||||
ppId: mod.id !== msg.author.id ? msg.author.id : null
|
||||
ppId: mod.id !== msg.author.id ? msg.author.id : null,
|
||||
});
|
||||
|
||||
// Confirm the action to the moderator
|
||||
|
@ -635,12 +631,12 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
// Log the action
|
||||
this.serverLogs.log(LogType.MEMBER_KICK, {
|
||||
mod: stripObjectToScalars(mod.user),
|
||||
user: stripObjectToScalars(args.member.user)
|
||||
user: stripObjectToScalars(args.member.user),
|
||||
});
|
||||
}
|
||||
|
||||
@d.command("ban", "<member:Member> [reason:string$]", {
|
||||
options: [{ name: "mod", type: "member" }]
|
||||
options: [{ name: "mod", type: "member" }],
|
||||
})
|
||||
@d.permission("ban")
|
||||
async banCmd(msg, args) {
|
||||
|
@ -666,14 +662,14 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
if (args.reason) {
|
||||
const banMessage = formatTemplateString(this.configValue("ban_message"), {
|
||||
guildName: this.guild.name,
|
||||
reason: args.reason
|
||||
reason: args.reason,
|
||||
});
|
||||
|
||||
messageSent = await this.tryToMessageUser(
|
||||
args.member.user,
|
||||
banMessage,
|
||||
this.configValue("dm_on_ban"),
|
||||
this.configValue("message_on_ban")
|
||||
this.configValue("message_on_ban"),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -688,7 +684,7 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
modId: mod.id,
|
||||
type: CaseTypes.Ban,
|
||||
reason: args.reason,
|
||||
ppId: mod.id !== msg.author.id ? msg.author.id : null
|
||||
ppId: mod.id !== msg.author.id ? msg.author.id : null,
|
||||
});
|
||||
|
||||
// Confirm the action to the moderator
|
||||
|
@ -701,12 +697,12 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
// Log the action
|
||||
this.serverLogs.log(LogType.MEMBER_BAN, {
|
||||
mod: stripObjectToScalars(mod.user),
|
||||
member: stripObjectToScalars(args.member, ["user"])
|
||||
member: stripObjectToScalars(args.member, ["user"]),
|
||||
});
|
||||
}
|
||||
|
||||
@d.command("softban", "<member:Member> [reason:string$]", {
|
||||
options: [{ name: "mod", type: "member" }]
|
||||
options: [{ name: "mod", type: "member" }],
|
||||
})
|
||||
@d.permission("ban")
|
||||
async softbanCmd(msg, args) {
|
||||
|
@ -742,7 +738,7 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
modId: mod.id,
|
||||
type: CaseTypes.Softban,
|
||||
reason: args.reason,
|
||||
ppId: mod.id !== msg.author.id ? msg.author.id : null
|
||||
ppId: mod.id !== msg.author.id ? msg.author.id : null,
|
||||
});
|
||||
|
||||
// Confirm the action to the moderator
|
||||
|
@ -750,19 +746,19 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
successMessage(
|
||||
`Softbanned **${args.member.user.username}#${args.member.user.discriminator}** (Case #${
|
||||
createdCase.case_number
|
||||
})`
|
||||
)
|
||||
})`,
|
||||
),
|
||||
);
|
||||
|
||||
// Log the action
|
||||
this.serverLogs.log(LogType.MEMBER_SOFTBAN, {
|
||||
mod: stripObjectToScalars(mod.user),
|
||||
member: stripObjectToScalars(args.member, ["user"])
|
||||
member: stripObjectToScalars(args.member, ["user"]),
|
||||
});
|
||||
}
|
||||
|
||||
@d.command("unban", "<userId:userId> [reason:string$]", {
|
||||
options: [{ name: "mod", type: "member" }]
|
||||
options: [{ name: "mod", type: "member" }],
|
||||
})
|
||||
@d.permission("ban")
|
||||
async unbanCmd(msg: Message, args: { userId: string; reason: string; mod: Member }) {
|
||||
|
@ -793,7 +789,7 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
modId: mod.id,
|
||||
type: CaseTypes.Unban,
|
||||
reason: args.reason,
|
||||
ppId: mod.id !== msg.author.id ? msg.author.id : null
|
||||
ppId: mod.id !== msg.author.id ? msg.author.id : null,
|
||||
});
|
||||
|
||||
// Confirm the action
|
||||
|
@ -802,12 +798,12 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
// Log the action
|
||||
this.serverLogs.log(LogType.MEMBER_UNBAN, {
|
||||
mod: stripObjectToScalars(mod.user),
|
||||
userId: args.userId
|
||||
userId: args.userId,
|
||||
});
|
||||
}
|
||||
|
||||
@d.command("forceban", "<userId:userId> [reason:string$]", {
|
||||
options: [{ name: "mod", type: "member" }]
|
||||
options: [{ name: "mod", type: "member" }],
|
||||
})
|
||||
@d.permission("ban")
|
||||
async forcebanCmd(msg: Message, args: any) {
|
||||
|
@ -845,7 +841,7 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
modId: mod.id,
|
||||
type: CaseTypes.Ban,
|
||||
reason: args.reason,
|
||||
ppId: mod.id !== msg.author.id ? msg.author.id : null
|
||||
ppId: mod.id !== msg.author.id ? msg.author.id : null,
|
||||
});
|
||||
|
||||
// Confirm the action
|
||||
|
@ -854,7 +850,7 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
// Log the action
|
||||
this.serverLogs.log(LogType.MEMBER_FORCEBAN, {
|
||||
mod: stripObjectToScalars(mod.user),
|
||||
userId: args.userId
|
||||
userId: args.userId,
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -909,7 +905,7 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
modId: msg.author.id,
|
||||
type: CaseTypes.Ban,
|
||||
reason: `Mass ban: ${banReason}`,
|
||||
postInCaseLog: false
|
||||
postInCaseLog: false,
|
||||
});
|
||||
} catch (e) {
|
||||
failedBans.push(userId);
|
||||
|
@ -927,12 +923,12 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
// Some or all bans were successful. Create a log entry for the mass ban and notify the user.
|
||||
this.serverLogs.log(LogType.MASSBAN, {
|
||||
mod: stripObjectToScalars(msg.author),
|
||||
count: successfulBanCount
|
||||
count: successfulBanCount,
|
||||
});
|
||||
|
||||
if (failedBans.length) {
|
||||
msg.channel.createMessage(
|
||||
successMessage(`Banned ${successfulBanCount} users, ${failedBans.length} failed: ${failedBans.join(" ")}`)
|
||||
successMessage(`Banned ${successfulBanCount} users, ${failedBans.length} failed: ${failedBans.join(" ")}`),
|
||||
);
|
||||
} else {
|
||||
msg.channel.createMessage(successMessage(`Banned ${successfulBanCount} users successfully`));
|
||||
|
@ -941,7 +937,7 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
}
|
||||
|
||||
@d.command("addcase", "<type:string> <target:userId> [reason:string$]", {
|
||||
options: [{ name: "mod", type: "member" }]
|
||||
options: [{ name: "mod", type: "member" }],
|
||||
})
|
||||
@d.permission("addcase")
|
||||
async addcaseCmd(msg: Message, args: any) {
|
||||
|
@ -982,7 +978,7 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
modId: mod.id,
|
||||
type: CaseTypes[type],
|
||||
reason: args.reason,
|
||||
ppId: mod.id !== msg.author.id ? msg.author.id : null
|
||||
ppId: mod.id !== msg.author.id ? msg.author.id : null,
|
||||
});
|
||||
|
||||
msg.channel.createMessage(successMessage(`Case #${theCase.case_number} created`));
|
||||
|
@ -992,7 +988,7 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
mod: stripObjectToScalars(mod.user),
|
||||
userId: args.userId,
|
||||
caseNum: theCase.case_number,
|
||||
caseType: type.toUpperCase()
|
||||
caseType: type.toUpperCase(),
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -1014,7 +1010,7 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
|
||||
await this.actions.fire("postCase", {
|
||||
caseId: theCase.id,
|
||||
channel: msg.channel
|
||||
channel: msg.channel,
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -1045,7 +1041,7 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
for (const theCase of casesToDisplay) {
|
||||
await this.actions.fire("postCase", {
|
||||
caseId: theCase.id,
|
||||
channel: msg.channel
|
||||
channel: msg.channel,
|
||||
});
|
||||
}
|
||||
} else {
|
||||
|
@ -1089,7 +1085,7 @@ export class ModActionsPlugin extends ZeppelinPlugin {
|
|||
|
||||
await this.cases.setHidden(theCase.id, true);
|
||||
msg.channel.createMessage(
|
||||
successMessage(`Case #${theCase.case_number} is now hidden! Use \`unhidecase\` to unhide it.`)
|
||||
successMessage(`Case #${theCase.case_number} is now hidden! Use \`unhidecase\` to unhide it.`),
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -22,19 +22,26 @@ export class MutesPlugin extends ZeppelinPlugin {
|
|||
getDefaultOptions() {
|
||||
return {
|
||||
config: {
|
||||
mute_role: null
|
||||
mute_role: null,
|
||||
},
|
||||
permissions: {
|
||||
cleanup: false
|
||||
view_list: false,
|
||||
cleanup: false,
|
||||
},
|
||||
overrides: [
|
||||
{
|
||||
level: ">=50",
|
||||
permissions: {
|
||||
view_list: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
level: ">=100",
|
||||
permissions: {
|
||||
cleanup: true
|
||||
}
|
||||
}
|
||||
]
|
||||
cleanup: true,
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -50,7 +57,6 @@ export class MutesPlugin extends ZeppelinPlugin {
|
|||
this.actions.register("unmute", args => {
|
||||
return this.unmuteMember(args.member, args.unmuteTime);
|
||||
});
|
||||
this.actions.register("postMuteList", this.postMuteList.bind(this));
|
||||
|
||||
// Check for expired mutes every 5s
|
||||
this.clearExpiredMutes();
|
||||
|
@ -60,7 +66,6 @@ export class MutesPlugin extends ZeppelinPlugin {
|
|||
onUnload() {
|
||||
this.actions.unregister("mute");
|
||||
this.actions.unregister("unmute");
|
||||
this.actions.unregister("postMuteList");
|
||||
|
||||
clearInterval(this.muteClearIntervalId);
|
||||
}
|
||||
|
@ -86,7 +91,9 @@ export class MutesPlugin extends ZeppelinPlugin {
|
|||
}
|
||||
}
|
||||
|
||||
public async postMuteList(channel: TextableChannel) {
|
||||
@d.command("mutes")
|
||||
@d.permission("view_list")
|
||||
public async postMuteList(msg: Message) {
|
||||
const lines = [];
|
||||
|
||||
// Active, logged mutes
|
||||
|
@ -108,24 +115,25 @@ export class MutesPlugin extends ZeppelinPlugin {
|
|||
...activeMutes.map(mute => {
|
||||
const user = this.bot.users.get(mute.user_id);
|
||||
const username = user ? `${user.username}#${user.discriminator}` : "Unknown#0000";
|
||||
const theCase = muteCasesById[mute.case_id] || null;
|
||||
const theCase = muteCasesById.get(mute.case_id);
|
||||
const caseName = theCase ? `Case #${theCase.case_number}` : "No case";
|
||||
|
||||
let line = `\`${caseName}\` **${username}** (\`${mute.user_id}\`)`;
|
||||
let line = `**${username}** (\`${mute.user_id}\`) 📔 ${caseName}`;
|
||||
|
||||
if (mute.expires_at) {
|
||||
const timeUntilExpiry = moment().diff(moment(mute.expires_at, DBDateFormat));
|
||||
const humanizedTime = humanizeDuration(timeUntilExpiry, { largest: 2, round: true });
|
||||
line += ` (expires in ${humanizedTime})`;
|
||||
line += ` ⏰ Expires in ${humanizedTime}`;
|
||||
} else {
|
||||
line += ` (doesn't expire)`;
|
||||
line += ` ⏰ Doesn't expire`;
|
||||
}
|
||||
|
||||
const mutedAt = moment(mute.created_at, DBDateFormat);
|
||||
line += ` (muted at ${mutedAt.format("YYYY-MM-DD HH:mm:ss")})`;
|
||||
const timeFromMute = moment(mute.created_at, DBDateFormat).diff(moment());
|
||||
const humanizedTimeFromMute = humanizeDuration(timeFromMute, { largest: 2, round: true });
|
||||
line += ` 🕒 Muted ${humanizedTimeFromMute} ago`;
|
||||
|
||||
return line;
|
||||
})
|
||||
}),
|
||||
);
|
||||
|
||||
// Manually added mute roles
|
||||
|
@ -143,13 +151,13 @@ export class MutesPlugin extends ZeppelinPlugin {
|
|||
lines.push(
|
||||
...manuallyMutedMembers.map(member => {
|
||||
return `\`Manual mute\` **${member.user.username}#${member.user.discriminator}** (\`${member.id}\`)`;
|
||||
})
|
||||
}),
|
||||
);
|
||||
|
||||
const message = `Active mutes:\n\n${lines.join("\n")}`;
|
||||
const message = `Active mutes (${activeMutes.length} total):\n\n${lines.join("\n")}`;
|
||||
const chunks = chunkMessageLines(message);
|
||||
for (const chunk of chunks) {
|
||||
channel.createMessage(chunk);
|
||||
msg.channel.createMessage(chunk);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -179,7 +187,7 @@ export class MutesPlugin extends ZeppelinPlugin {
|
|||
const bannedIds = bans.map(b => b.user.id);
|
||||
|
||||
await msg.channel.createMessage(
|
||||
`Found ${activeMutes.length} mutes and ${bannedIds.length} bans, cross-referencing...`
|
||||
`Found ${activeMutes.length} mutes and ${bannedIds.length} bans, cross-referencing...`,
|
||||
);
|
||||
|
||||
let cleared = 0;
|
||||
|
@ -262,7 +270,7 @@ export class MutesPlugin extends ZeppelinPlugin {
|
|||
await this.mutes.clear(member.id);
|
||||
|
||||
this.serverLogs.log(LogType.MEMBER_MUTE_EXPIRED, {
|
||||
member: stripObjectToScalars(member, ["user"])
|
||||
member: stripObjectToScalars(member, ["user"]),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue