InvestWeb/lib/BTTVAPI.ts

59 lines
1.4 KiB
TypeScript
Raw Normal View History

2023-01-21 05:36:29 -05:00
import type RedisInstance from "ioredis";
async function applyCache(
redis: RedisInstance,
key: string,
query: string,
cacheTime: number
) {
if (await redis.get(key)) {
return JSON.parse((await redis.get(key)) as string);
} else {
const response = await fetchEndpoint(redis, query);
if (response != null) {
await redis.set(key, JSON.stringify(response), "EX", cacheTime);
}
return response;
}
}
async function fetchEndpoint(redis: RedisInstance, query: string) {
if (await redis.get("BTTV.RATE_LIMIT")) {
await new Promise((resolve) => setTimeout(resolve, 1000));
} else {
await redis.set("BTTV.RATE_LIMIT", "1", "EX", 1);
}
const requestHeaders = new Headers();
requestHeaders.append("Content-Type", "application/json");
requestHeaders.append("User-Agent", "toffee-web/indev");
const response = await fetch(query, {
headers: requestHeaders,
});
const json = await response.json();
return json;
}
async function getGlobalEmotes(redis: RedisInstance) {
return await applyCache(
redis,
"BTTV.GLOBAL_EMOTES",
"https://api.betterttv.net/3/cached/emotes/global",
3600
);
}
async function getUserByID(redis: RedisInstance, channelID: string) {
return await applyCache(
redis,
`BTTV.CHANNEL_EMOTES.${channelID}`,
`https://api.betterttv.net/3/cached/users/twitch/${channelID}`,
3600
);
}
export { getGlobalEmotes, getUserByID };