aboutsummaryrefslogtreecommitdiff
path: root/build/constants.js
diff options
context:
space:
mode:
Diffstat (limited to 'build/constants.js')
-rw-r--r--build/constants.js226
1 files changed, 0 insertions, 226 deletions
diff --git a/build/constants.js b/build/constants.js
deleted file mode 100644
index 7dcb210..0000000
--- a/build/constants.js
+++ /dev/null
@@ -1,226 +0,0 @@
-/**
- * Fetch and edit constants from the skyblock-constants repo
- */
-// we have to do this so we can mock the function from the tests properly
-import * as constants from './constants.js';
-import NodeCache from 'node-cache';
-import { debug } from './index.js';
-import Queue from 'queue-promise';
-import fetch from 'node-fetch';
-import { Agent } from 'https';
-const httpsAgent = new Agent({
- keepAlive: true
-});
-const githubApiBase = 'https://api.github.com';
-const owner = 'skyblockstats';
-const repo = 'skyblock-constants';
-// we use a queue for editing so it always utilizes the cache if possible, and to avoid hitting the github rateimit
-const queue = new Queue({
- concurrent: 1,
- interval: 10
-});
-/**
- * Send a request to the GitHub API
- * @param method The HTTP method, for example GET, PUT, POST, etc
- * @param route The route to send the request to
- * @param headers The extra headers
- * @param json The JSON body, only applicable for some types of methods
- */
-async function fetchGithubApi(method, route, headers, json) {
- try {
- if (debug)
- console.debug('fetching github api', method, route);
- const data = await fetch(githubApiBase + route, {
- agent: () => httpsAgent,
- body: json ? JSON.stringify(json) : undefined,
- method,
- headers: Object.assign({
- 'Authorization': `token ${process.env.github_token}`
- }, headers),
- });
- if (debug)
- console.debug('fetched github api', method, route);
- return data;
- }
- catch {
- // if there's an error, wait a second and try again
- await new Promise((resolve) => setTimeout(resolve, 1000));
- return await fetchGithubApi(method, route, headers, json);
- }
-}
-// cache files for an hour
-const fileCache = new NodeCache({
- stdTTL: 60 * 60,
- checkperiod: 60,
- useClones: false,
-});
-/**
- * Fetch a file from skyblock-constants
- * @param path The file path, for example stats.json
- */
-function fetchFile(path) {
- return new Promise(resolve => {
- queue.enqueue(async () => {
- if (fileCache.has(path))
- return resolve(fileCache.get(path));
- const r = await fetchGithubApi('GET', `/repos/${owner}/${repo}/contents/${path}`, {
- 'Accept': 'application/vnd.github.v3+json',
- });
- const data = await r.json();
- const file = {
- path: data.path,
- content: Buffer.from(data.content, data.encoding).toString(),
- sha: data.sha
- };
- fileCache.set(path, file);
- resolve(file);
- });
- });
-}
-/**
- * Edit a file on skyblock-constants
- * @param file The GithubFile you got from fetchFile
- * @param message The commit message
- * @param newContent The new content in the file
- */
-async function editFile(file, message, newContent) {
- const r = await fetchGithubApi('PUT', `/repos/${owner}/${repo}/contents/${file.path}`, { 'Content-Type': 'application/json' }, {
- message: message,
- content: Buffer.from(newContent).toString('base64'),
- sha: file.sha,
- branch: 'main'
- });
- const data = await r.json();
- fileCache.set(file.path, {
- path: data.content.path,
- content: newContent,
- sha: data.content.sha
- });
-}
-export let fetchJSONConstant = async function fetchJSONConstant(filename) {
- const file = await fetchFile(filename);
- try {
- return JSON.parse(file.content);
- }
- catch {
- // probably invalid json, return an empty array
- return [];
- }
-};
-/** Add stats to skyblock-constants. This has caching so it's fine to call many times */
-export let addJSONConstants = async function addJSONConstants(filename, addingValues, unit = 'stat') {
- if (addingValues.length === 0)
- return; // no stats provided, just return
- let file = await fetchFile(filename);
- if (!file.path)
- return;
- let oldStats;
- try {
- oldStats = JSON.parse(file.content);
- }
- catch {
- // invalid json, set it as an empty array
- oldStats = [];
- }
- const updatedStats = oldStats
- .concat(addingValues)
- // remove duplicates
- .filter((value, index, array) => array.indexOf(value) === index)
- .sort((a, b) => a.localeCompare(b));
- const newStats = updatedStats.filter(value => !oldStats.includes(value));
- // there's not actually any new stats, just return
- if (newStats.length === 0)
- return;
- const commitMessage = newStats.length >= 2 ? `Add ${newStats.length} new ${unit}s` : `Add '${newStats[0]}' ${unit}`;
- try {
- await editFile(file, commitMessage, JSON.stringify(updatedStats, null, 2));
- }
- catch {
- // the file probably changed or something, try again
- file = await fetchFile(filename);
- await editFile(file, commitMessage, JSON.stringify(updatedStats, null, 2));
- }
-};
-/** Fetch all the known SkyBlock stats as an array of strings */
-export async function fetchStats() {
- return await constants.fetchJSONConstant('stats.json');
-}
-/** Add stats to skyblock-constants. This has caching so it's fine to call many times */
-export async function addStats(addingStats) {
- await constants.addJSONConstants('stats.json', addingStats, 'stat');
-}
-/** Fetch all the known SkyBlock collections as an array of strings */
-export async function fetchCollections() {
- return await constants.fetchJSONConstant('collections.json');
-}
-/** Add collections to skyblock-constants. This has caching so it's fine to call many times */
-export async function addCollections(addingCollections) {
- await constants.addJSONConstants('collections.json', addingCollections, 'collection');
-}
-/** Fetch all the known SkyBlock collections as an array of strings */
-export async function fetchSkills() {
- return await constants.fetchJSONConstant('skills.json');
-}
-/** Add skills to skyblock-constants. This has caching so it's fine to call many times */
-export async function addSkills(addingSkills) {
- await constants.addJSONConstants('skills.json', addingSkills, 'skill');
-}
-/** Fetch all the known SkyBlock collections as an array of strings */
-export async function fetchZones() {
- return await constants.fetchJSONConstant('zones.json');
-}
-/** Add skills to skyblock-constants. This has caching so it's fine to call many times */
-export async function addZones(addingZones) {
- await constants.addJSONConstants('zones.json', addingZones, 'zone');
-}
-/** Fetch all the known SkyBlock slayer names as an array of strings */
-export async function fetchSlayers() {
- return await constants.fetchJSONConstant('slayers.json');
-}
-/** Add skills to skyblock-constants. This has caching so it's fine to call many times */
-export async function addSlayers(addingSlayers) {
- await constants.addJSONConstants('slayers.json', addingSlayers, 'slayer');
-}
-/** Fetch all the known SkyBlock slayer names as an array of strings */
-export async function fetchMinions() {
- return await constants.fetchJSONConstant('minions.json');
-}
-export async function fetchSkillXp() {
- return await constants.fetchJSONConstant('manual/skill_xp.json');
-}
-export async function fetchSkillXpEasier() {
- return await constants.fetchJSONConstant('manual/skill_xp_easier.json');
-}
-/** Add skills to skyblock-constants. This has caching so it's fine to call many times */
-export async function addMinions(addingMinions) {
- await constants.addJSONConstants('minions.json', addingMinions, 'minion');
-}
-export async function fetchConstantValues() {
- return await constants.fetchJSONConstant('values.json');
-}
-export async function setConstantValues(newValues) {
- let file = await fetchFile('values.json');
- if (!file.path)
- return;
- let oldValues;
- try {
- oldValues = JSON.parse(file.content);
- }
- catch {
- // invalid json, set it as an empty array
- oldValues = {};
- }
- const updatedStats = { ...oldValues, ...newValues };
- // there's not actually any new stats, just return
- // TODO: optimize this? might be fine already though, idk
- if (JSON.stringify(updatedStats) === JSON.stringify(oldValues))
- return;
- const commitMessage = 'Update values';
- try {
- await editFile(file, commitMessage, JSON.stringify(updatedStats, null, 2));
- }
- catch { }
-}
-// this is necessary for mocking in the tests because es6
-export function mockAddJSONConstants($value) { addJSONConstants = $value; }
-export function mockFetchJSONConstant($value) { fetchJSONConstant = $value; }