Last active
February 11, 2022 16:09
-
-
Save iamnotacoder-djs/f2f72c8e620793ae81d7b38152154175 to your computer and use it in GitHub Desktop.
Discord.js Simple Canvas Profile
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
background.png
![background](https://user-images.githubusercontent.com/10072664/123650914-b8c85300-d833-11eb-95ab-d2e875f6706f.png)
overlay.png
![overlay](https://user-images.githubusercontent.com/10072664/123650920-b960e980-d833-11eb-95a5-d8259d3d4a5b.png)
avatar.png
![avatar](https://user-images.githubusercontent.com/10072664/123650996-ca115f80-d833-11eb-9359-474aac4cf034.png)
Шрифт придется вам самостоятельно найти и добавить в папку проекта.