Web Вход

 

Начинаем скриптить на TCL (EggDrop / WinDrop) [часть 2] - Автор: Bart[mdv]

Вы прочитали первую статью? Если нет - советую прочесть. А теперь продолжим изучать 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 <макс. значение>
Пример: set 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"
}
}


Если вы читали вдумываясь - вопросов возникнуть не должно

_____________________________
(с) Bart[mdv]@WeNet 2003 год.
Выкладывание этой статьи с сохранением копирайта и без изменений текста разрешено.
Желательно поставить меня в известность.

Copyright (с) 2004-2005 by Vozotron