Open psycodeliccircus opened 1 year ago
Fiz umas pequenas melhorias no codigo aqui como esta ele.
import fetch from 'node-fetch';
import Discord from 'discord.js';
const Colors = require('../../../utils/commandsFunctions/layoutEmbed/colors.js');
const Icons = require('../../../utils/commandsFunctions/layoutEmbed/iconsMessage.js');
const OPENAI_API_KEY = 'SUA_API_KEY_DO_OPENAI';
const DALLE_API_KEY = 'SUA_API_KEY_DO_DALLE';
const MAX_LENGTH = 200; // Limite máximo de caracteres na frase
const TIMEOUT = 10000; // Tempo máximo de espera para as requisições (em milissegundos)
const ELLIPSIS = '...'; // Sufixo adicionado à frase caso seja cortada
const MODELS = {
'image-alpha-001': 'Image Alpha 001',
'image-alpha-002': 'Image Alpha 002',
'image-alpha-003': 'Image Alpha 003',
};
export default {
name: 'imagine',
description: `Use a imaginação para gerar uma imagem usando OpenAI e Dall-e.`,
permissions: ['everyone'],
aliases: ['img', 'gerarimg'],
category: 'Utility ⛏️',
run: async ({ message, client }) => {
const { channel, author } = message;
// Verifica se o usuário enviou uma frase descritiva
const prompt = message.content.trim();
if (!prompt) {
const embed = new Discord.MessageEmbed()
.setColor(Colors.ERROR)
.setTitle(`${Icons.ERROR} Insira uma frase para gerar a imagem`)
.setDescription(`Envie uma frase descritiva para gerar uma imagem.`)
.setFooter(`Comando solicitado por ${author.username}`, author.displayAvatarURL({ dynamic: true }));
channel.send(embed);
return;
}
// Limita o tamanho da frase para evitar problemas com a API
const croppedPrompt = prompt.substring(0, MAX_LENGTH - ELLIPSIS.length) + ELLIPSIS;
// Pede ao usuário que escolha um modelo do OpenAI, ou usa o modelo padrão
const modelNames = Object.values(MODELS).join('\n');
const modelPrompt = `Escolha um modelo do OpenAI para gerar a imagem:\n\n${modelNames}\n\nDigite o nome do modelo ou "padrão" para usar o modelo padrão.`;
const modelMessage = await channel.send(modelPrompt);
const filter = (m) => m.author.id === author.id;
const collector = new Discord.MessageCollector(channel, filter, { max: 1, time: 30000 });
collector.on('collect', async (m) => {
const modelName = m.content.trim().toLowerCase();
const modelKey = Object.keys(MODELS).find((key) => MODELS[key].toLowerCase() === modelName);
if (!modelKey && modelName !== 'padrão') {
const embed = new Discord.MessageEmbed()
.setColor(Colors.ERROR)
.setTitle(`${Icons.ERROR} Modelo inválido`)
.setDescription(`Por favor, escolha um modelo válido ou digite "padrão" para usar o modelo padrão.`)
.setFooter(`Comando solicitado por ${author.username}`, author.displayAvatarURL({ dynamic: true }));
channel.send(embed);
return;
}
const model = modelKey || 'image-alpha-001';
const openaiUrl = 'https://api.openai.com/v1/images/generations';
const response = await fetch(openaiUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${OPENAI_API_KEY}`,
},
body: JSON.stringify({
model: model,
prompt: croppedPrompt,
num_images: 1,
size: '512x512',
response_format: 'url',
}),
timeout: TIMEOUT,
});
if (!response.ok) {
const embed = new Discord.MessageEmbed()
.setColor(Colors.ERROR)
.setTitle(`${Icons.ERROR} Erro ao gerar a imagem`)
.setDescription(`Ocorreu um erro ao gerar a imagem usando o modelo ${MODELS[model]}. Por favor, tente novamente mais tarde.`)
.setFooter(`Comando solicitado por ${author.username}`, author.displayAvatarURL({ dynamic: true }));
channel.send(embed);
return;
}
const { data: imageUrls } = await response.json();
const imageUrl = imageUrls[0];
// Gera uma descrição para a imagem usando DALL-E
const dalleUrl = 'https://api.openai.com/v1/images/generations';
const dalleResponse = await fetch(dalleUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${DALLE_API_KEY}`,
},
body: JSON.stringify({
model: 'image-alpha-001',
prompt: croppedPrompt,
size: '512x512',
response_format: 'url',
}),
timeout: TIMEOUT,
});
if (!dalleResponse.ok) {
const embed = new Discord.MessageEmbed()
.setColor(Colors.ERROR)
.setTitle(`${Icons.ERROR} Erro ao gerar descrição da imagem`)
.setDescription(`Ocorreu um erro ao gerar a descrição da imagem usando o modelo DALL-E. Por favor, tente novamente mais tarde.`)
.setFooter(`Comando solicitado por ${author.username}`, author.displayAvatarURL({ dynamic: true }));
channel.send(embed);
return;
}
const { data: dalleImageUrls } = await dalleResponse.json();
const dalleImageUrl = dalleImageUrls[0];
// Envia uma mensagem com a imagem e a descrição
const embed = new Discord.MessageEmbed()
.setColor(Colors.SUCCESS)
.setTitle(`${Icons.IMAGE} Imagem gerada usando ${MODELS[model]}`)
.setDescription(`"${prompt}"`)
.setImage(imageUrl)
.setFooter(`Comando solicitado por ${author.username} | Descrição da imagem gerada por DALL-E`, author.displayAvatarURL({ dynamic: true }))
.setTimestamp();
const descriptionEmbed = new Discord.MessageEmbed()
.setColor(Colors.INFO)
.setTitle(`${Icons.INFO} Descrição da imagem gerada por DALL-E`)
.setImage(dalleImageUrl)
.setFooter(`Comando solicitado por ${author.username}`, author.displayAvatarURL({ dynamic: true }))
.setTimestamp();
channel.send(embed);
channel.send(descriptionEmbed);
});
collector.on('end', async (collected) => {
if (collected.size === 0) {
const embed = new Discord.MessageEmbed()
.setColor(Colors.ERROR)
.setTitle(`${Icons.ERROR} Tempo limite excedido`)
.setDescription(`Você demorou muito para escolher o modelo. O comando foi cancelado.`)
.setFooter(`Comando solicitado por ${author.username}`, author.displayAvatarURL({ dynamic: true }));
channel.send(embed);
}
});
},
};
@Matan18 @tauz-hub @JVOPINHO
Olá
Minha ideia pegando um pouco de outros comandos.
em breve vou tenta melhora ela ser funciona no bot.