Сегодня будет делать Дискорд бота на Джээс!
Что-же нам потребуется?
Node.js
Discord.js
Node-fetch
Так-же увы, но я не буду объяснять, как создать бота и установить node.js, моя цель показать вам функционал discord.js, а не то, как делаются базовые действия бота.
Создаём папку скажем... на рабочем столе, и называем её любым названием, например это будет имя нашего бота! у меня это бот Pixi (Все права защищены, за использование названия вас приведут к ответственности!)
И так, для начала установим библиотеки!
Пишем:
npm i discord.js node-fetch
Далее после установки данных библиотек мы можем приступить к формулировке проекта!
Для этого в консоль пишем:
npm init
Далее мы просто нажимаем enter, хотя можно ещё заполнить последнее поле.. Это автор! Указываем ваше имя на Английском...
Далее создаём файл config.json, index.js, и в файл config.json пишем:
{
"prefix": "Тут ваш префикс",
"token": "Тут ваш токен"
}
И меняем на свои значения, префикс - это начальная точка команды, например $help, где $ выступает префиксом, а токен - это циферки и буквы которые можно получить в настройках бота), так-же токен никому нельзя говорить, иначе вашим ботом смогут управлять другие!
Далее в файле index.js пишем:
const Discord = require('discord.js')
const fs = require('fs') // подключаем fs к файлу
const client = new Discord.Client()
const config = require('./config.json')
const fetch = require('node-fetch')
client.commands = new Discord.Collection() // создаём коллекцию для команд
fs.readdir('./commands', (err, files) => { // чтение файлов в папке commands
if (err) console.log(err)
let jsfile = files.filter(f => f.split('.').pop() === 'js') // файлы не имеющие расширение .js игнорируются
if (jsfile.length <= 0) return console.log('Команды не найдены!') // если нет ни одного файла с расширением .js
console.log(`Загружено ${jsfile.length} команд`)
jsfile.forEach((f, i) => { // добавляем каждый файл в коллекцию команд
let props = require(`./commands/${f}`)
client.commands.set(props.help.name, props)
})
})
client.on('ready', () => {
console.log(`Бот ${client.user.username} запустился`);
})
client.on('message', message => {
let prefix = config.prefix
if (!message.content.startsWith(prefix) || message.author.bot) return;
let messageArray = message.content.split(' ') // разделение пробелами
let command = messageArray[0] // команда после префикса
let args = messageArray.slice(1) // аргументы после команды
let command_file = client.commands.get(command.slice(prefix.length)) // получение команды из коллекции
if (command_file) command_file.run(client, message, args, prefix)
})
client.login(config.token)
Что мы сделали можно посмотреть в подсказках, а теперь расскажу зачем нужна эта коллекция команд!
Дело в том, что по факту можно писать команды в client.on('message', message => {}, но это не правильно и именно по этому мы создаём коллекцию команд и делаем следующие действия.
После этого создаём в папке с нашим ботом ещё одну папку - commands, в этой папке и буду хранится все наши команды!
И так, давайте создадим первую команду!
Пускай это будет.. команда hi, бот будет отвечать нам привет!
И так... Создаём файл hi.js и пишем в него следующее:
const Discord = module.require("discord.js");
const fs = require("fs");
module.exports.run = async (client,message,args,prefix) => {
const exampleEmbed = new Discord.MessageEmbed() // Создаём наш эмбэд
.setColor('#43e2f7') // Цвет нашего сообщения
.setTitle('Приветик :>') // Название эмбэд сообщения
.setAuthor(message.guild.name) // Автором будет название сервера
.setDescription(':^Мы любим вас!^:') // комментарий
.setTimestamp() // Дата отправки сообщения
.setFooter('Ваш бот Bot © 2021'');
message.channel.send(exampleEmbed); // Отправляем сообщение
};
module.exports.help = {
name: "hi" // Название команды
};
Дальше запускаем бота (Переходим в консоль и идём через неё в папку с ботом и пишем node index.js) и видим...
Хорошо, у нас получилось!
Давайте.. Сделаем пинг! (Бот будет отправлять нам задержку к отправки сообщения в миллисекундах)
В папке commands создаём ещё один файл (ping.js) и там пишем:
const Discord = module.require("discord.js");
const fs = require("fs");
module.exports.run = async (client,message,args,prefix) => {
const ping = new Date(message.createdTimestamp);
const timeTaken = Date.now() - message.createdTimestamp;
message.channel.send(`Пинг: ${timeTaken}ms`);
};
module.exports.help = {
name: "ping"
};
Далее я хочу научить вас работать с рандомными изображениями и гифками, ну и эффектами :3
Создаём файл fox.js и пишем в него следующее:
const Discord = require('discord.js') // подключение discord.js к файлу
const fetch = require('node-fetch')
module.exports.run = (client, message, args) => {
let res = fetch('https://some-random-api.ml/img/fox') //Извлекаем json от сайта
.then(res => res.json()) // Просматриваем текст
.then(json => {
const embed = new Discord.MessageEmbed()
.setColor("RANDOM")
.setTitle(`${message.guild.name}, лисички :)`)
.setImage(json.link) // Ставим лисичку картинкой!
message.channel.send(embed); // Отсылаем сообщение
});
}
module.exports.help = {
name: 'fox' // название команды
}
Вы сможете сделать больше рандомных картинок зная сайт... Так вот!
Нажимаем например на картинку котика и пишет этот-же код, но вставляем вместо https://some-random-api.ml/img/fox -> https://some-random-api.ml/img/cat/ , а ещё меняем название команды и файла на cat.js / cat
Далее поговорим про эффекты, это будет экран wasted на аватарке пользователя дискорд!
Создаём файл wasted.js ( Вы уже знаете где) )
И пишем:
const Discord = module.require("discord.js");
const fetch = require('node-fetch')
const fs = require("fs");
module.exports.run = async (client,message,args) => {
if (!message.mentions.users.size) { // если написано $wasted, то показываем аватарку автора сообщения
let link = `https://some-random-api.ml/canvas/wasted/?avatar=${message.author.avatarURL({ format: 'png'})}` // Считываем эффект и говорим что картинка для эффекта - аватарка
const attachmentt = new Discord.MessageAttachment(link, 'triggered.gif');
const embed = new Discord.MessageEmbed()
.setTitle(`${message.author.username} ПОТРАЧЕНО!`)
.attachFiles(attachmentt)
.setImage('attachment://triggered.gif')
return message.channel.send(embed);
}
const WastedList = message.mentions.users.map(user => { // Если написали $wasted @test, то показываем триггер аватарки пользователя test
let link = `https://some-random-api.ml/canvas/wasted/?avatar=${user.avatarURL({ format: 'png'})}`
const attachmentt = new Discord.MessageAttachment(link, 'triggered.gif');
const embed = new Discord.MessageEmbed()
.setTitle(`${user.username} ПОТРАЧЕНО!`)
.attachFiles(attachmentt)
.setImage('attachment://triggered.gif')
return embed
});
message.channel.send(WastedList);
return
};
module.exports.help = {
name: "wasted"
};
Теперь сделаем команду say, бот будет удалять команду пользователя и напишет то что написано собственно после самой команды! Пример: $say Привет *Сообщение удалено * И бот пишет - Привет!
В файл say.js пишем:
// client.channels.cache.get('CHANNEL ID').send('Hello here!')
const Discord = module.require("discord.js");
const fs = require("fs");
module.exports.run = async (client,message,args) => {
if (message.member.hasPermission('MANAGE_MESSAGES')){ // Делаем проверку, что-бы не все могли использовать эту команду, смогут только те, кто может удалять сообщения на сервере
let sms = args.join(" "); // Считываем то, что хотим отправить!
message.channel.bulkDelete(1); // Удаляем сообщение с командой
message.channel.send(sms); // Отправляем сообщение
console.log(`Пользователь ${message.author.username} отправил через say: ${args.join(" ")}`); // Пишем в консоль о том, что кто-то написал сообщение через бота)
}else {
const adminerr2 = new Discord.MessageEmbed() // Если права нет, то пишем это
.setColor('#fc5184')
.setTitle(`${message.author.username}, вы не имеете прав на эту команду!`)
.setAuthor(message.guild.name)
.setFooter('Ваш бот bot © 2021')
message.channel.send(adminerr2) // Отправка ошибки
}
};
module.exports.help = {
name: "say"
};
И... На этом всё! Спасибо за чтение данной статьи и пока!