Бот Discord с помощью JavaScript!


Создайте бота Discord с помощью JavaScript!

Чтобы не запутаться, если вы никогда раньше не создавали бота Discord, следуйте этому руководству в первой половине.

Когда вы дойдете до раздела “Начальные файлы”, остановитесь на нем и продолжайте с этого момента.

Как только вы настроите приложение бота и подготовите токен, мы можем начинать!

Начальные файлы

Создайте домашний каталог, в котором будут храниться все файлы, необходимые для работы бота.

Начните работу со следующих команд:

  • npm init
    Следуйте каждой подсказке и выполните ее.

  • npm install discord.js discord-api-types dotenv

  • npm install nodemon -D.

Теперь в файле package.json есть “start” и “server” под объектом скрипта. Это лишь фрагмент того, что должно быть в файле, но их должно быть больше.

"main": "index.js",
"scipts": {
  "start": "node .",
  "server": "nodemon ."
}
Вход в полноэкранный режим Выход из полноэкранного режима

В данном случае “main” будет файлом, запускающим бота, в котором будет находиться основная часть кода. Позже мы проведем рефакторинг, чтобы привести его в порядок.

  • touch index.js
  • touch .env
  • .gitignore

Чтобы создать git-репо, выполните команду git init

.gitignore

В файле .gitignore разместите:

  • node_modules
  • .env
  • config.json

.env

В .env будет находиться токен бота

  • TOKEN=

index.js

// './index.js'

const { Client, Intents } = require('discord.js')
require('dotenv').config()

// Create a new client instance
const client = new Client({
  intents: [Intents.FLAG.GUILDS, Intents.FLAHS.GUILD_MESSAGES],
})

// When the client is ready, run this code only once
client.once('ready', () => {
  console.log(`Logged in as ${client.user.tag}`)
})

// Login to Discord with your client's token
client.login(process.env.TOKEN)
Вход в полноэкранный режим Выйти из полноэкранного режима

Тестирование бота

Запустите бота через node напрямую или используя один из скриптов, которые мы написали ранее, чтобы запустить бота.

npm start или npm server.

В качестве альтернативы вы можете запустить скрипты вручную с помощью node index.js.

control + c, чтобы убить бота для добавления дополнительного кода.

Сделайте несколько вещей

В файле index.js мы заставим бота отвечать на сообщения сообщением и иметь возможность получить случайную цитату.

// './index.js'

// require 'node-fetch'
const fetch = require('node-fetch')

...

// Get random quote
function getQuote() {
  return fetch('https://zenquotes.io/api/random')
    .then((res) => {
      return res.json()
    })
    .then((data) => {
      return data[0]['q'] + ' -' + data[0]['a']
    })
}

// Respond to message
client.on('messageCreate', (msg) => {
// Do not allow a bot to reply to this
if (msg.author.bot) return

// Switch statement to check for incoming messages that match
  switch (msg.content) {
    case 'hello':
      msg.channel.send(`Hello ${msg.author.username}`)
      break
    case 'ping':
      msg
        .reply('pong')
        .then((msg) => {
          setTimeout(() => msg.delete(), 5000)
        })
        .then(console.log('We just got pinged!!!'))
      break
    case '$inspire':
      getQuote().then((quote) => msg.channel.send(quote))
      break
    default:
      break
  }
}) 

...
Войти в полноэкранный режим Выход из полноэкранного режима

Убедитесь, что в каждом случае есть break, иначе бот пробежит через оператор и вывод не будет иметь смысла, так как он вернет все, что было в switch.

Также сообщение “inspire” с “$” будет действовать как псевдокоманда в этом случае, если вы хотите избежать проверки некоторых слов.

Время рефактора

index.js сейчас довольно захламлен, поэтому пришло время для некоторой очистки. Эта практика поможет сохранить понимание того, как должен действовать бот, вместо того, чтобы искать во всем файле какую-то проблему, которая могла возникнуть.

index.js

// './index.js'
// add external file
const listener = require('./listener')

...

// After "client.once" 
// Respond to message (refactored)
client.on('messageCreate', (message) => {
  listener.onMessage(message)
})

...
Вход в полноэкранный режим Выход из полноэкранного режима

listener.js

// './listener.js'

const Functions = require('./Functions')

function onMessage(message, client) {
// Ignore other bots
  if (message.author.bot) return

  message.content = message.content.toLowerCase()
  switch (message.content) {
    case 'hello':
      message.channel.send(`Hello ${message.author.username}`)
      break
    case 'ping':
      message
        .reply(Functions.getPing(message))
        .then((message) => {
          setTimeout(() => message.delete(), 5000)
        })
        .then(console.log('We just got pinged!!!'))
      break
    case '$inspire':
      Functions.getQuote().then((quote) => message.channel.send(quote))
      break
    default:
      break
  }
}

module.exports = { onMessage }
Вход в полноэкранный режим Выход из полноэкранного режима

Мы перенесли слушатель messageCreate в новый файл, он будет вызываться и возвращаться при совпадении одного сообщения.

Functions.js

// Require 'node-fetch' for quotes
const fetch = require('node-fetch')

// Get random quote
function getQuote() {
  return fetch('https://zenquotes.io/api/random')
    .then((res) => {
      return res.json()
    })
    .then((data) => {
      return data[0]['q'] + ' -' + data[0]['a']
    })
}

function getPing(message) {
  let latency = `Latency is ${message.createdTimestamp - Date.now()}ms.`
  console.log(`Latency is ${message.createdTimestamp - Date.now()}ms.`)
  return latency
}

module.exports = {
  getQuote,
  getPing,
}
Вход в полноэкранный режим Выход из полноэкранного режима

Моя основная цель с Functions.js – добавить произвольные функции/методы для локализованного места для тестирования другой функциональности.

Позже я могу добавить слэш-команды для выполнения действий ботом и возможность отображения контекстного меню для команд, к которым пользователь будет иметь доступ в зависимости от уровня доступа/гильдии.

До тех пор бот будет оставаться бэкенд-обработчиком для управления сервером для использования на некоторых серверах Discord.

Оцените статью
Procodings.ru
Добавить комментарий