aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/constants.ts3
-rw-r--r--src/database.ts75
-rw-r--r--src/hypixel.ts3
-rw-r--r--src/hypixelApi.ts10
-rw-r--r--src/hypixelCached.ts4
-rw-r--r--src/mojang.ts8
6 files changed, 59 insertions, 44 deletions
diff --git a/src/constants.ts b/src/constants.ts
index 3cc77d2..27f413b 100644
--- a/src/constants.ts
+++ b/src/constants.ts
@@ -8,6 +8,7 @@ import * as constants from './constants.js'
import * as nodeFetch from 'node-fetch'
import NodeCache from 'node-cache'
import { debug } from './index.js'
+import { sleep } from './util.js'
import Queue from 'queue-promise'
import fetch from 'node-fetch'
import { Agent } from 'https'
@@ -51,7 +52,7 @@ async function fetchGithubApi(method: string, route: string, headers?: any, json
return data
} catch {
// if there's an error, wait a second and try again
- await new Promise((resolve) => setTimeout(resolve, 1000))
+ await sleep(1000)
return await fetchGithubApi(method, route, headers, json)
}
}
diff --git a/src/database.ts b/src/database.ts
index 571ec5e..e195eed 100644
--- a/src/database.ts
+++ b/src/database.ts
@@ -313,21 +313,28 @@ async function fetchMemberLeaderboardRaw(name: string): Promise<memberRawLeaderb
sortQuery[`stats.${name}`] = isLeaderboardReversed(name) ? 1 : -1
fetchingRawLeaderboardNames.add(name)
- const leaderboardRaw: memberRawLeaderboardItem[] = (await memberLeaderboardsCollection
- .find(query)
- .sort(sortQuery)
- .limit(leaderboardMax)
- .toArray())
- .map((i: DatabaseMemberLeaderboardItem): memberRawLeaderboardItem => {
- return {
- profile: i.profile,
- uuid: i.uuid,
- value: i.stats[name]
- }
- })
- fetchingRawLeaderboardNames.delete(name)
- cachedRawLeaderboards.set(name, leaderboardRaw)
- return leaderboardRaw
+
+ try {
+ const leaderboardRaw: memberRawLeaderboardItem[] = (await memberLeaderboardsCollection
+ .find(query)
+ .sort(sortQuery)
+ .limit(leaderboardMax)
+ .toArray())
+ .map((i: DatabaseMemberLeaderboardItem): memberRawLeaderboardItem => {
+ return {
+ profile: i.profile,
+ uuid: i.uuid,
+ value: i.stats[name]
+ }
+ })
+ fetchingRawLeaderboardNames.delete(name)
+ cachedRawLeaderboards.set(name, leaderboardRaw)
+ return leaderboardRaw
+ } catch (e) {
+ // if it fails while fetching, remove it from fetchingRawLeaderboardNames
+ fetchingRawLeaderboardNames.delete(name)
+ throw e
+ }
}
async function fetchProfileLeaderboardRaw(name: string): Promise<profileRawLeaderboardItem[]> {
@@ -351,22 +358,28 @@ async function fetchProfileLeaderboardRaw(name: string): Promise<profileRawLeade
sortQuery[`stats.${name}`] = isLeaderboardReversed(name) ? 1 : -1
fetchingRawLeaderboardNames.add(name)
- const leaderboardRaw: profileRawLeaderboardItem[] = (await profileLeaderboardsCollection
- .find(query)
- .sort(sortQuery)
- .limit(leaderboardMax)
- .toArray())
- .map((i: DatabaseProfileLeaderboardItem): profileRawLeaderboardItem => {
- return {
- players: i.players,
- uuid: i.uuid,
- value: i.stats[name]
- }
- })
- fetchingRawLeaderboardNames.delete(name)
-
- cachedRawLeaderboards.set(name, leaderboardRaw)
- return leaderboardRaw
+ try {
+ const leaderboardRaw: profileRawLeaderboardItem[] = (await profileLeaderboardsCollection
+ .find(query)
+ .sort(sortQuery)
+ .limit(leaderboardMax)
+ .toArray())
+ .map((i: DatabaseProfileLeaderboardItem): profileRawLeaderboardItem => {
+ return {
+ players: i.players,
+ uuid: i.uuid,
+ value: i.stats[name]
+ }
+ })
+ fetchingRawLeaderboardNames.delete(name)
+
+ cachedRawLeaderboards.set(name, leaderboardRaw)
+ return leaderboardRaw
+ } catch (e) {
+ // if it fails while fetching, remove it from fetchingRawLeaderboardNames
+ fetchingRawLeaderboardNames.delete(name)
+ throw e
+ }
}
interface MemberLeaderboard {
diff --git a/src/hypixel.ts b/src/hypixel.ts
index dd9d91d..745e036 100644
--- a/src/hypixel.ts
+++ b/src/hypixel.ts
@@ -22,6 +22,7 @@ import { cleanSkyblockProfilesResponse } from './cleaners/skyblock/profiles.js'
import { CleanPlayer, cleanPlayerResponse } from './cleaners/player.js'
import * as cached from './hypixelCached.js'
import { debug } from './index.js'
+import { sleep } from './util.js'
import { WithId } from 'mongodb'
export type Included = 'profiles' | 'player' | 'stats' | 'inventories' | undefined
@@ -48,7 +49,7 @@ export async function sendCleanApiRequest({ path, args }, included?: Included[],
const rawResponse = await sendApiRequest({ path, key, args })
if (rawResponse.throttled) {
// if it's throttled, wait a second and try again
- await new Promise(resolve => setTimeout(resolve, 1000))
+ await sleep(1000)
return await sendCleanApiRequest({ path, args }, included, options)
}
// clean the response
diff --git a/src/hypixelApi.ts b/src/hypixelApi.ts
index 7b6a4a8..13866f9 100644
--- a/src/hypixelApi.ts
+++ b/src/hypixelApi.ts
@@ -1,9 +1,9 @@
/**
* Fetch the raw Hypixel API
*/
-import fetch from 'node-fetch'
+import { jsonToQuery, shuffle, sleep } from './util.js'
import * as nodeFetch from 'node-fetch'
-import { jsonToQuery, shuffle } from './util.js'
+import fetch from 'node-fetch'
import { Agent } from 'https'
if (!process.env.hypixel_keys)
@@ -167,13 +167,13 @@ export let sendApiRequest = async function sendApiRequest({ path, key, args }):
fetchJsonParsed = await fetchResponse.json()
} catch {
// if there's an error, wait a second and try again
- await new Promise((resolve) => setTimeout(resolve, 1000))
+ await sleep(1000)
return await sendApiRequest({ path, key, args })
}
// bruh
if (fetchJsonParsed.cause === 'This endpoint is currently disabled') {
- await new Promise((resolve) => setTimeout(resolve, 30000))
+ await sleep(30000)
return await sendApiRequest({ path, key, args })
}
@@ -204,7 +204,7 @@ export let sendApiRequest = async function sendApiRequest({ path, key, args }):
if (apiKeyUsage[key])
apiKeyUsage[key].remaining = 0
// if it's throttled, wait 10 seconds and try again
- await new Promise((resolve) => setTimeout(resolve, 10000))
+ await sleep(10000)
return await sendApiRequest({ path, key, args })
}
return fetchJsonParsed
diff --git a/src/hypixelCached.ts b/src/hypixelCached.ts
index d5b6628..b49a190 100644
--- a/src/hypixelCached.ts
+++ b/src/hypixelCached.ts
@@ -3,8 +3,8 @@
*/
import { CleanProfile, CleanFullProfile, CleanBasicProfile } from './cleaners/skyblock/profile.js'
+import { isUuid, sleep, undashUuid } from './util.js'
import { CleanPlayer } from './cleaners/player.js'
-import { isUuid, undashUuid } from './util.js'
import * as hypixel from './hypixel.js'
import * as mojang from './mojang.js'
import NodeCache from 'node-cache'
@@ -166,7 +166,7 @@ export async function fetchPlayer(user: string): Promise<CleanPlayer | null> {
// if it's already in the process of fetching, check every 100ms until it's not fetching the player anymore and fetch it again, since it'll be cached now
if (fetchingPlayers.has(playerUuid)) {
while (fetchingPlayers.has(playerUuid)) {
- await new Promise(resolve => setTimeout(resolve, 100))
+ await sleep(100)
}
return await fetchPlayer(user)
}
diff --git a/src/mojang.ts b/src/mojang.ts
index 9b224d6..0ad22ab 100644
--- a/src/mojang.ts
+++ b/src/mojang.ts
@@ -2,7 +2,7 @@
* Fetch the Mojang username API through api.ashcon.app
*/
-import { isUuid, undashUuid } from './util.js'
+import { isUuid, sleep, undashUuid } from './util.js'
import * as nodeFetch from 'node-fetch'
import fetch from 'node-fetch'
import { Agent } from 'https'
@@ -32,7 +32,7 @@ export let profileFromUuid = async function profileFromUuid(uuid: string): Promi
)
} catch {
// if there's an error, wait a second and try again
- await new Promise((resolve) => setTimeout(resolve, 1000))
+ await sleep(1000)
return await profileFromUuid(uuid)
}
@@ -68,7 +68,7 @@ export let profileFromUsername = async function profileFromUsername(username: st
)
} catch {
// if there's an error, wait a second and try again
- await new Promise((resolve) => setTimeout(resolve, 1000))
+ await sleep(1000)
return await profileFromUsername(username)
}
@@ -100,7 +100,7 @@ export async function profileFromUsernameAlternative(username: string): Promise<
)
} catch {
// if there's an error, wait a second and try again
- await new Promise((resolve) => setTimeout(resolve, 1000))
+ await sleep(1000)
return await profileFromUsernameAlternative(username)
}