const { MessageAttachment } = require('discord.js'); // const { readFile } = require('fs/promises'); const fs = require("fs"); const fetch = require('node-fetch'); const arrayBufferToBuffer = require('arraybuffer-to-buffer'); const { request } = require('undici'); const CanvasImport = require('@napi-rs/canvas'); const canvas = CanvasImport.createCanvas(700, 250) const context = canvas.getContext('2d') //https://some-random-api.ml/welcome async function welcome(member, welcomechannel, welcomemessage = null, welcomebanner = null) { //Draw Stuff const context = canvas.getContext('2d'); var bkimgsrc; let bkurl = 'https://github.com/ION606/selmerBot/blob/main/commands/admin/wallpaper.jpg'; const response = await fetch(bkurl); response.arrayBuffer().then(async (data) => { // const background = new CanvasImport.Image(); // background.src = arrayBufferToBuffer(data); // This uses the canvas dimensions to stretch the image onto the entire canvas // context.drawImage(background, 0, 0, canvas.width, canvas.height); context.fillStyle = 'rgba(0,0,0,1)'; context.fillRect(0,0, canvas.width, canvas.height); //Draw the Border context.strokeStyle = '#0099ff'; context.strokeRect(0, 0, canvas.width, canvas.height); //Add Text //have the function here, because returns are whack const applyText = (canvas, text) => { const context = canvas.getContext('2d'); // Declare a base size of the font let fontSize = 70; let i = 0; do { // Assign the font to the context and decrement it so it can be measured again context.font = `italic ${fontSize -= 10}px sans-serif`; // Compare pixel width of the text to the canvas minus the approximate avatar size i ++; } while (context.measureText(text).width > canvas.width - 100); // Return the result to use in the actual canvas return context.font; }; //message.author.username == interaction.member.displayName //message.guild.name == interaction.member.guild.name let text = `Welcome to ${member.guild.name} ${member.user.username}#${member.user.discriminator}!`; if(welcomemessage != null) { text = welcomemessage; text = text.replace('{sn}', member.guild.name); text = text.replace('{un}', member.user.username); text = text.replace('{ut}', member.user.discriminator); } context.font= applyText(canvas, text); context.fillStyle = '#ffffff'; context.fillText(text, (canvas.width/2) - (context.measureText(text).width)/2, canvas.height - 15); //Draw a white circle context.beginPath(); context.arc((canvas.width/2), 90, 85, 0, 2 * Math.PI, false); context.fillStyle = 'white'; context.fill(); context.closePath(); //ANYTHING DRAWN AFTER THIS WILL BE CLIPPED!!! //Make whatever image will be draw (the user's avatar) into a circular format context.beginPath(); context.arc((canvas.width/2), 90, 80, 0, Math.PI * 2, true); context.closePath(); // Clip off the region you just drew (enforce template?) context.clip(); //Add the user's profile pic (message.author == interaction.user) const { body } = await request(member.displayAvatarURL({ format: 'jpg' })); const avatar = new CanvasImport.Image(); avatar.src = Buffer.from(await body.arrayBuffer()); context.drawImage(avatar, (canvas.width/2) - 80, 10, 160, 160); // Use the helpful Attachment class structure to process the file for you const attachment = new MessageAttachment(canvas.toBuffer('image/png'), 'profile-image.png'); welcomechannel.send({ files: [attachment] }); }) } module.exports = { welcome }