[IRC]

Описание некоторых возможностей скриптов программы mIRC

Всё чаще и чаще пользователи сети IRC задумываются о том, как сделать свое общение в сети наиболее комфортным и безопасным. На спрос, как говорится, и предложение найдется. В связи с этим стали появляться всевозможные скрипты, такие как Shutdown, Neo-ra, Xapok etc. Казалось бы, качай и пользуйся, ан нет, как показывает практика, скрипты такого рода имеют ряд существенных недостатков и слишком перенасыщены порой всевозможными, совершенно не нужными фичами. В связи с этим все чаще и чаще можно слышать вопрос о том, как же написать свой собственный скрипт. В этой статье на конкретных примерах мы постараемся показать вам, как создать свой собственный скрипт. Хотелось бы сразу оговориться, что все ниже изложенное будет относиться к IRC-клиенту mIRC.

Так что же такое скрипт? Cкрипт - это дополнительная подпрограмма, модифицирующая ваш IRC-клиент и позволяющая автоматизировать некоторые процессы. Например, для того, чтобы кикнуть или забанить человека, который выкинул вас с канала, вам придется написать сначала:

/kick #channel ник причина

, а затем

/ban ник или хост

А скрипт поможет осуществить эти операции предельно быстро и просто. Достаточно будет кликнуть мышкой по нужному пункту меню.
Давайте попробуем разобраться каким образом это работает в mIRC. В нем есть несколько разделов, которые и отвечают за все действия, совершаемые в IRC. Одним из них является раздел Remote (события) - следит за всем, что происходит в окнах вашего mIRC. Следующий раздел: Aliases. Aлиасы отвечают за всевозможные сокращенные команды. То есть вместо того, чтобы набирать

/join #channel

, можно создать Aliases, который будет выполнять эту команду, скажем при нажатии F7 или любой другой клавиши, на ваше усмотрение. Еще один раздел, который будет нас с вами интересовать: Popups (всплывающие окна). Popups - это выскакивающие менюшки. Вы просто кликнете по нику или в окне канала и выбираете нужный вам пункт, который совершит то или иное запрограммированное ранее действие. Users - секция хранения перечня пользователей с назначенным уровнем доступа для каждого. Variables - отвечает за хранение постоянных переменных и их значения.
Вызвать список всех этих разделов можно кликнув по иконке или выбрав в меню Tools соответствующий подраздел.
Позже мы рассмотрим каждый раздел более подробно. Но так как без знания синтаксиса, переменных, идентификаторов и команд мы скрипт ну никак не напишем. То давайте с ними и познакомимся.

Команды IRC

Ознакомьтесь с командами IRC. Вот наиболее часто употребляемые. IRC команды предназначены для выполнения действий на IRC, например для управления каналами.

/join #канал
  • войти на канал
/part #канал
  • покинуть канал
/list [#channel] [-MIN #] [-MAX #]
  • выводит список доступных каналов. Например:
/list
  • вывести все каналы
/list *w* -MIN 10 -MAX 20
  • вывести все каналы, на которых находится от 10 до 20 человек, содержащие в названии букву w
/me действие
  • сообщить в текущий канал (приват) о своем действии
    Символ
/

называется командным префиксом и не является частью команды. Он служит для указания мирку того, что вводимая строка является командой. Так же может использоваться префикс

//

, заставляющий mIRC вычислить подставленные в команду идентификаторы и префикс

/.

, блокирующий любой вывод текста на экран:

------------------|-------------
Команда           | Результат 
------------------|-------------
/echo мой ник $me |мой ник $me 
//echo мой ник $me|мой ник Zmey 
/.echo мой ник $me| 
--------------------------------

В теле скрипта использование префикса

/<
/pre> не обязательно.  

## ИДЕНТИФИКАТОРЫ

Идентификаторы являются аналогом функций. Вот краткий перечень наиболее часто используемых идентификаторов.  

* $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 Zm
  ey | ложь)
+ 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
  • #s outhnet,#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 за моральную поддержку в процессе написания статьи.