eggdrop.org.ru - The Russian Eggdrop Resource


  ОтветитьНовая ТемаОпрос

> Ограничение на запуск скрипта., небольшой пример
username
Отправлено: May 20 2008, 04:11 PM
Цитировать


Сдвинутый
***************

Группа: #eggdrop opers
Сообщений: 612
Пользователь №: 770
Регистрация: 2-July 05



Значит так.

В меню настроек скрипта добавляем
CODE
set cmd(delay) 15
в этой переменной время в секундах через которое возможен повторный запуск.

Далее в начале процедуры создаем область переменных cmd
CODE
variable cmd


Теперь а начале процедуры, например после проверки наличия флагов на канале проверяем сколько времени прошло с предыдущего запуска, и если прошло меньше, чем $cmd(delay) то сообщаем юзеру сколько ему еще ждать:
CODE
if {[info exists cmd(lasttime,$chan)] && [expr $cmd(lasttime,$chan) + $cmd(delay)] > [clock seconds]} {
     putserv "NOTICE $nick :Запрос не чаще одного раза в $cmd(delay) [lindex {. секунду секунды секунд} [numgrp $cmd(delay)]]."
     putserv "NOTICE $nick :Подождите [expr $cmd(delay) - [expr [clock seconds] - $cmd(lasttime,$chan)]] [lindex {. секунду секунды секунд} [numgrp [expr $cmd(delay) - [expr [clock seconds] - $cmd(lasttime,$chan)]]]] до следующего запроса."
     return
}


Если все в порядке, и время предыдущего запуска было позже, чем $cmd(delay), то, после выполнения процедуры сохраняем время когда она выполнилась, чтобы проводить проверку при следующей команде:
CODE
set cmd(lasttime,$chan) [clock seconds]


А эта процедура вернет правильные окончания для слов в сообщении о невозможности выполнить скрипт.
CODE
proc numgrp {number} {
   switch -glob -- "$number" {
       *11 {return 3}
       *12 {return 3}
       *13 {return 3}
       *14 {return 3}
       *1 {return 1}
       *2 {return 2}
       *3 {return 2}
       *4 {return 2}
       default {return 3}
   }
}


Все очень несложно, достаточно внимательно смотреть в чужие скрипты.
Если у кого-то есть другая реализация идеи то не стесняйтесь и поделитесь.


--------------------
Архив TCL скриптов, Форум и Egg.Wiki: http://egghelp.ru/
PMEmail PosterUsers Website
Top
klut05
Отправлено: May 20 2008, 04:54 PM
Цитировать


Сильно Продвинутый
*****

Группа: Участник
Сообщений: 50
Пользователь №: 819
Регистрация: 25-July 05



Спасибо,
всё классно показал.

Одна апечатка

CODE

    putserv "NOTICE $nick :Запрос не чаще одного раза в $cmd(delay) [lindex {. секунду секунды секунд} [numgrp $bart(delay)]]."

на
CODE
    putserv "NOTICE $nick :Запрос не чаще одного раза в $cmd(delay) [lindex {. секунду секунды секунд} [numgrp $cmd(delay)]]."
PMEmail Poster
Top
username
Отправлено: May 20 2008, 04:57 PM
Цитировать


Сдвинутый
***************

Группа: #eggdrop opers
Сообщений: 612
Пользователь №: 770
Регистрация: 2-July 05



QUOTE (klut05 @ May 20 2008, 04:54 PM)
Спасибо,
всё классно показал.

Одна апечатка

CODE

    putserv "NOTICE $nick :Запрос не чаще одного раза в $cmd(delay) [lindex {. секунду секунды секунд} [numgrp $bart(delay)]]."

на
CODE
    putserv "NOTICE $nick :Запрос не чаще одного раза в $cmd(delay) [lindex {. секунду секунды секунд} [numgrp $cmd(delay)]]."

Код в первом сообщении обновлен.


