Вопросы по скриптам
|
|
|
dthopa 09.08.11 09:54 #76
|
Пытаюсь переделать скрипт пуля под русскую рулетку... какая команда делает/запускает рандом? я хочу сделать рандом от 0 до 6, если выпадает 3 то проиграл.
(в С+ Random(n,a) n и а - диапозон, в tcl - не знаю.)
|
|
|
|
Vladislav 09.08.11 09:59 #77
|
[rand 7] Число должно быть на 1 больше нужного. И русская рулетка есть !рхелп
|
|
|
|
dthopa 09.08.11 11:02 #78
|
о, спасибо, про рулетку я слоу... я просто почти все игры снес из бота...
вдобавок та рулетка что у вас... слишком навороченная, мне удобнее переделать пулю под рулетку. что-бы проигравший попадал в бан =)
Quote set megahal(flood) 3:120 Думаю было-бы разумно добавить globalFlood, т.к. защита от флуда распространяется на одного пользователя. А когда 10 человек задают вопросы, то канал просто переполнен тролингом бота.
Нужен наверное скрипт, который следит за общим количество обращений к боту на канале. Если, например, более 10 обращений к боту за 2-4 минуты, то бот игнорирует всех N секунд.
|
|
|
|
Vladislav 10.08.11 11:15 #79
|
В рулетке добавил в условие:
кикалку, считаю что банить слишком жестоко)
Code if {[botisop $chan] || [botishalfop $chan]} {putkick $chan $nick "$::gcolor(4)Слит!"}
А про флуд может чем поможет процедура определяется количеством команд в промежуток времени:
Code bind pub - !example PROCNAME proc PROCNAME {nick host hand chan text} { # Указываем сколько команд в какой промежуток времени можно использовать. set flood 3:180
# Создаем счетчик. if ![info exists ::mylastPROCNAME] { set ::mylastPROCNAME 0 }
# Обрабатываем настройку флуда. set max [lindex [split $flood ":"] 0] set time [lindex [split $flood ":"] 1]
# Выбираем способ отправки. if {$::mylastPROCNAME >= $max} { set type NOTICE set dest $nick } else { set type PRIVMSG set dest $chan }
# Увеличиваем счетчик и после окончания времени уменьшаем его. incr ::mylastPROCNAME utimer $time [list incr ::mylastPROCNAME -1]
# Отправляем сообщение. puthelp "$type $dest :$text" }
|
|
|
|
dthopa 10.08.11 16:41 #80
|
Я обычную пулю переделал под !релтка, вашу рулетку убрал. сделал бан 20 минут и переделал описания. Вообщем даже в такую рулетку некоторые периодически играют, и даже умудряются по 10 раз выйграть.
я в tlc скрипте полный... ну понял... немного не понятно куда это и на что менять, защиту от флуда. На каналах с онлайном под 30 это просто ужс.. каждый пытается обратится к боту.. и это превращается в хаос.
|
|
|
|
Vladislav 10.08.11 21:00 #81
|
Я ещё раз повторю, что народ наиграется и потом сам будешь просить чтоб использовали бота) видимо у тебя народ дикий, не видел ботов. У меня он стоял на канале с онлайном в 150 и ничего, кончено на таких каналах нужно все сервисы переводить в приват или на отдельный канал, так как главное это общение, а бот этому только мешает. 30 человек это пустой, канал должно быть норм.
|
|
|
|
dthopa 11.08.11 08:49 #82
|
У нас народ очень дикий (выходцы FO), из за этого один из опов канала постоянно бота банит, когда тот начинает флудить. Мне бот нужен что-бы когда в будни онлайн ИРЦ падает, или игровой сервак лежит, они хоть как-то развлекались ну и контролирует пользователей от матов, ну и давал справку.
По этому нужна защита от общего количества обращений к боту.
Для некоторых юзеров было-бы не плохо раскоментировать на русском "allprotection.tlc" Я этим скриптом не пользуюсь, но другой оп, которому я дал матера для бота спросил "что делат это/то/се".
Решил разнообразить описания в скрипте рулетки и она перестала работать, в чем ошибка? Code namespace eval bull {
variable bantime "20" variable commands {пуля рулетка} variable bulllist {"револьвер" "магнум" "самопал" "самодельный револьвер"} variable bulllist2 {"Его мозги забрызгали седящих на канале" "мозг красиво повисли на люстре" "но оружие оказалось бракованым. Она взела базар и изрешетила его"} variable bulllist3 {"патрон заклинило в гнезде, у когото удачный день" "она растроилась и кинула револьвер в сторону и ушла" "гнездо оказалось пустым. Кто-то видимо обосрался от страха, ведь там было заряжено 4 патрона"} variable bulllist4 {"Одним меньше, одним больше, какая разница?" "Что я наделала?!" "Мы все хотим справедливости!" "Будешь мне еще хамить" "Хах! как красиво растеклась его кровь" "теперь можно его продовать на органы"} foreach cmd $commands { bind pub - $::gprefix(1)$cmd [namespace current]::main } setudef flag nobull
proc main {nick uhost hand chan text} { variable bantime; variable bulllist; variable bulllist2; variable bulllist3; variable bulllist4 if {[channel get $chan nobull]} { return } if {[rand 7] != 2} {putserv "PRIVMSG $chan : Взвела $bulllistrand... *ЩЕЛК*, $bulllistrand3!"; return } if {[isop $nick $chan] && [ishalfop $nick $chan]} { putserv "NOTICE $nick :Извините, но опам запрещено использовать эту команду."; return } set bulllistrand [lindex $bulllist [rand [llength $bulllist]]]; set bulllistrand2 [lindex $bulllist2 [rand [llength $bulllist2]]]; set bulllistrand3 [lindex $bulllist3 [rand [llength $bulllist3]]]; set bulllistrand4 [lindex $bulllist4 [rand [llength $bulllist4]]] set banmask "*![regsub -- {\~} [lindex [split $uhost @] 0] {?}]@[lindex [split $uhost @] 1]" if {![file exists data/bull.dat]} {set file [open data/bull.dat w+]; close $file} set file [open data/bull.dat r] set data [read $file] if {$data == ""} { close $file set file [open data/bull.dat w] puts $file "$nick\+1" close $file putserv "PRIVMSG $chan :\001ACTION Взвела $bulllistrand... *БУМ*, $bulllistrand2\001" putserv "MODE $chan +b $banmask" putserv "KICK $chan $nick :$::gcolor(14)Ты стал$::gcolor(6) 1$::gcolor(14)-ым! $::gcolor(4)поздравляю!\003" timer $bantime [list [namespace current]::removeban $chan $banmask] putserv "PRIVMSG $chan :$bulllistrand4" } else { close $file set file [open data/bull.dat w] set who [lindex [split $data "+"] 0] set count [lindex [split $data "+"] 1] incr count puts $file "$nick\+$count" close $file putserv "PRIVMSG $chan :\001ACTION Взвела $bulllistrand... *БУМ*, $bulllist2rand\001" putserv "MODE $chan +b $banmask" putserv "KICK $chan $nick :$::gcolor(14)Ты стал$::gcolor(6) $count$::gcolor(14)-ым. Предыдущим был:$::gcolor(6) $who$::gcolor(14)!\003 (бан 20 минут=))" timer $bantime [list [namespace current]::removeban $chan $banmask] putserv "PRIVMSG $chan :$bulllistrand4" } } proc removeban {chan mask} { putserv "MODE $chan -b $mask" } строка if {[rand 7] != 2} {putserv "PRIVMSG $chan : Взвела $bulllistrand... *ЩЕЛК*, $bulllistrand3!"; return } была проверкой на права, но почему то бот имеющий +h не реагировал на halfop и по этому строка была переписано и без нее работало все.
|
|
|
|
Vladislav 11.08.11 13:09 #83
|
Ошибка всегда пишется в PuTTY или DC, если нужно вывести информацию о ошибке то сразу после неё пишем .set errorInfo или на канале !tcl $::errorInfo
Quote <Vladislav> !загрузка bullet.tcl <Windrop> -(Загрузка)- Скрипт: bullet.tcl (scripts->games) Строк: 57 Размер: 3.064КБ - ОШИБКА <Windrop> -(Ошибка)- отсутствует закрывающая фигурная скобка <Windrop> -(Ошибка)- при выполнении <Windrop> -(Ошибка)- "namespace eval bull { <Windrop> -(Ошибка)- <Windrop> -(Ошибка)- variable bantime "20" <Windrop> -(Ошибка)- variable commands {пуля рулетка} <Windrop> -(Ошибка)- Более 6 строк. Прекращаю вывод.
<Vladislav> !загрузка bullet.tcl <Windrop> -(Загрузка)- Скрипт: bullet.tcl (scripts->games) Строк: 58 Размер: 3.066КБ - OK
<Vladislav> !пуля <Vladislav> !tcl $::errorInfo <Windrop> [ERROR 0.126ms] неизвестная команда "невозможно прочитать "bulllistrand": переменная не существует <Windrop> [TCL] при выполнении <Windrop> [TCL] "putserv "PRIVMSG $chan : Взвела $bulllistrand... *ЩЕЛК*, $bulllistrand3!"" <Windrop> [TCL] (процедура "::bull::main" строка 4) <Windrop> [TCL] вызванное из <Windrop> [TCL] "::bull::main $_pub1 $_pub2 $_pub3 $_pub4 $_pub5"" <Windrop> [TCL] Более 6 строк. Прекращаю вывод.
Певрая ошибка у тебя переменные используются до их назначения, вторая ошибка не верно написана переменная и скобки внизу не хватает (возможно не скопировал сюда) ошибок видимо много, всё не смотрел, но так оно хотяб робит:
Code namespace eval bull {
variable bantime "20" variable commands {пуля рулетка} variable bulllist {"револьвер" "магнум" "самопал" "самодельный револьвер"} variable bulllist2 {"Его мозги забрызгали седящих на канале" "мозг красиво повисли на люстре" "но оружие оказалось бракованым. Она взела базар и изрешетила его"} variable bulllist3 {"патрон заклинило в гнезде, у когото удачный день" "она растроилась и кинула револьвер в сторону и ушла" "гнездо оказалось пустым. Кто-то видимо обосрался от страха, ведь там было заряжено 4 патрона"} variable bulllist4 {"Одним меньше, одним больше, какая разница?" "Что я наделала?!" "Мы все хотим справедливости!" "Будешь мне еще хамить" "Хах! как красиво растеклась его кровь" "теперь можно его продовать на органы"} foreach cmd $commands { bind pub - $::gprefix(1)$cmd [namespace current]::main } setudef flag nobull
proc main {nick uhost hand chan text} { variable bantime; variable bulllist; variable bulllist2; variable bulllist3; variable bulllist4 if {[channel get $chan nobull]} { return } if {[isop $nick $chan] && [ishalfop $nick $chan]} { putserv "NOTICE $nick :Извините, но опам запрещено использовать эту команду."; return } set bulllistrand [lindex $bulllist [rand [llength $bulllist]]]; set bulllistrand2 [lindex $bulllist2 [rand [llength $bulllist2]]]; set bulllistrand3 [lindex $bulllist3 [rand [llength $bulllist3]]]; set bulllistrand4 [lindex $bulllist4 [rand [llength $bulllist4]]] if {[rand 7] != 2} {putserv "PRIVMSG $chan : Взвела $bulllistrand... *ЩЕЛК*, $bulllistrand3!"; return } set banmask "*![regsub -- {\~} [lindex [split $uhost @] 0] {?}]@[lindex [split $uhost @] 1]" if {![file exists data/bull.dat]} {set file [open data/bull.dat w+]; close $file} set file [open data/bull.dat r] set data [read $file] if {$data == ""} { close $file set file [open data/bull.dat w] puts $file "$nick\+1" close $file putserv "PRIVMSG $chan :\001ACTION Взвела $bulllistrand... *БУМ*, $bulllistrand2\001" putserv "MODE $chan +b $banmask" putserv "KICK $chan $nick :$::gcolor(14)Ты стал$::gcolor(6) 1$::gcolor(14)-ым! $::gcolor(4)поздравляю!\003" timer $bantime [list [namespace current]::removeban $chan $banmask] putserv "PRIVMSG $chan :$bulllistrand4" } else { close $file set file [open data/bull.dat w] set who [lindex [split $data "+"] 0] set count [lindex [split $data "+"] 1] incr count puts $file "$nick\+$count" close $file putserv "PRIVMSG $chan :\001ACTION Взвела $bulllistrand... *БУМ*, $bulllistrand2\001" putserv "MODE $chan +b $banmask" putserv "KICK $chan $nick :$::gcolor(14)Ты стал$::gcolor(6) $count$::gcolor(14)-ым. Предыдущим был:$::gcolor(6) $who$::gcolor(14)!\003 (бан 20 минут=))" timer $bantime [list [namespace current]::removeban $chan $banmask] putserv "PRIVMSG $chan :$bulllistrand4" } }
proc removeban {chan mask} { putserv "MODE $chan -b $mask" }
}
|
|
|
|
dthopa 11.08.11 15:42 #84
|
Я скопировал часть скрипта "пуля" сюда. Именно ту часть, которую редактировал. Я поменял одну строчку "проверки на наличие опа" и поменял ее на рандом, при не выполнении которого игрок получает пулю. вот полный скрипт: Code #################################################### # Windrop © Vladislav # Автор: Vladislav # Версия: 1.0 # Описание: Рулетка. Банит при проигрыше. # Команды: !пулю ####################################################
namespace eval bull {
variable bantime "20" variable commands {пуля рулетка} variable bulllist {"револьвер" "магнум" "самопал" "самодельный револьвер"} variable bulllist2 {"Его мозги забрызгали седящих на канале" "мозг красиво повисли на люстре" "но оружие оказалось бракованым. Она взела базар и изрешетила его"} variable bulllist3 {"патрон заклинило в гнезде, у когото удачный день" "она растроилась и кинула револьвер в сторону и ушла" "гнездо оказалось пустым. Кто-то видимо обосрался от страха, ведь там было заряжено 4 патрона"} variable bulllist4 {"Одним меньше, одним больше, какая разница?" "Что я наделала?!" "Мы все хотим справедливости!" "Будешь мне еще хамить" "Хах! как красиво растеклась его кровь" "теперь можно его продовать на органы"} foreach cmd $commands { bind pub - $::gprefix(1)$cmd [namespace current]::main } setudef flag nobull
proc main {nick uhost hand chan text} { variable bantime; variable bulllist; variable bulllist2; variable bulllist3; variable bulllist4 if {[channel get $chan nobull]} { return } if {[rand 7] != 2} {putserv "PRIVMSG $chan : Взвела $bulllistrand... *ЩЕЛК*, $bulllistrand3!"; return } if {[isop $nick $chan] && [ishalfop $nick $chan]} { putserv "NOTICE $nick :Извините, но опам запрещено использовать эту команду."; return } set bulllistrand [lindex $bulllist [rand [llength $bulllist]]]; set bulllistrand2 [lindex $bulllist2 [rand [llength $bulllist2]]]; set bulllistrand3 [lindex $bulllist3 [rand [llength $bulllist3]]]; set bulllistrand4 [lindex $bulllist4 [rand [llength $bulllist4]]] set banmask "*![regsub -- {\~} [lindex [split $uhost @] 0] {?}]@[lindex [split $uhost @] 1]" if {![file exists data/bull.dat]} {set file [open data/bull.dat w+]; close $file} set file [open data/bull.dat r] set data [read $file] if {$data == ""} { close $file set file [open data/bull.dat w] puts $file "$nick\+1" close $file putserv "PRIVMSG $chan :\001ACTION Взвела $bulllistrand... *БУМ*, $bulllistrand2\001" putserv "MODE $chan +b $banmask" putserv "KICK $chan $nick :$::gcolor(14)Ты стал$::gcolor(6) 1$::gcolor(14)-ым! $::gcolor(4)поздравляю!\003" timer $bantime [list [namespace current]::removeban $chan $banmask] putserv "PRIVMSG $chan :$bulllistrand4" } else { close $file set file [open data/bull.dat w] set who [lindex [split $data "+"] 0] set count [lindex [split $data "+"] 1] incr count puts $file "$nick\+$count" close $file putserv "PRIVMSG $chan :\001ACTION Взвела $bulllistrand... *БУМ*, $bulllist2rand\001" putserv "MODE $chan +b $banmask" putserv "KICK $chan $nick :$::gcolor(14)Ты стал$::gcolor(6) $count$::gcolor(14)-ым. Предыдущим был:$::gcolor(6) $who$::gcolor(14)!\003 (бан 20 минут=))" timer $bantime [list [namespace current]::removeban $chan $banmask] putserv "PRIVMSG $chan :$bulllistrand4" } } proc removeban {chan mask} { putserv "MODE $chan -b $mask" } } Сравните его со своим скриптом пули...
|
|
|
|
Vladislav 11.08.11 16:32 #85
|
Вопрос то в чём? Последний код отличается от предыдущего выложенного тобой только наличием шапки и последней закрывающей скобкой.
В эту проверку ты добавил переменные $bulllistrand $bulllistrand3 которые ещё не назначены, они ниже идут set bulllistrand [lindex $bulllist [rand [llength $bulllist]]]; ... Следовательно проверка твоя должна быть под ними. И нет такой переменной $bulllist2rand есть $bulllistrand2.
Это всё ясно описано в информации о ошибках. И это всё написано в посте выше.
|
|
|
|
Evil_Moderate 01.10.11 09:40 #86
|
добавил к боту игру сказка, работала нормально
Quote [19:48:38] <Evil_Moderate> !сказка [19:48:40] <%Gemini> Для участии в игре <Сказка> наберите !рег На это у вас есть 3 мин [19:48:45] <Evil_Moderate> !рег [19:48:56] <%Волчица> !рег [19:49:07] <@ВкУсНяШкА> !рег [19:51:09] <@Nasтюша> !рег [19:51:39] <%Gemini> Регистрация в игру закончена. Начнем играть. [19:51:41] <%Gemini> В игре участвуют: Evil_Moderate Волчица ВкУсНяШкА Nasтюша [20:09:59] <@Evil_Moderate> !стоп [20:10:00] <%Gemini> Игра остановлена. [20:10:02] <%Gemini> А теперь послушайте сказку: [20:10:02] <%Gemini> Жила была Золушка ,она..................
а теперь перестал отвечать на команду стоп
Quote [14:37:56] <@Evil_Moderate> !сказка [14:37:57] <Gemini> Для участии в игре <Сказка> наберите !рег На это у вас есть 2 мин [14:38:03] <@Evil_Moderate> !стоп [14:39:56] <Gemini> Игра остановлена. Слишком мало игроков.
тоесть когда играешь и сказку уже дописали приходится ждать когда истечет время каждого игрока пробовал переустраивать скрипт,скачать с другого источника преустановить самого бота - результат тот же В чем может быть сама проблема?
|
|
|
|
Vladislav 01.10.11 10:02 #87
|
Проблема в том что у этого скрипта совпадают команды с другими скриптами в боте. !стоп это в викторине, а !рег это в рулетке. Какой скрипт загрузится последнем на тот и будут работать эти команды. Проверять нужно прежде чем ставить скрипты. Нужно заменить на ту команду которой ещё нет.
|
|
|
|
Evil_Moderate 01.10.11 10:06 #88
|
я в этом новичок,можешь пнуть на нужную литературу или показать пример,строку где можно изменить имя команды и еще добавляя скрипты нужно было добавлять команды в хелп ,пробовал прописывать но либо пропадала часть стандартной помощи либо вообще не отображался хелп. как правильнее добавить хелп на новые командвы?
|
|
|
|
Vladislav 01.10.11 10:14 #89
|
Литература и примеры простых скриптов есть в этом разделе.
Открываешь скрипт, находишь строки начинающие на bind:
Quote bind pub - !рег ::fun::reg bind pub - !стоп ::fun::stop bind pub - !имя ::fun::chhand
Данные команды уже есть у бота, меняешь на то что придёт в голову, например:
Quote bind pub - !рега ::fun::reg bind pub - !стопэ ::fun::stop bind pub - !нейм ::fun::chhand
Про хэлп:
Quote %c14|%uИгры%u%c14:%c06 %pвхелп !сказка %pсхелп
|
|
|
|
Evil_Moderate 02.10.11 09:00 #90
|
как переделать данный скрипт на все каналы ? ссори за вид,исходника не нашел.
Code ## AntiFlood Tcl script by Forb
set once 1 ## Установим значение начальной переменной (счетчик) set mlock 0 ## Переменная флаг: установлен ли +R на канал? set chann "#channel" ## Собственно, сам канал
foreach tms "[timers]" { if {([llength $tms] != 0)} { set tmc [lindex $tms 1] set tid [lindex $tms 2] if {($tmc == "unmode")} { killtimer $tid } } }
foreach tms "[utimers]" { if {([llength $tms] != 0)} { set tmc [lindex $tms 1] set tid [lindex $tms 2] if {($tmc == "strip")} { killutimer $tid } } }
## Данные процедуры убивают все таймеры при запуске (либо rehash'е скрипта). Это нужно для того, чтобы скрипт работал корректно при каждом перезапуске (иначе таймеры будут выполняться в 2 раза чаще).
utimer 20 strip ## Запускаем таймер на 20 секунд для обработки процедуры strip timer 10 unmode ## И на каждые 10 минут - процедура для снятия режима +R
proc strip { } { global once set once 1 utimer 20 strip ## Процедура strip будет обнулять счетчик по истечению 20 секунд (чтобы не перепутать флуд с обычными заходами) и повторно активировать таймер }
proc unmode { } { ## Данная процедура снимает +R по истечении 10 минут global once chann mlock if {($mlock == 1)} { ## Если режим установлен putserv "MODE $chann -R" set mlock 0 ## Снимаем его, и изменяем значение флага } timer 10 unmode ## Повторно активируем таймер }
proc joined {nick uhost handle chan args } { ## Процедура, которая будет обрабатываться при каждом заходе ника (параметры ник, хост, хэндл в боте, канал и аргументы global once chann mlock ## Глобализуем счетчик, канал и переменную-флаг if {($chan == $chann)} { incr once ## Инкрименируем счетчик, если канал совпадает с нужным if {($once >= 10)} { putchan $chann "Flood detected!" ## Если счетчик достиг 10 - пишем сообщение о детектировании флуда putserv "MODE $chann +R" ## Устанавливаем +R set mlock 1 ## И меняем значение флага на 1 } } }
bind join - *@* joined ## Устанавливаем bind на join (полную маску)
|
|
|