2013-06-27 3 views
0

У меня есть следующий автоответчик на моем ботеКоманда защиты от наводнений Mirc

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

Я хотел бы знать, как я могу сказать, написать код, я предполагаю, что с помощью оператора IF, что если пользователь вводит sparky более чем в два раза больше, чем пользователь игнорируется в течение 120 секунд. Таким образом, мой бот не заливает чат из-за функции автоответчика.

Любая помощь будет оценена!

ответ

-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. Это остановило бы вас от проверки, были ли они вызваны дважды в последнее время, но это был бы хороший способ разрешить им запускать его один раз в две минуты, например.

+0

-1, есть несколько вопросов, но самым важным является отсутствие опции «n» для $ readini() !!! Это непростительно. Кроме того, неплохо использовать $$ (т. Е. Требуемые значения) в псевдонимах, вызываемых из разных мест, поскольку они делают невероятную сложность отладки, неожиданно останавливая механизм сценариев. В-третьих, идентификаторы, такие как $ chan и $ nick, автоматически наследуются с помощью псевдонимов, вызываемых непосредственно из событий, имеющих эти идентификаторы. Передача их в качестве аргументов и сохранение их в переменных делает код более сложным без уважительной причины. Особенно в этом случае. – Wiz

+0

Я забыл упомянуть отсутствующую опцию 'n' от $ read(). – Wiz

+0

думаю, я буду искать альтернативу –