SolarNet Irc Network logo  
Твое место под солнцем!

Литература => Продолжаем скриптинг на TCL (EggDrop / WinDrop) (Часть 2):


Вы прочитали первую статью? Если нет - советую прочесть. А теперь продолжим изучать TCL.

Пишем скрипт приветствия на канале.

Как нам обработать событие захода на канал? Незнаете? А bind нам зачем по-вашему? Вот опять мы и
встетились с этой командой (она будет встречаться нам очень часто). О ее синтаксисе и назначении я уже писал
в прошлой статье. Сейчас узнаем еще немного нового об этой команде:
bind join <флаги пользователя> <маска> <процедура>
<флаги пользователя> - флаги пользователя на боте
<маска> - маска вида "#канал ник!юзер@хост.домен" и может содержать знаки маски (как в бане * или ?) например
"#MyChan *@*" будет означать "любой юзер с любым хостом, который зашел на канал #MyChan"
<процедура> - процедура, которая будет вызвана при происхождении данного события

Переходим к написанию скрипта:

bind join - "#MyChan *@*" join:autohi
proc join:autohi {nick uhost hand chan} {
global botnick
if {$nick != $botnick} {
putserv "notice $nick :$nick привет! Добро пожаловать на $chan!"
}
}

Заметели незнакомую команду? Правильно. Команда global. Что она делает? И что за botnick?
Объясним:
Команда: global
Синтаксис: global <переменная1> [<переменная2> <переменная3> <переменнаяN>]
Что же она делает? - Объявляет данной процедуре что эти переменные надо брать из глобальной области

Теперь про botnick:
Это переменная глобальной области, содержащая ник бота.

Теперь, когда все вроде ясно, вернемся к нашему скрипту. Если вы еще не поняли что он делает, то вы видимо плохо
читали первую статью или начало этой статьи. (Советую перечитать и вникнуть).
Всеже поясню:
Строка bind join - "#MyChan *@*" join:autohi говорит боту что надо ожидать заход на канал #MyChan любого пользователя
и передавать управление процедуре join:autohi.
Строка global botnick сообщает боту что для этой процедуры надо взять переменную botnick из глобальной области.
Остальные строки вам должны быть ясны. Если вы их не понимаете - вернитесь и перечитайте первую статью.

Усложнение данного скрипта.

Все конечно хорошо. Бот приветствует всех входящих, все работает, НО приветствие однообразное и немного
надоедает потом. Чтоже делать? Менять почаще строку с приветствиями? - Нет, это плохое решение этой проблемы.
Мы пойдем другим путем (с) :)

Команда: switch
Синтаксис: switch <переменная> {
<возможное значение переменной(1)> { <выполняемое действие> }
<возможное значение переменной(2)> { <выполняемое действие> }
default { <выполняемое действие если выше описано небыло> }
}

Пример:
switch $somevar {
1 { putlog "Переменная somevar равна 1" }
2 { putlog "Переменная somevar равна 2" }
default { putlog "Переменная somevar не равна ни 1 ни 2" }
}

Можно сказать что команда switch заменяет многочисленные if (если вариантов 5 или более, то количество if при неправильном использовании может шокировать)

И возьмем для нашего скрипта функцию rand. Из названия понятно (может не всем, но это не смертельно) что функция
будет возвращать случайное число (random)

Команда: rand
Синтаксис: rand <макс. значение>
Пример:
s et myvar [rand 10]
В переменную myvar будет положено число от 0 до 10

Вернемся к нашему скрипту и немного преобразуем его:

bind join - "#MyChan *@*" join:autohi
proc join:autohi {nick uhost hand chan} {
global botnick
if {$nick!=$botnick} {
switch [rand 5] {
0 { set message "Привет $nick! Добро пожаловать на $chan!" }
1 { set message "Привет $nick!" }
2 { set message "Добро пожаловать на $chan!" }
default { set message "Wenlcome on $chan! $nick!" }
}
putserv "notice $nick :$message"
}
}

Если вы читали вдумываясь - вопросов возникнуть не должно. Если они всетаки есть - вы можете задать их на канале #scripting в сети SolarNet (irc.solarnet.ru | irc.tm-net.ru)






строительный вестник http://agro-archive.ru/ Рейтинг@Mail.ru