seyfert/src/api/Router.ts
Xeno 00640bfda7
feat: new changes to avatarURL method over GuildMember & User (#194)
* fix(GuildMember#avatarURL): use dynamic response, to return gif avatar if the avatar is a gif

* fix(User#avatarURL): dynamic response, if avatar is a gif return gif

* fix(avatarURL): specified extension is being overriden by gif if avatar starts with a_

* chore: change in parseCDNURL so it's effective for almost everything

* chore: re-add GuildMember#dynamicAvatarURL

* fix(GuildEmoji#create): returns void while it should return the resolve promise of the created emoji

---------

Co-authored-by: NotAditya69 <90441096+NotAditya69@users.noreply.github.com>
2024-05-30 15:17:59 -04:00

84 lines
2.3 KiB
TypeScript

import { CDN_URL } from '../common';
import type { APIRoutes, ApiHandler, CDNRoute } from './index';
import type { HttpMethods, ImageExtension, ImageSize, StickerExtension } from './shared';
export enum ProxyRequestMethod {
Delete = 'delete',
Get = 'get',
Patch = 'patch',
Post = 'post',
Put = 'put',
}
const ArrRequestsMethods = Object.freeze(Object.values(ProxyRequestMethod)) as string[];
export class Router {
noop = () => {
return;
};
constructor(private rest: ApiHandler) {}
createProxy(route = [] as string[]): APIRoutes {
return new Proxy(this.noop, {
get: (_, key: string) => {
if (ArrRequestsMethods.includes(key)) {
return (...options: any[]) =>
this.rest.request(key.toUpperCase() as HttpMethods, `/${route.join('/')}`, ...options);
}
return this.createProxy([...route, key]);
},
apply: (...[, _, args]) => {
return this.createProxy([...route, ...args]);
},
}) as unknown as APIRoutes;
}
}
export const CDNRouter = {
createProxy(route = [] as string[]): CDNRoute {
const noop = () => {
return;
};
return new Proxy(noop, {
get: (_, key: string) => {
if (key === 'get') {
return (value: string | CDNUrlOptions | undefined, options?: CDNUrlOptions) => {
const lastRoute = `${CDN_URL}/${route.join('/')}`;
let routeResult = lastRoute;
if (typeof value === 'string') {
routeResult = `${lastRoute}${value ? `/${value}` : ''}`;
return parseCDNURL(routeResult, options);
}
return parseCDNURL(routeResult, value);
};
}
return this.createProxy([...route, key]);
},
apply: (...[, _, args]) => {
return this.createProxy([...route, ...args]);
},
}) as unknown as CDNRoute;
},
};
export interface BaseCDNUrlOptions {
extension?: ImageExtension | StickerExtension | undefined;
size?: ImageSize;
}
export interface CDNUrlOptions extends BaseCDNUrlOptions {
forceStatic?: boolean;
}
export function parseCDNURL(route: string, options: CDNUrlOptions = {}) {
if (options.forceStatic && route.includes('a_')) options.extension = 'png';
if (!options.extension && route.includes('a_')) options.extension = 'gif';
const url = new URL(`${route}.${options.extension || 'png'}`);
if (options.size) url.searchParams.set('size', `${options.size}`);
return url.toString();
}