Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NEU #60

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft

NEU #60

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/Client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@
import Updater from './Private/Updater';
import Errors from './Errors';
import API from './API';
import NEURepo from './Private/NEU-REPO';

const clients: Client[] = [];

Check warning on line 10 in src/Client.ts

View workflow job for this annotation

GitHub Actions / check linting (eslint)

'Client' was used before it was defined

class Client {
declare options: ClientOptions;
Expand All @@ -15,8 +16,10 @@
declare updater: Updater;
declare errors: Errors;
declare rateLimit: RateLimit;
declare NEU: NEURepo;
readonly key: string;
declare interval: NodeJS.Timeout;

constructor(key: string, options?: ClientOptions) {
this.key = key;
this.errors = new Errors();
Expand All @@ -27,6 +30,7 @@
this.updater = new Updater(this);
this.rateLimit = new RateLimit(this);
if ('NONE' !== this.options.rateLimit) this.rateLimit.initialize();
this.NEU = new NEURepo(this);
for (const func in API) {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-expect-error
Expand Down
141 changes: 141 additions & 0 deletions src/Private/NEU-REPO.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
/* eslint-disable camelcase */
import { decolorizeString } from '../utils/decolorize';
import Client from '../Client';

export interface NEUBestiaryData {
brackets: { [key: number]: number[] };
dynamic: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] };
hub: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] };
farming_1: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] };
combat_1: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] };
combat_3: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] };
crimson_isle: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] };
mining_2: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] };
mining_3: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] };
crystal_hollows: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] };
foraging_1: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] };
spooky_festival: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] };
mythological_creatures: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] };
jerry: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] };
kuudra: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] };
catacombs: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] };
garden: { name: string; mobs: { name: string; cap: number; mobs: string[]; bracket: number }[] };
}

class NEURepo {
readonly client: Client;
constructor(client: Client) {
this.client = client;
}

async getBestiary(): Promise<NEUBestiaryData> {
const res = await this.client.requests.fetchExternalData(
'https://raw.githubusercontent.com/NotEnoughUpdates/NotEnoughUpdates-REPO/master/constants/bestiary.json'
);
const data: NEUBestiaryData = {
brackets: {},
dynamic: { name: 'Private Island', mobs: [] },
hub: { name: 'Hub', mobs: [] },
farming_1: { name: 'The Farming Islands', mobs: [] },
combat_1: { name: 'Spiders Den', mobs: [] },
combat_3: { name: 'The End', mobs: [] },
crimson_isle: { name: 'Crimson Isle', mobs: [] },
mining_2: { name: 'Deep Caverns', mobs: [] },
mining_3: { name: 'Dwarven Mines', mobs: [] },
crystal_hollows: { name: 'Crystal Hollows', mobs: [] },
foraging_1: { name: 'The Park', mobs: [] },
spooky_festival: { name: 'Spooky Festival', mobs: [] },
mythological_creatures: { name: 'Mythological Creatures', mobs: [] },
jerry: { name: 'Jerry', mobs: [] },
kuudra: { name: 'Kuudra', mobs: [] },
catacombs: { name: 'Catacombs', mobs: [] },
garden: { name: 'Garden', mobs: [] }
};
Object.keys(res.data.brackets).forEach((key) => {
data.brackets[Number(key)] = res.data.brackets[key];
});
res.data.dynamic.mobs.forEach((mob: string | number) => {
const mobInfo = res.data.dynamic.mobs[mob];
mobInfo.name = decolorizeString(mobInfo.name);
data.dynamic.mobs.push(mobInfo);
});
res.data.hub.mobs.forEach((mob: string | number) => {
const mobInfo = res.data.hub.mobs[mob];
mobInfo.name = decolorizeString(mobInfo.name);
data.hub.mobs.push(mobInfo);
});
res.data.farming_1.mobs.forEach((mob: string | number) => {
const mobInfo = res.data.farming_1.mobs[mob];
mobInfo.name = decolorizeString(mobInfo.name);
data.farming_1.mobs.push(mobInfo);
});
res.data.combat_1.mobs.forEach((mob: string | number) => {
const mobInfo = res.data.combat_1.mobs[mob];
mobInfo.name = decolorizeString(mobInfo.name);
data.combat_1.mobs.push(mobInfo);
});
res.data.combat_3.mobs.forEach((mob: string | number) => {
const mobInfo = res.data.combat_3.mobs[mob];
mobInfo.name = decolorizeString(mobInfo.name);
data.combat_3.mobs.push(mobInfo);
});
res.data.crimson_isle.mobs.forEach((mob: string | number) => {
const mobInfo = res.data.crimson_isle.mobs[mob];
mobInfo.name = decolorizeString(mobInfo.name);
data.crimson_isle.mobs.push(mobInfo);
});
res.data.mining_2.mobs.forEach((mob: string | number) => {
const mobInfo = res.data.mining_2.mobs[mob];
mobInfo.name = decolorizeString(mobInfo.name);
data.mining_2.mobs.push(mobInfo);
});
res.data.mining_3.mobs.forEach((mob: string | number) => {
const mobInfo = res.data.mining_3.mobs[mob];
mobInfo.name = decolorizeString(mobInfo.name);
data.mining_3.mobs.push(mobInfo);
});
res.data.crystal_hollows.mobs.forEach((mob: string | number) => {
const mobInfo = res.data.crystal_hollows.mobs[mob];
mobInfo.name = decolorizeString(mobInfo.name);
data.crystal_hollows.mobs.push(mobInfo);
});
res.data.foraging_1.mobs.forEach((mob: string | number) => {
const mobInfo = res.data.foraging_1.mobs[mob];
mobInfo.name = decolorizeString(mobInfo.name);
data.foraging_1.mobs.push(mobInfo);
});
res.data.spooky_festival.mobs.forEach((mob: string | number) => {
const mobInfo = res.data.spooky_festival.mobs[mob];
mobInfo.name = decolorizeString(mobInfo.name);
data.spooky_festival.mobs.push(mobInfo);
});
res.data.mythological_creatures.mobs.forEach((mob: string | number) => {
const mobInfo = res.data.mythological_creatures.mobs[mob];
mobInfo.name = decolorizeString(mobInfo.name);
data.mythological_creatures.mobs.push(mobInfo);
});
res.data.jerry.mobs.forEach((mob: string | number) => {
const mobInfo = res.data.jerry.mobs[mob];
mobInfo.name = decolorizeString(mobInfo.name);
data.jerry.mobs.push(mobInfo);
});
res.data.kuudra.mobs.forEach((mob: string | number) => {
const mobInfo = res.data.kuudra.mobs[mob];
mobInfo.name = decolorizeString(mobInfo.name);
data.kuudra.mobs.push(mobInfo);
});
res.data.catacombs.mobs.forEach((mob: string | number) => {
const mobInfo = res.data.catacombs.mobs[mob];
mobInfo.name = decolorizeString(mobInfo.name);
data.catacombs.mobs.push(mobInfo);
});
res.data.garden.mobs.forEach((mob: string | number) => {
const mobInfo = res.data.garden.mobs[mob];
mobInfo.name = decolorizeString(mobInfo.name);
data.garden.mobs.push(mobInfo);
});
return data;
}
}

