await interaction.reply(...);
const message = await interaction.fetchReply();
const collector = message.createComponentCollector(...);
const {SlashCommandBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, Client, GatewayIntentBits, EmbedBuilder} = require('discord.js')
- const client = new Client({intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildPresences]});
module.exports = {
data: new SlashCommandBuilder()
.setName('add-animal')
.setNameLocalizations({"ru": "добавить-животное"})
.setDescription('Add animals to game "Guess the animal"!')
.setDescriptionLocalizations({"ru": 'Добавь животное в игру "Угадай животное"!'})
.addStringOption(option =>
option.setName('name')
.setNameLocalizations({"ru": 'имя'})
.setDescription("Animal name")
.setDescriptionLocalizations({"ru": "Имя животного"})
.setRequired(true)
)
.addAttachmentOption(option =>
option.setName('image')
.setNameLocalizations({"ru": "изображение"})
.setDescription("Animal image")
.setDescriptionLocalizations({"ru": "Изображение животного"})
.setRequired(true)
),
async execute(interaction) {
const name = interaction.options.getString('name')
const image = interaction.options.getAttachment('image')
const embed = new EmbedBuilder()
.setTitle(name)
.setDescription(`Прислал: ${interaction.user}`)
.setImage(image.url)
- client.channels.fetch('1007311557300068432')
- .then(channel => channel.send('ok'))
+ interaction.client.channels.fetch("1007311557300068432")
+ .then(channel => channel.send('ok'))
interaction.reply("ок")
}
}
Как уже говорилось ранее, у вас есть три секунды, чтобы ответить на Interaction, прежде чем его токен станет недействительным. Но что, если у вас есть команда, выполняющая задачу, которой требуется больше времени, чем три секунды?
В этом случае вы можете воспользоваться методомBaseInteraction#deferReply()
, который запускает<application> is thinking...
, а также действует как начальный ответ. Это позволит вам получить 15 минут на выполнение задач перед ответом.
axios.get()
иногда уходит более 3 секунд, из-за чего к моменту запуска .then()
токен Interaction уже является недействительным, что и вызывает ошибку.axios.get()
нужно поставить await interaction.deferReply()
, а после чего уже использовать await interaction.editReply(...)
вместо await interaction.reply(...)
.axios.get()
, юзер будет видеть надпись имя_бота думает...
(или имя_бота is thinking...
, в зависимости от языка). { "en-US": "Name", "ru": "Название", ... }
axios.get()
возвращает промис (а как известно, промисы выполняются асинхронно от остального кода), все изменения, которые вы сделаете внутри .then()
будут видны исключительно там.let num = 5;
let promise = new Promise((resolve, reject) => resolve());
promise.then((r) => {
num = 9;
console.log(`${num}, внутри .then()`); // "9, внутри .then()"
})
console.log(`${num}, вне .then()`); // "5, вне .then()"
2. ссылки в embed'е можно вставлять только в:[текст](ссылка 'появляющийся текст при наведении курсора на ссылку (необязательно)')
Guilds, GuildMessages, MessageContent
.client.on("messageCreate", async message => {
if (message.attachments.size < 1 || !message.attachments.some(el => el.contentType.startsWith("image"))) {
message.delete().catch(() => {
/* что-то сделать в случае, если удалить сообщение не удалось */
})
} else {
/* код здесь сработает в случае, если среди прикрепленных к сообщению файлов присутствует хотя бы 1 картинка любого формата (.png, .jpg, .jpeg, .svg и т.д.) */
}
});
Как получить значение из аргумента?
const string = interaction.options.getString('название_аргумента');
const integer = interaction.options.getInteger('название_аргумента');
const boolean = interaction.options.getBoolean('название_аргумента');
const user = interaction.options.getUser('название_аргумента');
const member = interaction.options.getMember('название_аргумента');
const channel = interaction.options.getChannel('название_аргумента');
const role = interaction.options.getRole('название_аргумента');
const number = interaction.options.getNumber('название_аргумента');
const mentionable = interaction.options.getMentionable('название_аргумента');
const attachment = interaction.options.getAttachment('название_аргумента');
Как узнать, какой пользователь ввел команду?
<GuildMember>.voice.setSuppressed(false) // предложить пользователю выступать в качестве оратора
<GuildMember>.voice.setSuppressed(true) // переместить пользователя в "слушатели"
npm uninstall discord.js
npm install discord.js
interaction.guild.channels.create(...).then(channel => channel.send("сообщение"))
let text = await interaction.guild.channels.create(...);
await text.send("сообщение")
`classic ${interaction.username}`
interaction.member.user.username
interaction.member.nickname
member.bannable // false в случае, если бот не может забанить юзера; true в случае, если бот может забанить юзера (зависит от позиции самой высокой роли у бота и у юзера)
guild.roles.comparePositions(member.roles.highest, guild.me.roles.highest)
* метод вернёт отрицательное число, если позиция первой роли < позиции второй роли;function is_url(str) {
let regexp = /^(?:(?:https?|ftp):\/\/)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?$/;
if(regexp.test(str)) {
return true;
} else {
return false;
}
}
let warns = new Map();
client.on('messageCreate', async message => {
if (is_url(message.content) === true) {
const embed = new MessageEmbed()
.setTitle('Обнаружена ссылка!')
.setDescription(`Ссылки на нашем сервере запрещены\nНе присылай их больше пожалуйста, это наказуемо.`)
.setThumbnail(message.author.avatarURL())
.setTimestamp()
.setColor('RED')
.setFooter('Ознакомьтесь с правилами')
if (!warns.has(message.author.id)) {
warns.set(message.author.id, 1);
message.channel.send({ content: `<@${message.author.id}>`, embeds: [embed] })
} else {
warns.set(message.author.id, warns.get(message.author.id) + 1);
if (warns.get(message.author.id) === 2) {
return функция_мута();
} else if (warns.get(message.author.id) >= 3) {
warns.delete(message.author.id);
return функция_бана();
}
}
}
});
- const { Client, Intents } = require('discord.js');
+ const { Client, Intents, MessageEmbed } = require('discord.js');
// ... //
- const embed = new Discord.MessageEmbed()
- .setAuthor("Айпи наших серверов")
- .setColor('#228B22')
- .setDescription("Servername #1 - 37.230.210.97:27015 [Online " + play + "/128]")
- .setFooter("© SKRP. Все права защищены.")
- .setTimestamp()
+ const embed = new MessageEmbed();
+ .setAuthor({ name: "Айпи наших серверов" })
+ .setColor('#228B22')
+ .setDescription("Servername #1 - 37.230.210.97:27015 [Online " + play + "/128]")
+ .setFooter({ text: "© SKRP. Все права защищены." })
+ .setTimestamp()
(node:7672) DeprecationWarning: The message event is deprecated. Use messageCreate instead
- client.on('message', async message => { /* ... */ })
+ client.on('messageCreate', async message => { /* ... */ })
client.on('messageCreate', async message => {
try {
if (message.type === "REPLY") {
let messageReference = await message.fetchReference();
console.log(messageReference.author.id) // ID пользователя, на сообщение которого ответили.
}
} catch (err) {
if (err.name === "Error [MESSAGE_REFERENCE_MISSING]") {
console.log("это обычное сообщение.")
}
}
});