2018-07-31 02:42:45 +03:00
|
|
|
import { Plugin, decorators as d, reply } from "knub";
|
|
|
|
import { Channel, Message, TextChannel, User } from "eris";
|
|
|
|
import { errorMessage, getMessages, stripObjectToScalars, successMessage } from "../utils";
|
|
|
|
import { GuildLogs } from "../data/GuildLogs";
|
|
|
|
import { LogType } from "../data/LogType";
|
|
|
|
|
|
|
|
const MAX_SEARCH_RESULTS = 15;
|
|
|
|
const MAX_CLEAN_COUNT = 50;
|
2018-07-01 03:35:51 +03:00
|
|
|
|
|
|
|
export class UtilityPlugin extends Plugin {
|
2018-07-31 02:42:45 +03:00
|
|
|
protected logs: GuildLogs;
|
|
|
|
|
2018-07-01 03:35:51 +03:00
|
|
|
getDefaultOptions() {
|
|
|
|
return {
|
|
|
|
permissions: {
|
2018-07-14 20:56:08 +03:00
|
|
|
roles: false,
|
2018-07-31 02:42:45 +03:00
|
|
|
level: false,
|
|
|
|
search: false,
|
|
|
|
clean: false,
|
|
|
|
info: false
|
2018-07-01 03:35:51 +03:00
|
|
|
},
|
|
|
|
overrides: [
|
|
|
|
{
|
|
|
|
level: ">=50",
|
|
|
|
permissions: {
|
2018-07-31 02:42:45 +03:00
|
|
|
roles: true,
|
|
|
|
level: true,
|
|
|
|
search: true,
|
|
|
|
clean: true,
|
|
|
|
info: true
|
2018-07-01 03:35:51 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2018-07-31 02:42:45 +03:00
|
|
|
onLoad() {
|
|
|
|
this.logs = new GuildLogs(this.guildId);
|
|
|
|
}
|
|
|
|
|
2018-07-01 03:35:51 +03:00
|
|
|
@d.command("roles")
|
|
|
|
@d.permission("roles")
|
|
|
|
async rolesCmd(msg: Message) {
|
2018-07-12 01:45:26 +03:00
|
|
|
const roles = (msg.channel as TextChannel).guild.roles.map(role => `${role.name} ${role.id}`);
|
2018-07-01 03:35:51 +03:00
|
|
|
msg.channel.createMessage("```" + roles.join("\n") + "```");
|
|
|
|
}
|
2018-07-14 20:56:08 +03:00
|
|
|
|
|
|
|
@d.command("level", "[userId:string]")
|
|
|
|
@d.permission("level")
|
|
|
|
async levelCmd(msg: Message, args) {
|
|
|
|
const member = args.userId ? this.guild.members.get(args.userId) : msg.member;
|
|
|
|
|
|
|
|
if (!member) {
|
|
|
|
msg.channel.createMessage(errorMessage("Member not found"));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const level = this.getMemberLevel(member);
|
|
|
|
msg.channel.createMessage(
|
|
|
|
`The permission level of ${member.username}#${member.discriminator} is **${level}**`
|
|
|
|
);
|
|
|
|
}
|
2018-07-31 02:42:45 +03:00
|
|
|
|
|
|
|
@d.command("search", "<query:string$>")
|
|
|
|
@d.permission("search")
|
|
|
|
async searchCmd(msg: Message, args: { query: string }) {
|
|
|
|
const query = args.query.toLowerCase();
|
|
|
|
const matchingMembers = this.guild.members.filter(member => {
|
|
|
|
const fullUsername = `${member.user.username}#${member.user.discriminator}`;
|
|
|
|
if (member.nick && member.nick.toLowerCase().indexOf(query) !== -1) return true;
|
|
|
|
if (fullUsername.toLowerCase().indexOf(query) !== -1) return true;
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
|
|
|
|
if (matchingMembers.length > 0) {
|
|
|
|
let header;
|
|
|
|
const resultText = matchingMembers.length === 1 ? "result" : "results";
|
|
|
|
|
|
|
|
if (matchingMembers.length > MAX_SEARCH_RESULTS) {
|
|
|
|
header = `Found ${matchingMembers.length} ${resultText} (showing ${MAX_SEARCH_RESULTS})`;
|
|
|
|
} else {
|
|
|
|
header = `Found ${matchingMembers.length} ${resultText}`;
|
|
|
|
}
|
|
|
|
|
|
|
|
const lines = matchingMembers.slice(0, MAX_SEARCH_RESULTS).map(member => {
|
|
|
|
return `${member.user.username}#${member.user.discriminator} (${member.id})`;
|
|
|
|
});
|
|
|
|
lines.sort((a, b) => {
|
|
|
|
return a.toLowerCase() < b.toLowerCase() ? -1 : 1;
|
|
|
|
});
|
|
|
|
|
|
|
|
msg.channel.createMessage(`${header}\n\`\`\`${lines.join("\n")}\`\`\``);
|
|
|
|
} else {
|
|
|
|
msg.channel.createMessage(errorMessage("No results found"));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
async cleanMessages(channel: Channel, messageIds: string[], mod: User) {
|
|
|
|
this.logs.ignoreLog(LogType.MESSAGE_DELETE, messageIds[0]);
|
|
|
|
this.logs.ignoreLog(LogType.MESSAGE_DELETE_BULK, messageIds[0]);
|
|
|
|
await this.bot.deleteMessages(channel.id, messageIds);
|
|
|
|
this.logs.log(LogType.CLEAN, {
|
|
|
|
mod: stripObjectToScalars(mod),
|
|
|
|
channel: stripObjectToScalars(channel),
|
|
|
|
count: messageIds.length
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
@d.command("clean", "<count:number>")
|
|
|
|
@d.command("clean all", "<count:number>")
|
|
|
|
@d.permission("clean")
|
|
|
|
async cleanAllCmd(msg: Message, args: { count: number }) {
|
|
|
|
if (args.count > MAX_CLEAN_COUNT || args.count <= 0) {
|
|
|
|
msg.channel.createMessage(
|
|
|
|
errorMessage(`Clean count must be between 1 and ${MAX_CLEAN_COUNT}`)
|
|
|
|
);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const messagesToClean = await getMessages(
|
|
|
|
msg.channel as TextChannel,
|
|
|
|
m => m.id !== msg.id,
|
|
|
|
args.count
|
|
|
|
);
|
|
|
|
if (messagesToClean.length > 0)
|
|
|
|
await this.cleanMessages(msg.channel, messagesToClean.map(m => m.id), msg.author);
|
|
|
|
|
|
|
|
msg.channel.createMessage(
|
|
|
|
successMessage(
|
|
|
|
`Cleaned ${messagesToClean.length} ${messagesToClean.length === 1 ? "message" : "messages"}`
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
@d.command("clean user", "<userId:string> <count:number>")
|
|
|
|
@d.permission("clean")
|
|
|
|
async cleanUserCmd(msg: Message, args: { userId: string; count: number }) {
|
|
|
|
if (args.count > MAX_CLEAN_COUNT || args.count <= 0) {
|
|
|
|
msg.channel.createMessage(
|
|
|
|
errorMessage(`Clean count must be between 1 and ${MAX_CLEAN_COUNT}`)
|
|
|
|
);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const messagesToClean = await getMessages(
|
|
|
|
msg.channel as TextChannel,
|
|
|
|
m => m.id !== msg.id && m.author.id === args.userId,
|
|
|
|
args.count
|
|
|
|
);
|
|
|
|
if (messagesToClean.length > 0)
|
|
|
|
await this.cleanMessages(msg.channel, messagesToClean.map(m => m.id), msg.author);
|
|
|
|
|
|
|
|
msg.channel.createMessage(
|
|
|
|
successMessage(
|
|
|
|
`Cleaned ${messagesToClean.length} ${messagesToClean.length === 1 ? "message" : "messages"}`
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
@d.command("clean bot", "<count:number>")
|
|
|
|
@d.permission("clean")
|
|
|
|
async cleanBotCmd(msg: Message, args: { count: number }) {
|
|
|
|
if (args.count > MAX_CLEAN_COUNT || args.count <= 0) {
|
|
|
|
msg.channel.createMessage(
|
|
|
|
errorMessage(`Clean count must be between 1 and ${MAX_CLEAN_COUNT}`)
|
|
|
|
);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const messagesToClean = await getMessages(
|
|
|
|
msg.channel as TextChannel,
|
|
|
|
m => m.id !== msg.id && m.author.bot,
|
|
|
|
args.count
|
|
|
|
);
|
|
|
|
if (messagesToClean.length > 0)
|
|
|
|
await this.cleanMessages(msg.channel, messagesToClean.map(m => m.id), msg.author);
|
|
|
|
|
|
|
|
msg.channel.createMessage(
|
|
|
|
successMessage(
|
|
|
|
`Cleaned ${messagesToClean.length} ${messagesToClean.length === 1 ? "message" : "messages"}`
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
2018-07-01 03:35:51 +03:00
|
|
|
}
|