Автор: Сергей LuXe

Всем привет. Мне бы хотелось рассказать об установке чудо бота Eggdrop. Конечно же сейчас в сети можно найти уже готовых и настроенных ботов, где лишь нужно подправить немножко конфиг и бот готов. Но всё-таки согласитесь, что намного интересней собирать бота с нуля… Собирать бота именно таким, каким вы хотите его видеть.

Итак, что же такое Eggdrop?

Eggdrop - это IRC-бот, написанный на языке C, доступный для любой более-менее распространённой платформы (unix, win32, amiga, etc…). Тесная интеграция языка Tcl (тикль) позволяет писать собственные высокопроизводительные скрипты для расширения функциональности бота, что при определённых навыках программирования открывает почти безграничные возможности.

Что нужно для работы?

Для работы бота необходим shell. Shell'ом называют наличие доступа к серверу (обычно Unix-серверу), на котором у вас есть право работать в качестве пользователя (закачивать, удалять, создавать, копировать файлы и, конечно же, запускать).
Обычно, shell-account можно получить следующими путями: В общем без разницы, где и каким образом вы его приобретёте :)

Установка TCL

Для сборки Eggdrop вам обязательно необходим TCL (язык программирования, который используется в ядре бота). Устанавливаем версию 8.6.1 по инструкции.

Установка Eggdrop

Работаем через SSH клиент в Linux сервере Debian 7 от обычного пользователя в папке
/home/dim/irc
.
Теперь нам нужно скачать самого бота. Я рекомендую взять бота от легендарного Buster'a. Почему именно его? Да потому что этот бот уже пропатчен и в нём есть все необходимые модули, чтобы он был функциональным и полезным.
  1. Скачиваем Eggdrop:
    wget https://raw.githubusercontent.com/dimst/IRC/master/eggdrop1.6.21-sp0011-modules.tar.bz2
  2. Распаковываем скачанный архив:
    tar xf eggdrop1.6.21-sp0011-modules.tar.bz2
  3. Для удобства переименовываем распакованную папку:
    mv eggdrop1.6.21-sp0011-modules eggdrop-src
  4. Переходим в папку с исходниками:
    cd eggdrop-src
  5. Запускаем конфигуратор бота с указанием папки, куда будет установлен Eggdrop:
    ./configure --prefix=/home/dim/irc/eggdrop --with-tcllib=/usr/lib/libtcl8.6.so --with-tclinc=/usr/include/tcl.h
  6. Запускаем конфигурацию модулей:
    make config
  7. Запускаем компиляцию:
    make
  8. Запускаем инсталяцию:
    make install
  9. Переходим в директорию с установленным ботом:
    cd ../eggdrop
  10. Создаём директорию tmp:
    mkdir tmp
  11. Переименовываем стандартный конфигурационный файл eggdrop.conf:
    mv eggdrop.conf eggdrop.conf-default
  12. Создаём свой eggdrop.conf (сохраняем файл в кодировке Windows-1251):
    nano eggdrop.conf

Настройка Eggdrop

  1. Редактируем файл eggdrop.conf под свой IRC сервер:
    # Кодировка IRC-сети. Должна совпадать с кодировкой файла
    set irc_encoding cp1251
    
    bind dcc n tcl *dcc:tcl
    bind dcc n set *dcc:set
    
    # Язык бота
    addlang "ru"
    addlang "russian"
    
    # Ник бота
    set nick "Eggdrop"
    set altnick "Eggdrop_"
    
    # Идент
    set username "Eggdrop"
    
    # Реальное имя
    set realname "Eggdrop"
    #set realname "\x03\x33\x0F${realname}"
    
    # Ник владельца бота
    set admin "LuXe"
    set owner "LuXe"
    
    # Название IRC-сети
    set network Dreamterra
    
    # IRC-сервера, к которым подключится бот
    set servers {  irc.dreamterra.net }
    
    # Порт бота для подключения через telnet
    listen 8850 all
    
    # Если на вашем сервере более одного IP-адреса, укажите используемый для бота
    #set my-ip "95.85.45.90"
    #set my-hostname "dreamterra.net"
    
    # Прокси
    #set firewall "прокси:порт"
    
    # Префикс для команд
    set gprefix(1) "!"
    
    # Настройка цвета. Чтобы не выводить цвета, сотрите значения между ковычек "
    set gcolor(1) "\00301"
    set gcolor(2) "\00302"
    set gcolor(3) "\00303"
    set gcolor(4) "\00304"
    set gcolor(5) "\00304"
    set gcolor(6) "\00307"
    set gcolor(7) "\00307"
    set gcolor(8) "\00308"
    set gcolor(9) "\00309"
    set gcolor(10) "\00310"
    set gcolor(11) "\00311"
    set gcolor(12) "\00312"
    set gcolor(13) "\00313"
    set gcolor(14) "\00314"
    set gcolor(15) "\00315"
    
    
    # Расположение различных файлов и директорий
    set mod-path "modules/"
    set help-path "help/"
    set text-path "text/"
    set temp-path "tmp/"
    
    # Подгрузка модулей
    loadmodule channels
    loadmodule server
    loadmodule ctcp
    loadmodule irc
    loadmodule notes
    loadmodule console
    loadmodule blowfish
    loadmodule transfer
    
    # Названия системный файлов
    set userfile "bot.user"
    set chanfile "bot.chan"
    set notefile "bot.notes"
    
    # Настройка логов
    set raw-log 0
    set log-time 1
    set quiet-save 1
    set max-logs 100
    set quick-logs 1
    set max-logsize 0
    set keep-all-logs 1
    set console "mkcobxs"
    set logfile-suffix ".%Y%b%d"
    set timestamp-format {[%H:%M:%S]}
    # В 'system.log' будут храниться приватные msg/ctcp, команды, прочая информация и ошибки с каналов. (закомментировано)
    #logfile mco * "logs/system/system.log"
    # В 'имя_канала.log' будут храниться публичные разговоры, входы, выходы, кики, баны и смены режимов вашего канала. (закомментировано)
    logfile jpk #общалка "logs/общалка.log"
    
    # Глобальные настройки. Тут можно вообще даже не смотреть ни на что.
    set global-chanset {
            -autoop         -autovoice
            -bitch          -cycle
             +dontkickops    +dynamicbans
             +dynamicexempts +dynamicinvites
             -enforcebans    +greet
             -inactive       -nodesynch
             -protectfriends -protectops
             -revenge        -revengebot
            -secret         +seen
             +shared         -statuslog
            +userbans       +userexempts
             +userinvites    -protecthalfops
     	-autohalfop
    }
    
    # Необходимо для управления ботом. Не менять ничего.
    set protect-telnet 0
    set open-telnets 0
    set never-give-up 1
    set server-cycle-wait 120
    set select_timeout 100
    set max_tcl_events 20
    set bounce-bans 1
    set net-type 0
    set keep-nick 1
    set max-notes 50
    set note-life 60
    set allow-fwd 0
    set notify-users 0
    set console-autosave 1
    set flood-msg 60:60
    set flood-ctcp 3:60
    set ident-timeout 1
    
    # Глобальные настройки, которые будут использованы при +chan.
    set global-flood-chan 7:10
    set global-flood-deop 3:10
    set global-flood-kick 3:10
    set global-flood-join 7:60
    set global-flood-ctcp 3:60
    set global-flood-nick 5:60
    set global-aop-delay 5:30
    set global-idle-kick 0
    set global-stopnethack-mode 0
    set global-revenge-mode 3
    set global-exempt-time 60
    set global-invite-time 60
    set global-ban-time 0
    set global-chanmode "nt"
    
    # Набор стандартных скриптов.
    source scripts/alltools.tcl
    source scripts/action.fix.tcl
    source scripts/compat.tcl
    source scripts/userinfo.tcl
    loadhelp userinfo.help
    
    # Набор системных скриптов
    
    
    # Скрипты работающие через интернет
    
    
    # Разные скрипты
    
    
    # Дополнительные модули
    source conf/stats.conf
    source conf/gseen.conf
    
    
    # Cкрипт, который выполнится во время подключения к серверу
    set init-server {
    putquick "umode2 +B"
    }
  2. Создаём конфигурационный файл модуля gseen.mod, который собирает информацию о том, когда пользователь последний раз присутствовал на канале и по запросу предоставляет ее другим пользователям по команде !seen.
    nano gseen.conf
    Содержимое файла:
    ######
    #####
    ### Основные настройки
    #####
    ######
    
    # Файл, где будут хранитсья данные
    # Обязательно должен загружаться до загрузки самого модуля!
    set gseenfile "data/gseen.dat"
    
    # Загрузка модуля
    loadmodule gseen
    
    # Загрузка языкового файла
    loadseenslang "ru" "Russian" language/gseen.ru.lang
    
    # Установки языкового файла по умолчанию
    set default-slang "ru"
    
    # Установка для определенного канала определенный языковой файл
    #setchanseenlang #Germany "de"
    
    # Префикс для публичных команд
    set cmdchar "!"
    
    # Через сколько дней удалять не активных юзеров
    set expire-seens 60
    
    # Антифлуд, 7 запросов за 60 секунд
    set max-seens 7:60
    
    # Сообщать пользователям о том что их искали? [1\0]
    set tell-seens 1
    
    # Проверять, есть ли пользователь в сети, но под другим ником? [1\0]
    set fuzzy-search 1
    
    # Разрешать использовать подстановочные знаки (* и ?) при запросе? [1\0]
    set wildcard-search 1
    
    # Прекращать поиск, если найденно более чем указаное число совпадений
    set max-matches 250
    
    # Использовать опрос ботов в ботнете? [1\0]
    set botnet-seens 1
    
    # Заменять каналы с режимом +s как [secret]? [1\0]
    set hide-secret-chans 1
    
    # Через сколько минут делать бэкап базы
    set save-seens 60
    
    # Максимальная длина ника
    set seen-nick-len 32
    
    ######
    #####
    ### Остальные настройки
    #####
    ######
    
    # Маски для seen
    set ai-seen-binds {
      "${nick}*seen*"
      "${botnet-nick}*seen*"
      "${nick}*gesehen*"
      "${botnet-nick}*gesehen*"
    }
    
    # Маски для seenstat
    set ai-seenstats-binds {
      "${nick}*seenstats*"
      "${botnet-nick}*seenstats*"
    }
    
    # Слова для игнорирования модулем
    set ai-seen-ignore "$nick ${botnet-nick} seen"
    
    ######
    #####
    ### Специальные настройки, можно не обращать внимания
    #####
    ######
    
    # Если пользователь известен боту, то искать по хэндлу
    # Не рекомендуется, может привести к путанице..
    set use-handles 0
    
    ######
    #####
    ### Устаревшие настройки (актуальны для пользователе версии eggdrop v1.4)
    #####
    ######
    
    # Список каналов, где бот не должен работать
    set no-pub-seens ""
    
    # Каналы, где бот будет отвечать нотисом
    set quiet-seens ""
    
    # Каналы, где бот будет отвечать нотисом на запросы ai-seen
    set quiet-ai-seens ""
    
    # Каналы, с которых вести статистику
    set no-seendata ""
    
    
    ###############################################################################
    # Конец конфига
    # Не обращайте внимания на строчки ниже ;)
    ###############################################################################
    
    bind chjn - * *chjn:gseen
    bind chpt - * *chpt:gseen
    
    catch "unbind pub - !seen *pub:!seen"
    catch "unbind pub - !син *pub:!seen"
    catch "unbind pub - !seennick *pub:!seennick"
    catch "unbind pub - !seenstats *pub:!seenstats"
    bind pub - ${cmdchar}seen *pub:!seen
    bind pub - ${cmdchar}син *pub:!seen
    bind pub - ${cmdchar}seennick *pub:!seennick
    bind pub - ${cmdchar}seenstats *pub:!seenstats
    
    foreach bnd [binds pubm] {
      if {([lindex $bnd 2] == "*pubm:seen") || ([lindex $bnd 2] == "*pub:!seenstats")} {
        unbind [lindex $bnd 0] [lindex $bnd 1] [lindex $bnd 2] [lindex $bnd 4]
      }
    }
    
    if {${ai-seen-binds} != ""} {
      foreach mask ${ai-seen-binds} {
        bind pubm -|- "% [subst $mask]" *pubm:seen
      }
    }
    
    if {${ai-seenstats-binds} != ""} {
      foreach mask ${ai-seenstats-binds} {
        bind pubm -|- "% [subst $mask]" *pub:!seenstats
      }
    }
  3. Создаём конфигурационный файл модуля stats.mod, который собирает статистику общения для каждого пользователя на вашем канале, такую как, количество произнесенных слов, символов, время пребывания на канале и т.д.
    nano stats.conf
    Содержимое файла:
    ######
    #####
    ### Основные настройки
    #####
    ######
    
    # Файл, где будет храниться статистика
    # ОБЯЗАТЕЛЬНО должен загружаться _до_ загрузки самого мудуля.
    set statsfile "data/statsmod.dat"
    
    # Загрузка модуля
    loadmodule stats
    
    # Через сколько минут сохранять данные
    set save-stats 15
    
    # Через сколько минут, после захода на канал юзера, добавлять его в базу.
    # Если установить в 0, то юзеры автоматически добавлятся не будут,
    # но будет идти проверка каждую минуту, не идентифицировался ли юзер сам;
    # Если установить в -1, то юзеры не будут добавлятся автоматически и не бдут проверки
    # (самый низкий уровень загрузки процессора).
    set autoadd 3
    
    # Через склько дней удалять неактивных пользователей
    set expire-users 300
    
    # Статистика wordstats (наиболее часто используемые слова), сбрасывается ежедневно.
    # Оказывает большую нагрузку на процессор.
    # Включить 1; Выключить - 0
    set log-wordstats 1
    
    # Минимальная длина слова, учитываемая в статистике
    # 0 - все слова.
    set min-word-length 0
    
    # Сколько url-ссылок записывать в статистику
    # 0 - отключает
    set display-urls 5
    
    # Сколько киков записывать в статистику
    set display-kicks 5
    
    # when logging kicks, also save the last x lines of activity in the chan
    set kick-context 5
    
    # log every Xth quote
    # If this value is lower, then the random quotes will be more random,
    # but the memory usage will also increase.
    set quote-frequency 5
    
    ######
    #####
    ### Языковые настройки
    #####
    ######
    
    # Сбрасываем старые языковые настройки..
    resetslang
    
    # Загружыем языковый файл
    loadslang language/stats.ru.lang
    
    ## Загрузить допольнительный языковой файл
    # loadslang ger language/stats.ger.lang
    #
    ## Установить на определенном канале язык
    # setchanslang #xwp ger
    
    ######
    #####
    ### Публичные команды
    #####
    ######
    
    # Префикс для публичных команд (!top10, !top20 и т.д.)
    set cmdchar "!"
    
    # don't answer more than x commands in y seconds
    set max-stat-cmds 5:60
    
    # Значения, которые будут выдаваться по команде !stat
    # words - количество сказаных слов
    # letters - количество написаных букв
    # lines - количество строк
    # wpl - среднее количество слов в строке
    # actions - количество действий (команда /me)
    # smileys - количество смайликов
    # questions - количество вопросов
    # joins - количество заходов на канал
    # kicks - количество киков
    # modes - количество измененных модов
    # nicks - сколько раз юзер менял ник
    # topics - количество измененных топиков
    # started minutes - проведенное время на канале
    # idle - время полчания
    set stat-reply "words letters lines wpl actions smileys questions joins kicks modes nicks topics started minutes idle"
    
    ######
    #####
    ### Настройки HTML
    #####
    ######
    
    # Сколько юзеров показывать в топе
    set topnr 30
    
    # Цвет фона таблицы
    set table-color 0x3850B8
    
    # fade table color to another color
    set fade-table-to 0x000000
    
    # Ширина таблицы
    # 0 - нет таблицы?..
    set table-border 0
    
    # Значени в следующих двух параметрах влияет только на отображение статистики.
    # Бот будет сохранять все, независимо от того, отображается или нет.
    
    # Какую статистику отображать
    # Значения показателей, перечисленны выше
    set topstats "words lines wpl actions smileys kicks modes topics idle minutes"
    
    # По каким показателям строить графики
    set graphstats "words lines actions smileys kicks modes topics minutes"
    
    # Сколько юзеров в топе с графиками
    set graphnr 15
    
    # which colour should the bars have?
    set graphcolor "blue"
    
    # Отображать среднее количество юзеров на канале? [1\0]
    set display-average-users 1
    
    # Отображать юзеров которые в данный момент он-лайн? [1\0]
    set show-usersonchan 1
    
    # Отображать список всех пользователей канала? [1\0]
    set show-userlist 1
    
    # Отображать засекреченные каналы в статистике? [1\0]
    set list-secret-chans 1
    
    # Полный путь до графиков
    #set graphgif "http://your.shell.com/~you/bar.gif"
    
    ##
    ## Настройки ЛайфСтат
    ##
    
    # Порт для статистики
    #livestats 8033
    livestats off
    
    # Указать айпи для статы, по умолчанию будет прослушивать,
    # указанный выше порт, на всех адресах сервера
    #set livestats-ip ""
    
    # Куда писать логи?
    # "" - для отключения
    set livestats-log "livestats.log"
    
    # Флаг консоли, для просмотра логов (.console +l)
    set livestats-loglevel "1"
    
    # Антифлуд, не более 5 страниц за 60 секунд
    set max-livestats-access 5:10
    
    ####
    ## Только для часто обновляющихся вебфайлов
    ##
    ## Эта функция является устаревшей, не используйте её, если в ней нет необходимости
    ###
    
    # Через сколько обновлять файлы
    # 0 - отключено
    # 0 идет по умолчанию. Используйте Лайфстат! :)
    set webupdate 0
    
    # Директория, куда записывать файлы
    set webdir "./html/stats"
    
    ######
    #####
    ### Прочие параметры
    #####
    ######
    
    # stats.mod saves new users in an internal database by default
    # for compatibility reasons, the old way of using the eggdrop
    # user file is still available, but I strongly recommend to let
    # it turned off!
    #set use-eggdrop-userfile 0
    #
    # Не добавлять новые адреса пользователям с этими флагами
    #set anti-autoadd-flags "ofvb|ofv"
    #
    # Не добалвять пользователей в статистику с этими флагами
    #
    #set anti-stats-flag "b|-"
    
    
    # Набор смайлов
    set smileys ":-) :) ;) ;-) ^_^ :-D :-P :P =) ;D ))"
    
    ###############################################################################
    # Конец конфига
    # Не обращайте внимания на строчки ниже ;)
    ###############################################################################
    
    catch "unbind pub - !top10 *pub:!top10"
    catch "unbind pub - !топ10 *pub:!top10"
    catch "unbind pub - !ttop10 *pub:!ttop10"
    catch "unbind pub - !ттoп10 *pub:!ttop10"
    catch "unbind pub - !top20 *pub:!top20"
    catch "unbind pub - !топ20 *pub:!top20"
    catch "unbind pub - !ttop20 *pub:!ttop20"
    catch "unbind pub - !ттоп20 *pub:!ttop20"
    catch "unbind pub - !stat *pub:!stat"
    catch "unbind pub - !стат *pub:!stat"
    catch "unbind pub - !tstat *pub:!tstat"
    catch "unbind pub - !тстат *pub:!tstat"
    catch "unbind pub - !place *pub:!place"
    catch "unbind pub - !место *pub:!place"
    catch "unbind pub - !tplace *pub:!tplace"
    catch "unbind pub - !тместо *pub:!tplace"
    catch "unbind pub - !wordstats *pub:!wordstats"
    catch "unbind pub - !topwords *pub:!topwords"
    bind pub - ${cmdchar}top10 *pub:!top10
    bind pub - ${cmdchar}топ10 *pub:!top10
    bind pub - ${cmdchar}ttop10 *pub:!ttop10
    bind pub - ${cmdchar}ттоп10 *pub:!ttop10
    bind pub - ${cmdchar}top20 *pub:!top20
    bind pub - ${cmdchar}топ20 *pub:!top20
    bind pub - ${cmdchar}ttop20 *pub:!ttop20
    bind pub - ${cmdchar}ттоп20 *pub:!ttop20
    bind pub - ${cmdchar}place *pub:!place
    bind pub - ${cmdchar}место *pub:!place
    bind pub - ${cmdchar}tplace *pub:!tplace
    bind pub - ${cmdchar}тместо *pub:!tplace
    bind pub - ${cmdchar}stat *pub:!stat
    bind pub - ${cmdchar}стат *pub:!stat
    bind pub - ${cmdchar}tstat *pub:!tstat
    bind pub - ${cmdchar}тстат *pub:!tstat
    bind pub - ${cmdchar}wordstats *pub:!wordstats
    bind pub - ${cmdchar}topwords *pub:!topwords
  4. Запуск Eggdrop

    1. Теперь нам остаётся запустить бота с флагом -m, чтобы создать базу данных пользователей и каналов. Для этого выполним команду:
      ./eggdrop -m eggdrop.conf
      Если всё сделали правильно и нет ошибок, то бот войдёт в IRC сеть, а в консоли будет:
      Telnet to the bot and enter 'NEW' as your nickname.
      OR go to IRC and type: /msg НИК_БОТА hello
      This will make the bot recognize you as the master.
      [08:54] === НИК_БОТА: 0 channels, 0 users.
      Launched into the background (pid: 27194)
    2. Теперь нужно создать пользователя (администратора бота), подключившись к порту (по умолчанию в конфиге 8850) по протоколу telnet с помощью Putty.
      Пишем IP-адрес сервера, где установлен бот, ставим галочку на telnet, пишем порт 8850, выставляем кодировку (Translation>Remote character set: и выбираем Win1251(Cyrillic)).
      Подключаемся. Видим следующее:
      НИК_БОТА (Eggdrop v1.6.20 (C) 1997 Robey Pointer (C) 2010 Eggheads)
      Please enter your nickname.
      Вводим: NEW

      This is the telnet interface to НИК_БОТА, an eggdrop bot.
      Don't abuse it, and it will be open for all your friends, too.
      You now get to pick a nick to use on the bot,
      and a password so nobody else can pretend to be you.
      Please remember both!
      Enter the nickname you would like to use.
      Вводим ник администратора: ВАШ_НИК

      Okay, now choose and enter a password:
      (Only the first 15 letters are significant.)
      Пишим пароль: СУПЕР_ПАРОЛЬ

      Have fun.
      Commands start with '.' (like '.quit' or '.help')
      Everything else goes out to the party line
    3. Теперь по очереди вводим:
      .notes erase
      .+chan #канал
      .save
      .die
      Бот сохранит нового пользователя, каналы и отключится. Ну чтож - поздравляю. Бот успешно установлен. Можно спокойно перекурить и немножко порадоваться… А что теперь? Теперь нам не надо запускать бота с флагом -m.
    4. Запуск бота должен происходить так:
      env MALLOC_OPTIONS='Dm' LANG=ru_RU.CP1251 LC_TIME=en_US ./eggdrop

    Важные скрипты для Eggdrop

    Ну теперь все готово, бот успешно запускается и радует глаз хозяина. Теперь нам нужно добавить в бота нужные скрипты. Скриптов в интернете как грязи для Eggdrop, но я расскажу о самых необходимых. Подключаемся к боту через telnet и пишем:
    .rehash
    Эта команда заставляет бота перечитать конфигурационный файл eggdrop.conf и в нашем случае подключить новые скрипты. При добавлении новых скриптов всегда нужно делать боту рехеш
    .rehash
    или рестарт
    .restart
    . Различные скрипты можно найти на egghelp.ru и buster-net.ru.

    Дополнительно

    Модификация скрипта whois.tcl от Алексея Мистериус

    Выводит полную информацию запроса
    /whois ник
    в канал. Если бот не обладает правами IRC-оператора, то информация об установленных модах и реальных IP и хоста выводится не будет. Также информативность скрипта зависит от типа IRC-сервера. Корректная работа гарантируется на UnrealIRCd 3.2.1 dalnetru моде.
    Синтаксис команды:
    ~whois ник
    Ответ бота:
    Информация запроса WHOIS для ника Eggdrop:
    Хост: Egg@Mega.Egg
    Реальное имя: eggdrop 1.6.21 full
    Установлены моды: +irsOxWBHtPf
    Реальный хост: dreamterra.net, IP: 95.85.45.90
    Зарегистрирован и идентифицирован на сервисах
    Присутствует на каналах: +#eggdrop ^#debian %#bash
    Подключен к серверу dreamterra.net (Частная IRC-сеть 'дримтерра')
    Статус на сервере: Локальный IRC Оператор
    Дополнительная информация: использует кодировку CP1251
    Дополнительная информация: Ботяра
    Молчит: 2 минуты, 34 секунды
    Время появления в сети: Понедельник 17 Июня 2013 года в 22:31:03
    Конец информации по запросу WHOIS Eggdrop.
    Код скрипта whois.tcl:
    # Author : MeTroiD, #v1per on Quakenet.
    # Please don't be lame and rip my script.
    # I've made it for Quakenet but i assume if the ircd you want to use it
    # on has the same RAW's you can use it just fine.
    # Адаптация скрипта для сети IrcNet.ru и другие изменения tvrsh
    # Дополнения строк ответа (для unrealircd), а при наличии опер-флага у бота
    # выдаёт полную информацию /whois, а также полная руссификация скрипта Мистериус (irc.dreamterra.net)
    
    set whois(author) "MeTroiD, #v1per on Quakenet"    
    set whois(coauthor) "tvrsh, #egghelp on IrcNet.ru"
    set whois(modifier) "Мистериус, #eggdrop on dreamterra.net"
    
    # Version History
    # MeTroiD
    # 0.1 - Made a start, first expermimental test.
    # 0.2-0.5 - Finished some more code
    # 0.6-0.8 - The script was fully functional
    # 0.9 - Removed some silly crap that didnt work for Quakenet anyhow (shows which server he was on)
    # 1.0 - Cleaned some of the code, and it works fine on Quakenet, It also shows idle time and signon time now.
    # tvrsh
    # 1.1 - Изменены RAW бинды для работы в сети IrcNet.ru
    # - Добавлена возможность работы со скриптом в привате бота.
    # - Добавлен канальный флаг nopubwhois
    # Мистериус
    # - добавлены raw бинды, в т.ч. и те которые доступны IRC-оператору (для unreal 3.2.1)
    # - скрипт полностью на русском
    # End of Version History
    
    set whois(version) "1.2"
    
    # Кому доступна команда:
    # o = глобальный оп, m = глобальный мастер, n = глобальный владелец
    # |o = локальный оп, |m = локальный мастер, |n = владелец канала -|- =любому прописанному
    
    set whois(acc) "-|-"
    set whois(msg) "1"
    
    # Канальный флаг
      setudef flag nopubwhois
    # End of Config
    
    bind pub $whois(acc) "~whois" pubwhois:nick
    bind msg $whois(acc) "~whois" msgwhois:nick
    bind pub $whois(acc) "~хуиз" pubwhois:nick
    bind msg $whois(acc) "~хуиз" msgwhois:nick
    
    ### Настройки цвета ###
    set clr1 "\00302"
    set clr2 "\00307"
    set clr3 "\00312"
    set clr4 "\00309"
    
    ### Обработка и руссификация времени (idletime) ###
    
    proc duration {seconds} {
    global clr2
    set years [expr {$seconds / 31449600}]
    set seconds [expr {$seconds % 31449600}]
    set weeks [expr {$seconds / 604800}]
    set seconds [expr {$seconds % 604800}]
    set days [expr {$seconds / 86400}]
    set seconds [expr {$seconds % 86400}]
    set hours [expr {$seconds / 3600}]
    set seconds [expr {$seconds % 3600}]
    set minutes [expr {$seconds / 60}]
    set seconds [expr {$seconds % 60}]
    set res ""
    if {$years != 0} {lappend res [numstr_spec $years "лет" "год" "года"]}
    if {$weeks != 0} {lappend res [numstr_spec $weeks "недель" "неделю" "недели"]}
    if {$days != 0} {lappend res [numstr_spec $days "дней" "день" "дня"]}
    if {$hours != 0} {lappend res [numstr_spec $hours "часов" "час" "часа"]}
    if {$minutes != 0} {lappend res [numstr_spec $minutes "минут" "минуту" "минуты"]}
    if {$seconds != 0} {lappend res [numstr_spec $seconds "секунд" "секунду" "секунды"]}
    return [join $res "\003,$clr2 "]
    }
    
    proc numstr_spec {val str1 str2 str3} {
    set d1 [expr $val % 10]
    set d2 [expr $val % 100]
    if {$d2 < 10 || $d2 > 19} {
    if {$d1 == 1} {return "$val $str2"}
    if {$d1 >= 2 && $d1 <= 4} {return "$val $str3"}
    }
    return "$val $str1"
    }
    
    ### ###
    
    proc pubwhois:nick { nickname hostname handle channel arguments } {
    global whois lastbind
     if { [channel get $channel nopubwhois] } { return 0 }
    set target [lindex [split $arguments] 0]
    if {$target == ""} {
    putquick "PRIVMSG $channel :Используй $lastbind <ник>"
    return 0
    }
    if {[string length $target] >= "31"} {
    putquick "PRIVMSG $channel :Слишком длинный ник, попробуйте указать не более 30 символов."; return
    }
    whois:nick $nickname $hostname $handle $channel $target
    return
    }
    
    proc msgwhois:nick { nickname hostname handle arguments } {
    global whois lastbind
    if { $whois(msg) != "1" } { return 0 }
    set target [lindex [split $arguments] 0]
    if {$target == ""} {
    putquick "PRIVMSG $nickname :Используй $lastbind "
    return 0
    }
    if {[string length $target] >= "31"} {
    putquick "PRIVMSG $nickname :Слишком длинный ник, попробуйте использовать не более 30 символов."
    return 0
    }
    whois:nick $nickname $hostname $handle $nickname $target
    return
    }
    
    proc whois:nick { nickname hostname handle channel target } {
    global whois lastbind
    putquick "WHOIS $target $target"
    set ::whoischannel $channel
    set ::whoistarget $target
    bind RAW - 402 whois:nosuch
    bind RAW - 311 whois:info
    bind RAW - 319 whois:channels
    bind RAW - 301 whois:away
    bind RAW - 310 whois:helper
    bind RAW - 312 whois:server
    bind RAW - 313 whois:ircop
    bind RAW - 307 whois:auth
    bind RAW - 317 whois:idle
    bind RAW - 318 whois:end
    bind RAW - 335 whois:bot
    bind RAW - 320 whois:dinfo
    bind RAW - 378 whois:realip
    bind RAW - 379 whois:umodes
    
    }
    
    proc whois:putmsg { channel arguments } {
    global clr1
    putquick "PRIVMSG $channel :$clr1$arguments"
    }
    
    ### Сообщение 311 ###
    
    proc whois:info { from keyword arguments } {
    global clr1 clr2 clr3 clr4
    set channel $::whoischannel
    set nickname [lindex [split $arguments] 1]
    set ident [lindex [split $arguments] 2]
    set host [lindex [split $arguments] 3]
    set realname [string range [join [lrange $arguments 5 end] ] 1 end]
    whois:putmsg $channel "Информация запроса$clr4 WHOIS$clr1 для ника$clr4 $nickname:"
    whois:putmsg $channel "Хост: $clr2$ident@$host"
    whois:putmsg $channel "Реальное имя: $realname"
    unbind RAW - 311 whois:info
    }
    
    ### Сообщение 378 ###
    
    proc whois:realip { from key arg } {
    global botnick
    global clr1 clr2 clr3 clr4
    set channel $::whoischannel
    set target $::whoistarget
    if { $target == $botnick } { return }
    set host [lindex [lindex [split $arg "@"] 1] 0]
    set rip  [lindex $arg 6]
    if { $host != $rip } {
    whois:putmsg $channel "Реальный хост: $clr2$host\003,$clr1 IP: $clr2$rip"
    } elseif { $host == $rip } {
    whois:putmsg $channel "IP-адрес: $clr2$rip"
    } else {
    unbind RAW - 378 whois:realip }
    }
    
    ### Сообщение 379 ###
    
    proc whois:umodes { from key arg } {
    global botnick
    global clr1 clr2 clr3 clr4
    set channel $::whoischannel
    set target $::whoistarget
    if { $target == $botnick } { return }
    set modes [string range [join [lindex $arg ] ] 0 end]
    whois:putmsg $channel "Установлены моды: $clr2$modes"
    unbind RAW - 379 whois:umodes
    }
    
    ### Сообщение 313 ###
    
    proc whois:ircop { from keyword arguments } {
    global clr1 clr2 clr3 clr4
    set channel $::whoischannel
    set target $::whoistarget
    set ircopmessage [lrange $arguments 4 end]
    if { $ircopmessage == "Network Administrator" } {
    set operstatus "Администратор сети"
    } elseif { $ircopmessage == "Services Administrator" } {
    set operstatus "Администратор сервисов"
    } elseif { $ircopmessage == "Server Administrator" } {
    set operstatus "Администратор сервера"
    } elseif { $ircopmessage == "IRC Operator" } {
    set operstatus "IRC Оператор"
    } elseif { $ircopmessage == "Local IRC Operator" } {
    set operstatus "Локальный IRC Оператор"
    } else {return}
    whois:putmsg $channel "Статус на сервере: $clr2\002$operstatus"
    unbind RAW - 313 whois:ircop
    }
    
    ### Сообщение 310 ###
    
    proc whois:helper { from keyword arguments } {
    set channel $::whoischannel
    set target $::whoistarget
    set helpermessage [string range [join [lrange $arguments 2 end] ] 1 end]
    whois:putmsg $channel "Является помошником по IRC"
    unbind RAW - 310 whois:helper
    }
    
    ### Сообщение 301 ###
    
    proc whois:away { from keyword arguments } {
    set channel $::whoischannel
    set target $::whoistarget
    set awaymessage [string range [join [lrange $arguments 2 end] ] 1 end]
    whois:putmsg $channel "Отсутсвует: \003$awaymessage"
    unbind RAW - 301 whois:away
    }
    
    ### Сообщение 312 ###
    
    proc whois:server { from keyword arguments } {
    global clr1 clr2 clr3 clr4
    set channel $::whoischannel
    set target $::whoistarget
    set servername [join [lrange $arguments 2 2] ]
    set serverdesc [string range [join [lrange $arguments 3 end] ] 1 end]
    whois:putmsg $channel "Подключен к серверу $clr3$servername$clr1 ($clr3$serverdesc$clr1)"
    unbind RAW - 312 whois:server
    }
    
    ### Сообщение 319 ###
    
    proc whois:channels { from keyword arguments } {
    global clr1 clr2 clr3 clr4
    set channel $::whoischannel
    set channels [string range [join [lrange $arguments 2 end] ] 1 end]
    set target $::whoistarget
    while { $channels != "" } { whois:putmsg $channel "Присутствует на каналах: $clr2[string range $channels 0 399]"
    set channels [string range $channels 400 end] }
    unbind RAW - 319 whois:channels
    }
    
    ### Сообщение 307 ###
    
    proc whois:auth { from keyword arguments } {
    set channel $::whoischannel
    set target $::whoistarget
    set authmessage [string range [join [lrange $arguments 2 end] ] 1 end]
    whois:putmsg $channel "Зарегистрирован и идентифицирован на сервисах"
    unbind RAW - 307 whois:auth
    }
    
    ### Сообщение 402 ###
    
    proc whois:nosuch { from keyword arguments } {
    global clr1 clr2 clr3 clr4
    set channel $::whoischannel
    set target $::whoistarget
    whois:putmsg $channel "Нет ника \"$clr2$target\"$clr1"
    unbind RAW - 402 whois:nosuch
    }
    
    ### Сообщение 317 ###
    
    proc whois:idle { from keyword arguments } {
    global clr2
    set channel $::whoischannel
    set target $::whoistarget
    set idletime [lindex [split $arguments] 2]
    set prsignon [lindex [split $arguments] 3]
    set signon [string map -nocase {Mon Понедельник  Tue  Вторник  Wed  Среда  Thu  Четверг  Fri  Пятница  Sat  Суббота  Sun  Воскресенье  Jan  Января  Feb  Февраля  Mar  Марта  Apr  Апреля  May  Мая  Jun  Июня  Jul  Июля  Aug  Августа  Sep  Сентября  Oct  Октября  Nov  Ноября  Dec  Декабря } [strftime "[string trim %a " "] [string trim %e " "] %b %Y года в %X" "$prsignon"] ]
    whois:putmsg $channel "Молчит:$clr2 [duration $idletime]"
    whois:putmsg $channel "Время появления в сети:$clr2 $signon"
    #unbind RAW - 317 whois:idle
    }
    
    ### Raw 335 ###
    
    proc whois:bot { from keyword arguments } {
    global clr1 clr2 clr3 clr4
    set channel $::whoischannel
    set target $::whoistarget
    set bot [lindex $arguments 4]
    set net [lindex $arguments 6]
    whois:putmsg $channel "$target - это $clr2Бот $clr1сети $clr2$net"
    unbind RAW - 335 whois:bot
    }
    
    ### RAW 318 ###
    
    proc whois:end { from keyword arguments } {
    global clr1 clr2 clr3 clr4
    set channel $::whoischannel
    set target $::whoistarget
    whois:putmsg $channel "Конец информации по запросу$clr4 WHOIS $target\003."
    unbind RAW - 318 whois:end
    }
    
    ### Сообщение 320 (строчка дополнительно)  ###
    
    proc whois:dinfo { from keyword arguments } {
    global clr1 clr2 clr3 clr4
    set channel $::whoischannel
    set target $::whoistarget
    set infomessage [string range [join [lrange $arguments 2 end] ] 1 end]
    if { ([lrange $infomessage 0 end] == "is a Secure Connection") } {
    whois:putmsg $channel "Дополнительная информация: использует защищённое подключение (\00306SSL$clr1)"
    } elseif { [lrange $infomessage 0 1] == "using codepage" } {
    whois:putmsg $channel "Дополнительная информация: использует кодировку \002[string trim [lindex $infomessage 2] "'"]\002"
    } else {
    whois:putmsg $channel "Дополнительная информация: $clr2$infomessage"
    }
    #unbind RAW - 320 whois:dinfo
    }
    
    putlog "Public whois script $whois(version) by $whois(author) and $whois(coauthor) with the participation $whois(modifier) loaded..."