--------------------
Архив TCL скриптов, Форум и Egg.Wiki: http://egghelp.ru/
PMEmail PosterUsers Website
Top
klut05
Отправлено: May 21 2008, 01:36 PM
Цитировать


Сильно Продвинутый
*****

Группа: Участник
Сообщений: 50
Пользователь №: 819
Регистрация: 25-July 05



Скрипт сильно жрёт очередь сообщений,
можно как нибудь оптимизировать?

Сорри не туда имел ввиду скрипт fight.tcl
http://forum.eggdrop.org.ru/index.php?show...t=0&#entry17026
PMEmail Poster
Top
username
Отправлено: Jun 4 2009, 09:35 PM
Цитировать


Сдвинутый
***************

Группа: #eggdrop opers
Сообщений: 612
Пользователь №: 770
Регистрация: 2-July 05



Еще один, более сложный вариант, позволяет указывать количество команд за выбранное время и игнорит юзеров превысивших этот лимит.

В меню настроек добавляем:
CODE
# Сколько команд за сколько секунд считать флудом и начинать игнорить юзера.
set cmd(flood) 5:60

# Время(мин) игнора.
set acmd(ignore) 10


Далее в начале процедуры создаем область переменных cmd
CODE
variable cmd


Теперь добавляем в скрипт 2 дополнительные процедуры
CODE
# Процедура инициализации антифлуда.
   proc flood_init {} {
   variable flood_array
   global cmd
     if {$cmd(ignore) < 1} {
       return 0
     }
     if {![string match *:* $cmd(flood)]} {
       putlog "variable flood not set correctly."
       return 1
     }
     set cmd(flood_num) [lindex [split $cmd(flood) :] 0]
     set cmd(flood_time) [lindex [split $cmd(flood) :] 1]
     set i [expr $cmd(flood_num) - 1]
     while {$i >= 0} {
       set flood_array($i) 0
       incr i -1
     }
   }
  ; flood_init

   # Процедура обновляет и возвращает флудстатус юзеров.
   proc flood_cmd {nick uhost} {
   variable flood_array
   global cmd
    if {$cmd(ignore) < 1} {
       return 0
     }
     if {$cmd(flood_num) == 0} {
       return 0
     }
     set i [expr $cmd(flood_num) - 1]
     while {$i >= 1} {
       set flood_array($i) $flood_array([expr $i - 1])
       incr i -1
     }
     set flood_array(0) [unixtime]
     set aaa [expr $cmd(flood_num) - 1]
     set bbb [expr [unixtime] - $flood_array($aaa)]
     if {$bbb <= $cmd(flood_time) } {
       putlog "flood detected from ${nick}."
       newignore [join [maskhost *!*[string trimleft $uhost ~]]] flooding $cmd(ignore)
       catch {unset cmd($uhost)}
       return 1
     } else {
       return 0
     }
   }


В первой процедуре происходит обработка значений из настройки скрипта и проверка верности их ввода. Вторая процедура будет срабатывать при каждой команде и проверять не превышел ли лимит использования команд за указанное время. В случае превышения, юзер будет игнориться ботом в течении времени указанного в настройках.

И теперь самое главное, сразу в начале вашей процедуры срабатывающей от использования команды добавляем следующий код
CODE
# Проверка на флуд.
if {[flood_cmd $nick $uhost]} {
return
}


В этой проверке в процедуру flood_cmd отсылаются $nick и $uhost юзера использовавшего команду.

Все работает вполне корректно. Дальнейшая модификация приветствуется.


--------------------
Архив TCL скриптов, Форум и Egg.Wiki: http://egghelp.ru/
PMEmail PosterUsers Website
Top
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Настройки Темы ОтветитьНовая ТемаОпрос

 

Упрощённая версия


[ Script Execution time: 0.1345 ]   [ 13 queries used ]   [ GZIP включён ]

  Rambler's Top100    Peterhost    Anarxi.st Shell Hosting Provider      Яндекс цитирования  

eServer.ru :: Хостинг-оператор №1