Об IRC. Доступно и со вкусом.

Использование $submenu

В данной статье мы рассмотрим создание всплывающих меню с помощью идентификатора $submenu.
Использование $submenu

Введение
$submenu это идентификатор, появившийся в mIRC 6.0, помощь по mIRC описывает его так:
$submenu($id($1)) - это идентификатор, позволяющий вам динамически создавать пункты меню, и может быть вызван только из popup меню.
Идентификатор вызывает $id($1), где $id() это название вашего идентификатора, и где $1 = 1, и возрастает на 1 с каждым вызовом, дополняя своим содержанием $id() popup менюху.
Значение, которое возвращает $id()должно быть однострочным, как и в popup меню.
Операция прерывается, когда идентификатор $id() не возвращает ничего.
menu status {
Animal
.$submenu($animal($1))
}

alias animal {
if ($1 == begin) return -
if ($1 == 1) return Cow:echo Cow
if ($1 == 2) return Llama:echo Llama
if ($1 == 3) return Emu:echo Emu
if ($1 == end) return -
}
Значения begin и end заключаются в разделители.
Примечание: Вы не сможете создавать вложенные меню, данный идентификатор строит только одно меню.

Еще примеры
К несчастью, в помощи к mIRC дан только один пример этого очень нужного идентификатора.
Сейчас попытаемся понять его работу более глубоко на примерах. Итак начнем:
Сначало создадим следующий алиас:
alias _partchan {
if ($1 == begin) return -
if ($chan($1) ischan) return $ifmatch :part $ifmatch
}
Если не поняли его работу, то введите //echo -a $_partchan(1) и покажет первый из всего списка каналов на которых вы сидите, ввиде: #bestirc :part #bestirc
На первый взгляд ничего полезного в этом нет, но используя наш идентификатор $submenu мы сделаем из этого конфетку.
Вставляем в Popups, раздел Канал следующее:
Покинуть
.Все каналы:partall
.$submenu($_partchan($1))
И смотрим, что получилось, mIRC вставляет все каналы на которых вы сидите в popup меню. Раньше бы пришлось писать что-нибудь такое:
Покинуть
.Все каналы:partall
.-
.$chan(1):part $chan(1)
.$chan(2):part $chan(2)
; и т.д.
С использованием идентификатора $submenu, работать с popup стало намного проще и легче.

Продвинутые примеры
Еще один хороший пример использования $submenu – это когда у вас есть список элементов. Допустим у вас есть переменная %variable, содержащая список каналов. Например %recent.channels #mirc,#bestirc,#irchelp,#mircscripts,#help
Создаем такой алиас:
alias _recentchan {
if ($gettok(%recent.channels,$1,44)) return $ifmatch :join $ifmatch
}
И вставляем следующее в Popups:
Мои каналы
.$submenu($_recentchan($1))
И смотрим результат..

И еще несколько примеров
Еще одной отличительной особенностью $submenu является его поддержка других идентификаторов. Сейчас рассмотрим еще один интересный пример возможностей $submenu. Допустим у вас три переменные: одна – под любимые каналы, другая – под любимые ники, третья – под любимые ники:
%recent.join #mirc,#help,#irchelp,#mircscripts,#bestirc
%recent.server irc.dalnet.ru,irc.bestirc.ru,irc.dogma.net, irc.ru
%recent.nick yXo,yXu,yXa,yxactuk
Сейчас вы увидите, что даже название переменных создано с умыслом.
Создаем такой алиас:
alias _recent {
if ($gettok($($+(%,recent.,$2),2),$1,44)) return $ifmatch : $2 $ifmatch
}
Разберем скрипт по кусочкам:
$+(%,recent.,$2) – создаст переменную вида %recent.$2
Если значение $2 будет join, он создаст переменную %recent.join и т.д.
$(%recent.join,2) – это тоже самое, что использование идентификатора $eval. Таким образом, если у нас была переменная %recent.join, то использование данной конструкции вернет значение этой переменной (#help,#bestirc.. и т.д.).
А $gettok я думаю не нуждается в пояснениях, также как и $ifmatch.
Причина по которой мы назвали так наши идентификаторы, это чтобы удобнее было работать с ними в $_recent identifier.
Но вернемся к нашему скрипту, вставляем это в Popups:
Любимые
.Серваки
..$submenu($_recent($1,server))
.Каналы
..$submenu($_recent($1,join))
.Ники
..$submenu($_recent($1,nick))

И тестим, что мы получили ;)

А сейчас поработает с идентификаторами и переменными внутри $submenu. Если вы умеете динамически создавать и изменять вашим popups, используя команду /write, то скорей всего вы уже знакомы с такими конструкциями как $!identifiers и % $+ variables.
Для тех, кто не знает, они предназначены для записи в popup файлы не значения идентификатора $identifiers, а его самого, т.е. слово '$identifiers'. Тоже самое и для переменных %variables.
Как это все применимо для $submenu?
Сейчас увидим на простом примере. Пишем алиас:
alias _part {
if ($chan($1) ischan) return $ifmatch : part $ifmatch $!input(Введите сообщение,1,Part)
}
Заметьте, я использовал $!input вместо $input. Это не даст mIRC интерпритировать значение идентификатора $input при создании подменю (или значения popup).
Тоже самое и для переменных, если вы не хотите, чтобы переменная была обработана и считано ее значение, просто используем такую конструкцию % $+ variablename.
Вот еще один алиас для примера:
alias _rfpop {
var %c = $chan($1), %n = $gettok($3,1,33), %m = kick %c %n : $!+ $!input(Введите причину кика %n с %c ,1,Кик)
if ($2 == kb) %m = .raw mode %c +b $mask($gettok($3,2,33),2) $!+ $!lf $!+ %m
else %m = .raw %m
if ($1 isalpha) return -
if ($comchan(%n,$1).op) return %c : %m
if ($chan($1) ischan) return $!style(2) %c :return
}

Заключение
Надеюсь теперь, когда мы расширили свои познания в этом вопросе с помощью этих нескольких скриптов, у вас в голове созреет еще несколько идей использования данного идентификатора. Это не важно, используете ли вы переменные, ini файл, hash таблицы или просто текстовые файлы, идентификатор $submenu все равно может быть использован. Все, что вам понадобиться, это капелька выдумки и ваши скрипты превратятся действительно в произведения искусства.