Eager-check permissions in persist plugin

This commit is contained in:
Dragory 2020-08-21 03:58:49 +03:00
parent 6730e51552
commit e55375fb25
No known key found for this signature in database
GPG key ID: 5F387BA66DF8AAC1
2 changed files with 35 additions and 1 deletions

View file

@ -6,6 +6,7 @@ import { GuildLogs } from "src/data/GuildLogs";
import { StoreDataEvt } from "./events/StoreDataEvt";
import { LoadDataEvt } from "./events/LoadDataEvt";
import { trimPluginDescription } from "../../utils";
import { LogsPlugin } from "../Logs/LogsPlugin";
const defaultOptions: PluginOptions<PersistPluginType> = {
config: {
@ -25,6 +26,7 @@ export const PersistPlugin = zeppelinPlugin<PersistPluginType>()("persist", {
`),
},
dependencies: [LogsPlugin],
configSchema: ConfigSchema,
defaultOptions,

View file

@ -1,8 +1,14 @@
import { persistEvent } from "../types";
import { MemberOptions } from "eris";
import { Constants, MemberOptions } from "eris";
import intersection from "lodash.intersection";
import { LogType } from "src/data/LogType";
import { stripObjectToScalars } from "src/utils";
import { getMissingPermissions } from "../../../utils/getMissingPermissions";
import { LogsPlugin } from "../../Logs/LogsPlugin";
import { missingPermissionError } from "../../../utils/missingPermissionError";
import { canAssignRole } from "../../../utils/canAssignRole";
const p = Constants.Permissions;
export const LoadDataEvt = persistEvent({
event: "guildMemberAdd",
@ -23,9 +29,35 @@ export const LoadDataEvt = persistEvent({
const config = pluginData.config.getForMember(member);
const restoredData = [];
// Check permissions
const me = pluginData.guild.members.get(pluginData.client.user.id);
let requiredPermissions = 0;
if (config.persist_nicknames) requiredPermissions |= p.manageNicknames;
if (config.persisted_roles) requiredPermissions |= p.manageRoles;
const missingPermissions = getMissingPermissions(me.permission, requiredPermissions);
if (missingPermissions) {
pluginData.getPlugin(LogsPlugin).log(LogType.BOT_ALERT, {
body: `Missing permissions for persist plugin: ${missingPermissionError(missingPermissions)}`,
});
return;
}
// Check specific role permissions
if (config.persisted_roles) {
for (const roleId of config.persisted_roles) {
if (!canAssignRole(pluginData.guild, me, roleId)) {
pluginData.getPlugin(LogsPlugin).log(LogType.BOT_ALERT, {
body: `Missing permissions to assign role \`${roleId}\` in persist plugin`,
});
return;
}
}
}
const persistedRoles = config.persisted_roles;
if (persistedRoles.length) {
const rolesToRestore = intersection(persistedRoles, persistedData.roles);
if (rolesToRestore.length) {
restoredData.push("roles");
toRestore.roles = Array.from(new Set([...rolesToRestore, ...member.roles]));