【问题标题】:Why doesn't Sender = Recipient?为什么发件人不=收件人?
【发布时间】:2020-12-19 18:57:56
【问题描述】:

我一直在将为 discord.js v11 编写的 Discord 机器人代码转换为 v12。我仍然无法工作的唯一部分代码是一个利用 enmap 数据的循环: 我当前的代码:

exports.run = (client, message, args) => {
  let serverlist = client.guilds.cache.array(); // Grabs the Guilds.
  const server = message.guild.id; // Key for client.Networks
  let Sender = client.Networks.get(server); // Key is already defined with 'server' there is no point typing it out again unless it is different.
  const input = args.join(" "); // Joins the arguments together.
  for (let i = 0; i < serverlist.length; i++) {
    let Recipient = client.Networks.get(serverlist[i].id);
    Recipient = parseInt(Recipient);
    //if (Sender == Recipient) {
    if (server === serverlist[i].id) {
      try {
        if (
          !serverlist[i].channels.cache.find(
            (channel) => channel.name === "broadcast"
          )
        )
          continue; // If the channel it just skips it, and starts from the top again.

这是原始代码:

exports.run = (client, message, args) => {
  var serverlist = client.guilds.array();
  console.log(client.Networks);

  var server = message.guild.channels;
  var Sender = client.Networks.get(message.guild.name);
  const input = args.join(" "); //rejoins arg array into string
  for (var i = 0; i < serverlist.length; i++) {
    //get network id of message sender
    var Recipient = client.Networks.get(serverlist[i].name);
    Recipient = parseInt(Recipient);

    if (Sender == Recipient) {
      try {
        var serv = serverlist[i].channels.find(
          (serv) => serv.name === "broadcast"
        );

Enmap 数据似乎存储得很好。键是服务器 ID,每个键的值是服务器所属网络的名称。该循环应该将消息传输到网络中每个服务器上的#broadcast 频道。代码在发件人 === 收件人检查时失败。如果在机器人正在检查的服务器之一上找不到#broadcast 频道,则尝试以捕获结束。 为什么发件人和收件人不匹配,这个循环结构是否正确?

【问题讨论】:

    标签: javascript node.js networking discord.js bots


    【解决方案1】:

    我注意到您使用了parseInt(Recipient),但没有使用parseInt(Sender)。因此,您的 Sender 可能是一个字符串,而您的 Recipient 可能是一个整数。在您的旧代码中,您使用松散相等== 进行了比较,它执行type coercion。但是在您当前的代码中,您使用的是严格相等 ===,如果要检查的两个值是不同的类型(字符串和 int),这永远不会是真的。

    如果您没有特别需要发送者或接收者实际上是一个数字,我建议您删除 Recipient = parseInt(Recipient) 行。如果你这样做,我建议使用Unary plus

    var Sender = +client.Networks.get(message.guild.name);
    var Recipient = +client.Networks.get(serverlist[i].name);
    

    【讨论】:

    • 是的,实际上我已经将其更改为用户服务器 ID,而不是 v12 代码中的名称。我也在考虑擦除所有发件人/收件人代码,只使用 Enmap.ForEach 或 Enmap.Filter 之类的东西,因为循环正在检查一个 enmap 以发送到具有相同值(网络名称)的每个服务器这可能会很多更简单。
    • @Startropic1 你做到了!原谅我,我没有注意到这种变化。我将删除答案的那一部分,因为它无关紧要。
    猜你喜欢
    • 2018-10-28
    • 2022-06-27
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    相关资源
    最近更新 更多