3
0
Fork 0
mirror of https://github.com/ZeppelinBot/Zeppelin.git synced 2025-05-10 12:25:02 +00:00
zeppelin/backend/src/plugins/Persist/events/LoadDataEvt.ts

87 lines
3.1 KiB
TypeScript

import { GuildMemberEditData, Permissions } from "discord.js";
import intersection from "lodash.intersection";
import { memberToTemplateSafeMember } from "../../../utils/templateSafeObjects";
import { LogType } from "../../../data/LogType";
import { canAssignRole } from "../../../utils/canAssignRole";
import { getMissingPermissions } from "../../../utils/getMissingPermissions";
import { memberRolesLock } from "../../../utils/lockNameHelpers";
import { missingPermissionError } from "../../../utils/missingPermissionError";
import { LogsPlugin } from "../../Logs/LogsPlugin";
import { persistEvt } from "../types";
const p = Permissions.FLAGS;
export const LoadDataEvt = persistEvt({
event: "guildMemberAdd",
async listener(meta) {
const member = meta.args.member;
const pluginData = meta.pluginData;
const memberRoleLock = await pluginData.locks.acquire(memberRolesLock(member));
const persistedData = await pluginData.state.persistedData.find(member.id);
if (!persistedData) {
memberRoleLock.unlock();
return;
}
const toRestore: GuildMemberEditData = {};
const config = await pluginData.config.getForMember(member);
const restoredData: string[] = [];
// Check permissions
const me = pluginData.guild.members.cache.get(pluginData.client.user!.id)!;
let requiredPermissions = 0n;
if (config.persist_nicknames) requiredPermissions |= p.MANAGE_NICKNAMES;
if (config.persisted_roles) requiredPermissions |= p.MANAGE_ROLES;
const missingPermissions = getMissingPermissions(me.permissions, requiredPermissions);
if (missingPermissions) {
pluginData.getPlugin(LogsPlugin).logBotAlert({
body: `Missing permissions for persist plugin: ${missingPermissionError(missingPermissions)}`,
});
return;
}
const guildRoles = Array.from(pluginData.guild.roles.cache.keys());
// Check specific role permissions
if (config.persisted_roles) {
for (const roleId of config.persisted_roles) {
if (!canAssignRole(pluginData.guild, me, roleId) && guildRoles.includes(roleId)) {
pluginData.getPlugin(LogsPlugin).logBotAlert({
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, guildRoles);
if (rolesToRestore.length) {
restoredData.push("roles");
toRestore.roles = Array.from(new Set([...rolesToRestore, ...member.roles.cache.keys()]));
}
}
if (config.persist_nicknames && persistedData.nickname) {
restoredData.push("nickname");
toRestore.nick = persistedData.nickname;
}
if (restoredData.length) {
await member.edit(toRestore, "Restored upon rejoin");
await pluginData.state.persistedData.clear(member.id);
pluginData.getPlugin(LogsPlugin).logMemberRestore({
member,
restoredData: restoredData.join(", "),
});
}
memberRoleLock.unlock();
},
});