Ballerini-Server / BalleBot

MIT License
0 stars 1 forks source link

ideia para um comando para ser adicionado ao bot. #9

Open psycodeliccircus opened 1 year ago

psycodeliccircus commented 1 year ago

Olá

Minha ideia pegando um pouco de outros comandos.

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';

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
    if (!message.content) {
      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;
    }

    // Envia a frase para o OpenAI e recebe o texto descritivo da imagem gerada pelo Dall-e
    const prompt = message.content.trim();
    const openaiResponse = await fetch('https://api.openai.com/v1/images/generations', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${OPENAI_API_KEY}`,
      },
      body: JSON.stringify({
        model: 'image-alpha-001',
        prompt,
        num_images: 1,
        size: '512x512',
        response_format: 'url',
      }),
    });
    const { data } = await openaiResponse.json();

    // Envia o texto descritivo para o Dall-e e recebe a imagem gerada
    const dalleResponse = await fetch('https://api.openai.com/v1/images/generations', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${DALLE_API_KEY}`,
      },
      body: JSON.stringify({
        model: 'image-alpha-001',
        prompt: data[0].text,
        num_images: 1,
        size: '512x512',
        response_format: 'url',
      }),
    });
    const { data: image } = await dalleResponse.json();

    // Cria e envia o embed com a imagem gerada pelo Dall-e
    const embed = new Discord.MessageEmbed()
      .setColor(Colors.SUCCESS)
      .setTitle(`${Icons.SUCCESS} Imagem gerada com sucesso`)
      .setDescription(prompt)
      .setImage(image[0].url)
      .setFooter(`Comando solicitado por ${author.username}`, author.displayAvatarURL({ dynamic: true }));
    channel.send(embed);
  },
};

em breve vou tenta melhora ela ser funciona no bot.

psycodeliccircus commented 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);
  }
});
},
};
AlphaLawless commented 1 year ago

@Matan18 @tauz-hub @JVOPINHO