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); if (!cache.isReady) return eventHandlers.guildLoaded?.(guild);
return eventHandlers.guildCreate?.(guild); eventHandlers.guildCreate?.(guild);
} }
export async function handleInternalGuildDelete(data: DiscordPayload) { export async function handleInternalGuildDelete(data: DiscordPayload) {
@@ -61,7 +61,7 @@ export async function handleInternalGuildDelete(data: DiscordPayload) {
const guild = await cacheHandlers.get("guilds", payload.id); const guild = await cacheHandlers.get("guilds", payload.id);
if (!guild) return; if (!guild) return;
return eventHandlers.guildDelete?.(guild); eventHandlers.guildDelete?.(guild);
} }
export async function handleInternalGuildUpdate(data: DiscordPayload) { export async function handleInternalGuildUpdate(data: DiscordPayload) {
@@ -91,7 +91,6 @@ export async function handleInternalGuildUpdate(data: DiscordPayload) {
if (Array.isArray(cachedValue) && Array.isArray(value)) { if (Array.isArray(cachedValue) && Array.isArray(value)) {
const different = (cachedValue.length !== value.length) || const different = (cachedValue.length !== value.length) ||
// @ts-ignore no idea how to fix this
cachedValue.find((val) => !value.includes(val)) || cachedValue.find((val) => !value.includes(val)) ||
value.find((val) => !cachedValue.includes(val)); value.find((val) => !cachedValue.includes(val));
if (!different) return; if (!different) return;
@@ -103,7 +102,9 @@ export async function handleInternalGuildUpdate(data: DiscordPayload) {
} }
}).filter((change) => change) as GuildUpdateChange[]; }).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) { export async function handleInternalGuildEmojisUpdate(data: DiscordPayload) {
@@ -118,7 +119,7 @@ export async function handleInternalGuildEmojisUpdate(data: DiscordPayload) {
cacheHandlers.set("guilds", payload.guild_id, guild); cacheHandlers.set("guilds", payload.guild_id, guild);
return eventHandlers.guildEmojisUpdate?.( eventHandlers.guildEmojisUpdate?.(
guild, guild,
payload.emojis, payload.emojis,
cachedEmojis, cachedEmojis,
+2
View File
@@ -70,6 +70,8 @@ export async function handleInternalGuildMemberUpdate(data: DiscordPayload) {
payload.guild_id, payload.guild_id,
); );
await cacheHandlers.set("messages", member.id, member);
if (guildMember?.nick !== payload.nick) { if (guildMember?.nick !== payload.nick) {
eventHandlers.nicknameUpdate?.( eventHandlers.nicknameUpdate?.(
guild, guild,
+8 -3
View File
@@ -63,7 +63,7 @@ export async function handleInternalPresenceUpdate(data: DiscordPayload) {
const oldPresence = await cacheHandlers.get("presences", payload.user.id); const oldPresence = await cacheHandlers.get("presences", payload.user.id);
await cacheHandlers.set("presences", payload.user.id, payload); 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. */ /** 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 // @ts-ignore index signatures
if (member[key] !== value) return member[key] = value; 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. */ /** 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, selfStream: payload.self_stream || false,
}); });
await cacheHandlers.set("guilds", payload.guild_id, guild);
if (cachedState?.channelID !== payload.channel_id) { if (cachedState?.channelID !== payload.channel_id) {
// Either joined or moved channels // Either joined or moved channels
if (payload.channel_id) { if (payload.channel_id) {
@@ -144,7 +149,7 @@ export function handleInternalWebhooksUpdate(data: DiscordPayload) {
if (data.t !== "WEBHOOKS_UPDATE") return; if (data.t !== "WEBHOOKS_UPDATE") return;
const options = data.d as WebhookUpdatePayload; const options = data.d as WebhookUpdatePayload;
return eventHandlers.webhooksUpdate?.( eventHandlers.webhooksUpdate?.(
options.channel_id, options.channel_id,
options.guild_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); const message = await cacheHandlers.get("messages", payload.message_id);
if (message) { if (message) {
const previousReactions = message.reactions; const reactionExisted = message.reactions?.find(
const reactionExisted = previousReactions?.find(
(reaction) => (reaction) =>
reaction.emoji.id === payload.emoji.id && reaction.emoji.id === payload.emoji.id &&
reaction.emoji.name === payload.emoji.name, reaction.emoji.name === payload.emoji.name,
@@ -68,8 +67,7 @@ export async function handleInternalMessageReactionRemove(
const message = await cacheHandlers.get("messages", payload.message_id); const message = await cacheHandlers.get("messages", payload.message_id);
if (message) { if (message) {
const previousReactions = message.reactions; const reactionExisted = message.reactions?.find(
const reactionExisted = previousReactions?.find(
(reaction) => (reaction) =>
reaction.emoji.id === payload.emoji.id && reaction.emoji.id === payload.emoji.id &&
reaction.emoji.name === payload.emoji.name, 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; 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); 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; 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?.( eventHandlers.reactionRemoveEmoji?.(
data.d as MessageReactionRemoveEmojiPayload, 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); const role = await structures.createRole(payload.role);
guild.roles = guild.roles.set(payload.role.id, 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) { export async function handleInternalGuildRoleDelete(data: DiscordPayload) {
@@ -41,8 +43,11 @@ export async function handleInternalGuildRoleDelete(data: DiscordPayload) {
if (!g.roles.includes(payload.role_id)) return; if (!g.roles.includes(payload.role_id)) return;
// Remove this role from the members cache // Remove this role from the members cache
g.roles = g.roles.filter((id) => id !== payload.role_id); 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) { export async function handleInternalGuildRoleUpdate(data: DiscordPayload) {
@@ -57,5 +62,7 @@ export async function handleInternalGuildRoleUpdate(data: DiscordPayload) {
const role = await structures.createRole(payload.role); const role = await structures.createRole(payload.role);
guild.roles.set(payload.role.id, role); guild.roles.set(payload.role.id, role);
await cacheHandlers.set("guilds", guild.id, guild);
eventHandlers.roleUpdate?.(guild, role, cachedRole); eventHandlers.roleUpdate?.(guild, role, cachedRole);
} }