Всё чаще и чаще пользователи сети Irc задумываются о том, как сделать свое общение в сети наиболее комфортным и безопасным. На спрос, как говорится, и предложение найдется. В связи с этим стали появляться всевозможные скрипты, такие как Shutdown, Neo-ra, Xapok etc. Казалось бы, качай и пользуйся, ан нет, как показывает практика, скрипты такого рода имеют ряд существенных недостатков и слишком перенасыщены порой всевозможными, совершенно не нужными фичами. В связи с этим все чаще и чаще можно слышать вопрос о том, как же написать свой собственный скрипт. В этой статье на конкретных примерах мы постараемся показать вам, как создать свой собственный скрипт. Хотелось бы сразу оговориться, что все ниже изложенное будет относиться к Irc - клиенту: mIRC. Так что же такое скрипт? Cкрипт - это дополнительная подпрограмма, модифицирующая ваш Irc - клиент и позволяющая автоматизировать некоторые процессы. Например, для того, чтобы кикнуть или забанить человека, который выкинул вас с канала, вам придется написать сначала: /kick #channel ник причина, а затем /ban ник или хост. А скрипт поможет осуществить эти операции предельно быстро и просто. Достаточно будет кликнуть мышкой по нужной менюхе. Давайте попробуем разобраться каким образом это работает в Irc - клиенте. В нем есть несколько разделов, которые и отвечают за все действия, совершаемые в Irc. Одним из них является раздел Remote (события) - следит за всем, что происходит в окнах вашего Irc - клиента. Следующий раздел: Aliases. Aлиасы отвечают за всевозможные сокращенные команды. То есть вместо того, чтобы набирать /join #channel, можно создать Aliases, который будет выполнять эту команду, скажем при нажатии F7 или любой другой клавиши, на ваше усмотрение. Еще один раздел, который будет нас с вами интересовать: Popups (всплывающие окна). Popups - это выскакивающие менюшки. Вы просто кликнете по нику или в окне канала и выбираете нужный вам пункт, который совершит то или иное запрограммированное ранее действие. Users - секция хранения перечня пользователей с назначенным уровнем доступа для каждого. Variables - отвечает за хранение постоянных переменных и их значения. Вызвать список всех этих разделов можно кликнув по иконке или выбрав в меню Tools соответствующий подраздел. Позже мы рассмотрим каждый раздел более подробно. Но так как без знания синтаксиса, переменных, идентификаторов и команд мы скрипт ну никак не напишем. То давайте с ними и познакомимся. КОМАНДЫ IRC-команды предназначены для выполнения действий на IRC, например для управления каналами. /JOIN #канал - войти на канал /PART #канал - покинуть канал /LIST [#channel] [-MIN #] [-MAX #] - выводит список доступных каналов. Например: /list - вывести все каналы /list *w* -MIN 10 -MAX 20 - вывести все каналы, на которых находится от 10 до 20 человек, содержащие в названии букву w /ME действие - сообщить в текущий канал (приват) о своем действии /describe <ник|#канал> действие - сообщить о действии в заданный канал (приват) /MSG <ник|#канал> сообщение - послать сообщение в заданный канал (приват) /QUERY ник сообщение - открыть окно привата и послать сообщение /WHOIS ник - показать информацию о ком-то /NICK новый ник - сменить свой ник на новый ник /QUIT [причина] - отключение от сервера с указанием причины отключения /DISCONNECT - незамедлительное отключение от сервера, отличается от quit тем, что не ждет ответа сервера /EXIT - отключение от сервера и выход из mIRC /AWAY [эвэй-сообщение] - помечает вас как отсутствующего и оставляет сообщение, которое объясняет, почему вы в данный момент не в IRC (сообщение появляется, когда кто-либо выполняет /whois или посылает сообщение в приват) Использование /away без параметра снимает пометку об отсутствии /TOPIC #канал новый топик - меняет топик канала на новый топик /INVITE ник #канал - приглашает пользователя на канал Символ \"/\" называется командным префиксом и не является частью команды. Он служит для указания мирку того, что вводимая строка является командой. Так же может использоваться префикс \"//\", заставляющий mIRC вычислить подставленные в команду идентификаторы и префикс \"/.\", блокирующий любой вывод текста на экран: ------------------|------------- Команда | Результат ------------------|------------- /echo мой ник $me |мой ник $me //echo мой ник $me|мой ник Zmey /.echo мой ник $me| -------------------------------- В теле скрипта использование префикса \"/\" не обязательно. ИДЕНТИФИКАТОРЫ Идентификаторы являются аналогом функций. Вот краткий перечень наиболее часто используемых идентификаторов. $active - возвращает имя активного окна $address (ник, индекс) - возвращает маску, связанную с ником. В зависимости от индекса маска возвращается в виде: 0: *!user@host.domain 1: *!*user@host.domain 2: *!*@host.domain 3: *!*user@*.domain 4: *!*@*.domain 5: nick!user@host.domain 6: nick!*user@host.domain 7: nick!*@host.domain 8: nick!*user@*.domain 9: nick!*@*.domain (например $address (Guest, 5) вернёт Guest!Guest@guest.binet.south.net.ru) Внимание: для собственного ника эта функция вернет маску созданную на основе реального адреса, а для чужих - на основе скрытого, при условии, что человек использует режим +х $away - возвращает текущий эвэй-статус $date - возвращает текущую дату в формате день/месяц/год $editbox (окно) - возвращает содержание редактора для окна $me - возвращает текущий ник $usermode - возвращает ваши моды (напр. irx) $os - возвращает версию операционной системы (mirc 5.9 может вернуть одно из следующих значений: 3.1, 95, 98, NT, ME, 2000, XP) $idle - возвращает продолжительность молчания $ip - возвращает ваш ip адрес $version - возвращает версию mirc в контексте скрипта можно использовать следующие идентификаторы: $banmask - маска, на которую установлен бан $bnick - имя пользователя, на которого поставлен бан. Определен только в том случае, если маска бана содержит ник пользователя (например Guest!*@*binet.south.net.ru), в остальных случаях вернет значение $null (ноль) $chan - канал на котором происходит событие $nick - пользователь инициализировавший выполнение события $knick - пользователь выкинутый с канала $me - возвращает ваш ник $newnick - новый ник (используется в событии NICK) $opnick - пользователь которому был присвоен оп $0 - возвращает количество переданных в скрипт параметров $1 - возвращает первый переданный в скрипт параметр (можно использовать от $1 до $9) отличие $1 от $$1 в том, что если $$1 вернет пустое значение, то строка, в которой встретился этот идентификатор не будет выполнена $1- - возвращает строку параметров разделенных пробелами начиная с первого (можно использовать от $1- до $9-) $2-5 - возвращает параметры со второго по пятый При написании собственных идентификаторов для передачи параметров используются идентификаторы $0, $1, $1-, $$1 и т.п. $?=\"сообщение\" - выдает на экран диалог ввода и возвращает введенную строку $?!=\"сообщение\" - выдает на экран диалог с кнопками Yes/No (Да/Нет). Если нажата кнопка Yes возвращает $true, иначе $false УПРАВЛЯЮЩИЕ КОНСТРУКЦИИ Условия: Конструкция if-then-else, позволяет сравнивать значения переменных или выражений. Формат: if (условие1) { действие1 } elseif (условие2) { действие2 } else { действие0 } при этом действие будут выполнено, если условие истинно Операторы сравнения: == - равно (без учета регистра) === - равно (с учетом регистра) != - не равно < - меньше > - больше <= - меньше или равно >= - больше или равно isin - подстрока находится в строке (z isin Zmey | истина) isincs - подстрока находится в строке (с учетом регистра) (z isin Zmey | ложь) iswm - маска соответствует заданному образцу (*!*@zmeya.net iswm Zmey!Zmey@zmeya.net | истина) isnum - число находится в диапазоне (параметр диапазон -- опциональный) (7 isnum 5-9 | истина) isletter - буква есть в строке isalnum - текст содержит только буквы и цифры isalpha - текст содержит только буквы ison - ник на канале isop - ник оператор на канале isvoice - ник имеет право голоса на канале isreg - ник обычный пользователь на канале ischan - ник находится на одном канале с вами isreg - ник - нормальный ник на канале Идентификатор $ifmatch возвращает первый параметр сравнения. Например, если условие выглядит так: if (Zmey ison #help) , то $ifmatch вернет Zmey Идентификатор $null используется в сравнениях, для определения содержит переменная значение или нет. Операторы сравнения можно комбинировать, используя символы: && - логическое и || - логическое или Префикс ! (отрицание) Отрицание логических выражений может быть построено следующим образом: Zmey !ison #help - Zmey не находится на канале хелп w !isin zmey - w не находится в строке zmey Так же ! может быть использован для определения содержит ли переменная значение. Приведенные условия идентичны: if (%x == $null) echo переменная x не содержит значения if (!%x) echo переменная x не содержит значения Циклы: В mIRC применяется только один вид циклов - while. Его формат: while (условие) {действие} Например: /list { var %i = 1 while (%i <= 10) { echo 2 %i inc %i } } Команды безусловного перехода: /goto метка -безусловный переход к метке /return [значение] - останавливает выполнение скрипта и передает управление вызывающей процедуре. В качестве опционального параметра может использоваться возвращаемое идентификатором значение /halt - останавливает выполнение скрипта и прекращает последующую обработку Пример: /number { if ($1 == 1) goto one elseif ($1 == 2) goto two else { echo Unknown number! halt } :one echo The number ONE return 1 :two echo The number TWO return 2 } КОММЕНТАРИИ Для комментария в скрипте используйте в начале строки символ - \";\" ;вот такой вот комментарий СОЗДАНИЕ СОБСТВЕННЫХ КОМАНД И ИДЕНТИФИКАТОРОВ На странице Aliases размещаются пользовательские команды и идентификаторы. В качестве операторных скобок используются символы { }. Команды отделяются друг от друга символом перевода строки либо символом |. Пример идентификатора, возвращающего информацию о клиенте: clientinfo return mIRC $version (Windows $os $+ ) Пример команды, выходящей с сервера с заданным сообщением и закрывающей mIRC: /quitex quit $1- | exit Локальные переменные создаются командой var. Инициализировать локальные переменные можно прямо в этой команде. Можно задать сразу несколько локальных переменных, разделяя их запятыми. Так же в теле создаваемого идентификатора может быть использован идентификатор $prop для создания собственных свойств (properties) идентификатора. Например: add { var %x = $1 + $2 if ($prop == neg) return $calc(-1 * %x) return %x } $add(1,1) вернёт 2 $add(1,1).neg вернёт -2 В разделе aliases можно задавать переопределения для функциональных клавиш. Например: F3 /msg $active чуть что, сразу змей sF4 /query $1 Префиксы s и c используются для задания клавиш Shift и Control соответственно. Лично я бы не рекомендовал перекрывать системные сочетания клавиш, такие как: Ctrl+F4, F1. Пример. Данный идентификатор возвращает n-ное слово (2-ой параметр) строки (параметры, начиная с третьего), где разделителями слов является символ переданный в первом параметре. Идентификатор считает, что между символами не может быть более чем одного разделителя. extractword { var %x, %len, %ch = $1, %cnt = $2, %str = $3- %len = $count(%str, %ch) + 1 if (%cnt > %len) || (%cnt <= 0) return elseif (%cnt < %len) { %x = $pos(%str, %ch, %cnt) %str = $left(%str, %x) } if (%cnt > 1) { %x = $pos(%str, %ch, $calc(%cnt - 1)) return $right(%str, $calc(- %x)) } else return %str } $extractword($chr(32), 2, Мир! Труд! Май!) вернёт Труд! СОБЫТИЯ В разделе Remote описываются действия происходящие в ответ на некоторые события в мирке, например, при входе кого-либо на канал. Вот далеко не полный перечень возможных событий: ACTION - сообщения от третьего лица (/me). TEXT - текстовые сообщения пользователей (не свои) BAN - установка бан (+b ) DEOP - снятие опа (-о) с кого-либо DEVOICE - снятие войса (-v) INPUT - нажатие клавиши Enter, после ввода текста сообщения INVITE - приглашение на канал JOIN - заход кого-либо на канал KICK - кик кого-либо с канала MODE - изменение модов канала NICK - смену ника NOTIFY - пользователь из нотифи-листа заходит на IRC NOTICE - получение нотиса OP - получение опа (+о) OPEN - открытие окон TOPIC - смена топика UNBAN - снятие бана (-b) UNOTIFY - пользователь из нотифи-листа покидает IRC USERMODE - изменение собственных пользовательских модов VOICE - получение войса (+v) Общий синтаксис обработчиков событий: on [<префикс>]<уровень>:<событие>:[<фильтр>:][<место>:]<команды> где <уровень> - уровень пользователя для которого срабатывает событие. Соответствие пользователь-уровень задается на вкладке Users (синтаксис: уровень: маска). В качестве уровня может использоваться число, именованный уровень или строка. <префикс> - задает ограничение на уровни. Существуют следующие префиксы: + - скрипт сработает только для пользователей, уровень которых не превышает заданный * - скрипт сработает для всех пользователей ! - скрипт сработает для всех, кроме себя & - скрипт не сработает, если предыдущий скрипт был остановлен командой /halt или /haltdef @ - скрипт сработает только если использующий скрипт имеет оп на канале на котором он сработал <событие> - имя события на которое будет срабатывать заданный скрипт (или * для срабатывания на любое событие) <фильтр> - фильтр на событие. Скрипт сработает только если событие содержит в параметрах строку удовлетворяющую фильтру. Возможны следующие варианты: * - любой текст & - любое слово text - текст, состоящий из слова text text* - текст, начинающийся со слова text *text - текст, заканчивающийся словом text *text* - текст, содержащий в себе слово text В фильтрах большие и маленькие латинские буквы неразличимы, в отличии от русских. Так же может использоваться динамический фильтр. Он позволяет при помощи идентификатора $(..) вычислить значения подставленных в него идентификаторов. <место> - место срабатывания скрипта. Пропускаются только события возникшие в определенном месте. Возможны следующие варианты: ? - любое событие в привате # - любое событие на канале #zoo - любое событие на канале #zoo #southnet,#zoo - любое событие на каналах #southnet и #zoo * - любое событие на канале или привате В качестве места срабатывания может быть использована глобальная переменная <команды> - реакция на событие, состоящая из произвольного числа вызовов команд Примеры: on *:TEXT:Zмей:#: /msg $chan чуть что - сразу змей если кто-либо напишет на любом канале слово Zмей или zмей, то скрипт выдаст на канал сообщение \"чуть что - сразу змей\" on *:TEXT:*трахнуть*:#southnet: { /msg $chan смотри как бы самого не трахнуло. } если кто-либо напишет на канале #southnet фразу содержащую слово трахнуть, то скрипт выдаст на канал сообщение \"смотри как бы самого не трахнуло\" on *:ACTION:$(*slaps $me around a bit with a large trout*):#: /describe $chan скорчился от боли Если кто-то выполняет на любом канале экшн на ваш текущий ник, то скрипт выдаст в канал экшн \"/me скорчился от боли\" on *:NICK: { if ($nick == $me) && ($newnick == %myname) /ns identify %mypassword if ($nick == $me) && ($newnick == _ $+ %myname $+ -) /nick %myname } Если ваш ник меняется на ник, записанный в переменной %myname, то он идентифицируется, если же ваш ник меняется на ник с \"лапками\" (такое происходит при сплите) то он меняется обратно на ник без лапок и, соответственно, идентифицируется on *:DEOP:%mychanlist: { if ($me == $opnick) && ($me != $nick) { if (Serv !isin $nick) /chanserv deop $chan $nick /chanserv op $chan $me } } Происходит при деопе на одном из каналов записанных в переменную %mychanlist. Если деопнули вас, причем вы деопнулись не сами, то вам возвращается оп, а обидчик деопается (для этого используется чансерв) ВСПЛЫВАЮЩИЕ МЕНЮ mIRC позволяет создавать свои всплывающие меню для всех видов окон: окна статуса, окна списка ников, окна канала, окна привата и для меню Commands главного меню. Формат описания всплывающего меню: [<глубина>]<наименование>[:< команды>] где <глубина> - глубина вложенности элемента меню (одна или несколько точек) <наименование> - наименование меню или разделитель обозначается символом \"-\" <команды> - реакция на событие, состоящая из произвольного числа вызовов команд Для указания типа меню необходимо выбрать в меню View окно, в котором это меню будет появляться (Status, Channel, Query/chat, Nickname list, Menubar) Пример (меню для окна каналов): Вернулся:/AWAY | /NICK %myname Отошел .Не далеко ..Занят: AWAY Ну очень занят!!! | NICK %myname $+ [busy] ..Отошел: AWAY Где-то тут... | NICK %myname $+ [away] .Далеко ..Есть: AWAY Поем и приду!!! | NICK %myname $+ [eat] ..Ушел: AWAY Нет меня по определению | NICK %myname $+ [out] .Отошел (куда): AWAY $?=\"Сообщение:\" | NICK %myname $+ $$?=\"Дополнительная часть ника:\" Ушел .Спать: QUIT спокойной ночи | EXIT .На работу: QUIT ушел на работу | EXIT .Учиться: QUIT ушел учиться | EXIT - Rejoin:/hop ЭПИЛОГ Подводя итог, хотелось бы напомнить уважаемому читателю о том, что статья не претендует на полное и идеальное руководство по написанию скриптов mIRC. Нашей целью было ознакомить вас с основными понятиями, дать поверхностный обзор и помочь понять с чего же нужно начинать и с какой стороны браться в столь не легкой сфере как скрипто-строение. Авторы желают вам удачи и выражают надежду, что их труд был не напрасен. P.S. Авторы выражают благодарность qingwa за моральную поддержку в процессе написания статьи.
Источник: http://www.neora.ru/ |