Создаю своего первого бота discord, не могу добавить ничего, кроме базовых команд

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

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

Вопрос:

Я использую discord.js а также javascript для кода. Я просто пытаюсь разобраться с этим тестовым ботом, который я сделал, и, несмотря на все пошаговые руководства, которым я в значительной степени следовал, я могу заставить бота работать только с базовыми командами, похожими на «пинг-понг». Каждый раз, когда я пытаюсь добавить что-то большее или меньшее, бот полностью перестает работать.

Вот пример кода, который у меня есть на данный момент. Это немного «странно», некоторые друзья и я, как я уже сказал, просто пытаемся понять, как сначала создать тестового бота. Может быть, это просто не укладывается у меня в голове, и я просто делаю это неправильно. В любом случае, некоторая помощь была бы полезна. Спасибо.

         /*
  A ping pong bot, whenever you send "ping", it replies "pong".
*/

// Import the discord.js module
const Discord = require('discord.js');

// Create an instance of a Discord client
// This is sometimes called 'bot', but 'client' is prefered
const client = new Discord.Client();


const token = 'MY_BOT_TOKEN';


client.on('ready', () => {
  console.log('I am ready!');
});

// Create an event listener for messages
client.on('message', message => {
  // If the message is "ping"
  if (message.content === 'silas!ping') {
    // Send "pong" in the same channel
    message.channel.send('pong');
  }
});

// Log our bot in
client.login(token);
        
  

Что я также пытаюсь сделать, так это добавить команду «СКАЗАТЬ», это то, что я использую, и как только я добавляю ее, она полностью ломает бота. А также добавление префикса.

 client.on('message', message => {
  if (message.channel.type != 'text' || message.author.bot || !message.startsWith('*'))
    return;

  if (message.content === '*ping') {
    message.channel.send('pong');
  }
});
client.on('message', message => {
  if (message.channel.type != 'text' || message.author.bot || !message.startsWith('*'))
    return;

  if (message.content === '*ping') {
    message.channel.send('pong');
  }

  else if (message.content === '*say') {
    message.channel.send(message.content);
  }
});
  

Я не уверен, означает ли это что-нибудь для получения помощи, но это ошибка, которую я получаю при попытке добавить следующий код, предоставленный мне для справки

если (!message.content.StartsWith(prefix)) возвращает; ^

Ошибка ссылки: сообщение не определено в объекте. (C:Usersmy расположение файловindex.js:23:1) [90m в модуле._compile (internal/modules/cjs/loader.js:1137:30)[39m [90m в объекте.Module._extensions..js (внутренний/modules/cjs/loader.js:1157:10)[39m [90m в модуле.загрузка (internal/modules/cjs/loader.js:985:32)[39m [90m в функции.Модуль._load (internal/modules/cjs/loader.js:878:14)[39m [90m в Function.executeUserEntryPoint [как runMain] (internal/modules/run_main.js:71:12)[39m [90m во internal/main/run_main_module.js:17:47[39m

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

1. Что вы подразумеваете под «полностью ломается»? Какое сообщение вы отправляете, что оно делает, чего вы ожидаете от него? Я опубликовал ответ, основанный на том, в чем, по моему мнению, заключается ваша проблема, но в будущем, пожалуйста, добавьте больше деталей, чтобы помочь другим ответить.

2. Правильно, извините. Я имею в виду «полностью ломается», так как НИ в ОДНОМ из кодов, которые ранее работали до каких-либо изменений, тоже не работают. Прошу прощения за отсутствие подробностей.

3. На самом деле это не вопрос ди-джеев. Теперь вам нужно знать программирование для создания специальных команд

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

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

Ответ №1:

Другим, немного более продвинутым способом было бы разделить префикс и команду. Это позволяет вам определять префикс без изменения всех .startsWith() условий.

С Array.split() помощью вы можете разделять каждое следующее слово, если между ними есть пробелы.

Это закончилось бы так:

 let prefix = "*";

// Prevents any unnecessary condition checks if the message does not contain the prefix
if (!message.content.startsWith(prefix)) return;

const args = message.content.toLowerCase().split(' ');

let command = args[0];
command = command.slice(prefix.length);

if(command === "say"){
   // do whatevery you want :)
}

  

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

Все, что будет после args[0] , будет дополнительными аргументами, которые вы можете использовать для любого случая, который вы хотите.

Ответ №2:

вы могли бы сделать config.json .

внутри вашего config.json

 {
   "TOKEN": "",
   "PREFIX": "",
}
  

а затем потребовать от вас основной файл бота, а также определить client.commands и client.aliases

 const config = require("./config.json");
client.commands = new Discord.Collection();
client.aliases = new Discord.Collection();
  

в вашем событии message вы хотите добавить обработчик команд

 client.on("message", async(message) => {
    if (message.author.bot) return;
    if (!message.guild) return;
    if (!message.content.startsWith(config.PREFIX)) return;
    if (!message.member) message.member = await message.guild.fetchMember(message);

    const args = message.content.slice(config.PREFIX.length).trim().split(/  /g);
    const cmd = args.shift().toLowerCase();
    
    if (cmd.length === 0) return;
    
    let command = client.commands.get(cmd);
    if (!command) command = client.commands.get(client.aliases.get(cmd));
    try {
    if (command) 
        command.run(client, message, args);
    } catch(error) {
        console.log(error)
    }
})
  

после этого добавьте новый вызов папки handlers и внутри handlers папки создайте новый вызов файла command.js

 const { readdirSync } = require("fs");

const ascii = require("ascii-table");

let table = new ascii("Command");
table.setHeading("Command", "Load Status");

module.exports = (client) => {
    readdirSync("./commands/").forEach(dir => {
        const commands = readdirSync(`./commands/${dir}/`).filter(file => file.endsWith(".js"));
    
        for (let file of commands) {
            let pull = require(`../commands/${dir}/${file}`);
    
            if (pull.name) {
                client.commands.set(pull.name, pull);
                table.addRow(file, '✅');
            } else {
                table.addRow(file, `❌  -> missing a help.name, or help.name is not a string.`);
                continue;
            }
    
            if (pull.aliases amp;amp; Array.isArray(pull.aliases)) pull.aliases.forEach(alias => client.aliases.set(alias, pull.name));
        }
    });

    console.log(table.toString());
}
  

а затем запрашиваю основной файл бота

 ["command"].forEach(handler => {
    require(`./handlers/${handler}`)(client);
});
  

сделайте вызов новой папки commands внутри категории команд add new folder, такой как info
простая команда ping

 module.exports = {
   name: "ping",
   aliases: ["pong"],
   description: "Check Bot Ping",
   usage: "",
   run: async(client, message, args) => {
       messsage.channel.send("PONG")
   },
};
  

надеюсь, это руководство полезно 🙂