0

所以,作为一个项目,我正在为我的 IRC 频道调整这个机器人:https ://gist.github.com/996827

我正在尝试做的是测试它发送消息的能力。消息功能似乎工作正常,但我很难让它“收听”来自频道的消息。

//handles incoming messages
irc.handle = function(data)
{
  var i, info;
  for (i = 0; i < irc.listeners.length; i++)
  {
    info = irc.listeners[i][0].exec(data);
    if (info)
    {
      irc.listeners[i][1](info, data);
      if (irc.listeners[i][2])
      {
        irc.listeners.splice(i, 1);
      }
    }
    if (irc.listeners[i] == "string that is being listened for")
    {
      irc.msg("#solidoodle", "Test,test,test"); 
    }
  }
}

我一直在尝试将其与我在控制台中看到的一些谈话相匹配。我在做任何明显错误的事情吗?我知道我需要一些正则表达式才能使其正常工作。

4

1 回答 1

0

irc.listeners显然是一个数组,其元素是数组(尽管看起来使它成为一个对象数组会是一个更好的设计,因为您使用“幻数”来索引子元素),但是在if (irc.listeners[i] == "string that is being listened for")您正在处理的行中就好像它是一个字符串数组一样。我猜你的意思是if (irc.listeners[i][someOtherMagicNumber] == ...

再一次,使用对象而不是子数组来表示每个侦听器,并为它们的元素赋予有意义的键。现在我们只能猜测监听器的第一个、第二个和第三个元素应该代表什么,如果您需要在几个月后重新访问您的代码,您也会如此。

此外,在某些情况下,您要从中删除一个元素,irc.listeners但随后会陷入对现在将成为下一个元素的进一步测试。但是,下一个元素永远不会受到早期测试的影响,因为循环的下一次迭代将跳过它。从您正在迭代的数组中删除或插入元素非常棘手且容易出错。

于 2012-08-17T02:54:27.427 回答