TCL скрипты для eggdrop и windrop (часть 3)

Написал Danila Vershinin Четверг, 26 Июль 2007

В этой статье приводятся простые и не совсем TCL скрипты для Windrop и Eggdrop

По нарастающей: простой скрипт реагирующий на «привет» на канале:

 
bind pub - привет pub:hello
  proc pub:hello {nick host handle chan text} {
  putserv "PRIVMSG $chan :Привет, $nick!"
}

Данный кусок программы реагирует на слово «привет» на любом канале, где есть бот, а потом отвечает, обращаясь к этому человеку.

Никто не запрещает вам давать такие имена локальным переменным, какие нравятся. Например:

 
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], то есть список пользователей канала. Скрипт усложнен тем, что дополнительно выводятся маски пользователей.

Последнее обновление ( Суббота, 22 Сентябрь 2007 )
< Пред.   След. >