3
0
Fork 0
mirror of https://github.com/ZeppelinBot/Zeppelin.git synced 2025-07-08 03:27:20 +00:00

feat: add member cache; handle all role changes with RoleManagerPlugin; exit gracefully

This commit is contained in:
Dragory 2023-05-07 17:56:55 +03:00
parent fd60a09947
commit fa50110766
No known key found for this signature in database
GPG key ID: 5F387BA66DF8AAC1
48 changed files with 755 additions and 264 deletions

View file

@ -0,0 +1,9 @@
import { guildPluginEventListener } from "knub";
import { GuildMemberCachePluginType } from "../types";
export const cancelDeletionOnMemberJoin = guildPluginEventListener<GuildMemberCachePluginType>()({
event: "guildMemberAdd",
async listener({ pluginData, args: { member } }) {
pluginData.state.memberCache.unmarkMemberForDeletion(member.id);
},
});

View file

@ -0,0 +1,12 @@
import { guildPluginEventListener } from "knub";
import { MINUTES } from "../../../utils";
import { GuildMemberCachePluginType } from "../types";
const DELETION_DELAY = 2 * MINUTES;
export const removeMemberCacheOnMemberLeave = guildPluginEventListener<GuildMemberCachePluginType>()({
event: "guildMemberRemove",
async listener({ pluginData, args: { member } }) {
pluginData.state.memberCache.markMemberForDeletion(member.id);
},
});

View file

@ -0,0 +1,15 @@
import { AuditLogEvent } from "discord.js";
import { guildPluginEventListener } from "knub";
import { updateMemberCacheForMember } from "../functions/updateMemberCacheForMember";
import { GuildMemberCachePluginType } from "../types";
export const updateMemberCacheOnMemberUpdate = guildPluginEventListener<GuildMemberCachePluginType>()({
event: "guildAuditLogEntryCreate",
async listener({ pluginData, args: { auditLogEntry } }) {
if (auditLogEntry.action !== AuditLogEvent.MemberUpdate) {
return;
}
updateMemberCacheForMember(pluginData, auditLogEntry.targetId!);
},
});

View file

@ -0,0 +1,16 @@
import { guildPluginEventListener } from "knub";
import { updateMemberCacheForMember } from "../functions/updateMemberCacheForMember";
import { GuildMemberCachePluginType } from "../types";
export const updateMemberCacheOnMessage = guildPluginEventListener<GuildMemberCachePluginType>()({
event: "messageCreate",
listener({ pluginData, args }) {
// Update each member once per guild load when we see a message from them
const key = `${pluginData.guild.id}-${args.message.author.id}`;
if (pluginData.state.initialUpdatedMembers.has(key)) {
return;
}
updateMemberCacheForMember(pluginData, args.message.author.id);
pluginData.state.initialUpdatedMembers.add(key);
},
});

View file

@ -0,0 +1,15 @@
import { AuditLogEvent } from "discord.js";
import { guildPluginEventListener } from "knub";
import { updateMemberCacheForMember } from "../functions/updateMemberCacheForMember";
import { GuildMemberCachePluginType } from "../types";
export const updateMemberCacheOnRoleChange = guildPluginEventListener<GuildMemberCachePluginType>()({
event: "guildAuditLogEntryCreate",
async listener({ pluginData, args: { auditLogEntry } }) {
if (auditLogEntry.action !== AuditLogEvent.MemberRoleUpdate) {
return;
}
updateMemberCacheForMember(pluginData, auditLogEntry.targetId!);
},
});

View file

@ -0,0 +1,20 @@
import { guildPluginEventListener } from "knub";
import { updateMemberCacheForMember } from "../functions/updateMemberCacheForMember";
import { GuildMemberCachePluginType } from "../types";
export const updateMemberCacheOnVoiceStateUpdate = guildPluginEventListener<GuildMemberCachePluginType>()({
event: "voiceStateUpdate",
listener({ pluginData, args }) {
const memberId = args.newState.member?.id;
if (!memberId) {
return;
}
// Update each member once per guild load when we see a message from them
const key = `${pluginData.guild.id}-${memberId}`;
if (pluginData.state.initialUpdatedMembers.has(key)) {
return;
}
updateMemberCacheForMember(pluginData, memberId);
pluginData.state.initialUpdatedMembers.add(key);
},
});