fix(controllers): update cache with new value in gateway events (#433)

* fix(controllers): cache updated member

* fix(controllers): cache update guild

* fix(controllers): cache user update

* fix(controllers): cache voice state update

* refactor(controllers): message reaction add remove previousReactions

* refactor(controllers): message reaction remove remove previousReactions

* fix(controllers): cache message reaction remove all

* fix(controllers): cache message reaction remove emoji

* fix(controllers): cache guild role create

* fix(controllers): role delete event update cache and return eventHandler

* fix(controllers): cache role update

* don't return eventHandlers

* don't return eventHandlers
This commit is contained in:
ITOH
2021-01-22 16:20:33 +01:00
committed by GitHub
parent 8d5803c82a
commit 62af388820
5 changed files with 56 additions and 15 deletions
+6 -5
View File
@@ -33,7 +33,7 @@ export async function handleInternalGuildCreate(
}
if (!cache.isReady) return eventHandlers.guildLoaded?.(guild);
return eventHandlers.guildCreate?.(guild);
eventHandlers.guildCreate?.(guild);
}
export async function handleInternalGuildDelete(data: DiscordPayload) {
@@ -61,7 +61,7 @@ export async function handleInternalGuildDelete(data: DiscordPayload) {
const guild = await cacheHandlers.get("guilds", payload.id);
if (!guild) return;
return eventHandlers.guildDelete?.(guild);
eventHandlers.guildDelete?.(guild);
}
export async function handleInternalGuildUpdate(data: DiscordPayload) {
@@ -91,7 +91,6 @@ export async function handleInternalGuildUpdate(data: DiscordPayload) {
if (Array.isArray(cachedValue) && Array.isArray(value)) {
const different = (cachedValue.length !== value.length) ||
// @ts-ignore no idea how to fix this
cachedValue.find((val) => !value.includes(val)) ||
value.find((val) => !cachedValue.includes(val));
if (!different) return;
@@ -103,7 +102,9 @@ export async function handleInternalGuildUpdate(data: DiscordPayload) {
}
}).filter((change) => change) as GuildUpdateChange[];
return eventHandlers.guildUpdate?.(cachedGuild, changes);
await cacheHandlers.set("guilds", payload.id, { ...cachedGuild, ...changes });
eventHandlers.guildUpdate?.(cachedGuild, changes);
}
export async function handleInternalGuildEmojisUpdate(data: DiscordPayload) {
@@ -118,7 +119,7 @@ export async function handleInternalGuildEmojisUpdate(data: DiscordPayload) {
cacheHandlers.set("guilds", payload.guild_id, guild);
return eventHandlers.guildEmojisUpdate?.(
eventHandlers.guildEmojisUpdate?.(
guild,
payload.emojis,
cachedEmojis,
+2
View File
@@ -70,6 +70,8 @@ export async function handleInternalGuildMemberUpdate(data: DiscordPayload) {
payload.guild_id,
);
await cacheHandlers.set("messages", member.id, member);
if (guildMember?.nick !== payload.nick) {
eventHandlers.nicknameUpdate?.(
guild,
+8 -3
View File
@@ -63,7 +63,7 @@ export async function handleInternalPresenceUpdate(data: DiscordPayload) {
const oldPresence = await cacheHandlers.get("presences", payload.user.id);
await cacheHandlers.set("presences", payload.user.id, payload);
return eventHandlers.presenceUpdate?.(payload, oldPresence);
eventHandlers.presenceUpdate?.(payload, oldPresence);
}
/** This function is the internal handler for the typings event. Users can override this with controllers if desired. */
@@ -85,7 +85,10 @@ export async function handleInternalUserUpdate(data: DiscordPayload) {
// @ts-ignore index signatures
if (member[key] !== value) return member[key] = value;
});
return eventHandlers.botUpdate?.(userData);
await cacheHandlers.set("members", userData.id, member);
eventHandlers.botUpdate?.(userData);
}
/** This function is the internal handler for the voice state update event. Users can override this with controllers if desired. */
@@ -117,6 +120,8 @@ export async function handleInternalVoiceStateUpdate(data: DiscordPayload) {
selfStream: payload.self_stream || false,
});
await cacheHandlers.set("guilds", payload.guild_id, guild);
if (cachedState?.channelID !== payload.channel_id) {
// Either joined or moved channels
if (payload.channel_id) {
@@ -144,7 +149,7 @@ export function handleInternalWebhooksUpdate(data: DiscordPayload) {
if (data.t !== "WEBHOOKS_UPDATE") return;
const options = data.d as WebhookUpdatePayload;
return eventHandlers.webhooksUpdate?.(
eventHandlers.webhooksUpdate?.(
options.channel_id,
options.guild_id,
);
+32 -6
View File
@@ -15,8 +15,7 @@ export async function handleInternalMessageReactionAdd(data: DiscordPayload) {
const message = await cacheHandlers.get("messages", payload.message_id);
if (message) {
const previousReactions = message.reactions;
const reactionExisted = previousReactions?.find(
const reactionExisted = message.reactions?.find(
(reaction) =>
reaction.emoji.id === payload.emoji.id &&
reaction.emoji.name === payload.emoji.name,
@@ -68,8 +67,7 @@ export async function handleInternalMessageReactionRemove(
const message = await cacheHandlers.get("messages", payload.message_id);
if (message) {
const previousReactions = message.reactions;
const reactionExisted = previousReactions?.find(
const reactionExisted = message.reactions?.find(
(reaction) =>
reaction.emoji.id === payload.emoji.id &&
reaction.emoji.name === payload.emoji.name,
@@ -115,15 +113,43 @@ export async function handleInternalMessageReactionRemove(
);
}
export function handleInternalMessageReactionRemoveAll(data: DiscordPayload) {
export async function handleInternalMessageReactionRemoveAll(
data: DiscordPayload,
) {
if (data.t !== "MESSAGE_REACTION_REMOVE_ALL") return;
const payload = data.d as BaseMessageReactionPayload;
const message = await cacheHandlers.get("messages", payload.message_id);
if (message?.reactions) {
message.reactions = undefined;
await cacheHandlers.set("messages", payload.message_id, message);
}
eventHandlers.reactionRemoveAll?.(data.d as BaseMessageReactionPayload);
}
export function handleInternalMessageReactionRemoveEmoji(data: DiscordPayload) {
export async function handleInternalMessageReactionRemoveEmoji(
data: DiscordPayload,
) {
if (data.t !== "MESSAGE_REACTION_REMOVE_EMOJI") return;
const payload = data.d as MessageReactionRemoveEmojiPayload;
const message = await cacheHandlers.get("messages", payload.message_id);
if (message?.reactions) {
message.reactions = message.reactions?.filter(
(reaction) =>
!(
reaction.emoji.id === payload.emoji.id &&
reaction.emoji.name === payload.emoji.name
),
);
await cacheHandlers.set("messages", payload.message_id, message);
}
eventHandlers.reactionRemoveEmoji?.(
data.d as MessageReactionRemoveEmojiPayload,
);
+8 -1
View File
@@ -16,7 +16,9 @@ export async function handleInternalGuildRoleCreate(data: DiscordPayload) {
const role = await structures.createRole(payload.role);
guild.roles = guild.roles.set(payload.role.id, role);
return eventHandlers.roleCreate?.(guild, role);
await cacheHandlers.set("guilds", payload.guild_id, guild);
eventHandlers.roleCreate?.(guild, role);
}
export async function handleInternalGuildRoleDelete(data: DiscordPayload) {
@@ -41,8 +43,11 @@ export async function handleInternalGuildRoleDelete(data: DiscordPayload) {
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);
cacheHandlers.set("members", member.id, member);
});
});
eventHandlers.roleDelete?.(guild, cachedRole);
}
export async function handleInternalGuildRoleUpdate(data: DiscordPayload) {
@@ -57,5 +62,7 @@ export async function handleInternalGuildRoleUpdate(data: DiscordPayload) {
const role = await structures.createRole(payload.role);
guild.roles.set(payload.role.id, role);
await cacheHandlers.set("guilds", guild.id, guild);
eventHandlers.roleUpdate?.(guild, role, cachedRole);
}