88 lines
3.3 KiB
JavaScript
Raw Normal View History

2023-09-10 09:02:17 +02:00
const { AttachmentBuilder } = require("discord.js")
const Canvas = require('canvas');
module.exports = {
async execute(interaction){
const color1 = interaction.options.getString('color1'); // Première couleur
const color2 = interaction.options.getString('color2'); // Deuxième couleur
const blendMode = interaction.options.getString('mode'); // Mode de fusion
if (!isValidHexColor(color1) || !isValidHexColor(color2)) {
interaction.reply({content: 'Les couleurs doivent être au format hexadécimal (ex. #FF0000).', ephermeral: true});
return;
}
await interaction.deferReply();
const blendedColor = blendColors(color1, color2, blendMode);
const canvas = Canvas.createCanvas(99, 99);
const ctx = canvas.getContext('2d');
ctx.fillStyle = color1;
ctx.fillRect(0, 0, 33, 99);
ctx.fillStyle = blendedColor;
ctx.fillRect(33, 0, 66, 99);
ctx.fillStyle = color2;
ctx.fillRect(66, 0, 99, 99);
const attachment = new AttachmentBuilder(canvas.toBuffer(), {name: 'blended_color.png'});
await interaction.editReply({content: `Couleur résultante du mélange (${blendMode}) : ${blendedColor}`, files: [attachment]});
}
}
// Fonction pour vérifier si une chaîne est une couleur hexadécimale valide
function isValidHexColor(hexColor) {
return /^#[0-9A-F]{6}$/i.test(hexColor);
}
// Fonction pour mélanger deux couleurs en fonction du mode de fusion
function blendColors(color1, color2, blendMode) {
// Parsez les composants RVB des couleurs
const r1 = parseInt(color1.slice(1, 3), 16);
const g1 = parseInt(color1.slice(3, 5), 16);
const b1 = parseInt(color1.slice(5, 7), 16);
const r2 = parseInt(color2.slice(1, 3), 16);
const g2 = parseInt(color2.slice(3, 5), 16);
const b2 = parseInt(color2.slice(5, 7), 16);
// Appliquez le mode de fusion et calculez la couleur résultante
let blendedR, blendedG, blendedB;
switch (blendMode) {
case 'normal':
blendedR = r1;
blendedG = g1;
blendedB = b1;
break;
case 'multiply':
blendedR = (r1 * r2) / 255;
blendedG = (g1 * g2) / 255;
blendedB = (b1 * b2) / 255;
break;
case 'screen':
blendedR = 255 - (255 - r1) * (255 - r2) / 255;
blendedG = 255 - (255 - g1) * (255 - g2) / 255;
blendedB = 255 - (255 - b1) * (255 - b2) / 255;
break;
case 'overlay':
blendedR = r1 < 128 ? (2 * r1 * r2) / 255 : 255 - (2 * (255 - r1) * (255 - r2)) / 255;
blendedG = g1 < 128 ? (2 * g1 * g2) / 255 : 255 - (2 * (255 - g1) * (255 - g2)) / 255;
blendedB = b1 < 128 ? (2 * b1 * b2) / 255 : 255 - (2 * (255 - b1) * (255 - b2)) / 255;
break;
// Ajoutez d'autres modes de fusion ici
default:
blendedR = r1;
blendedG = g1;
blendedB = b1;
}
// Convertissez les composants RVB en une couleur hexadécimale
const blendedColor = `#${componentToHex(Math.floor(blendedR))}${componentToHex(Math.floor(blendedG))}${componentToHex(Math.floor(blendedB))}`;
return blendedColor;
}
// Fonction pour convertir un composant RVB en hexadécimal
function componentToHex(c) {
const hex = c.toString(16);
return hex.length === 1 ? `0${hex}` : hex;
}