forked from syntaxbullet/AuroraBot-discord
feat: Implement graphical student ID card generation for user profiles.
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
import { createCommand } from "@/lib/utils";
|
||||
import { SlashCommandBuilder, EmbedBuilder } from "discord.js";
|
||||
import { SlashCommandBuilder, EmbedBuilder, AttachmentBuilder } from "discord.js";
|
||||
import { userService } from "@/modules/user/user.service";
|
||||
import { classService } from "@/modules/class/class.service";
|
||||
import { generateStudentIdCard } from "@/graphics/studentID";
|
||||
|
||||
export const profile = createCommand({
|
||||
data: new SlashCommandBuilder()
|
||||
@@ -16,24 +18,25 @@ export const profile = createCommand({
|
||||
|
||||
const targetUser = interaction.options.getUser("user") || interaction.user;
|
||||
const targetMember = await interaction.guild?.members.fetch(targetUser.id).catch(() => null);
|
||||
const targetUserClass = await userService.getUserClass(targetUser.id);
|
||||
const classBalance = await classService.getClassBalance(targetUserClass?.id || BigInt(0));
|
||||
|
||||
const user = await userService.getOrCreateUser(targetUser.id, targetUser.username);
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setTitle(`${targetUser.username}'s Profile`)
|
||||
.setThumbnail(targetUser.displayAvatarURL({ size: 512 }))
|
||||
.setColor(targetMember?.displayHexColor || "Random")
|
||||
.addFields(
|
||||
{ name: "Level", value: `${user!.level || 1}`, inline: true },
|
||||
{ name: "XP", value: `${user!.xp || 0}`, inline: true },
|
||||
{ name: "Balance", value: `${user!.balance || 0}`, inline: true },
|
||||
{ name: "Class", value: user!.class?.name || "None", inline: true },
|
||||
{ name: "Joined Discord", value: `<t:${Math.floor(targetUser.createdTimestamp / 1000)}:R>`, inline: true },
|
||||
{ name: "Joined Server", value: targetMember ? `<t:${Math.floor(targetMember.joinedTimestamp! / 1000)}:R>` : "Unknown", inline: true }
|
||||
)
|
||||
.setFooter({ text: `ID: ${targetUser.id}` })
|
||||
.setTimestamp();
|
||||
const cardBuffer = await generateStudentIdCard({
|
||||
username: targetUser.username,
|
||||
avatarUrl: targetUser.displayAvatarURL({ extension: 'png', size: 256 }),
|
||||
id: targetUser.id,
|
||||
level: user!.level || 1,
|
||||
xp: user!.xp || 0n,
|
||||
au: user!.balance || 0n,
|
||||
cu: classBalance || 0n,
|
||||
className: user!.class?.name || "D"
|
||||
});
|
||||
|
||||
const attachment = new AttachmentBuilder(cardBuffer, { name: 'student-id.png' });
|
||||
|
||||
await interaction.editReply({ files: [attachment] }); // Send mostly just the image as requested, or maybe both? User said "show that user's student id". Image is primary.
|
||||
|
||||
await interaction.editReply({ embeds: [embed] });
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user