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

Литература => Начинаем писать скрипты на TCL (EggDrop / WinDrop) (первые шаги):


Вот Вы наконец-то установили себе бота, настроили конфиг, запустили, бот увидел вас как хозяина и сидит красуется на канале.
Что же теперь? Как же "научить" его выполнять ваши команды или например просто приветствовать всех при их входе на канал? Вы
думаете это очень сложно и непонятно? Эта статья создана что бы развеять эти убеждения. Начнем с простого.

Написание простейшего скрипта на TCL

Команда bind. Вы конечно спросите - "Что же она делает и зачем нужна?" - вот ответ: Она сообщает боту что нужно ожидать
определенное событие и как на него реагировать.

Команда: bind
Синтаксис: bind <тип события> <флаги пользователя> <текст> <процедура, которую вызывать при данном событии>
Теперь поясним каждый пункт:
<тип события> - тип события, произошедшего на IRC (в чате) или в ботнете (ботнет - 2 или более слинкованных вместе ботов, об этом
чуть позже). Например bind pub будет означать что ожидать определенной строки на канале. (о типах событий будет в продолжении)
<флаги пользорвателя> - у каждого пользователя на боте есть определенные внутренние флаги. (о флагах поговорим немного позже)
<текст> - на канале это может быть например !op или !kick, в некоторых событиях (напр. join или part) в этом месте идет хостмаска вида
"#канал ник!юзер@хост".
<процедура, которую вызывать при данном событии> - процедура (функция), которую вызывать при происхождении описанного события.

Пример:
bind pub - !beer pub:beer

Эта команда будет ожидать строку, в начале которой идет !beer и вызовет функцию pub:beer

Теперь мы создадим процедуру pub:beer. Как? - Все очень просто - командой proc.

Команда: proc
Синтакис: proc {<параметры>} { <тело процедуры> }
Поясним:
<параметры> - это параметры, которые нужны этой процедуре для нормальной работы
<тело> - это тело самой процедуры

Пример:
proc pub:beer {nick uhost hand chan text} {
<тело>
}

Почему именно эти параметры? - спросите вы. Отвечу - именно эти параметры возвращает bind с типом pub. Сейчас коротко опишем каждый:
nick - ник человека, который произнес данную фразу
uhost (userhost) - хост пользователя вида "user@host.domain.com"
hand - имя, под которым пользователь записан на боте
chan - канал, на котором была произнесена фраза
text - текст, который был написан после строки, указанной в bind (напр. !beer всем)

Теперь допишем тело процедуры.

proc pub:beer {nick uhost hand chan text} {
putserv "privmsg $chan : Держи пиво $nick!"
}

Команда: putserv
Cинтаксис: putserv "текст, отправляемый на сервер"
Пример:
putserv "privmsg $chan : Держи пиво $nick!"

Данная команда отправит на сервер строку "privmsg $chan :Держи пиво $nick"
Где $chan - переменная, содержащая имя канала, а $nick - переменная, содержащая ник.

Что же мы получим, соединив все что тут описано?

Код на TCL:
bind pub - !beer pub:beer
proc pub:beer {nick uhost hand chan text} {
putserv "privmsg $chan :Держи пиво $nick!"
}

Событие на IRC:
<юзер_Вася> !beer
<бот> Держи пиво юзер_Вася!

Как подключить скрипт к боту?

Подключение готового скрипта к боту:

Команда: source
Синтаксис: source </путь/до/файла/имяфайла.tcl>

Пример:
source scripts/beer.tcl

Сохраним наш скрипт в папку scripts в папке с ботом и этой командой подключим его к боту.
Файлы скриптов должны быть написаны в формате text-only, т.е. не должны содержать никакой
разметки как в MS Word и т.п. Создавать их лучше всего блокнотом (notepad) или vim под UNIX.

Несколько полезных советов:
1. Создайте файл scripts.conf в папке с ботом и прописывайте все нужные скрипты оттуда. Не забудьте подключить его командой source scripts.conf в конфиге бота (в самом низу)
Для чего? - А для того чтобы не листать целиком здоровый конфиг с кучей коментариев (при медленной связи по ssh или ftp, да и просто неудобно).

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

Возьмем наш скрипт:
bind pub - !beer pub:beer
proc pub:beer {nick uhost hand chan text} {
putserv "privmsg $chan :Держи пиво $nick!"
}

И научим его молчать на каналах, где скрипт не нужен.
Сделаем мы это с помощью оператора if

Синтаксис: if {<условие>} {<выполняемое действие>}
Пример:
if {1==1} { putlog "верно" }

Что за putlog? Это команда, которая пишет в лог бота указанный текст. Этот текст также идет в DCC (т.н. патилайн бота). Используется в целях отладки.
Синтаксис: putlog "text"
Пример:
putlog "текст, который пойдет в лог"

Операторы условий:
== - строго равно
!= - строго НЕ равно
>= - больше, либо равно
<= - меньше, либо равно

В одной строке if можно указывать несколько условий, объединяя их знаками:
&& - И
|| - ИЛИ
Пример:
if {{$var1==$var2} && {$var3==$var1}} { <действие> }

Вернемся к нашему скрипту:
Мы допишем в него строку if {$chan=="#MyChannel"} {}

Получим:
bind pub - !beer pub:beer
proc pub:beer {nick uhost hand chan text} {
if {$chan=="#MyChan" } {
putserv "privmsg $chan :Держи пиво $nick!"
}
}

Теперь бот будет откликаться на !beer только на канале #MyChan
Для принятия изменений в силу достаточно команды rehash
(В патилайне наберите .rehash)






Рейтинг@Mail.ru