所以,作为一个项目,我正在为我的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");
}
}
}
我一直试图将这与我在控制台中收到的一些话题相匹配。我做了什么明显错误的事吗? 我知道我需要一些正则表达式才能让它运作良好。
答案 0 :(得分:0)
irc.listeners
显然是一个数组,其元素是数组(虽然它看起来像是一个对象数组将是一个更好的设计,因为你使用“魔术数字”来索引子元素),但在行if (irc.listeners[i] == "string that is being listened for")
中,你将它视为一个字符串数组。我猜你的意思是if (irc.listeners[i][someOtherMagicNumber] == ...
再一次,使用对象而不是子数组来表示每个侦听器,并为其元素提供有意义的键。现在我们只能猜测一个监听器的第一,第二和第三个元素应该代表什么,所以如果你需要在几个月后重新访问你的代码,你也会这样做。
此外,在某些情况下,您正在删除irc.listeners
中的元素,但随后会进一步测试现在将成为下一个元素的内容。但是,下一个元素永远不会受到早期测试的影响,因为循环的下一次迭代将跳过它。从正在迭代的数组中删除或插入元素非常棘手且容易出错。