import type { GearType, User } from "~/db/types"; import { assertUnreachable } from "./types"; export function discordFullName( user: Pick ) { return `${user.discordName}#${user.discordDiscriminator}`; } export function makeTitle(title: string | string[]) { return `${Array.isArray(title) ? title.join(" | ") : title} | sendou.ink`; } export function getEnglishOrdinalSuffix(num: number) { const lastDigit = num % 10; const last2Digits = num % 100; if (lastDigit === 1 && last2Digits !== 11) { return "st"; } else if (lastDigit === 2 && last2Digits !== 12) { return "nd"; } else if (lastDigit === 3 && last2Digits !== 13) { return "rd"; } return "th"; } export function semiRandomId() { return String(Math.random()); } export const rawSensToString = (sens: number) => `${sens > 0 ? "+" : ""}${sens / 10}`; type WithStart< S extends string, Start extends string > = S extends `${Start}${infer Rest}` ? `${Start}${Rest}` : never; export function startsWith( str: S, start: Start ): str is WithStart { return str.startsWith(start); } type Split = string extends S ? string[] : S extends "" ? [] : S extends `${infer T}${Sep}${infer U}` ? [T, ...Split] : [S]; export function split( str: S, seperator: Sep ) { return str.split(seperator) as Split; } export function gearTypeToInitial(gearType: GearType) { switch (gearType) { case "HEAD": return "H"; case "CLOTHES": return "C"; case "SHOES": return "S"; default: assertUnreachable(gearType); } }