如何在我的IRC机器人上实施反垃圾邮件技术?

med*_*iev 2 irc node.js

我在拥有数百名用户的公共频道中运行我的机器人.昨天有人进来,只是滥用了它.

我想让任何人使用机器人,但如果他们连续发送垃圾邮件命令,并且如果他们不是像我这样的机器人"所有者",那么我想将它们添加到一个被忽略的列表中,该列表在一小时左右到期.

我想的一种方法是在所有用户中保存所有命令,例如:

({
  'meder@freenode': [{command:'.weather 20851', timestamp: 209323023 }],
  'jack@efnet': [{command:'.seen john' }]
})
Run Code Online (Sandbox Code Playgroud)

我会设置一个cron作业来每24小时刷新一次,但我基本上会确定一个人是否在15秒的持续时间内发出了X个命令并将它们添加到忽略列表中.

实际上,当我写这个答案时,我想到了一个更好的想法..也许不是存储每个用户命令,只是将机器人的命令存储在列表中并继续推动直到它达到15的限制.

lastCommands = [], limit = 5;

function handleCommand( timeObj, action ) {
    if ( lastCommands.length < limit ) {
        action();
    } else {
        // enumerate through lastCommands and compare the timestamps of all 5 commands
        // if the user is the same for all 5 commands, and...
        // if the timestamps are all within the vicinity of 20 seconds
        // add the user to the ignoreList
    }  
}


watch_for('command', function() {
   handleCommand({timestamp: 2093293032, user: user}, function(){ message.say('hello there!') })
});
Run Code Online (Sandbox Code Playgroud)

我很感激有关此事的任何建议.

nmi*_*els 11

这是一个简单的算法:

  • 每次用户向机器人发送命令时,都会增加与该用户绑定的数字.如果这是新用户,请为其创建编号并将其设置为1.
  • 当用户的号码增加到某个值(比如15)时,将其设置为100.
  • 每个<period>秒,遍历列表并将所有数字递减1.零表示可以释放用户的号码.

在执行命令之前和递增用户计数器之后,检查它是否超过你的魔法最大值(上面的15).如果是,请在执行命令之前退出.

这使您可以在一段时间后对限制操作进行评级并原谅过度行为.将您期望的禁令长度除以减量周期,以找到当用户超过您的阈值(100以上)时要设置的数字.如果特定用户在被禁止后继续发送命令,您也可以添加该号码.