import { ContainerBuilder, EmbedBuilder, hyperlink, inlineCode, InteractionContextType, MessageFlags, SlashCommandBuilder, time, TimestampStyles, } from "discord.js"; import { HybridCommand, useHybridCommand } from "../../base/command/Command.js"; import type { HybridContext } from "../../base/command/HybridContext.js"; import CommitManager from "../../libs/CommitManager.js"; import { truncate } from "../../utils/string.js"; import { getRepoCommitsURL, parseRepoURL } from "../../utils/github.js"; import logger from "../../libs/logger.js"; @useHybridCommand({ applicationCommandData: new SlashCommandBuilder() .setName("information") .setDescription("Display all information about me :3") .setContexts(InteractionContextType.Guild), prefixTriggers: ["info", "infor"], }) export default class InformationCommand extends HybridCommand { public override async execute(context: HybridContext) { const { client } = this; const commits = await CommitManager.getAll(); // const embed = new EmbedBuilder() // .setThumbnail(client.user.displayAvatarURL({ size: 128 })) // .setAuthor({ // name: context.user.displayName, // iconURL: context.user.displayAvatarURL({ size: 64 }), // }) // .setColor(0x4752c4) // .addFields([ // { // name: "Uptime", // value: `(${time(client.readyAt, TimestampStyles.RelativeTime)})`, // }, // ]) // .setTimestamp(new Date()); const container = new ContainerBuilder().setAccentColor(0x4752c4); container.addSectionComponents((section) => section .addTextDisplayComponents((textDisplay) => textDisplay.setContent(["## About me", "Hi, I'm Zent!"].join("\n")), ) .setThumbnailAccessory((thumbnail) => thumbnail.setURL(client.user.displayAvatarURL({ size: 4096 })), ), ); container.addSeparatorComponents((seperator) => seperator); if (commits.size) { const amount = 3; const recentCommits = commits.first(amount).map((commit) => { const message = truncate(commit.commit.message, 25); const commitId = inlineCode(commit.sha.slice(0, 7)); const date = new Date(commit.commit.author?.date || Date.now()); const formattedTimestamp = time(date, TimestampStyles.RelativeTime); return `> ${hyperlink(`${commitId} ${message}`, commit.html_url)} at ${formattedTimestamp}`; }); const remainingCommits = Math.min(commits.size - amount, commits.size).toLocaleString(); if (!CommitManager.repoURL) { logger.warn("Missing repository field in package.json"); return; } const { owner, repo } = parseRepoURL(CommitManager.repoURL); const commitsURL = getRepoCommitsURL(owner, repo); container.addSectionComponents((section) => section.addTextDisplayComponents((textDisplay) => textDisplay.setContent( [ "## Recent commits", recentCommits.join("\n"), `View more ${remainingCommits} commits at our [official repository commit history](${commitsURL})`, ].join("\n"), ), ), ); } await context.send({ components: [container], flags: MessageFlags.IsComponentsV2, }); } }