Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
psycodeliccircus opened this issue Feb 24, 2023 · 2 comments
Open

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

psycodeliccircus opened this issue Feb 24, 2023 · 2 comments
Labels
good first issue Good for newcomers

Comments

@psycodeliccircus
Copy link

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
Copy link
Author

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 AlphaLawless added the good first issue Good for newcomers label Feb 28, 2023
@AlphaLawless
Copy link
Member

@Matan18 @tauz-hub @JVOPINHO

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
good first issue Good for newcomers
Projects
None yet
Development

No branches or pull requests

2 participants