命令洪水保护mIRC

时间:2013-06-27 20:20:23

标签: mirc flooding auto-responder

我的机器人上有以下自动应答器

on *:TEXT:*sparky*:*: { msg # $read(scripts/name-responses.txt) }
on *:ACTION:*sparky*:*: { msg # $read(scripts/name-responses.txt) }

我想知道怎样才能告诉编写代码,我猜一个IF语句,如果用户键入 sparky 两倍以上,用户会被忽略120秒。这样,由于自动响应功能,我的机器人不会充斥聊天。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:-1)

我建议跟踪使用该命令的所有用户,以及他们上次使用该命令的时间。这可以通过将所有数据保存在INI文件中轻松完成。

您可以使用writeini命令保存此信息。要将数据写入此文件,请使用以下行中的内容:

writeini sparky.ini usage $nick $ctime

$ctime将评估自1970/01/01以来经过的秒数。这通常是比较事件时间的方法。

用户再次触发脚本后,您可以从此INI文件中读取值并将其与当前时间进行比较。如果时间之间的差异小于10秒(例如),它可以发送命令然后忽略它们120秒。您可以使用以下方法读取其上次使用的值:

$readini(sparky.ini, n, usage, $nick)

您的最终脚本可能看起来像以下脚本中的内容。我已将功能移到单独的别名(/triggerSparky <nick> <channel>),以避免在TEXT和ACTION事件侦听器上使用相同的代码。

on *:TEXT:*sparky*:#: {
  triggerSparky
}

on *:ACTION:*sparky*:#: {
  triggerSparky
}

alias triggerSparky {      
  ; Send the message
  msg $chan $read(scripts/name-responses.txt, n)

  if ($calc($ctime - $readini(sparky.ini, n, usage, $nick)) < 10) {
    ; This user has recently triggered this script (10 seconds ago), ignore him for 120 seconds

    ignore -u120 $nick
    remini sparky.ini usage $nick
  }

  else {
    writeini sparky.ini usage %nick $ctime
  }
}

当然,实现类似结果的一种稍微简单的方法是在预定义的时间内忽略它们而不将其数据保存在INI文件中。这样可以阻止你检查它们最近是否触发了两次,但这是一种很好的方法,例如,每两分钟只允许它们触发一次。