mirror of
https://github.com/discordeno/discordeno.git
synced 2026-06-16 19:28:17 +00:00
move guild.members to cache.members
This commit is contained in:
@@ -10,7 +10,7 @@ export async function handleInternalGuildBanAdd(data: DiscordPayload) {
|
||||
const guild = await cacheHandlers.get("guilds", payload.guild_id);
|
||||
if (!guild) return;
|
||||
|
||||
const member = guild.members.get(payload.user.id);
|
||||
const member = await cacheHandlers.get("members", payload.user.id);
|
||||
eventHandlers.guildBanAdd?.(guild, member || payload.user);
|
||||
}
|
||||
|
||||
@@ -21,6 +21,6 @@ export async function handleInternalGuildBanRemove(data: DiscordPayload) {
|
||||
const guild = await cacheHandlers.get("guilds", payload.guild_id);
|
||||
if (!guild) return;
|
||||
|
||||
const member = guild.members.get(payload.user.id);
|
||||
const member = await cacheHandlers.get("members", payload.user.id);
|
||||
eventHandlers.guildBanRemove?.(guild, member || payload.user);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { Channel } from "../structures/channel.ts";
|
||||
import { Guild } from "../structures/guild.ts";
|
||||
import { Member } from "../structures/member.ts";
|
||||
import { Message } from "../structures/message.ts";
|
||||
import { PresenceUpdatePayload } from "../types/discord.ts";
|
||||
import { cache } from "../utils/cache.ts";
|
||||
@@ -7,10 +8,11 @@ import { Collection } from "../utils/collection.ts";
|
||||
|
||||
export type TableName =
|
||||
| "guilds"
|
||||
| "unavailableGuilds"
|
||||
| "channels"
|
||||
| "messages"
|
||||
| "presences"
|
||||
| "unavailableGuilds";
|
||||
| "members"
|
||||
| "presences";
|
||||
|
||||
function set(
|
||||
table: "guilds",
|
||||
@@ -27,6 +29,11 @@ function set(
|
||||
key: string,
|
||||
value: Message,
|
||||
): Promise<Collection<string, Message>>;
|
||||
function set(
|
||||
table: "members",
|
||||
key: string,
|
||||
value: Member,
|
||||
): Promise<Collection<string, Member>>;
|
||||
function set(
|
||||
table: "presences",
|
||||
key: string,
|
||||
@@ -44,6 +51,7 @@ async function set(table: TableName, key: string, value: any) {
|
||||
function get(table: "guilds", key: string): Promise<Guild | undefined>;
|
||||
function get(table: "channels", key: string): Promise<Channel | undefined>;
|
||||
function get(table: "messages", key: string): Promise<Message | undefined>;
|
||||
function get(table: "members", key: string): Promise<Member | undefined>;
|
||||
function get(
|
||||
table: "presences",
|
||||
key: string,
|
||||
@@ -72,6 +80,10 @@ function forEach(
|
||||
table: "messages",
|
||||
callback: (value: Message, key: string, map: Map<string, Message>) => unknown,
|
||||
): void;
|
||||
function forEach(
|
||||
table: "members",
|
||||
callback: (value: Member, key: string, map: Map<string, Member>) => unknown,
|
||||
): void;
|
||||
function forEach(
|
||||
table: TableName,
|
||||
callback: (value: any, key: string, map: Map<string, any>) => unknown,
|
||||
@@ -82,20 +94,24 @@ function forEach(
|
||||
function filter(
|
||||
table: "guilds",
|
||||
callback: (value: Guild, key: string) => boolean,
|
||||
): Collection<string, Guild>;
|
||||
): Promise<Collection<string, Guild>>;
|
||||
function filter(
|
||||
table: "unavailableGuilds",
|
||||
callback: (value: Guild, key: string) => boolean,
|
||||
): Collection<string, Guild>;
|
||||
): Promise<Collection<string, Guild>>;
|
||||
function filter(
|
||||
table: "channels",
|
||||
callback: (value: Channel, key: string) => boolean,
|
||||
): Collection<string, Channel>;
|
||||
): Promise<Collection<string, Channel>>;
|
||||
function filter(
|
||||
table: "messages",
|
||||
callback: (value: Message, key: string) => boolean,
|
||||
): Collection<string, Message>;
|
||||
): Promise<Collection<string, Message>>;
|
||||
function filter(
|
||||
table: "members",
|
||||
callback: (value: Member, key: string) => boolean,
|
||||
): Promise<Collection<string, Member>>;
|
||||
async function filter(
|
||||
table: TableName,
|
||||
callback: (value: any, key: string) => boolean,
|
||||
) {
|
||||
|
||||
@@ -11,11 +11,6 @@ export async function handleInternalChannelCreate(data: DiscordPayload) {
|
||||
const channel = await structures.createChannel(payload);
|
||||
await cacheHandlers.set("channels", channel.id, channel);
|
||||
|
||||
if (channel.guildID) {
|
||||
const guild = await cacheHandlers.get("guilds", channel.guildID);
|
||||
guild?.channels.set(channel.id, channel);
|
||||
}
|
||||
|
||||
eventHandlers.channelCreate?.(channel);
|
||||
}
|
||||
|
||||
@@ -31,20 +26,18 @@ export async function handleInternalChannelDelete(data: DiscordPayload) {
|
||||
const guild = await cacheHandlers.get("guilds", payload.guild_id);
|
||||
|
||||
if (guild) {
|
||||
guild.voiceStates.forEach((vs, key) => {
|
||||
guild.voiceStates.forEach(async (vs, key) => {
|
||||
if (vs.channelID !== payload.id) return;
|
||||
|
||||
// Since this channel was deleted all voice states for this channel should be deleted
|
||||
guild.voiceStates.delete(key);
|
||||
|
||||
const member = guild.members.get(vs.userID);
|
||||
const member = await cacheHandlers.get("members", vs.userID);
|
||||
if (!member) return;
|
||||
|
||||
eventHandlers.voiceChannelLeave?.(member, vs.channelID);
|
||||
});
|
||||
}
|
||||
|
||||
guild?.channels.delete(payload.id);
|
||||
}
|
||||
|
||||
cacheHandlers.delete("channels", payload.id);
|
||||
@@ -66,10 +59,5 @@ export async function handleInternalChannelUpdate(data: DiscordPayload) {
|
||||
|
||||
if (!cachedChannel) return;
|
||||
|
||||
if (channel.guildID) {
|
||||
const guild = await cacheHandlers.get("guilds", channel.guildID);
|
||||
guild?.channels.set(channel.id, channel);
|
||||
}
|
||||
|
||||
eventHandlers.channelUpdate?.(channel, cachedChannel);
|
||||
}
|
||||
|
||||
@@ -22,7 +22,6 @@ export async function handleInternalGuildMemberAdd(data: DiscordPayload) {
|
||||
payload,
|
||||
guild.id,
|
||||
);
|
||||
guild.members.set(payload.user.id, member);
|
||||
|
||||
eventHandlers.guildMemberAdd?.(guild, member);
|
||||
}
|
||||
@@ -35,13 +34,14 @@ export async function handleInternalGuildMemberRemove(data: DiscordPayload) {
|
||||
if (!guild) return;
|
||||
|
||||
guild.memberCount--;
|
||||
const member = guild.members.get(payload.user.id);
|
||||
const member = await cacheHandlers.get("members", payload.user.id);
|
||||
eventHandlers.guildMemberRemove?.(
|
||||
guild,
|
||||
member || payload.user,
|
||||
);
|
||||
|
||||
guild.members.delete(payload.user.id);
|
||||
member?.guilds.delete(guild.id);
|
||||
if (member && !member.guilds.size) cacheHandlers.delete("members", member.id);
|
||||
}
|
||||
|
||||
export async function handleInternalGuildMemberUpdate(data: DiscordPayload) {
|
||||
@@ -51,7 +51,7 @@ export async function handleInternalGuildMemberUpdate(data: DiscordPayload) {
|
||||
const guild = await cacheHandlers.get("guilds", payload.guild_id);
|
||||
if (!guild) return;
|
||||
|
||||
const cachedMember = guild.members.get(payload.user.id);
|
||||
const cachedMember = await cacheHandlers.get("members", payload.user.id);
|
||||
|
||||
const newMemberData = {
|
||||
...payload,
|
||||
@@ -60,12 +60,12 @@ export async function handleInternalGuildMemberUpdate(data: DiscordPayload) {
|
||||
.toISOString(),
|
||||
deaf: cachedMember?.deaf || false,
|
||||
mute: cachedMember?.mute || false,
|
||||
roles: payload.roles,
|
||||
};
|
||||
const member = await structures.createMember(
|
||||
newMemberData,
|
||||
guild.id,
|
||||
);
|
||||
guild.members.set(payload.user.id, member);
|
||||
|
||||
if (cachedMember?.nick !== payload.nick) {
|
||||
eventHandlers.nicknameUpdate?.(
|
||||
@@ -99,15 +99,9 @@ export async function handleInternalGuildMembersChunk(data: DiscordPayload) {
|
||||
const guild = await cacheHandlers.get("guilds", payload.guild_id);
|
||||
if (!guild) return;
|
||||
|
||||
payload.members.forEach(async (member) => {
|
||||
guild.members.set(
|
||||
member.user.id,
|
||||
await structures.createMember(
|
||||
member,
|
||||
guild.id,
|
||||
),
|
||||
);
|
||||
});
|
||||
await Promise.all(
|
||||
payload.members.map((member) => structures.createMember(member, guild.id)),
|
||||
);
|
||||
|
||||
// Check if its necessary to resolve the fetchmembers promise for this chunk or if more chunks will be coming
|
||||
if (
|
||||
@@ -118,7 +112,7 @@ export async function handleInternalGuildMembersChunk(data: DiscordPayload) {
|
||||
|
||||
if (payload.chunk_index + 1 === payload.chunk_count) {
|
||||
cache.fetchAllMembersProcessingRequests.delete(payload.nonce);
|
||||
resolve(guild.members);
|
||||
resolve(await cacheHandlers.filter("members", (m) => m.guilds.has(guild.id)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+9
-14
@@ -52,21 +52,17 @@ export function handleInternalTypingStart(data: DiscordPayload) {
|
||||
eventHandlers.typingStart?.(data.d as TypingStartPayload);
|
||||
}
|
||||
|
||||
export function handleInternalUserUpdate(data: DiscordPayload) {
|
||||
export async function handleInternalUserUpdate(data: DiscordPayload) {
|
||||
if (data.t !== "USER_UPDATE") return;
|
||||
|
||||
const userData = data.d as UserPayload;
|
||||
|
||||
cacheHandlers.forEach("guilds", (guild) => {
|
||||
const member = guild.members.get(userData.id);
|
||||
if (!member) return;
|
||||
// member.author = userData;
|
||||
Object.entries(userData).forEach(([key, value]) => {
|
||||
// @ts-ignore
|
||||
if (member[key] === value) return;
|
||||
// @ts-ignore
|
||||
member[key] = value;
|
||||
});
|
||||
const member = await cacheHandlers.get("members", userData.id);
|
||||
if (!member) return;
|
||||
|
||||
Object.entries(userData).forEach(([key, value]) => {
|
||||
// @ts-ignore
|
||||
if (member[key] !== value) return member[key] = value;
|
||||
});
|
||||
return eventHandlers.botUpdate?.(userData);
|
||||
}
|
||||
@@ -80,10 +76,9 @@ export async function handleInternalVoiceStateUpdate(data: DiscordPayload) {
|
||||
const guild = await cacheHandlers.get("guilds", payload.guild_id);
|
||||
if (!guild) return;
|
||||
|
||||
const member = guild.members.get(payload.user_id) ||
|
||||
(payload.member
|
||||
const member = payload.member
|
||||
? await structures.createMember(payload.member, guild.id)
|
||||
: undefined);
|
||||
: await cacheHandlers.get("members", payload.user_id);
|
||||
if (!member) return;
|
||||
|
||||
// No cached state before so lets make one for em
|
||||
|
||||
@@ -29,8 +29,16 @@ export async function handleInternalGuildRoleDelete(data: DiscordPayload) {
|
||||
eventHandlers.roleDelete?.(guild, cachedRole);
|
||||
|
||||
// For bots without GUILD_MEMBERS member.roles is never updated breaking permissions checking.
|
||||
guild.members.forEach((member) => {
|
||||
member.roles = member.roles.filter((id) => id !== payload.role_id);
|
||||
cacheHandlers.forEach("members", member => {
|
||||
// Not in the relevant guild so just skip.
|
||||
if (!member.guilds.has(guild.id)) return;
|
||||
|
||||
member.guilds.forEach(g => {
|
||||
// Member does not have this role
|
||||
if (!g.roles.includes(payload.role_id)) return;
|
||||
// Remove this role from the members cache
|
||||
g.roles = g.roles.filter(id => id !== payload.role_id);
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user