Cкрипт для IRC своими руками (полная версия)
Вступление Не иметь своего собственного скрипта, сидя в IRC, это стыд и позор пятой степени. Использовать уже сделанные - ламерство. А если просто не совсем понятно, как делать скрипт самому, то эта статья именно для тебя. Тут я рассмотрю основные моменты, связанные с написанием собственного скрипта для IRC. Из нее ты подчерпнешь основные нюансы и ответы на многочисленные вопросы, связанные со скриптованием для IRC. В интернет полно готовых скриптов, но совершенно нет мануала как такового. К тому же на русском языке подобной информации просто не существует. Итак, эксклюзивно в Х :).
Мотор Ассоциация скриптования для IRC с поднятием неимоверных тяжестей в корне не верна. Для этого не надо быть даже супер-пупер программистом, достаточно просто понять, как и куда :). Остальное приходит с опытом. Опыт можно черпать и из чужих ваяний. Первая проблема, которая встанет перед тобой, заключается в том, что каждый скрипт обычно пишется под определенную версию Mirc. Связано это с тем, что программа постоянно совершенствуется, появляются новые навороты, которые можно использовать в скриптах, но старые версии, увы, этого не поддерживают. Отсюда и трабла. Поэтому запасись последней версией Mirc (www.mirc.co.uk) и вникай в основы.
Дубль первый Любой скрипт строится в одинаковой последовательности. Сначала придумывается структура, то есть что он будет делать и какие возможности ты на него навешаешь. Далее создается само меню с помощью Popups. Простые операции прописывают также непосредственно в Popups. Более сложные выделяют в отдельные сценарии с помощью Aliases, при этом в Popups на них уже идет просто ссылка. Если требуется анализировать какие-нибудь события в реальном времени, то используют еще и Remote. Эти три составляющие (Popups, Aliases и Events) обычно содержатся в любом скрипте. Если по умолчанию, то они пишутся в popups.ini, aliases.ini и remote.ini соответственно, но прописать можно произвольные имена файлов.
Дубль второй Popups с явнозабугорского означает нечто, как всплывает :), то есть всплывающие менюшки, а не то, что весной :). Этот инструмент позволяет делать ветвления и описывать простейшие операции непосредственно в самих ветвлениях. Для редактирования топай в Tools -> Popups. В самом IRC есть несколько окон: окно статуса, окно канала, окно привата и окно dcc-чата. Соответственно для каждого окна можно сделать свое меню, которое всплывает при нажатии правой кнопки крысы в этом окне. Плюс ко всему можно сделать свои пункты для общего меню (верхнее контекстное меню клиента). Меню для окна канала делится на два меню: для области, где ползут все фразы, и для области, где выведен список всех ников, которые сидят в данный момент на канале. Чтобы выбрать конкретное меню для редактирования, например, для окна статуса, топай в Tools -> Popups -> View -> Status. С этим понятно, теперь осталось понять, что там писать :). Структура меню в принципе очень простая. Каждый пункт меню пишется с новой строки, разделитель можно сделать с помощью "-", разделитель тоже пишется с новой строки. Ветвления создаются с помощью символов ".", ".." и т.д. Вот элементарный пример:
X-script - Protect Menu .Protect Channel Mode ..Channel Modes:тут пишется сама команда ..Users Modes:тут пишется сама команда .Protect Client Mode ..Flood Protect:тут пишется сама команда ..CTCP Disabled:тут пишется сама команда - War Menu .Port Fucker:тут пишется сама команда .Nuke:тут пишется сама команда .Private Flood:тут пишется сама команда .Channel Flood:тут пишется сама команда
Дубль третий Aliases дословно переводится, как сценарий. Это последовательность команд, объединенная в один сценарий, который можно выполнять много раз, при этом не нужно каждый раз набирать все команды, достаточно сослаться на готовый сценарий. Аналогично ты пишешь сценарий, когда конектишься к прову через скрипт. Когда нужно набрать 1-2 команды, можно и не использовать Aliases. Но, прикинь, тебе надо набрать 10 команд и к тому же не один раз. Тут уже без сценариев не обойтись. Или бывает, что команда всего одна, но по длине короче только экватор земли :), опять же не обойтись без сценариев. Для редактирования ползай в Tools -> Aliases. Сценарии могут состоять из отдельных команд, из логических операций, набора команд и из логических переходов внутри. Одним словом, инструмент достаточно гибкий, чтобы написать любой изврат :). Но проще объяснять на примерах.
а) /jx /join #xakep - всего одна команда /jx заменяет команду /join #xakep
б) /jj /join $?="Enter channel:" - аналогично, но выдается окно запроса для названия канала
в) /aw /away $?="Enter away message:" | /say $! - в результате ставится авей с сообщением, плюс еще выдается команда /me это же сообщение, символ | используется для разделения отдельных команд
Но это элементарные примеры. Хотя уже здесь использованы специальные переменные, например, $?. Ниже я перечислил основные из специальных переменных и описал, что они означают:
$me - твой ник # - текущий канал $# - символ # $1..$xx - параметры командной строки, то есть отдельные слова, xx - порядковый номер слова в введенной команде $хх- - параметры командной строки с хх слова и до конца *1..*xx - последовательность параметров в командной строке начинается с указанной позиции %1..%xx - возвращает слова из указанных позиций $+ - дополнительный пробел между параметрами | - разделитель команд
а) /changeme /me $2 $1 $3 - тогда, если набрать /changeme I'll fuck you, получишь /me fuck I'll you
б) /insertme /me $1 $2 fuck, fuck and fuck $3- - тогда, если набрать /insertme I'll need you dear, получишь /me I'll need fuck, fuck and fuck you dear 🙂
в) /addsay /say Fuc $+ king wo $+ rld $+ ! - в результате в канал будет сказана фраза Fucking world!
г) /dkb /kick # $1 | /mode # +b $1 - при наборе команды /dkb nickname, ты сразу кикаешь и банишь этого чела с текущего канала
Если нужно сначала выполнить некоторое действие и результат использовать для дальнейших манипуляций, можно ставить приоритет операциям как в математике скобками []. Если команд очень много и неудобно писать в одну строку, можно использовать скобки , чтобы можно было писать команды построчно.
а) /fucktext - выводит все три строки в приват одной командой
Кроме того можно использовать логические переходы или переходы на метки. Логический переход осуществляется комбинацией If-then-else, а метка обозначается как :metka, переход на нее - goto metka. При этом можно использовать следующие логические операторы:
== - равенство != - неравенство < - меньше > - больше >= - больше или равно <= - меньше или равно || - логический оператор OR && - логический оператор AND // - является кратным \\ - не является кратным isin - переменная входит в переменную iswm - переменная входит в переменную по маске isnum - число из указанного диапазона isletter - символ есть в перечисленной последовательности символов ison - nickname находится на канале isop - nickname оп на канале isvo - nickname войс на канале ischan - имя канала, на котором сидишь ты isauto - юзер есть в твоем автооп листе isignore - юзер в твоем игнор листе isprotect - юзер в твоем протект листе isnotify - юзер в твоем нотифай листе !любой оператор - отрицание данного оператора, то есть обратное условие
а) /number - пример логического ветвления, halt означает прекращение дальнейшего выполнения
б) /opslist - выводит опов на канале
Кстати забить выполнение сценариев можно не только на команды, но и на определенные комбинации функциональных клавиш F1-F12, Alt, Ctrl и Shift.
а) /F1 /say Всем привет! - забить на F1 вывод текста
б) /saF2 /query $1 - забить на Shift+Alt+F2 приват
в) /cF3 /ctcp $1 version - забить на Ctrl+F3 запрос версии клиента
Ну и в конце несколько нюансов относительно Aliases. При использовании переменных в сценарии они прекрасно работают, но стоит набрать ручками /echo мой ник как ни странно $me и вместо $me не будет ника, а будет именно $me. Как же обойти? Используй //echo . - тогда вместо $me уже будет твой ник. Некоторые команды после выполнения выдают результат действия. Если ты хочешь заблокировать вывод результата действия, используй /.command, например, /.ignore nickname. Ну и конечно же комментарии при написании кода, куда без них :). В сценарии они начинаются с знака (;).
Дубль четвертый
Events (Remote) означает события, а более доступно - реакцию на события. Без этого элемента не сделать скрипт, который мог бы что-либо отслеживать в реальном времени. Для редактирования Events топай в Tools -> Remote. Под событием понимается любое событие, которое генерируется клиентом. Вот основные события Mirc:
on text - реакция на текст в привате или канале on ban - реакция на бан on unban - реакция на снятие бана on chat - реакция на dcc чат on chatopen - реакция на открытие dcc чата on chatclose - реакция на закрытие dcc чата on connect - реакция на конект к серверу (когда выводится motd) on ctcp - реакция на ctcp событие on ctcpreply - реакция на ответное событие ctcp on op - реакция на оп on deop - реакция на снятие опа on voice - реакция на во йс on devoice - реакция на снятие войса on dns - реакция на команду /dns on error - реакция на error сообщения on filesent - реакция на успешную пересылку файла по dcc on filercvd - реакция на успешное получение файла по dcc on sendfail - реакция на неуспешную пересылку файла по dcc on getfail - реакция на неуспешное получение файла по dcc on input - реакция на ввод текста после нажатия на Enter on invite - реакция на приглашение on join - реакция на заход на канал on part - реакция на выход с канала on kick - реакция на кик on load - реакция на попытку загрузить уже загруженный скрипт on midiend - реакция на завершение проигрывание *.mid файла on mode - реакция на установку модов на канале on nick - реакция на смену ника on nosound - реакция на запрос звука, которого у тебя нет on notice - реакция на нотис on action - реакция на /me on notify - реакция на приход юзера из твоего нотифай листа on unotify - реакция на уход юзера из твоего нотифай листа on queryopen - реакция на открытие привата on queryclose - реакция на закрытие привата on quit - реакция на выход из сети on serv - реакция на dcc fileserver on servopen - реакция на открытие dcc fileserver on servclose - реакция на закрытие dcc fileserver on servermode - реакция на установку модов на канале сервером on serverop - реакция на оп сервером on snotice - реакция на нотис севрера on start - реакция на первую загрузку скрипта при запуске клиента on topic - реакция на смену топика on usermode - реакция на смену твоих модов on wallops - реакция на wallops сообщения
Этого списка вполне хватает, чтобы описать всевозможные реакции собственного скрипта на действия извне и внутри. Теперь осталось понять, как эти события описываются в Remote. Общий формат события <prefix> <level>:<event>:<commands>. <prefix> определяет, на что реагируем, здесь может стоять либо префикс ON, если будем использовать любое из вышеперечисленных событий, либо, допустим, протокол получения информации, например, ctcp (в случае реакции на ctcp просто не ставится ON). <level> задает уровень доступа, то есть можно ограничить реакцию события на определенных юзверей, описав потом, на кого распространяется этот уровень. <event> непосредственно описывает, на какое событие реагирует <commands>. Ну а в <commands> можно писать любой изврат :). Но формат для разных событий может быть различным, поэтому ниже привожу форму записи для всех событий, которые были приведены выше. Используя эти шаблоны, ты можешь описать практически что угодно. Чтобы было более доступно, я написал произвольные примеры для каждого события.
on <level>:TEXT:<matchtext>:<*><?><#[,#]>:<commands> Пример использования события TEXT: on 1:TEXT:*help*:#xakep,#RusChannel:/msg $nick Нужна помощь? on <level>:BAN:<#[,#]>:<commands> Пример использования события BAN: on 9:BAN:#xakep,#RusChannel:/mode $chan -o $nick | /mode $chan -b $banmask on <level>:UNBAN:<#[,#]>:<commands> Пример использования события UNBAN: on 1:UNBAN:#:/msg $bnick Бан снят. on <level>:CHAT:<matchtext>:<commands> Пример использования события CHAT: on 1:CHAT:*пока*:/msg $nick Ну, давай, до скорого. on <level>:CHATOPEN:<commands> Пример использования события CHATOPEN: on 1:CHATOPEN:/msg =$nick Привет! (замечание - тут используется уже =$nick для того, чтобы написать ответ также по dcc) on <level>:CHATCLOSE:<commands> Пример использования события CHATCLOSE: on 1:CHATCLOSE:/notice $me $nick закрыл dcc-чат. on <level>:CONNECT:<commands> Пример использования события CONNECT: on 1:CONNECT:/join #xakep | /join #RusChannel ctcp <level>:<matchtext>:<commands> Пример использования события CTCP: ctcp 1:ping:/notice $nick Упс | /halt Format: on <level>:CTCPREPLY:<matchtext>:<commands> Пример использования события CTCPREPLY: on 1:CTCPREPLY:VERSION*:/echo $nick имеет IRC client: $1- (как описывал выше, $1- означает вывод полученных переменных, начиная с первой) on <level>:OP:<#[,#]>:<commands> Пример использования события OP: on 1:OP:#xakep,#RusChannel:/msg $nick не шали, а то опять оп сниму 🙂 on <level>:DEOP:<#[,#]>:<commands> Пример использования события DEOP: on 10:DEOP:#xakep,#RusChannel:/mode $chan +o $opnick on <level>:VOICE:<#[,#]>:<commands> Пример использования события VOICE: on 1:VOICE:#xakep,#RusChannel:/msg $vnick тебя пометили в $chan 🙂 on <level>:DEVOICE:<#[,#]>:<commands> Пример использования события DEVOICE: on 1:DEVOICE:#xakep,#RusChannel:/mode $chan +v $vnick on <level>:DNS:<commands> Пример использования события DNS: on 1:DNS:/notice $me Resolved: $raddress on <level>:ERROR:<matchtext>:<commands> Пример использования события ERROR: on 1:ERROR:*server full*:/echo этот сервер перегружен, надо бы попробовать другой on <level>:FILESENT:<filename[,filename]>:<commands> Пример использования события FILESENT: on 1:FILESENT:*.txt:/msg $nick я отправил тебе текстовуху $filename on <level>:FILERCVD:<filename[,filename]>:<commands> Пример использования события FILERCVD: on 1:FILERCVD:*.txt,*.ini:/echo получено $filename от $nick | /run notepad.exe $filename (командой /run можно запускать внешние программы) on <level>:SENDFAIL:<filename[,filename]>:<commands> Пример использования события SENDFAIL: on 1:SENDFAIL:*.txt:/echo не получилось отправить текстовик $filename для $nick on <level>:GETFAIL:<filename[,filename]>:<commands> Пример использования события GETFAIL: on 1:GETFAIL:*.zip:/echo не получилось получить архив $filename от $nick on <level>:INPUT:<*#?@>:<commands> Пример использования события INPUT: on 1:INPUT:#xakep:/echo текст " $1- " был введен на #xakep on <level>:INVITE:<#[,#]>:<commands> Пример использования события INVITE: on 1:INVITE:#xakep:/join $chan on <level>:JOIN:<#[,#]>:<commands> Пример использования события JOIN: on 1:JOIN:#xakep,#RusChannel:/msg $nick Привет! on <level>:PART:<#[,#]>:<commands> Пример использования события PART: on 5:PART:#xakep,#RusChannel:/msg $nick пока, приходи еще 🙂 Format: on <level>:KICK:<#[,#]>:<commands> Пример использования события KICK: on >=2:KICK:#xakep,#RusChannel:/msg $chan $nick пнул $knick (legal) (тут использована логическая операция больше или равно, то есть действует для уровней со второго) on <level>:LOAD:<commands> Пример использования события LOAD: on 1:LOAD:/echo mIRC Script Loaded! on <level>:MIDIEND:<commands> Пример использования события MIDIEND: on 1:MIDIEND:/echo midi закончил играть. on <level>:MODE:<#[,#]>:<commands> Пример использования события MODE: on 1:MODE:#xakep,#RusChannel:/notice $me $nick изменил моды $chan на $1- on <level>:NICK:<commands> Пример использования события NICK: on 1:NICK:/msg $nick Типа, теперь $newnick 🙂 on <level>:NOSOUND:<commands> Пример использования события NOSOUND: on 1:NOSOUND:/notice $me Oops, $nick поимел $filename , а у меня его нет. on <level>:NOTICE:<matchtext>:<*><?><#[,#]>:<commands> Пример использования события NOTICE: on 1:NOTICE:*. /msg $nick сорри, скоро буду. on <level>:ACTION:<matchtext>:<*><?><#[,#]>:<commands> Пример использования события ACTION: on 1:ACTION:привет:#:/msg $chan и тебе туда же 🙂 on <level>:NOTIFY:<commands> Пример использования события NOTIFY: on 1:NOTIFY:/msg $nick Привет! 🙂 on <level>:UNOTIFY:<commands> Пример использования события UNOTIFY: on 1:UNOTIFY:/notice $me $nick только что свалил. on <level>:QUERYOPEN:<commands> Пример использования события QUERYOPEN: on 1:QUERYOPEN:/echo одним чатом больше с $nick $address on <level>:QUERYCLOSE:<commands> Пример использования события QUERYCLOSE: on 1:QUERYCLOSE:/echo одним чатом меньше с $nick $address on <level>:QUIT:<commands> Пример использования события QUIT: on 1:QUIT:/notice $me $nick тока что свалил(а) с сообщением $1- on <level>:SERV:<matchtext>:<commands> Пример использования события SERV: on 1:SERV:bye:/msg =$nick спасибо, что поимел мой fileserver, пока 🙂 on <level>:SERVOPEN:<commands> Пример использования события SERVOPEN: on 1:SERVOPEN:/msg =$nick Welcome! on <level>:SERVCLOSE:<commands> Пример использования события SERVCLOSE: on 1:SERVCLOSE:/echo $nick $address ушел с fileserver on <level>:SERVERMODE:<#[,#]>:<commands> Пример использования события SERVERMODE: on 1:MODE:#xakep,#RusChannel:/notice $me сервер изменил моды $chan на $1- on <level>:SERVEROP:<#[,#]>:<commands> Пример использования события SERVEROP: on 1:SERVEROP:#:/mode $chan -o $opnick on <level>:SNOTICE:<matchtext>:<commands> Пример использования события SNOTICE: on 1:SNOTICE:*client connecting*:/halt on <level>:START:<commands> Пример использования события START: on 1:START:/echo Performing regular initialization for this script! (разница с LOAD в том, что реагирует на каждый запуск скрипта, независимо от того, первый это или второй раз) on <level>:TOPIC:<#[,#]>:<commands> Пример использования события TOPIC: on 1:TOPIC:#xakep,#RusChannel:/msg $chan ммм, какой топик 🙂 on <level>:USERMODE:<commands> Пример использования события USERMODE: on 1:USERMODE:/echo теперь мои моды $1- on <level>:WALLOPS:<matchtext>:<commands> Пример использования события WALLOPS: on 1:WALLOPS:*warning*:/echo $nick варнинговал в $time 🙂
Кульминация
Это далеко не все нюансы и не все возможности. К сожалению, в выделенный объем далеко не все влезло. Если тебе хотелось бы увидеть продолжение, то намалюй на centner@real.xakep.ru c Subject: IRC-script свои отзывы по этой статье и пожелания по продолжению этой тематики.
Финал Здесь ты не увидел пример самого скрипта. Здесь ты увидел некоторые элементы любого скрипта, которые помогут тебе разобраться в чужих и написать собственный уже своими граблями. А чужие лежат горами в инете. Другие уже надорвали попку только ради того, чтобы ты заценил их произведения :). Вот несколько ценных ссылочек: