@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
289 lines (285 loc) • 8.18 kB
text/typescript
import type { PlayerResponse } from "../types/AugmentedTypes";
import {
MinecraftColorAsHex,
MinecraftFormatting,
} from "./MinecraftFormatting";
/** @internal */
export enum PlayerRanks {
NON_DONOR = 1,
VIP = 2,
VIP_PLUS = 3,
MVP = 4,
MVP_PLUS = 5,
SUPERSTAR = 6,
YOUTUBER = 60,
JR_HELPER = 70,
HELPER = 80,
MODERATOR = 90,
ADMIN = 100,
}
/**
* Describes the results from the {@link getPlayerRank} helper.
*/
export interface PlayerRank {
/**
* The priority of this rank as it relates to other ranks.
*/
priority: number;
/**
* Name of the rank as it appears in the data.
*/
name: string;
/**
* Cleaned up version of the name.
*/
cleanName: string;
/**
* The chat prefix with Minecraft formatting codes.
*/
prefix: string;
/**
* The chat prefix _without_ Minecraft formatting codes.
*/
cleanPrefix: string;
/**
* The Minecraft formatting color code of this rank.
*/
colorCode: MinecraftFormatting;
/**
* The hex value of the color code.
*/
colorHex: MinecraftColorAsHex;
/**
* If they have a custom color for their rank.
* **Note:** this can be set when the player isn't MVP++. If you want to use this value, be sure to check if the rank is SUPERSTAR (MVP++).
*/
customRankColor?: MinecraftFormatting;
/**
* Same as customRankColor, but the hex version of the color.
*/
customRankColorHex?: MinecraftColorAsHex;
/**
* If they have a custom color for the pluses in their rank (++).
* **Note:** this can be set when the player isn't MVP++. If you want to use this value, be sure to check if the rank is SUPERSTAR (MVP++).
*/
customPlusColor?: MinecraftFormatting;
/**
* Same as customPlusColor, but the hex version of the color.
*/
customPlusColorHex?: MinecraftColorAsHex;
/**
* Whether or not this is a staff only rank.
*/
staff: boolean;
}
/**
* Get an {@link PlayerRank} object describing the player's rank in more detail without the need to figure out how to parse it yourself.
* @param player The result of `client.player.uuid()`.
* @param onlyPackages Whether to ignore their staff / youtube rank and only get their donor rank.
* @category Helper
*/
export function getPlayerRank(
player: NonNullable<PlayerResponse["player"]>,
onlyPackages = false
): PlayerRank {
let foundRank: PlayerRanks = PlayerRanks.NON_DONOR;
if (onlyPackages) {
if (player.monthlyPackageRank) {
const rank =
PlayerRanks[player.monthlyPackageRank as keyof typeof PlayerRanks];
if (rank) {
foundRank = rank;
}
}
if (player.newPackageRank) {
const rank =
PlayerRanks[player.newPackageRank as keyof typeof PlayerRanks];
if (rank && rank > foundRank) {
foundRank = rank;
}
}
if (player.packageRank) {
const rank = PlayerRanks[player.packageRank as keyof typeof PlayerRanks];
if (rank && rank > foundRank) {
foundRank = rank;
}
}
} else if (typeof player.rank !== "undefined" && player.rank !== "NORMAL") {
const rank = PlayerRanks[player.rank as keyof typeof PlayerRanks];
if (rank) {
foundRank = rank;
} else {
return getPlayerRank(player, true);
}
} else {
return getPlayerRank(player, true);
}
let out: PlayerRank;
switch (foundRank) {
case PlayerRanks.VIP:
out = {
priority: foundRank,
name: "VIP",
cleanName: "VIP",
prefix: "§a[VIP]",
cleanPrefix: "[VIP]",
colorCode: MinecraftFormatting.GREEN,
colorHex: MinecraftColorAsHex[MinecraftFormatting.GREEN],
staff: false,
};
break;
case PlayerRanks.VIP_PLUS:
out = {
priority: foundRank,
name: "VIP_PLUS",
cleanName: "VIP+",
prefix: "§a[VIP§6+§a]",
cleanPrefix: "[VIP+]",
colorCode: MinecraftFormatting.GREEN,
colorHex: MinecraftColorAsHex[MinecraftFormatting.GREEN],
staff: false,
};
break;
case PlayerRanks.MVP:
out = {
priority: foundRank,
name: "MVP",
cleanName: "MVP",
prefix: "§b[MVP]",
cleanPrefix: "[MVP]",
colorCode: MinecraftFormatting.AQUA,
colorHex: MinecraftColorAsHex[MinecraftFormatting.AQUA],
staff: false,
};
break;
case PlayerRanks.MVP_PLUS:
out = {
priority: foundRank,
name: "MVP_PLUS",
cleanName: "MVP+",
prefix: "§b[MVP§c+§b]",
cleanPrefix: "[MVP+]",
colorCode: MinecraftFormatting.AQUA,
colorHex: MinecraftColorAsHex[MinecraftFormatting.AQUA],
staff: false,
};
break;
case PlayerRanks.SUPERSTAR:
out = {
priority: foundRank,
name: "SUPERSTAR",
cleanName: "MVP++",
prefix: "§6[MVP§c++§6]",
cleanPrefix: "[MVP++]",
colorCode: MinecraftFormatting.GOLD,
colorHex: MinecraftColorAsHex[MinecraftFormatting.GOLD],
staff: false,
};
break;
case PlayerRanks.YOUTUBER:
out = {
priority: foundRank,
name: "YOUTUBER",
cleanName: "YOUTUBER",
prefix: "§c[§fYOUTUBE§c]",
cleanPrefix: "[YOUTUBE]",
colorCode: MinecraftFormatting.RED,
colorHex: MinecraftColorAsHex[MinecraftFormatting.RED],
staff: false,
};
break;
case PlayerRanks.JR_HELPER:
out = {
priority: foundRank,
name: "JR_HELPER",
cleanName: "JR HELPER",
prefix: "§9[JR HELPER]",
cleanPrefix: "[JR HELPER]",
colorCode: MinecraftFormatting.BLUE,
colorHex: MinecraftColorAsHex[MinecraftFormatting.BLUE],
staff: true,
};
break;
case PlayerRanks.HELPER:
out = {
priority: foundRank,
name: "HELPER",
cleanName: "HELPER",
prefix: "§9[HELPER]",
cleanPrefix: "[HELPER]",
colorCode: MinecraftFormatting.BLUE,
colorHex: MinecraftColorAsHex[MinecraftFormatting.BLUE],
staff: true,
};
break;
case PlayerRanks.MODERATOR:
out = {
priority: foundRank,
name: "MODERATOR",
cleanName: "MODERATOR",
prefix: "§2[MOD]",
cleanPrefix: "[MOD]",
colorCode: MinecraftFormatting.DARK_GREEN,
colorHex: MinecraftColorAsHex[MinecraftFormatting.DARK_GREEN],
staff: true,
};
break;
case PlayerRanks.ADMIN:
out = {
priority: foundRank,
name: "ADMIN",
cleanName: "ADMIN",
prefix: "§c[ADMIN]",
cleanPrefix: "[ADMIN]",
colorCode: MinecraftFormatting.RED,
colorHex: MinecraftColorAsHex[MinecraftFormatting.RED],
staff: true,
};
break;
default:
out = {
priority: foundRank,
name: "NON_DONOR",
cleanName: "DEFAULT",
prefix: "§7",
cleanPrefix: "",
colorCode: MinecraftFormatting.GRAY,
colorHex: MinecraftColorAsHex[MinecraftFormatting.GRAY],
staff: false,
};
break;
}
if (player.monthlyRankColor || player.rankPlusColor) {
const customRankColor =
MinecraftFormatting[
player.monthlyRankColor as keyof typeof MinecraftFormatting
];
const customPlusColor =
MinecraftFormatting[
player.rankPlusColor as keyof typeof MinecraftFormatting
];
if (customRankColor) {
out.customRankColor = customRankColor;
out.customRankColorHex =
MinecraftColorAsHex[
customRankColor as keyof typeof MinecraftColorAsHex
];
}
if (customPlusColor) {
out.customPlusColor = customPlusColor;
out.customPlusColorHex =
MinecraftColorAsHex[
customPlusColor as keyof typeof MinecraftColorAsHex
];
}
if (out.priority === PlayerRanks.MVP_PLUS) {
out.prefix = `§b[MVP${customPlusColor ?? "§c"}+§b]`;
}
if (out.priority === PlayerRanks.SUPERSTAR) {
out.prefix = `${customRankColor ?? "§6"}[MVP${customPlusColor ?? "§c"}++${
customRankColor ?? "§6"
}]`;
}
}
return out;
}