Web Вход

 

TCL скриптинг для eggdrop'ов [статья #3] - Автор: Sat

В продолжении статей Sat’a вот моя… Я не такой писатель как он – поэтому будет больше программ чем текста…
По-нарастающей: простой скрипт реагирующий на "hi" на канале.

bind pub - привет pub:hello
proc pub:hello {nick host handle chan text} {
putserv "PRIVMSG $chan :Привет, $nick!"
}
Данный кусок программы реагирует на слово hi на любом канале, где есть бот, а потом отвечает, обращаясь к этому человеку.
Никто не зарещает Вам давать имена локальным переменным какие Вам нравятся. Например:

bind pub – привет pub:hello
proc pub:hello {n uh h ch t} {
putserv "PRIVMSG $ch :Привет, $n!"
}
Самая главная команда которой Вам придется пользоваться при отправки сообщений на IRC сервер – это putserv. Эта команда помещает вашу информацию в специальный буфер. А бот сам уже отправляет.

А теперь к более сложным скриптам (работа с WATCH).

bind raw - 600 nick:on
bind raw - 604 nick:on
bind raw - 605 nick:off
bind raw - 601 nick:off
bind pub - hello pubcommand_hello
bind pubm - "*!watch*" nick:add
bind pubm - "*!off*" nick:rem

set c_chan "#work.net"

proc nick:on { from keyword text } {
global c_chan
set wt [lindex $text 1]
putserv "NOTICE $c_chan :АЛЯЯЯЯЯЯЯЯЯЯЯРМ ( $wt ) ! Для подробной информации наберите: /whois $wt"
}

proc nick:off { from keyword text } {
global c_chan
set wt [lindex $text 1]

putserv "NOTICE $c_chan :Отбой ( $wt ) ! /whowas $wt "
}

proc nick:add {nick host handle chan text} {
set wt [lindex $text 1]
putserv "NOTICE $nick :Теперь я шпионю за $wt"
putserv "WATCH +$wt"
}

proc nick:rem {nick host handle chan text} {
set wt [lindex $text 1]
putserv "NOTICE $nick :Теперь я отстал от $wt"
putserv "WATCH -$wt"
}
Сначала надо было сопоставить событиям некоторые функции. Например 600 и 604 возникает, когда определенный ник входит в online. 605 и 601 – когда выходит.

Так же нам понадобится еще 2 функции которые будут добавлть и удалять пользователей из списка просмотра. Когда пользователь вводит !watch Толик то происходит запуск программы. В параметр $text передается значение «!watch Толик». При помощи функции set wt [lindex $text 1] отделяем второе слово и записываем его в переменную $wt. После этого выводим пользователю нотис с подтверждением и отправляем на сервер команду, которой просим его уведомить бота когда данный ник войдет в онлайн. Аналогично работает и !off толкь в команде передается – (минус) и немного другой коментарий.

Как только пользователь входит в online сервер посылает боту сообщение о том что даынный пользователь вошел в online. Этому сообщению у нас сопоставленна функция nick:on. Так эе отделяем имя пользователя от всякого сервисного «хлама». И выводим его в нотис. Аналогично работает функция nick:off
Теперь надо сделать так чтобы только опы могли добавить и удалить какого то пользователя из списка наблюдения. Для этого модифицируем фукции nick:add и nick:rem:

proc nick:add {nick host handle chan text} {
set wt [lindex $text 1]

if {[isop $nick $chan]} {
putserv "NOTICE $nick :Теперь я шпионю за $wt"
putserv "WATCH +$wt"
return
} else {
putserv "NOTICE $nick :Только операторы могут производить такие действия."
}
}

proc nick:rem {nick host handle chan text} {
set wt [lindex $text 1]

if {[isop $nick $chan]} {
putserv "NOTICE $nick :Теперь я отстал от $wt"
putserv "WATCH -$wt"
} else {
putserv "NOTICE $nick :Только операторы могут производить такие действия."
}
}

В данной программе предусмотренна проверка на наличие опа. Эту проверку делает функция isop. Она берет в качестве параметров ник и канал. И возвращает 1, если оп действительно есть. И соответственно 0 – если опа нету.

Программа которая кикает.

bind pub o !kick pub:kick

proc pub:kick {nick host hand chan text} {
set kogo [lindex $text 0]
set pochemu [lrange $text 1 end]
if {[onchan $kogo $chan]} {
putserv "KICK $chan $kogo :$pochemu"
} else {
putserv "PRIVMSG $chan :Извини, $nick, но $kogo нету на $chan"
}
}
Эта программа работает примерно так:
Вы вводите !kick НикВрага а за просто так в качетве теста.
Теперь расмотрим как это чуда работает:
Сначал мы ставим bind как обычно. Однако там появился дополнительный значек. Букавка n. Эта буковка демонстрация еще одно возможности egg’a. Т.е. она указывает боту что надо слушать строку «!kick» только от owner’ов. Остальных бот будет игнорировать. Можно указать o – оператор. Не надо путать флаги на ботах с флагами на каналах. Если вы хоть фаундер канала, а на боте у вас нету оператора канала (или выше) то бот Вас просто проигнорирует.
Далее идет сама программа.
Сначала отделяем первое слово (индекс 0) – это будет ник того, кого мы собрались кикнуть.
Все что идет дельше – причина по кторой кикнули. С второго по последнее слово (нумерация слов в массиве идет с 0, т.е. второе слово в предложении будет иметь индекс 1).
Далее мы проверяем есть ли такой пользователь на канале. Если есть – кикаем, если нету то сообщаем об этом тому кто вызвал команду.

Функция котора сразу и кикает и банит.
Работает так !ban КОЛЯ а для профилактики :)

bind pub - !ban pub:kickban

proc pub:kickban {nick host hand chan text} {
set kogo [lindex $text 0]

set pochemu [lrange $text 1 end]

if {[onchan $kogo $chan]} {
set mask [maskhost [getchanhost $kogo $chan]]
putserv "MODE $chan +b $mask"
putserv "KICK $chan $kogo :$pochemu"
putserv "PRIVMSG $chan :$kogo в след раз будет умнее : $pochemu"
} else {
putserv "PRIVMSG $chan :Извини, $nick, но $kogo нету на $chan"
}
}
Первая строка получет имя пользователя. Вторая получает хост пользователя $kogo с канала $chan. Третья получет причину, То что идет в след за ником. Потом идет проверка на сужествование пользователя на канале. Если пользовательс существет, то происходит бан+кик. Если его нету – то об этом сообщается на канал.

Ну и назасладочку перебор пользователей на канале. Абсолютно бесполезный конкретный пример – но он просто демонстрирует возможности.

bind pub - !chanlist pub:chanlist

proc pub:chanlist {nick host hand chan text} {
foreach nick [chanlist $chan] {
set mask [maskhost [getchanhost $nick $chan]]
putserv "PRIVMSG $chan :$nick ( $mask )"
}
}
Здесь все вполне очевидно. Классический перебор. А в качестве того что мы перебираем берем [chanlist $chan]. Список пользователей канала. Скрипт усложнен тем, что дополнительно вывоятся маски пользователей.

 

Copyright (с) 2004-2005 by Vozotron