Данный кусок программы реагирует на слово «привет» на любом канале, где есть бот, а потом отвечает, обращаясь к этому человеку.
Никто не запрещает вам давать такие имена локальным переменным, какие нравятся. Например:
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, сервер посылает сообщение об этом боту. Этому сообщению у нас сопоставлена функция 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]
, то есть список пользователей канала. Скрипт усложнен тем, что дополнительно выводятся маски пользователей.