0
votes

certains alias de commande de bot discord fonctionnent et d'autres non, n'obtiennent aucune erreur?

Je crée donc un bot discord, et il semble fonctionner parfaitement à part une chose: parfois, les alias de commande ne fonctionnent pas. Ils n'obtiennent tout simplement pas de réponse.

Je soupçonnais que cela pouvait avoir à voir avec des apostrophes / caractères spéciaux, mais après quelques tests, j'ai conclu que les deux ne causaient pas l'erreur. Ensuite, j'ai pensé que cela pouvait être un problème avec la longueur de l'alias, mais je l'ai testé avec un mot long aléatoire comme alias et cela a bien fonctionné. J'ai cherché sur Google et je n'ai rien trouvé sur les limites des alias ou pourquoi cela pourrait se produire, donc je suis complètement perdu.

Voici le code de l'une de mes commandes qui se dérobe:

bot.on("message", async message => {
    if(message.author.bot || message.channel.type === "dm") return;

    let prefix = botconfig.prefix;
    let messageArray = message.content.split(" ")
    let cmd = messageArray[0];
    let args = messageArray.slice(1);

    if(!message.content.startsWith(prefix)) return;
    let commandfile = bot.commands.get(cmd.slice(prefix.length)) || bot.commands.get(bot.aliases.get(cmd.slice(prefix.length)))
    if(commandfile) commandfile.run(bot,message,args)

})

Ci-dessus répertorie les alias que j'ai essayés. Tous fonctionnent à l'exception de "firefly malédiction" et "test test". Cela m'a fait penser l'espace était la question, mais dans une autre commande, un alias avec un espace fonctionne. Il n'y a absolument aucune différence entre le code en dehors du texte différent dans le texte dans l'intégration, ce qui ne devrait pas affecter l'exécution du code lui-même.

Code du gestionnaire de commandes:

const fs = require("fs");
bot.commands = new Discord.Collection();
bot.aliases = new Discord.Collection();

async function load(dir){
fs.readdir(`./commands/${dir}/`, (err, files) => {
        if(err) console.log(err)

        let jsfile = files.filter(f => f.split(".").pop);
        if(jsfile.length <= 0) {
            return console.log("commands missing!");
        }

    jsfile.forEach((f, i) => {
        let pull = require(`./commands/${dir}/${f}`)
        bot.commands.set(pull.config.name, pull);  
        pull.config.aliases.forEach(alias => {
            bot.aliases.set(alias, pull.config.name)

        })
    })
});
}

Bloc de code Bot.on:

const Discord = require("discord.js");
const colors = require("../../colors.json");

module.exports.run = async (bot, message, args) => {
    let embed = new Discord.RichEmbed()
    .setColor(colors.purple)
    .setAuthor('FIREFLY CURSE', 'placeholder.image.link', 'placeholder.link')
    .setDescription("placeholder description")
    .setThumbnail('placeholder.image.link')
    .addField('Test', 'X', false)
    .addField('Test', "Y", false);
    message.channel.send({embed:embed});
}

module.exports.config = {
    name: "firefly curse",
aliases: ["fireflycurse", "fireflyc", "fc", "firefly curse", "supercalifragilisticexpialidocious", "test'test", "test test", "numbertest",]
}


2 commentaires

Veuillez afficher le code du gestionnaire de commandes (comment il détecte si un message est une commande et comment il stocke les commandes).


ajouté à l'article principal (je pense? J'en ai peut-être manqué car je ne sais pas exactement de quoi vous parlez)


3 Réponses :


0
votes

bot.on message montrer votre bloc de bot.on message

Comme d'habitude, les commandes de bot coupent avec des spases, donc si le nom de la commande a des espaces, il ne peut pas être géré par la commande hendler

PS désolé de le demander en réponse, ne peut pas écrire de commentaires: C


2 commentaires

ajouté au message principal. Je voudrais qu'il soit aussi simple que des espaces, mais comme je l' ai mentionné, il ne fonctionne pas dans certaines situations


oui votre cmd est un premier mot dans le message, donc lorsque vous essayez d'obtenir une commande avec des alliés d'espaces, le bot ne peut pas le trouver. Comme raison, vous pouvez ajouter une condition: if(!commandfile && messageArray.length > 1) messageArray = message.content.split(" ") cmd = messageArray.splice(0,2).join(' ') args = messageArray.slice(2); commandfile = bot.commands.get(cmd.slice(prefix.length)) || bot.commands.get(bot.aliases.get(cmd.slice(prefix.length))) if(commandfile) commandfile.run(bot,message,args)



0
votes

En regardant le code où vous obtenez la commande à partir du message, vous devrez tenir compte du fait que les espaces peuvent être dans la commande, ainsi que les arguments. À l'heure actuelle, vous n'attendez et ne recevez que le premier mot du message, et en faites la clé de la carte des commandes, cependant, vous devez également autoriser le premier élément des arguments à autoriser les espaces:

let commandFile;
if (args.length === 0) {
  commandFile = bot.commands.get(cmd) || bot.commands.get(bot.aliases.get(cmd));
  // this will only run if there are no arguments in the message. You can expect the command to have no spaces
} else {
  commandFile = bot.commands.get(cmd  + ' ' + args[0]) || bot.commands.get(bot.aliases.get(cmd + ' ' + args[0])) || bot.commands.get(cmd) || bot.commands.get(bot.aliases.get(cmd));
  // since the arguments length is larger than 0, the cmd + (space) + first index of arguments may be a command or alias, so check for that first. If there isn't any found, check if cmd is a command or alias
}

Si vous n'êtes pas familier avec ternary operators , voici le code développé:

if (!message.content.startsWith(botconfig.prefix)) return;

const args = message.content.slice(botconfig.prefix.length).trim().split(' ');
const cmd = args.shift().toLowerCase();
// this is a simplified way to get the command, removing the prefix and creating the arguments

let commandfile = bot.commands.get(cmd.slice(prefix.length)) || bot.commands.get(bot.aliases.get(cmd.slice(prefix.length)))

const commandFile = args.length === 0 ? bot.commands.get(cmd) || bot.commands.get(bot.aliases.get(cmd)) : bot.commands.get(cmd  + ' ' + args[0]) || bot.commands.get(bot.aliases.get(cmd + ' ' + args[0])) || bot.commands.get(cmd) || bot.commands.get(bot.aliases.get(cmd));
// the ternary operator

if (commandfile) commandfile.run(bot,message,args)


2 commentaires

Je comprends ce que vous dites, mais je ne sais pas comment intégrer votre code dans le mien. (essayé plusieurs méthodes différentes pour remplacer les variables arg / cmd existantes en vain) Si ce n'est pas trop de problèmes, pourriez-vous être plus précis avec ce que je dois remplacer?


J'ai seulement utilisé votre code (et remplacé cette section) dans l'événement de message , et j'ai simplement changé quelques lignes.



1
votes

Vous voulez créer une commande qui s'exécute comme !say hello pour que le bot envoie un message hello . Il n'est pas nécessaire d'ajouter des alias pour cela, comme say hello .

Dans votre script de bot, tout est correct sauf une erreur:

const Discord = require("discord.js");
const colors = require("../../colors.json");

module.exports.run = async (bot, message, args) => {

    if(args[0] === 'curse'){

    let embed = new Discord.MessageEmbed()
    .setColor(colors.purple)
    .setAuthor('FIREFLY CURSE', 'placeholder.image.link', 'placeholder.link')
    .setDescription("placeholder description")
    .setThumbnail('placeholder.image.link')
    .addField('Test', 'X', false)
    .addField('Test', "Y", false);
    message.channel.send({embed:embed});
}
}

module.exports.config = {
    name: "firefly",
    aliases: []
}

Maintenant, essayez la commande !firefly curse , cela fonctionnerait!


0 commentaires