export default NEURepo;
48 changes: 46 additions & 2 deletions src/Private/Requests.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const BASE_URL = 'https://api.hypixel.net/v2';
const BASE_URL = 'http://localhost:3000/hypixel/v2';
import isUUID from '../utils/isUUID';
import Client from '../Client';
import axios from 'axios';
Expand Down Expand Up @@ -93,7 +93,7 @@ class Requests {
if (!input) throw new Error(this.client.errors.NO_NICKNAME_UUID);
if ('string' !== typeof input) throw new Error(this.client.errors.UUID_NICKNAME_MUST_BE_A_STRING);
if (isUUID(input)) return input.replace(/-/g, '');
const url = `https://mowojang.matdoes.dev/${input}`;
const url = `http://localhost:3000/uuid/${input}`;
if (this.client.cacheHandler.has(url)) {
return this.client.cacheHandler.get(url);
}
Expand Down Expand Up @@ -123,6 +123,50 @@ class Requests {
}
return parsedRes.id;
}

async fetchExternalData(url: string, options?: RequestOptions): Promise<RequestData> {
options = { raw: options?.raw ?? false, noCache: options?.noCache ?? false };
if (this.client.cacheHandler.has(url)) {
const data = this.client.cacheHandler.get(url);
return new RequestData(data.data, data.headers, {
status: 200,
options,
url: url,
cached: true,
timestamp: data.timestamp
});
}
const res = await axios.get(url);
if (500 <= res.status && 528 > res.status) {
throw new Error(
this.client.errors.ERROR_STATUSTEXT.replace(/{statustext}/, `Server Error : ${res.status} ${res.statusText}`)
);
}
const parsedRes = await res.data;
if (400 === res.status) {
throw new Error(
this.client.errors.ERROR_CODE_CAUSE.replace(/{code}/, '400 Bad Request').replace(
/{cause}/,
parsedRes.cause || ''
)
);
}
if (422 === res.status) throw new Error(this.client.errors.UNEXPECTED_ERROR);
if (200 !== res.status) {
throw new Error(this.client.errors.ERROR_STATUSTEXT.replace(/{statustext}/, res.statusText));
}
const requestData = new RequestData(parsedRes, res.headers, {
status: res.status,
options,
url: url,
cached: false
});
if (options.noCache) return requestData;
if (this.client.options.cache && !options.raw) {
this.client.cacheHandler.set(url, requestData);
}
return requestData;
}
}

export default Requests;
2 changes: 1 addition & 1 deletion src/Private/Updater.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class Updater {
}

async getLatestVersion(): Promise<string> {
const request = await axios.get('https://registry.npmjs.org/hypixel-api-reborn');
const request = await axios.get('https://localhost:3000/npm/hypixel-api-reborn');
if (200 !== request.status) throw new Error(this.client.errors.UPDATER_REQUEST_NOT_OK);
return request.data['dist-tags'].latest;
}
Expand Down
Loading
Loading