diff --git a/src/handlers/misc/USER_UPDATE.ts b/src/handlers/misc/USER_UPDATE.ts index 3ebc74323..9c85b8759 100644 --- a/src/handlers/misc/USER_UPDATE.ts +++ b/src/handlers/misc/USER_UPDATE.ts @@ -1,8 +1,10 @@ import { eventHandlers } from "../../bot.ts"; import { cacheHandlers } from "../../cache.ts"; +import { memberToggles } from "../../structures/member.ts"; import type { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; import type { User } from "../../types/users/user.ts"; import { snowflakeToBigint } from "../../util/bigint.ts"; +import { iconHashToBigInt } from "../../util/hash.ts"; export async function handleUserUpdate(data: DiscordGatewayPayload) { const userData = data.d as User; @@ -10,11 +12,22 @@ export async function handleUserUpdate(data: DiscordGatewayPayload) { const member = await cacheHandlers.get("members", snowflakeToBigint(userData.id)); if (!member) return; - Object.entries(userData).forEach(([key, value]) => { - eventHandlers.debug?.("loop", `Running forEach loop in USER_UPDATE file.`); - // @ts-ignore index signatures - if (member[key] !== value) return (member[key] = value); - }); + // Update username + member.username = userData.username; + // Update discriminator + member.discriminator = BigInt(userData.discriminator); + + // Check if a avatar is available + const hash = userData.avatar ? iconHashToBigInt(userData.avatar) : undefined; + // Update the avatar + member.avatar = hash?.bigint || 0n; + // Update the animated status if its animated + if (hash?.animated) member.bitfield |= memberToggles.animatedAvatar; + else member.bitfield &= ~memberToggles.animatedAvatar; + + member.flags = userData.flags; + member.premiumType = userData.premiumType; + member.publicFlags = userData.publicFlags; await cacheHandlers.set("members", snowflakeToBigint(userData.id), member); diff --git a/src/structures/member.ts b/src/structures/member.ts index f839caa10..d83f6ca4f 100644 --- a/src/structures/member.ts +++ b/src/structures/member.ts @@ -16,7 +16,7 @@ import type { DiscordImageSize } from "../types/misc/image_size.ts"; import type { User } from "../types/users/user.ts"; import { snowflakeToBigint } from "../util/bigint.ts"; import { Collection } from "../util/collection.ts"; -import { iconHashToBigInt } from "../util/hash.ts"; +import { iconBigintToHash, iconHashToBigInt } from "../util/hash.ts"; import { createNewProp } from "../util/utils.ts"; import { DiscordenoGuild } from "./guild.ts"; @@ -106,7 +106,7 @@ const baseMember: Partial = { id: this.id?.toString(), username: this.username, discriminator: this.discriminator?.toString(), - avatar: this.avatar, + avatar: this.avatar ? iconBigintToHash(this.avatar) : undefined, bot: this.bot, system: this.system, mfaEnabled: this.mfaEnabled, @@ -186,11 +186,13 @@ export async function createDiscordenoMember( return member; } -export interface DiscordenoMember extends Omit { +export interface DiscordenoMember extends Omit { /** The user's id */ id: bigint; /** The user's 4-digit discord-tag */ discriminator: bigint; + /** The avatar in bigint format. */ + avatar: bigint; /** The guild related data mapped by guild id */ guilds: Collection< bigint, diff --git a/src/structures/message.ts b/src/structures/message.ts index 3c28da6fe..9a6922a82 100644 --- a/src/structures/message.ts +++ b/src/structures/message.ts @@ -16,6 +16,7 @@ import type { EditMessage } from "../types/messages/edit_message.ts"; import type { Message } from "../types/messages/message.ts"; import { bigintToSnowflake, snowflakeToBigint } from "../util/bigint.ts"; import { CHANNEL_MENTION_REGEX } from "../util/constants.ts"; +import { iconBigintToHash } from "../util/hash.ts"; import { createNewProp } from "../util/utils.ts"; import { DiscordenoChannel } from "./channel.ts"; import { DiscordenoGuild } from "./guild.ts"; @@ -152,7 +153,7 @@ const baseMessage: Partial = { id: this.authorId?.toString(), username: this.tag?.substring(0, this.tag.length - 5), discriminator: this.tag?.substring(this.tag.length - 4), - avatar: this.member?.avatar, + avatar: this.member?.avatar ? iconBigintToHash(this.member.avatar) : undefined, bot: this.member?.bot, system: this.member?.system, mfaEnabled: this.member?.mfaEnabled,