move guild.members to cache.members

This commit is contained in:
Skillz
2020-11-18 11:58:26 -05:00
parent 65e04f656f
commit 6ecdb9fc9b
12 changed files with 140 additions and 81 deletions
+2 -2
View File
@@ -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);
}
+22 -6
View File
@@ -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,
) {
+2 -14
View File
@@ -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);
}
+9 -15
View File
@@ -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
View File
@@ -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
+10 -2
View File
@@ -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);
})
});
}