#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")
},
};
надеюсь, это руководство полезно 🙂