@zikeji/hypixel
Version:
With IntelliSense support & test coverage, this is an unopinionated async/await API wrapper for Hypixel's Public API. It is developed in TypeScript complete with documentation, typed interfaces for all API responses, built-in rate-limit handling, flexible
82 lines (78 loc) • 2.59 kB
text/typescript
import type { ResourcesSkyblockSkillsResponse } from "../types/AugmentedTypes";
import type { SkyBlockProfileMember } from "../types/Augmented/SkyBlock/ProfileMember";
export interface SkyBlockSkillsInfo {
FARMING: SkyBlockSkillInfo;
MINING: SkyBlockSkillInfo;
COMBAT: SkyBlockSkillInfo;
/**
* As official API support does not exist for this skill, this will always return level 0.
*/
DUNGEONEERING: SkyBlockSkillInfo;
FORAGING: SkyBlockSkillInfo;
FISHING: SkyBlockSkillInfo;
ENCHANTING: SkyBlockSkillInfo;
ALCHEMY: SkyBlockSkillInfo;
CARPENTRY: SkyBlockSkillInfo;
RUNECRAFTING: SkyBlockSkillInfo;
/**
* As official API support does not exist for this skill, this will always return level 0.
*/
SOCIAL: SkyBlockSkillInfo;
TAMING: SkyBlockSkillInfo;
[key: string]: SkyBlockSkillInfo;
}
export interface SkyBlockSkillInfo {
name: string;
description: string;
level: number;
exp: number;
totalExpToLevel: number;
expToNextLevel: number;
maxLevel: number;
}
/**
* This helper takes a profile member and converts raw skill EXP to skill levels using the skills resources. Returns false is none of the profile member does not have their skills API enabled.
* @param profileMember The SkyBlock profile member object you want to check.
* @param skills The skills resource object.
* @category Helper
*/
export function getSkyBlockProfileMemberSkills(
profileMember: SkyBlockProfileMember,
skills: ResourcesSkyblockSkillsResponse["skills"]
): SkyBlockSkillsInfo | false {
if (!profileMember.player_data?.experience) {
return false;
}
const result = {} as SkyBlockSkillsInfo;
for (let i = 0; i < Object.keys(skills).length; i += 1) {
const skillName = Object.keys(skills)[i];
const skillKey = `SKILL_${skillName}`;
const skill = skills[skillName];
let exp = 0;
if (skillKey in profileMember.player_data.experience) {
exp = profileMember.player_data.experience[skillKey] as number;
}
let level = 0;
let totalExpToLevel = 0;
let expToNextLevel = 0;
for (let ii = 0; ii < skill.levels.length; ii += 1) {
const levelInfo = skill.levels[ii];
if (levelInfo.totalExpRequired > exp) {
expToNextLevel = levelInfo.totalExpRequired - exp;
break;
}
level = levelInfo.level;
totalExpToLevel = levelInfo.totalExpRequired;
}
result[skillName] = {
name: skill.name,
description: skill.description,
level,
exp,
totalExpToLevel,
expToNextLevel,
maxLevel: skill.maxLevel,
};
}
return result;
}