Принять изображение пользователя в качестве аргумента, затем отправить сообщение с тем же изображением с Discord.JS

#javascript #node.js #discord #discord.js

#javascript #node.js #Discord #discord.js

Вопрос:

Давайте просто начнем с этого.

Я просматривал Google, пытаясь найти руководство о том, как принимать изображения в качестве аргументов, а затем отправлять это же изображение с сообщением, предоставленным пользователем.

Я делаю команду объявления.

Прямо сейчас моя команда принимает только текст в качестве входных данных, а не файлы / изображения.

Вот моя команда announce:

 module.exports = {
  name: "afv!announce",
  description: "announce something",
  execute(msg, args, bot) {
    if (msg.member.roles.cache.find((r) => r.name === "Bot Perms")) {
      const prevmsg = msg;
      const text = args.join().replace(/,/g, " ");
      msg
        .reply(
          "Would you like to do `@here` :shushing_face: or `@everyone` :loudspeaker:?nIf you would like to ping something else, react with :person_shrugging:. (you will have to ping it yourself, sorry)n*react with :x: to cancel*"
        )
        .then((msg) => {
          const areusure = msg;
          msg
            .react("🤫")
            .then(() => msg.react("📢"))
            .then(() => msg.react("🤷"))
            .then(() => msg.react("❌"));

          const filter = (reaction, user) => {
            return (
              ["🤫", "📢", "🤷", "❌"].includes(reaction.emoji.name) amp;amp;
              user.id === prevmsg.author.id
            );
          };

          msg
            .awaitReactions(filter, { max: 1, time: 60000, errors: ["time"] })
            .then((collected) => {
              const reaction = collected.first();

              if (reaction.emoji.name === "🤫") {
                areusure.delete();
                prevmsg
                  .reply("<a:AFVloading:748218375909539923> Give me a sec...")
                  .then((msg) => {
                    bot.channels.cache
                      .get("696135322240548874")
                      .send("@herenn"   text);
                    msg.edit("<a:AFVdone:748218438551601233> Done!");
                  });
              } else if (reaction.emoji.name === "📢") {
                areusure.delete();
                prevmsg
                  .reply("<a:AFVloading:748218375909539923> Give me a sec...")
                  .then((msg) => {
                    bot.channels.cache
                      .get("696135322240548874")
                      .send("@everyonenn"   text);
                    msg.edit("<a:AFVdone:748218438551601233> Done!");
                  });
              } else if (reaction.emoji.name === "🤷") {
                areusure.delete();
                prevmsg
                  .reply("<a:AFVloading:748218375909539923> Give me a sec...")
                  .then((msg) => {
                    bot.channels.cache
                      .get("696135322240548874")
                      .send(
                        "Important: https://afv.page.link/announcementnn"  
                          text
                      );
                    msg.edit("<a:AFVdone:748218438551601233> Done!");
                  });
              } else if (reaction.emoji.name === "❌") {
                areusure.delete();
                prevmsg.reply("Cancelled.");
              }
            })
            .catch((collected) => {
              msg.delete();
              prevmsg.reply("you didn't react with any of the emojis above.");
            });
        });
    }
  },
};
  

Ответ №1:

Message имеет свойство с именем attachments , которое содержит все вложения в сообщении. (Изображение, загруженное пользователем, считается вложением, однако URL-адрес изображения — нет.)


Вот пример:

 client.on('message', (message) => {
 if (message.author.bot) return false;
 if (message.attachments.size == 0)
  return message.channel.send('No attachments in this message.');

 const AnnouncementChannel = new Discord.TextChannel(); // This shall be announcement channel / the channel you want to send the embed to.

 const Embed = new Discord.MessageEmbed();
 Embed.setTitle('Hey!');
 Embed.setDescription('This is an announcement.');
 Embed.setImage(message.attachments.first().url);

 AnnouncementChannel.send(Embed);
});
  

Ответ №2:

Аватар

Для использования изображений вы можете использовать эту функцию :

 message.author.displayAvatarURL(
 { dynamic: true } /* In case the user avatar is animated we make it dynamic*/
);
  

Затем он вернет ссылку, которую вы можете использовать для встраивания миниатюр или изображений. Если вы хотите использовать его во внедрении

 let link = message.author.displayAvatarURL({ dynamic: true });
const embed = new Discord.MessageEmbed().setThumbnail(link);
  

Используйте ссылки на изображения

Если вы хотите использовать ссылку на изображение, вам придется преобразовать ее в вложение discord.

 const args = message.content.split(' ').slice(1);
const attach = new Discord.Attachement(args.join(' '), 'image_name.png');
message.channel.send(attach);
  

Надеюсь, я вам помог. Если нет, вы все равно можете выполнить поиск в discord.js руководство ^^

Не уверен, где находится ссылка на изображение

Если вы действительно не знаете, где находится ссылка на изображение в содержимом сообщения, вы можете отделить его (вы уже сделали с аргументами) и использовать функцию forEach :

 const args = message.content.split(' ').slice(1);

// a function to see if it's an url
function isvalidurl(string) {
 try {
  const a = new URL(string);
 } catch (err) {
  return false;
 }
 return true;
}
// check the function for each argument
args.forEach((a) => {
 if (isvalidurl(a)) link = a;
});

if (link) {
 // code
} else {
 // code
}
  

Комментарии:

1. Привет. Спасибо за ответ. Я ищу вложение изображения пользователя. Например: Пользователь: afv!анонс Проверьте эту классную студию! (прикрепляет изображение) Бот: в #анонсы: Посмотрите на эту классную студию! (то же изображение) Я надеюсь, что это прояснило ситуацию.