Skip to content

Instantly share code, notes, and snippets.

@iamnotacoder-djs
Last active February 11, 2022 16:09
Show Gist options
  • Save iamnotacoder-djs/f2f72c8e620793ae81d7b38152154175 to your computer and use it in GitHub Desktop.
Save iamnotacoder-djs/f2f72c8e620793ae81d7b38152154175 to your computer and use it in GitHub Desktop.
Discord.js Simple Canvas Profile
const Discord = require('discord.js'),
client = new Discord.Client(),
fs = require('fs'),
{ createCanvas, loadImage, registerFont } = require('canvas');
client.db = require("quick.db");
const config = {
token: "/токен/",
prefix: "!",
adminID: "/id/"
};
const embed_color = "#fff";
client.on('ready', () => {
if (client.db.get(`members`) == null) client.db.set(`members`, {});
var user_id = config.adminID;
var member = client.db.get(`members.user_${user_id}`);
if (member == null || member == undefined) {
var u = {};
u.id = user_id;
u.lvl = 1;
u.exp = 0;
u.background = "";
u.status = "";
client.db.set(`members.user_${user_id}`, u);
member = u;
}
});
client.on('message', (message) => {
if (message.author.bot || message.channel.type != "text") return;
if (!message.content.startsWith(config.prefix)) return;
const args = message.content.slice(config.prefix.length).trim().split(/ +/g);
const command = args.shift();
if (command === "exp" || command === "lvl" || command === "level" || command === "profile") {
let mention = message.mentions.users.first();
if (mention) {
printMemberProfile(mention.id, message.channel.id)
.then((result) => {
if (result) {
const embed = new Discord.MessageEmbed()
.setColor(embed_color)
.setDescription(message.guild.members.cache.get(mention.id).user)
.attachFiles('./member_cards/'+mention.id+'.png')
.setImage('attachment://'+mention.id+'.png');
message.reply(embed);
}
});
} else {
printMemberProfile(message.author.id, message.channel.id)
.then((result) => {
if (result) {
const embed = new Discord.MessageEmbed()
.setColor(embed_color)
.setDescription(message.guild.members.cache.get(message.author.id).user)
.attachFiles('./member_cards/'+message.author.id+'.png')
.setImage('attachment://'+message.author.id+'.png');
message.reply(embed);
}
});
}
}
});
function printMemberProfile(user_id = undefined, channel_id = null) {
return new Promise((resolve, reject) => {
if (user_id == undefined) resolve(false);
if (channel_id != null || client.channels.chache.get(channel_id) == undefined) {
channel_id = "667065701491802152"; // Любой дефолтный канал для ивентов
}
try {
if (fs.existsSync('./member_cards/'+user_id+'.png')) {
fs.stat('./member_cards/'+user_id+'.png', function(err, stats) {
var date = new Date(stats["mtime"]);
if (timeDifference(date, Date.now()) < 10) {
resolve(true);
}
});
}
} catch (err) {
console.log(err)
}
getProfile(user_id).then(dbProfile => {
var u = dbProfile;
if (u.background == undefined || u.background == "") {
u.background = "./background.png";
}
loadImage(u.background)
.then((bg) => {
loadImage('./overlay.png')
.then((overlay) => {
const user = client.channels.cache.get(channel_id).guild.members.cache.get(user_id);
var user_avatar = './avatar.png';
if (user.user.avatarURL({ format: "jpg" }) != null && user.user.avatarURL({ format: "jpg" }) != undefined) {
user_avatar = user.user.avatarURL({ format: "jpg" });
}
loadImage(user_avatar)
.then((profile) => {
const canvas = createCanvas(400, 200);
const context = canvas.getContext('2d');
context.fillStyle = '#fff';
context.fillRect(0, 0, 400, 200);
context.drawImage(bg, 0, 0, 400, 200);
context.drawImage(profile, 22, 67, 98, 98);
context.drawImage(overlay, 0, 0, 400, 200);
registerFont('./10568.ttf', { family: 'Astakhov' });
context.font = '24pt Astakhov';
var title = user.user.username;
context.font = '24pt Astakhov';
context.fillStyle = '#000';
context.fillText(title, 22, 48);
context.fillStyle = '#fff';
context.fillText(title, 20, 46);
var lvl = u.lvl+" LVL";
context.font = '10pt Astakhov';
context.textAlign = 'center';
context.fillStyle = '#000';
context.fillText(lvl, 73, 185);
context.fillStyle = '#fff';
context.fillText(lvl, 71, 183);
var exp = (u.exp/100).toFixed(1).replace(".0", "")+"k/10k EXP";
context.textAlign = 'right';
context.fillStyle = '#000';
context.fillText(exp, 375, 185);
context.fillStyle = '#fff';
context.fillText(exp, 373, 183);
context.fillRect(5, 188, Math.round((u.exp*389)/1000), 5);
const buffer = canvas.toBuffer('image/png');
fs.writeFileSync('./member_cards/'+user_id+'.png', buffer);
resolve(true);
})
.catch(err => {
console.log(err);
resolve(false);
});
})
.catch(err => {
console.log(err);
resolve(false);
});
})
.catch(err => {
console.log(err);
resolve(false);
});
});
});
}
function getProfile(user_id) {
return new Promise((resolve, reject) => {
var member = client.db.get(`members.user_${user_id}`);
if (member == null || member == undefined) {
var u = {};
u.id = user_id;
u.lvl = 1;
u.exp = 0;
u.background = "";
u.status = "";
client.db.set(`members.user_${user_id}`, u);
member = u;
}
resolve(member);
});
}
function timeDifference(timestamp1, timestamp2) {
var date1 = new Date();
date1.setTime(timestamp1);
var date2 = new Date();
date2.setTime(timestamp2);
var difference = date1.getTime() - date2.getTime();
var daysDifference = Math.floor(difference/1000/60/60/24);
difference -= daysDifference*1000*60*60*24
var hoursDifference = Math.floor(difference/1000/60/60);
difference -= hoursDifference*1000*60*60
var minutesDifference = Math.floor(difference/1000/60);
return Math.abs(minutesDifference);
}
client.login(config.token);
@iamnotacoder-djs
Copy link
Author

iamnotacoder-djs commented Jun 28, 2021

background.png
background

overlay.png
overlay

avatar.png
avatar

Шрифт придется вам самостоятельно найти и добавить в папку проекта.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment