【问题标题】:I need help reassigning a variable in a bot menu我需要帮助重新分配机器人菜单中的变量
【发布时间】:2020-02-14 20:08:27
【问题描述】:

我正在尝试为我的机器人构建一个设置菜单,供服务器所有者用来配置机器人。当所有者键入=setup 时触发菜单。我希望机器人回复几条询问用户问题的嵌入消息,以便正确配置机器人。

这是我的第一个Discord.js 项目,所以我不知道语法但正在努力学习。当机器人在服务器中实现时,我有一个名为前缀的常量变量分配给=

机器人菜单上的第一个提示要求用户将prefix 更改为他们想要的任何内容。我需要帮助了解如何将我的原始常量变量重新分配给他们请求的新前缀。

var PREFIX = '=';

bot.on('message', message=>{
    let args = message.content.substring(PREFIX.length).split(" ");

    switch(args[0]){
        case 'setup':
            const embed = new Discord.RichEmbed()
            .setTitle('Step 1 of 1')
            .setDescription('Set your Prefix')
            .setColor(0xF1C40F)
            message.channel.sendEmbed(embed);
            //I want the user to now enter their own PREFIX and have the
            //bot save their responce as the new PREFIX
        break;
    }
})

我想要发生的是当用户键入他们想要的prefix 时,机器人将在代码中重新分配prefix,并删除机器人问题和用户的响应,并开始提示他们下一个问题。

【问题讨论】:

  • 那么第一步就是得到反应。你对此做了什么尝试?
  • 我是新手,不知道该采取什么步骤。我查看了整个 Discord.js 文档 API,但不知道我在寻找什么

标签: javascript bots discord discord.js


【解决方案1】:

你不能prompt用户回复(据我所知),你需要等待用户写另一条消息并分析它。

消息链接到用户,因此当用户启动更改前缀的命令时,您要确保相同用户更改了前缀。

这未经测试,但应该接近您正在寻找的解决方案。


let prefix = '=';
let expectingResponseFrom = null;

bot.on('message', message=>{

    // same user sent a response
    if(expectingResponseFrom !== null && expectingResponseFrom === message.user.id){
      expectingRepsonseFrom = null;
      prefix = message.content.trim();
      return;
    }

    const regex = new RegExp(`^${prefix}([^\s]+)`, 'g');
    cosnt command = regex.exec(message.content)[1] || '';

    switch(command){
        case 'setup':
            const embed = new Discord.RichEmbed()
            .setTitle('Step 1 of 1')
            .setDescription('Set your Prefix')
            .setColor(0xF1C40F)
            message.channel.sendEmbed(embed);
            // memorize user who initiated a prefix change
            expectingResponseFrom = message.user.id;
        break;
    }
})

正则表达式允许更好(我认为)获取命令的方式

console.log(
  (/^=([^\s]+)/g).exec("=hello should not get this"),
  (/^=([^\s]+)/g).exec("="),
  (/^=([^\s]+)/g).exec("= should not get this")
)

【讨论】:

    【解决方案2】:

    取决于您的机器人是否将位于具有不同前缀的多个服务器中:

    • 如果是这样,那么您需要一个数据库来保存每个服务器的前缀和 然后在用户从该服务器发送消息时获取它
    • 如果不是,我会使用 json 文件来存储前缀,然后有节点 在需要更改时编辑文件

    或者看看https://discordjs.guide/keyv/那里有一个很棒的教程可以做你想做的事

    【讨论】:

    • 也快速说明一下,你仍然可以将数据库用于单个服务器,它可能会更好但更复杂
    【解决方案3】:

    您绝对应该使用数据库来存储前缀和其他服务器设置,它比使用 JSON 文件更有效和稳定。

    如果您不确定要使用什么,我建议您使用mongoose 和/或只使用MongoDB

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 2018-09-14
      • 2021-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多