himbot/src/utils/helpers.ts
2023-05-28 20:20:00 -06:00

147 lines
4.1 KiB
TypeScript

import type {
Bot,
BotWithCache,
CreateApplicationCommand,
Guild,
MakeRequired,
} from "../../deps.ts";
import {
getGuild,
hasProperty,
upsertGuildApplicationCommands,
} from "../../deps.ts";
import { logger } from "./logger.ts";
import type { subCommand, subCommandGroup } from "../commands/mod.ts";
import { commands } from "../commands/mod.ts";
const log = logger({ name: "Helpers" });
/** This function will update all commands, or the defined scope */
export async function updateCommands(
bot: BotWithCache,
scope?: "Guild" | "Global"
) {
const globalCommands: Array<MakeRequired<CreateApplicationCommand, "name">> =
[];
const perGuildCommands: Array<
MakeRequired<CreateApplicationCommand, "name">
> = [];
for (const command of commands.values()) {
if (command.scope) {
if (command.scope === "Guild") {
perGuildCommands.push({
name: command.name,
description: command.description,
type: command.type,
options: command.options ? command.options : undefined,
});
} else if (command.scope === "Global") {
globalCommands.push({
name: command.name,
description: command.description,
type: command.type,
options: command.options ? command.options : undefined,
});
}
} else {
perGuildCommands.push({
name: command.name,
description: command.description,
type: command.type,
options: command.options ? command.options : undefined,
});
}
}
if (globalCommands.length && (scope === "Global" || scope === undefined)) {
log.info("Updating Global Commands, changes should apply in short...");
await bot.helpers
.upsertGlobalApplicationCommands(globalCommands)
.catch(log.error);
}
if (perGuildCommands.length && (scope === "Guild" || scope === undefined)) {
await bot.guilds.forEach(async (guild: Guild) => {
await upsertGuildApplicationCommands(bot, guild.id, perGuildCommands);
});
}
}
/** Update commands for a guild */
export async function updateGuildCommands(bot: Bot, guild: Guild) {
const perGuildCommands: Array<
MakeRequired<CreateApplicationCommand, "name">
> = [];
for (const command of commands.values()) {
if (command.scope) {
if (command.scope === "Guild") {
perGuildCommands.push({
name: command.name,
description: command.description,
type: command.type,
options: command.options ? command.options : undefined,
});
}
}
}
if (perGuildCommands.length) {
await upsertGuildApplicationCommands(bot, guild.id, perGuildCommands);
}
}
export async function getGuildFromId(
bot: BotWithCache,
guildId: bigint
): Promise<Guild> {
let returnValue: Guild = {} as Guild;
if (guildId !== 0n) {
if (bot.guilds.get(guildId)) {
returnValue = bot.guilds.get(guildId) as Guild;
}
await getGuild(bot, guildId).then((guild) => {
if (guild) bot.guilds.set(guildId, guild);
if (guild) returnValue = guild;
});
}
return returnValue;
}
export function snowflakeToTimestamp(id: bigint) {
return Number(id / 4194304n + 1420070400000n);
}
export function humanizeMilliseconds(milliseconds: number) {
// Gets ms into seconds
const time = milliseconds / 1000;
if (time < 1) return "1s";
const days = Math.floor(time / 86400);
const hours = Math.floor((time % 86400) / 3600);
const minutes = Math.floor(((time % 86400) % 3600) / 60);
const seconds = Math.floor(((time % 86400) % 3600) % 60);
const dayString = days ? `${days}d ` : "";
const hourString = hours ? `${hours}h ` : "";
const minuteString = minutes ? `${minutes}m ` : "";
const secondString = seconds ? `${seconds}s ` : "";
return `${dayString}${hourString}${minuteString}${secondString}`;
}
export function isSubCommand(
data: subCommand | subCommandGroup
): data is subCommand {
return !hasProperty(data, "subCommands");
}
export function isSubCommandGroup(
data: subCommand | subCommandGroup
): data is subCommandGroup {
return hasProperty(data, "subCommands");
}