mirror of
https://github.com/ZeppelinBot/Zeppelin.git
synced 2025-06-08 08:05:03 +00:00
feat: add member cache; handle all role changes with RoleManagerPlugin; exit gracefully
This commit is contained in:
parent
fd60a09947
commit
fa50110766
48 changed files with 755 additions and 264 deletions
|
@ -0,0 +1,58 @@
|
|||
import { APIRole, AuditLogChange, AuditLogEvent } from "discord.js";
|
||||
import { guildPluginEventListener } from "knub";
|
||||
import { resolveRole } from "../../../utils";
|
||||
import { logMemberRoleAdd } from "../logFunctions/logMemberRoleAdd";
|
||||
import { logMemberRoleRemove } from "../logFunctions/logMemberRoleRemove";
|
||||
import { LogsPluginType } from "../types";
|
||||
|
||||
type RoleAddChange = AuditLogChange & {
|
||||
key: "$add";
|
||||
new: Array<Pick<APIRole, "id" | "name">>;
|
||||
};
|
||||
|
||||
function isRoleAddChange(change: AuditLogChange): change is RoleAddChange {
|
||||
return change.key === "$add";
|
||||
}
|
||||
|
||||
type RoleRemoveChange = AuditLogChange & {
|
||||
key: "$remove";
|
||||
new: Array<Pick<APIRole, "id" | "name">>;
|
||||
};
|
||||
|
||||
function isRoleRemoveChange(change: AuditLogChange): change is RoleRemoveChange {
|
||||
return change.key === "$remove";
|
||||
}
|
||||
|
||||
export const LogsGuildMemberRoleChangeEvt = guildPluginEventListener<LogsPluginType>()({
|
||||
event: "guildAuditLogEntryCreate",
|
||||
async listener({ pluginData, args: { auditLogEntry } }) {
|
||||
// Ignore the bot's own audit log events
|
||||
if (auditLogEntry.executorId === pluginData.client.user?.id) {
|
||||
return;
|
||||
}
|
||||
if (auditLogEntry.action !== AuditLogEvent.MemberRoleUpdate) {
|
||||
return;
|
||||
}
|
||||
|
||||
const member = await pluginData.guild.members.fetch(auditLogEntry.targetId!);
|
||||
const mod = await pluginData.client.users.fetch(auditLogEntry.executorId!);
|
||||
for (const change of auditLogEntry.changes) {
|
||||
if (isRoleAddChange(change)) {
|
||||
const addedRoles = change.new.map((r) => resolveRole(pluginData.guild, r.id));
|
||||
logMemberRoleAdd(pluginData, {
|
||||
member,
|
||||
mod,
|
||||
roles: addedRoles,
|
||||
});
|
||||
}
|
||||
if (isRoleRemoveChange(change)) {
|
||||
const removedRoles = change.new.map((r) => resolveRole(pluginData.guild, r.id));
|
||||
logMemberRoleRemove(pluginData, {
|
||||
member,
|
||||
mod,
|
||||
roles: removedRoles,
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
|
@ -1,10 +1,4 @@
|
|||
import diff from "lodash.difference";
|
||||
import isEqual from "lodash.isequal";
|
||||
import { LogType } from "../../../data/LogType";
|
||||
import { logMemberNickChange } from "../logFunctions/logMemberNickChange";
|
||||
import { logMemberRoleAdd } from "../logFunctions/logMemberRoleAdd";
|
||||
import { logMemberRoleChanges } from "../logFunctions/logMemberRoleChanges";
|
||||
import { logMemberRoleRemove } from "../logFunctions/logMemberRoleRemove";
|
||||
import { logsEvt } from "../types";
|
||||
|
||||
export const LogsGuildMemberUpdateEvt = logsEvt({
|
||||
|
@ -14,8 +8,6 @@ export const LogsGuildMemberUpdateEvt = logsEvt({
|
|||
const pluginData = meta.pluginData;
|
||||
const oldMember = meta.args.oldMember;
|
||||
const member = meta.args.newMember;
|
||||
const oldRoles = [...oldMember.roles.cache.keys()];
|
||||
const currentRoles = [...member.roles.cache.keys()];
|
||||
|
||||
if (!oldMember || oldMember.partial) {
|
||||
return;
|
||||
|
@ -28,62 +20,5 @@ export const LogsGuildMemberUpdateEvt = logsEvt({
|
|||
newNick: member.nickname != null ? member.nickname : "<none>",
|
||||
});
|
||||
}
|
||||
|
||||
if (!isEqual(oldRoles, currentRoles)) {
|
||||
const addedRoles = diff(currentRoles, oldRoles);
|
||||
const removedRoles = diff(oldRoles, currentRoles);
|
||||
let skip = false;
|
||||
|
||||
if (
|
||||
addedRoles.length &&
|
||||
removedRoles.length &&
|
||||
pluginData.state.guildLogs.isLogIgnored(LogType.MEMBER_ROLE_CHANGES, member.id)
|
||||
) {
|
||||
skip = true;
|
||||
} else if (addedRoles.length && pluginData.state.guildLogs.isLogIgnored(LogType.MEMBER_ROLE_ADD, member.id)) {
|
||||
skip = true;
|
||||
} else if (
|
||||
removedRoles.length &&
|
||||
pluginData.state.guildLogs.isLogIgnored(LogType.MEMBER_ROLE_REMOVE, member.id)
|
||||
) {
|
||||
skip = true;
|
||||
}
|
||||
|
||||
if (!skip) {
|
||||
if (addedRoles.length && removedRoles.length) {
|
||||
// Roles added *and* removed
|
||||
logMemberRoleChanges(pluginData, {
|
||||
member,
|
||||
addedRoles: addedRoles.map(
|
||||
(roleId) => pluginData.guild.roles.cache.get(roleId) ?? { id: roleId, name: `Unknown (${roleId})` },
|
||||
),
|
||||
removedRoles: removedRoles.map(
|
||||
(roleId) => pluginData.guild.roles.cache.get(roleId) ?? { id: roleId, name: `Unknown (${roleId})` },
|
||||
),
|
||||
mod: null,
|
||||
});
|
||||
} else if (addedRoles.length) {
|
||||
// Roles added
|
||||
logMemberRoleAdd(pluginData, {
|
||||
member,
|
||||
roles: addedRoles.map(
|
||||
(roleId) => pluginData.guild.roles.cache.get(roleId) ?? { id: roleId, name: `Unknown (${roleId})` },
|
||||
),
|
||||
mod: null,
|
||||
});
|
||||
} else if (removedRoles.length && !addedRoles.length) {
|
||||
// Roles removed
|
||||
logMemberRoleRemove(pluginData, {
|
||||
member,
|
||||
roles: removedRoles.map(
|
||||
(roleId) => pluginData.guild.roles.cache.get(roleId) ?? { id: roleId, name: `Unknown (${roleId})` },
|
||||
),
|
||||
mod: null,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
// TODO: Reimplement USERNAME_CHANGE
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue