Вступление 

Не иметь своего собственного скрипта, сидя в 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 {
/msg $1 сначала я найду тебя по запаху потных носков
/msg $1 потом я огрею тебя веслом
/msg $1 а напоследок подергаю за уши 🙂
} — выводит все три строки в приват одной командой

Кроме того можно использовать логические переходы или переходы на метки. Логический переход осуществляется комбинацией If-then-else, а метка обозначается как :metka, переход на нее — goto metka. При этом можно использовать следующие логические операторы:

== — равенство
!= — неравенство
< — меньше
> — больше
>= — больше или равно
<= — меньше или равно
|| — логический оператор OR
&& — логический оператор AND
// — является кратным
\\ — не является кратным
isin — переменная входит в переменную
iswm — переменная входит в переменную по маске
isnum — число из указанного диапазона
isletter — символ есть в перечисленной последовательности символов
ison — nickname находится на канале
isop — nickname оп на канале
isvo — nickname войс на канале
ischan — имя канала, на котором сидишь ты
isauto — юзер есть в твоем автооп листе
isignore — юзер в твоем игнор листе
isprotect — юзер в твоем протект листе
isnotify — юзер в твоем нотифай листе
!любой оператор — отрицание данного оператора, то есть обратное условие

Примеры:

а) /number {
if ($1 == 1) goto one
elseif ($1 == 2) goto two
else goto unknown
:one
echo The number ONE
halt
:two
echo The number TWO
halt
:unknown
echo Unknown number!
halt
} — пример логического ветвления, halt означает прекращение дальнейшего выполнения

б) /opslist {
echo 4 * Listing Ops on #
set %i 1
:next
set %nick $nick(%i,#)
if %nick == $null goto done
if %nick isop # echo 3 %nick is an Op!
inc %i
goto next
:done
echo 4 * End of Ops list
} — выводит опов на канале

Кстати забить выполнение сценариев можно не только на команды, но и на определенные комбинации функциональных клавиш 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 свои отзывы по этой статье и пожелания по продолжению этой тематики.

Финал

Здесь ты не увидел пример самого скрипта. Здесь ты увидел некоторые элементы любого скрипта, которые помогут тебе разобраться в чужих и написать собственный уже своими граблями. А чужие лежат горами в инете. Другие уже надорвали попку только ради того, чтобы ты заценил их произведения :). Вот несколько ценных ссылочек:

http://www.mircx.com/
http://www.mirc.net/
http://www.mircscripts.com/
http://www.xcalibre.com/
http://www.hawkee.com/
http://www.irc-scripts.com/

Оставить мнение

Check Also

Жизнь без антивируса. Как побороть малварь голыми руками и обезопасить себя на будущее

На вопрос «Какой антивирус вы используете на своей виндовой машине?» многие безопасники (в…