mirror of
https://github.com/tiramisulabs/seyfert.git
synced 2025-07-01 20:46:08 +00:00
refactor: optimize the resolveColor function for better perfomance (#273)
* refactor: optimize the resolveColor function for better perfomance * refactor: optimize the resolveColor function even further for higher number of iterations * format: fix code formatting * just use if(lookupColor)
This commit is contained in:
parent
6412609e0e
commit
2912296d96
@ -22,28 +22,37 @@ import { type APIPartialEmoji, FormattingPatterns, GatewayIntentBits } from '../
|
|||||||
export function calculateShardId(guildId: string, shards?: number) {
|
export function calculateShardId(guildId: string, shards?: number) {
|
||||||
return Number((BigInt(guildId) >> 22n) % BigInt(shards ?? 1));
|
return Number((BigInt(guildId) >> 22n) % BigInt(shards ?? 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// It is used for resolve color for better performance
|
||||||
|
const ColorLookup: { [key: string]: number } = {
|
||||||
|
Random: -1, // Special value for random color
|
||||||
|
...EmbedColors,
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resolves the color to a numeric representation.
|
* Resolves the color to a numeric representation.
|
||||||
* @param color The color to resolve.
|
* @param color The color to resolve.
|
||||||
* @returns The numeric representation of the color.
|
* @returns The numeric representation of the color.
|
||||||
*/
|
*/
|
||||||
export function resolveColor(color: ColorResolvable): number {
|
export function resolveColor(color: ColorResolvable): number {
|
||||||
switch (typeof color) {
|
const type = typeof color;
|
||||||
case 'string': {
|
|
||||||
if (color === 'Random') return Math.floor(Math.random() * (0xffffff + 1));
|
if (type === 'number') {
|
||||||
if (color.startsWith('#')) return Number.parseInt(color.slice(1), 16);
|
if (!Number.isInteger(color) || (color as number) < 0) throw new Error(`Invalid color: ${color}`);
|
||||||
if (color in EmbedColors) return EmbedColors[color as keyof typeof EmbedColors];
|
return color as number;
|
||||||
return EmbedColors.Default;
|
|
||||||
}
|
|
||||||
case 'number':
|
|
||||||
return color;
|
|
||||||
case 'object':
|
|
||||||
if (Array.isArray(color)) return (color[0] << 16) + (color[1] << 8) + color[2];
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return color;
|
|
||||||
}
|
}
|
||||||
return color;
|
|
||||||
|
if (type === 'string') {
|
||||||
|
const lookupColor = ColorLookup[color as keyof typeof EmbedColors];
|
||||||
|
if (lookupColor) {
|
||||||
|
return lookupColor === -1 ? Math.floor(Math.random() * 0xffffff) : lookupColor;
|
||||||
|
}
|
||||||
|
return (color as string).startsWith('#') ? Number.parseInt((color as string).slice(1), 16) : EmbedColors.Default;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Array.isArray(color) && color.length >= 3
|
||||||
|
? (color[0] << 16) | (color[1] << 8) | color[2]
|
||||||
|
: EmbedColors.Default;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -320,7 +329,11 @@ export function resolvePartialEmoji(emoji: EmojiResolvable): APIPartialEmoji | u
|
|||||||
if (typeof emoji === 'string') {
|
if (typeof emoji === 'string') {
|
||||||
const groups: Partial<APIPartialEmoji> | undefined = emoji.match(FormattingPatterns.Emoji)?.groups;
|
const groups: Partial<APIPartialEmoji> | undefined = emoji.match(FormattingPatterns.Emoji)?.groups;
|
||||||
if (groups) {
|
if (groups) {
|
||||||
return { animated: !!groups.animated, name: groups.name!, id: groups.id! };
|
return {
|
||||||
|
animated: !!groups.animated,
|
||||||
|
name: groups.name!,
|
||||||
|
id: groups.id!,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
if (emoji.includes('%')) {
|
if (emoji.includes('%')) {
|
||||||
emoji = encodeURIComponent(emoji);
|
emoji = encodeURIComponent(emoji);
|
||||||
@ -342,12 +355,23 @@ export async function resolveEmoji(emoji: EmojiResolvable, cache: Cache): Promis
|
|||||||
if (typeof emoji === 'string') {
|
if (typeof emoji === 'string') {
|
||||||
if (!emoji.match(/\d{17,20}/g)) return;
|
if (!emoji.match(/\d{17,20}/g)) return;
|
||||||
const fromCache = await cache.emojis?.get(emoji);
|
const fromCache = await cache.emojis?.get(emoji);
|
||||||
return fromCache && { animated: fromCache.animated, id: fromCache.id, name: fromCache.name };
|
return (
|
||||||
|
fromCache && {
|
||||||
|
animated: fromCache.animated,
|
||||||
|
id: fromCache.id,
|
||||||
|
name: fromCache.name,
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (emoji.id) {
|
if (emoji.id) {
|
||||||
const fromCache = await cache.emojis?.get(emoji.id);
|
const fromCache = await cache.emojis?.get(emoji.id);
|
||||||
if (fromCache) return { animated: fromCache.animated, id: fromCache.id, name: fromCache.name };
|
if (fromCache)
|
||||||
|
return {
|
||||||
|
animated: fromCache.animated,
|
||||||
|
id: fromCache.id,
|
||||||
|
name: fromCache.name,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user