Add massban command

This commit is contained in:
Dragory 2018-08-16 20:07:43 +03:00
parent 741118d877
commit 1f4b89700c
5 changed files with 106 additions and 10 deletions

6
package-lock.json generated
View file

@ -2524,9 +2524,9 @@
} }
}, },
"knub": { "knub": {
"version": "10.0.0", "version": "10.1.0",
"resolved": "https://registry.npmjs.org/knub/-/knub-10.0.0.tgz", "resolved": "https://registry.npmjs.org/knub/-/knub-10.1.0.tgz",
"integrity": "sha512-E83Sl0NjoOhFZbUPcCuYvCO37qaegvNnyzRJrYNIIQ664JDpVkE0fRvQJI08wU8tPeQ7CNEGMsyP5WaM4NoNBA==", "integrity": "sha512-W14IbTSz4iGvgKQ4QutY8s+5rZcqYmB8ll3aUQ8nYDp23VDCdm/6Do0f8j0zip5h05cmfVmVRIXabfvfFQkxmA==",
"requires": { "requires": {
"escape-string-regexp": "^1.0.5", "escape-string-regexp": "^1.0.5",
"js-yaml": "^3.9.1", "js-yaml": "^3.9.1",

View file

@ -33,7 +33,7 @@
"escape-string-regexp": "^1.0.5", "escape-string-regexp": "^1.0.5",
"humanize-duration": "^3.15.0", "humanize-duration": "^3.15.0",
"knex": "0.12.6", "knex": "0.12.6",
"knub": "^10.0.0", "knub": "^10.1.0",
"lodash.at": "^4.6.0", "lodash.at": "^4.6.0",
"lodash.chunk": "^4.2.0", "lodash.chunk": "^4.2.0",
"lodash.difference": "^4.5.0", "lodash.difference": "^4.5.0",

View file

@ -40,5 +40,7 @@
"CENSOR": "🛑 **{member.user.username}#{member.user.discriminator}** (`{member.id}`) censored message in **#{channel.name}** (`{channel.id}`) {reason}:\n```{messageText}```", "CENSOR": "🛑 **{member.user.username}#{member.user.discriminator}** (`{member.id}`) censored message in **#{channel.name}** (`{channel.id}`) {reason}:\n```{messageText}```",
"CLEAN": "🚿 **{mod.username}#{mod.discriminator}** (`{mod.id}`) cleaned **{count}** message(s) in **#{channel.name}**", "CLEAN": "🚿 **{mod.username}#{mod.discriminator}** (`{mod.id}`) cleaned **{count}** message(s) in **#{channel.name}**",
"CASE_CREATE": "✏ **{member.user.username}#{member.user.discriminator}** (`{member.id}`) manually created new **{caseType}** case (#{caseNum})" "CASE_CREATE": "✏ **{member.user.username}#{member.user.discriminator}** (`{member.id}`) manually created new **{caseType}** case (#{caseNum})",
"MASSBAN": "⚒ **{mod.username}#{mod.discriminator}** massbanned {count} users"
} }

View file

@ -38,5 +38,7 @@ export enum LogType {
CENSOR, CENSOR,
CLEAN, CLEAN,
CASE_CREATE CASE_CREATE,
MASSBAN
} }

View file

@ -1,4 +1,4 @@
import { decorators as d, Plugin, waitForReaction } from "knub"; import { decorators as d, Plugin, waitForReaction, waitForReply } from "knub";
import { Constants as ErisConstants, Guild, Member, Message, TextChannel, User } from "eris"; import { Constants as ErisConstants, Guild, Member, Message, TextChannel, User } from "eris";
import moment from "moment-timezone"; import moment from "moment-timezone";
import humanizeDuration from "humanize-duration"; import humanizeDuration from "humanize-duration";
@ -92,7 +92,8 @@ export class ModActionsPlugin extends Plugin {
kick: false, kick: false,
ban: false, ban: false,
view: false, view: false,
addcase: false addcase: false,
massban: true
}, },
overrides: [ overrides: [
{ {
@ -106,6 +107,12 @@ export class ModActionsPlugin extends Plugin {
view: true, view: true,
addcase: true addcase: true
} }
},
{
level: ">=100",
permissions: {
massban: true
}
} }
] ]
}; };
@ -744,6 +751,89 @@ export class ModActionsPlugin extends Plugin {
}); });
} }
@d.command("massban", "<userIds:string...>")
@d.permission("massban")
async massbanCmd(msg: Message, args: { userIds: string[] }) {
msg.channel.createMessage("Ban reason? `cancel` to cancel");
const banReasonReply = await waitForReply(this.bot, msg.channel as TextChannel, msg.author.id);
if (
!banReasonReply ||
!banReasonReply.content ||
banReasonReply.content.toLowerCase().trim() === "cancel"
) {
msg.channel.createMessage("Cancelled");
return;
}
const banReason = banReasonReply.content;
if (args.userIds.length > 100) {
msg.channel.createMessage(errorMessage(`Can only massban max 100 users at once`));
return;
}
for (const userId of args.userIds) {
const member = this.guild.members.get(userId);
if (member && !this.canActOn(msg.member, member)) {
msg.channel.createMessage(
errorMessage("Cannot massban one or more users: insufficient permissions")
);
return;
}
}
args.userIds.forEach(userId => {
this.ignoreEvent(IgnoredEventType.Ban, userId);
this.serverLogs.ignoreLog(LogType.MEMBER_BAN, userId);
});
const loadingMsg = await msg.channel.createMessage("Banning...");
const failedBans = [];
for (const userId of args.userIds) {
try {
await this.guild.banMember(userId);
await this.createCase(
userId,
msg.author.id,
CaseType.Ban,
null,
`Mass ban: ${banReason}`,
false,
false
);
} catch (e) {
failedBans.push(userId);
}
}
loadingMsg.delete();
const successfulBanCount = args.userIds.length - failedBans.length;
if (successfulBanCount === 0) {
msg.channel.createMessage(errorMessage("All bans failed. Make sure the IDs are valid."));
} else {
this.serverLogs.log(LogType.MASSBAN, {
mod: stripObjectToScalars(msg.author),
count: successfulBanCount
});
if (failedBans.length) {
msg.channel.createMessage(
successMessage(
`Banned ${successfulBanCount} users, ${failedBans.length} failed: ${failedBans.join(
" "
)}`
)
);
} else {
msg.channel.createMessage(
successMessage(`Banned ${successfulBanCount} users successfully`)
);
}
}
}
@d.command("addcase", "<type:string> <target:userId> [reason:string$]") @d.command("addcase", "<type:string> <target:userId> [reason:string$]")
@d.permission("addcase") @d.permission("addcase")
async addcaseCmd(msg: Message, args: any) { async addcaseCmd(msg: Message, args: any) {
@ -983,7 +1073,8 @@ export class ModActionsPlugin extends Plugin {
caseType: CaseType, caseType: CaseType,
auditLogId: string = null, auditLogId: string = null,
reason: string = null, reason: string = null,
automatic = false automatic = false,
postInCaseLogOverride = null
): Promise<number> { ): Promise<number> {
const user = this.bot.users.get(userId); const user = this.bot.users.get(userId);
const userName = user ? `${user.username}#${user.discriminator}` : "Unknown#0000"; const userName = user ? `${user.username}#${user.discriminator}` : "Unknown#0000";
@ -1006,7 +1097,8 @@ export class ModActionsPlugin extends Plugin {
if ( if (
this.configValue("case_log_channel") && this.configValue("case_log_channel") &&
(!automatic || this.configValue("log_automatic_actions")) (!automatic || this.configValue("log_automatic_actions")) &&
postInCaseLogOverride !== false
) { ) {
try { try {
await this.postCaseToCaseLog(createdId); await this.postCaseToCaseLog(createdId);