_Пара слов о MIrc скриптинге_
1)Предисловие
2)Алиасы, идентификаторы и переменные
3)Менюшки
4)Скрипты
5)Примеры для практики
===[ :Begin: ]===============
Хеллоу, хочу сразу вас предупредить дорогой читатель, что в этой статье вы не увидете как "взломадь инт0рнед",
"похэкодь соседа" или "написадь своего мего превадного троя на дельфи",кои статьи щас почему-то стало "модно"
писать и которыми завален весь рунет.Так что если вам это не по душе можете смело дальше не читать, а закрыть
страницу или пролистать вниз и запостить комент типо "КГ/AM".. потому что непохек.С самого начала я собирался
написать статью "чисто для себя", по двум причинам 1)Дабы закрепить свои знания в данной области
(с памятью проблемы - сказываются частые падения вниз головой с качелей в детстве. Я серьёзно))..
2)Ну и хоть как то научиться четко формулировать свои мысли Т.к это как никак тренирует мозг и не даёт ему
окончательно атрофироваться засохнуть ИМХО.В этой статье я хотел лишь слегка затронуть тему Mirc скриптинга.
Итак, начнём с того что IRC это сервисная система,при помощи которой можно общаться с другими людьми в реальном
времени,которая была создана финским студентом Ярко Ойкариненом.В русском сленге её часто называют "иркой","ирцем"
или "миркой","мирцем" (немного забегу вперед:последние два примера не совсем из той оперы, "не совсем" потому что
"миркой" или "мирцем" обычно называют клиент для IRC сетей).Я не буду здесь описывать как настраивать mIRC,
и заходить на каналы тут я только опишу пару сервисов и команд для них Итак, начнём с NickServ, который предназначен
в основном для регистрации и "защиты" ника.Сразу добавлю что можно писать /ns вместо /msg Nickserv
команды, это намного быстрей и удобней. В первую очередь нам надо зарегистрировать себе ник на сервере,
что позволяет сделать команда /ns REGISTER пароль [email].Хотелось бы отметить что регистр символов в пароле
различаться ! Т.е пароли Vasya и VASyA это совершенно два разных пароля. Впредь заходя под своим
свежезарегестрированным иком вы должны проидентифицироваться что позволяет сделать команда
/ns IDENTIFY пароль_при_реге.Команда /ns LOGOUT работает наоборот,т.е с вас снимается статус
владельца ника.Теперь перейдем к ChanServ'у, сервису который позволяет создавать и управлять своими каналами.
Зарегестрировать свой канал нам позволяет команда /cs REGISTER #канал пароль описание
При регистрации канала у вас должны быть права ОПа и этот канал не должен быть зарегестрированым.
Проидентифицироваться на своем канале позволяет команда /cs IDENTIFY #канал пароль, если вы зашли под своим
ником проидентифицировавшись то можно не идентифицироваться на канале.
==============[ :Непосредственно mIRC скриптинг :]=============================
Что же такое скрипт ? Как говорит хелп мирка (к которому я буду иногда
обращаться в этой части,но истолковывать своими словами с небольшими дополнениями) - это набор правил,которые
используються для автоматизации действий mIRC. mIRC имеет собственный язык скриптов, который служит для выполнения
многих задач, от управления вашими IRC каналами до мультиплеерных игр.Писать скрипты можно хоть в блокноте ,
но я бы советовал вам делать это во встроенном в mIRC редактором скриптов т.к это намного удобней.Весь
мирц-скриптинг сводиться к редактированию следующих файлов (в версии 6.31,в 6.21 эти файлы находяться в папке с
мирцем):
%путь к вашей папке с mIRC%sriptsaliases.ini - здесь содержаться ваши алиасы
%путь к вашей папке с mIRC%sriptspopups.ini - здесь всплывающие меню
%путь к вашей папке с mIRC%sriptsvars.ini - переменные
%путь к вашей папке с mIRC%sriptsusers.ini - уровни доступа пользователей и собырий
%путь к вашей папке с mIRC%remote.ini - а здесь - ваши скрипты
==============[ :Aliases: ]=============================
Алиас - Это созданная пользователем последовательность часто используемых команд, сгруппированная в один сценарий,
для упрощения часто повторяющихся действий.Чтобы создавать свои алиасы нужно знать хотябы основные команды IRC.
Создав свой сценарий/алиас вам больше не придеться долбить в строку ввода часто используемые или длинные команды,
например: /msg nickserv identify **** . Рассмотрим структуру алиаса:
/<имя нашего сценария> /<имя команды> <список параметров (иногда не обязательно)>
Если в вашем сценарии будет использоваться больше одной команды тогда нужно ставить фигурные скобки либо разделять
команды вертикальной чертой. Пример:
/<имя нашего сценария> {
<команда 1> <список параметров>
<команда 2> <список параметров>
<команда 3> <список параметров>
}
или
/<имя нашего сценария> <команда1> <список параметров> | <команда2> <список параметров> | <команда3> <список параметров>
Как упоминалось выше список параметров команды может и отсутсвовать вовсе.
Многие, принявшись за изучение какого-либо языка программирования пишут свой "Hello World", создание mIRC скриптов
это конечно же не программирование, но сейчас мы сделаем с вами аналогичное, т.е напишем простейший алиас который
отправляет на канал сообщение "Hello World". Войдите в редактор алиасов (ALT+D) и напишите с новой строки:
/hello /say Hello World
Итак:
1)/hello это непосредственно имя сценария/алиаса к которому мы можем обращаться как раз по этому имени..
2)/say - непосредственно команда IRC печатающая ваше сообщение
3)Hello World - параметры команды say
Если вы введёте в строку ввода /hello то вы увидите отправленное сообщение "Hello World".Лучше не засорять канал
бесполезными сообщениями,а зарегистрировать себе новый (см.выше) или же просто отобразить сообщение у себя в окне
чата, заменив /say на /echo.Запуская данный сценарий результат его выполнения т.е строку "Hello World" увидете
только вы.Вот еще несколько простых алиасов которые позволяют получить общее представление о структуре алиасов
с которыми у вас не должно возникнуть проблем:
/privall /say Hello All
/aw /me Отошел покушодь
/poka /me Прощаеться со всеми | /quit good bye
Также мы можем обращаться к нашему алиасу не по его имени а по горячей клавише, мы можем использовать только
функциональные клавиши (т.е F1-F12) но и этого нам должно вполне хватить, учитывая то что мы можем делать связки
вида Ctrl+F8 и Shift+F8, это 36 различных комбинаций которых нам должно
хватить "за глаза и за уши". Ну и как обычно пару примеров:
F2 /say Hello All - при нажатии F2 отправляет сообщение Hello All
sF2 /say Hello All - при нажатии Shift+F2
cF2 /say Hello All - при нажатии Ctrl+F2
-----[ :Параметры и Идентификаторы: ]---------------
В своих алиасах вы также можете использовать идентификаторы ($),которые по сути можно назвать специализированными
переменными которые возвращают какое-либо значение. Рассмотрим следующий пример алиаса:
/mw /say $1
$1 - это как раз тот идентификатор,о котором я говорил выше. В данном случае это первый аргумент (параметр) командной
строки.Также существует множество других идентификаторов с которыми вы можете столкнуться в будущем.
Вот некоторые из них: $ip - возвращает ваш собственный айпи, $me - ваш ник, $chan - канал на котором вы находитесь
в данный момент. Описание остальных идентификаторов вы можете найти в хелпе к мирку.Как я уже сказал
$1 - это первый параметр/аргумент командной строки т.е если вы введёте в строку ввода "/mw Hello" то вы
"отправите" сообщение Hello. Нетрудно догадаться, что если мы напишем алиас вида:
/mw /me $2 $3
и вобьём в строку ввода "/mw Снова приветствует всех" то вы "отправите" только *Vasya_Pupkin приветствует всех,
т.к мы не передали в команду ME первый параметр строки т.е слово "Снова". Также вы можете передать все параметры,
начиная с какого то конкретного, что позволяет нам сделать идентификатор $x- это передаст все параметры начиная
с Х и до конца строки...(напр: $3-).Также мы можем запретить запуск алиаса если какой либо из параметров
"пустой" т.е алиас:
/poka /me slaps $$1 around with $$2 - не будет запущен,если хотябы один параметр ($$) не указан т.е сценарий /poka
не будет выполнен если мы не укажем например второй параметр.
/mj /join $? - здесь как видно, мы куда то заходим только непонятно куда,переменная $? - означает то что данный параметр должен быть
введен вручную т.е при выполнении данного скрипта будет отображено диалоговое окно для ввода параметра.Заголовок диалогового окна
можно изменить:
$?="Введи название канала для входа"
Параметр $! содержит строку которую вы только что ввели в окне диалога...
Также мы можем склеивать текст благодоря идентификатору "$+". Обьяснять не буду т.к это должно быть понятно - покажу
на примере:
1)say $+(text_1,text_2) и 2)say text_1 $+ text_2 - оформлены по разному, но это одно и тоже.
Я считаю что знания нигде лучше не закрепляются, чем на практике вот мы этим щас и займёмся...Сейчас
мы напишем небольшой скрипт эвея:
mw {
if ($away == $false) {
set %x $me
$?="Куда уходим ?"
me ушел по причине: $!
away $$!
nick $me $+ |away
}
else echo 4 -=х Вы уже отошли х=-
}
nmw {
if ($away == $true) {
nick %x
away
msg nickserv identify *password*
}
else echo 4 -=х Вы никуда не отходили. = х=-
}
Здесь мы встречаемся с конструкцией IF-THEN-ELSE которая может выполнять различные действия в зависимости
от того какие результаты возвращаються,если перевести на русский язык то это будет выглядеть как "если-то-иначе".
Можем рассмотреть как эта конструкция уcтроена:
if ("аргумент" "оператор" "аргумент") {выполняемое действие при успешном выполнении условия}
else {выполняемое действие,если условие не выполнено}
теперь рассмотрем что такое оператор. говоря простым русским языком эта штука сравнивает значения аргументов.
один из операторов - "==" (оператор равентсва) т.е если первый аргумент равен второму то считать условие
выполненным... существует и множество других операторов например:
"!=" условие можно считать выполненным если первый аргумент не равен второму, "<=" если первый аргумент меньше
или равен второму...
В качестве примера приведу:
/ta {
if ($me == suriv) say я сурев
if ($me == sur1v) say test_2
else nick suriv
}
По моему тут всё очень просто: если мой ник suriv написать "я сурев",если мой ник sur1v написать "test_2",иначе
(если не ник не suriv и не sur1v)переименовать себя в suriv.Теперь вернёмся к нашему скрипту эвэя,выяснив в первую очередь стоим
ли мы уже в эвее или нет,если стоим то просто вывести сообщение и ничего дальше не делать,если же не стоим то "работать" дальше.
Это можно сделать благодаря вышеупомянутой конструкции IF-THEN-ELSE и идентификатору $away,который может принимать два
значения в зависимости от того находитесь ли вы эвее ($true) или нет ($false), мы как раз сравниваем:
"if ($away == $false) {здесь выполняем нужные нам команды}" Строкой ниже мы видим незнакомую строку
"set %x $me" - здесь мы объявляем (set) переменную (%х) которая будет хранить наше имя ($me) на будущее.
Дальше мы выводим диалоговое окно с заголовком "Куда уходим ?" для ввода сообщения.
Следующая строка "переключает" вас в режим эвэй, если вы ничего не ввели в диалоговое окно то наш алиас просто
не выполниться т.к я уже говорил что если мы используем "$$x" то алиас не будет выполняться если данный параметр
пуст,дальше мы добавляем в хвост своего имени |away... Теперь рассмотрим скрипт "снятия" эвея..
Опять же сравниваем находимся ли мы в эвее, если да то выполняем работу если нет, то просто пишем уведомление о
паранойе.Допустим мы находимся в эвее -первым делом надо вернуть наш ник обратно мы это делаем это уже довольно
знакомой командой /nick, %x эта как раз та переменная в которую мы сохранили наш ник в скрипте эвэя...
команда /away без параметров снимает с вас флаг away... и последняя строка нужна если вы зарегистрированы на канале
для того чтобы дабы не писать каждый раз длиннющую строку /msg nickserv identify *pass* мы сделаем это автоматом..
куда вместо pass вы должны естественно вписать свой пароль
==========[ :Menu: ]==============
Сейчас мы с вами разберём простые примеры менюшек,и добавим пару своих всплывающих меню. Итак,меню
(конкретно в mIRC скриптинге) - это то что вы видите в окне статуса,привата,канала,списка ников канала,главного меню,
нажав в каком либо из этих окон правую кнопку.... Mirc как раз позволяет создавать отдельные всплывающие меню для
вышеперечисленных окон.Я считаю что в некоторых ситуациях удобней использовать меню, чем писать в строку ввода имя
нашего алиасa, тем более если мы ему передаём какиелибо параметры.Структура Меню:
:
"menuitem" - название пункта меню
":" - разделитель, отделяющий название пункта меню и выполняемых команд для данного элнмента (пункта) меню
"commands" - как не сложно догадаться сюда вы вставляете свои команды.
Создадим простое меню.Жмём Alt+P или переходим на вкладку Menu если "окно скриптов" у вас уже открыто..
В верхнем меню выбираем Вид -> Канал (View-> Channel).Tаким образом мы с вами создадим всплывающее меню которое будет
появляться только в окне канала после нажатия на нём правой кнопкой.. итак пишем:
Says
.Hello
..Hello all:/say Hello All
..Hello "user":/me Mr. $+ $me пожал руку $?
.Mess
..Mess Tee:/me ушел пить чай
..Mess Smoke:/me ушел курить
..Mess away:/me ушел по дела
.Bye
..Bye all:/me прощаеться со всеми
Только что состряпанное меню не должно у вас вызвать вопросов относительно касающихся того что идёт после ":" т.к
эти команды мы уже использовали. Здесь мы видим то, что многие строки идут с точками в начале.Таким образом мы
указываем подменю какого то одного из пунктов меню.Т.е эл-ты "Mess Tee","Mess Smoke" и "Mess away" являються
подменю пункта меню "Mess" который в свою очередь являеться подменю пункта меню "Says"...
Уловили ? Т.е чем "глубже" мы идем тем больше точек мы ставив перед названием элемента меню - т.е при каждом новом
"вложении" добавляем одну точку перед названием элемента меню - всё просто.Как уже видно,пункты меню содержащие в
себе другие подменю пишуться без ":<команда>"т.к при наведении на них раскрываеться вложенные в них меню и естественно
оно не может выполнить какую либо команду.. Т.е можете нажимать на них до посинения ничего не пройзойдет.
Для создания разделителей используеться знак "-":
Test_1:/say test one
Test_2:/say test two
Также мы можем из своих меню ссылаться на алиасы, указав вместо стандартной команды имя алиаса.Например данное меню
ссылаеться на наш старый "скрипт эвея":
Away_test
.away_on:/mw
.away_off:/nmw
Это несколько облегчило задачу т.к вам теперь не придеться набирать в окне ввода длинюющую команду /mw или /nmw ))
пара движений мышкой и наш алиас запущен.
========[ :Scripts: ]===============
Итак вкладка Scripts как нетрудно догадаться предназначена для создания скриптов т.е програм обработчиков которые
срабатыают в ответ на различные события IRC, будь то строка содержащая слово "дергать" или же смена ника какого либо
пользователя на том же канале что и вы... Итак разберем простой скрипт:
on *:INVITE:#:/msg $nick Спасибо я обязательно зайду на $chan
В первую очередь хочу добавить что здесь идентификаторы уже работают немного по другому, т.е идентификатор $chan
о котором я говорил,обозначающий текущий канал на которым вы находитесь в данный момент, то здесь это же идентификатор
имеет уже значения,которые непосредственно связанны с выполняемым скриптом... т.е если возвращаеться ник,то это ник
пользователя запустившего наш обработчик,в нашем случае $chan уже обозначает не текущий канал а канал($chan) на который вас
пригласил(INVITE) пользователсь ($nick).Разберем по частям:
В большинстве случаев используеться именно ON.Здесь мы указываем что наш протокол будет реагировать на какое либо
событие - ON, либо на протокол получения информации - CTCP или RAW
<*> - Здесь нам нужно задать уровень пользователя,который сможет "запустить" наш обработчик.
Уровень 1 или * позволяет "запустить" любому пользователю наш скрипт,т.е конкретно в нашем случае он будет реагировать
на приглашения/инвайты от любого пользователя независимо от его уровня доступа если бы мы использовали "on 30" то
наш обработчик реагировал бы только на пользователей с уровнем доступа 30 и выше(про уровни доступа позже).
- Здесь непосредственно само событие на которое должен реагировать наш обработчик. Самих событий в мирц
достаточно много,например
on KICK - событие на кик какого либого пользователя
on TEXT - событие на текст в привате или на канале
on OP - событие на получение опа какого либо пользователя
В нашем случае обработчик реагирует на получение приглашения вас на любой канал
<#> - Здесь мы должны сообщить обработчику, на события связанные с какими каналами ему реагироать т.е здесь мы
сообщаем обработчику чтобы он срабатывал при получение приглашения на какой либо канал (#fix,#general,#test - их
можно вводить через запятую).В нашем случае обработчик реагирует когда нас приглашают на любой канал (#)
/msg $nick Спасибо я обязательно зайду на $chan> - Как уже видно, сюда мы вводим команды при запуске обработчика....
Т.е если все условия удовлетворены то наш обработчик выполняет именно эти команды.Как я уже говорил здесь идентификаторы
$chan и $nick обозначачабт не канал на котором вы находитесь и не ваш ник (соотвественно), а тот канал на кототорый
вас пригласил пользователь запустивший наш обработчик..Вроде по этой части всё должно быть понятно...
Для "верности" рассмотрим еще один скрипт
on *:JOIN:#:/msg $chan Привет $nick !
Если перевести на наш родной язык то получается что-то вроде этого: При заходе (событие JOIN) пользователя с любым
уровнем доступа (on *) на любой канал(#),написать собщение на канале "канал_на_котором_сработал_обработчик":
Привет "имя_зашедшего_пользователя" ! (/msg $chan Привет $nick !)
Для пущей убедительности рассмотрим еще один скрипт, на этот раз автоидентификация:
on *:NOTICE:*IDENTIFY*:?:{
if ($nick == NickServ && $server == irc.rusnet.ru) { privmsg NickServ identify "ваш_пароль" }
if ($nick == NickServ && $server == irc.dalnet.ru) { privmsg NickServ identify "ваш_пароль" }
}
Начнем с Первой строки, которую можно "расшифровать" следующим образом: Реагировать на любого пользователя(или событие)
если он нам прислал нотис (NOTICE)в приват (?) в котором встречаеться строка IDENTIFY,дальше идут команды которые по
сутя являються "проверками", если ник пользователя вызвавшего обработчик - NickServ (от него пришел нотис)и сервер на которым
вы находитесь в данный момент irc.rusnet.ru, ТО послать приватное сообщение NickServ'u со строкой identify "ваш_пароль"
Отдельно хотелось бы сказать насчёт *IDENTIFY*:
*IDENTIFY - если строка в нотисе заканчиваеться словом NOTICE
IDENTIFY* - если слово IDENTIFY первое в строке
*IDENTIFY* - если слово IDENTIFY присутствует в тексте (т.е наличие символа "*" не обязывает чтобы было какое либо слово/a
в том месте... Если в нотисе единственное слово IDENTIFY то данное условие будет считаться выполненым при всех трех вариациях
(*IDENTIFY, IDENTIFY*, *IDENTIFY*)
===========[ :Немного практики: ]============
Если вы собираетесь работать в своих скриптах со текстом и обрабатывать его (разбивать на слова и прч...),то
идентификатор $gettok самый подходящий вариант. Здесь мы рассмотрим работу с токенами, думаю одного примера хватит
чтобы понять принцип работы идентификатора $gettok итак:
$gettok(text,N,C)
text - текст который мы хотим обработать
N - здесь мы указываем номер слова которое хотим получить
C - здесь указываем символ разделитель нашего токена
т.е: $gettok(Ночь:Улица:Фонарь:Аптека,3,58) вернет нам слово "Фонарь" т.к это третье слово если учитывать то что
слова разделяються друг от друга символом ":", ASCII код которого 58.Посмотреть таблицу ASCII кодов можно в хелпе
к мирку или же идентификатором $asc() который возвращает ASCII код указанного символа в скобках... т.е чтобы узнать
ASCII код символа ":" нужно использовать $asc(:)
/nap {
set %den $gettok($date,1,47)
set %mes $gettok($date,2,47)
set %god $gettok($date,3,47)
if (%mes == 01) set %mes января
if (%mes == 02) set %mes февраля
if (%mes == 03) set %mes марта
if (%mes == 04) set %mes апреля
if (%mes == 05) set %mes мая
if (%mes == 06) set %mes июня
if (%mes == 07) set %mes июля
if (%mes == 08) set %mes августа
if (%mes == 09) set %mes сентября
if (%mes == 10) set %mes октября
if (%mes == 11) set %mes ноября
if (%mes == 12) set %mes декабря
me напоминает что сегодня: %den $+ ое %mes %god года...
}
Разберем этот скрипт..
В первую очередь присваем переменным нужные нам значения. Тут мы видим идентификатор $date который
возвращает дату в формате /day/month/year... в качестве разделителя слов мы взяли "/" который как раз и разделяет
день месяц и число..Первое слово присваем переменной %den которая будет хранить текущий день,второе слово присваем
%mes которая будет хранить месяц,третье - текущий год.Дальше мы сравниваем значение переменной %mes с текущим месяцем
если значения совпадают то присваем этой переменное уже не число как мы это делали выше, а название месяца
и наконец пишем сообщение от третьего лица сообщающее сегоднящнюю дату.
Впринципе можно было обойтись без переменных (первые 3) но было бы больше писанины имхо:
if ($gettok($date,2,47) == 01) set %mes bla-bla-bla
.................
if ($gettok($date,2,47) == 12) set %mes bla-bla-bla
me напоминает что сегодня: $gettok($date,1,47) $+ $gettok($date,2,47 $gettok($date,3,47) года...
Или же поместить "громоздкую" конструкцию сравнения IF-THEN-ELSE,которую неуместно было бы тут использовать.
Но как я уже говорил это лишь примеры для практики... Которые можно решать различными
способами и чем больше вариантов мы "опробуем" те лучше для нас самих.Прежде чем перейдем к файлам хотелось бы
возвратиться к нашему скрипту эвея который я немного улучшил и добавил новую "фичу"которая пишет сколько времени вы
отсутсвовали.
mw {
set %myhour
set %mymin $gettok($duration($awaytime,3),2,58) $+ мин
set %mysec $gettok($duration($awaytime,3),3,58) $+ сек
if !$away {
set %x $me
$?="Куда уходим ?"
me ушел по причине: $!
away $$!
nick $+($me,|away)
}
else {
nick %x
me отсутствовал %myhour %mymin %mysec
away
msg nickserv identify *password*
}
}
Первое что бросаеться в глаза это два новых идентификатора "$duration" и "$awaytime"... Начнемс с "$awaytime" который
указывает сколько времени вы провели в эвее в секундах. Но так как строка вида "*Vasya_Pupkin отстутсвовал 1432 секунд" будет не
очень красиво смотреться, то мы должны привести её в порядок - т.е возвратить время в формате Hour:Minute:Second, что и позволяет
нам сделать идентификатор "$duration". Если быть более конкретным то он принимает "время и дату" в секундах, а возвращает уже
в формате "week day hour minute second" или hour:minute:second, в зависимости от того какой параметр мы ему "передадим",
ну и работу с токенами мы уже проходили. Здесь мы мы берем слова,которые отделяються друг от друга символом ":", ASCII код
которого 58.который как раз и возвращает идентификатор $duration (с параметром 2),отделяя часы от минут и секунд..
$gettok($duration($awaytime,3),2,58) $+ мин
Остальное в принципе должно быть всё понятно, только теперь наш скрипт занимает меньше места несмотря на добавление новой
"фичи". И теперь это не два отдельных скрипта как раньше, а один единственный. В котором мы проверяем стоит ли у нас флаг эвея
(т.е в эвее ли мы или нет)- если находимся,то снять с нас флаг эвея, написав сообщение от третьего лица
сколько времени вы остутсвовали, проидентифицировавшись на сервере, если же мы не в эвее то сделать это, как обычно
указав причину ухода. Впринципе здесь не должно возникнуть у кого-то трудностей с пониманием работы данного алиаса...
Дабы не заниматься тафтологией я буду приводить примерых простых скриптов и по ходу дела обьяснять что к чему.Щас мы
попробуем написать скрипт... даж не знаю как его обозвать. Может быть видели каналы где стоят боты, которые выдют
рандомный анекдот при отравке сообщения содержащего строки - !анек или !anec.Попробуем сделать то же самое разбирая
по ходу дела работу файлами и новыми идентификаторами.Но здесь мы разберем алиас "цитат в одну строку т.к это пога будет полгче".
Cначала нам надо сделать проверку существует ли файл с нашими "цитатами" или нет для этого воспользуемся
идентификатором $exists(filename) или же $isfile(filename) (лично я не увидил никакой разницы между ними так что можно
использовать любой) где "fileame" это путь к файлу который мы хотим проверить, если файл существует то он возвращает
нам $true, если же такого файла не находиться то $false. Многие устанавливают mIRC в директорию C:Program FilesmIRC,
многие но не все.. дабы не возникло никаких казусов воспользуемся идентикатором $mircdir который возврашает путь к папке с
установленым мирком.Теперь мы должны прочитать любую строку из нашего файла с цитатами,для чтения файла существует ф-ция
$read(filename) (для более подробного "описания" обратитесь к хелпу мирка) в итоге получаем простой скрипт который реагирует на
слово !q от любого пользователя и выдаёт рандомную(случайную)
строку из файла:
on 1:TEXT:!q*:#:{
set %quotesfile $mircdir $+ quotes.txt
if ($exists(%quotesfile) == $true) /msg $chan 3 вспомнил перл: $read(quotes.txt)
else echo Файл не найден
}
Не так уж и сложно как казлось. Как и обещал теперь напишем скрипт выдающий от третьего лица сегодняшнюю дату:,как видно
скрипт совсем не "полегчал" а наоборот, усложнен специально для того чтобы познакомиться с новыми конструкциями языка.
И "взять на вооружение" новые приёмы скриптописания.
/test {
set %mn 1
set %mfile $+($mircdir,months.txt)
set %den $gettok($date,1,47)
set %mes $gettok($date,2,47)
set %god $gettok($date,3,47)
if $exists(%mfile) {
while (%mn <= 12) {
if (%mes == $gettok($read(%mfile,%mn),1,59)) {
set %mes $gettok($read(%mfile,%mn),2,59)
goto Okay
}
inc %mn
}
echo 4 Error !
/halt
:Okay
me напоминает что сегодня: %den $+ ое %mes %god года...
}
else echo 4 Файл не найден !
}
Файл Months.txt:
01;Января
02;Февраля
и т.д до 12.
Как обычно, разберем его по строкам.Первые пять строк это создание и присваивание нашим переменным "нужных" нам значений,
здесь все должно быть понятно и не должно нуждаться в обьяснении. Дальше мы проверяем существует ли файл с названием
месяцев (months.txt) если нет то сообщаем об этом пользователю и завершаем работу алиаса, если же данный файл находим
то запускаем цикл While.Структура которого схожа с конструкцией IF-THEN-ELSE:
While (Условие) {Выполняемые команды}
То есть цикл будет выполняться пока выражение в круглых скобках будет правдой.Конкретно в нашем случае мы будем читать
файл и сравнивать его первое слово в строке, значение которой имеет переменная %mn ($read(%mfile,%mn)с текущим месяцем
пока эта же переменная %mn будет меньше или равна 12.Если значения не совпадают то увеливаем переменную %mn на единицу
(inc %mn) и "проходим" наш цикл с начала.При совпадении присваиваем нашей переменной %mn новое значение(текст), которое
мы берем из того же файла на той же строке где и совпали наши значения(т.е удовлетворены условия конструкции IF-THEN-ELSE),
но которое являеться вторым словом, которое разделяеться от первого символом ";" ascii код которого
59($gettok($read(%mfile,%mn),2,59)).И переходим на метку "Okay".В mirc-скриптинге, да и вообще в любом языке
программирования метки являються командами безусловного (т.е принудительного) перехода на какую либо часть нашей
программы. Мы же переходим на 18ую строку которая содержит me напоминает что сегодня: %den $+ ое %mes %god года...
и завершаем работу алиаса.Если мы "прошли" наш цикл все 12 раз и по каким-то необьяснимым причинам значения текущего
месяца и порядкового числа месяца в файле не совпали то выдаём сообщение об ошибке, и завершаем работу алиса командой
/halt которая не позволит выполняться ему дальше и попасть на строку с me напоминает что сегодня: %den $+ ое %mes
%god года... Вот и всё, может для кого-то немного запутано но это пока цветочки ( ягодок в статье не будет)) )
Единственое что хотелось бы добавить, так это то что мы немного по другому "оформили" конструкцию IF-THEN-ELSE.
По простой причине того,что если идентификатор возвращает значение типа Boolean т.е "$true" или "$false" (1 или 0)
то мы можем не писать "if ($identificator == $true)"а можем написать "if $identifikator" что будет тем же самым как
и пример выше ("if !$identifikator" тоже самое что и "if $identifikator == $false").Можно уменьшить и упростить
скрипт убрав всяческие проверки,сообщения об ошибках и сверять номер месяца не со "%mn"ой строкой в файле а с номером
"прохода" скрипта и при выполненом условии читать из файла порядковый номер этой строки.Т.е файл будет выглядеть:
Января
Февраля
и т.д
====================[ :iNt 20h: ] ===================
Вот впринципе и всё что я хотел описать в данной статье...Здесь практически нету "полезных и интересных" скриптов
типа: qwerty=йцук,автоприветсвие всех пользователей,вставка выделенного ника в списке юзеров канала в строку ввода
по горячей клавише,etc... Так как моей целью было описать стандартные структуры/конструкции и синтаксис языка,
познакомив вас с основными командами на простых примерах, а не просто скопипастить скрипты и пояснить
их другими словами.
Ссылки на сайты и статьи которое помогли мне при написании статьи и которые возможно пригодяться вам:
http://www.bestirc.ru/ - Кульный сайт на котором можно скачать как русифицированый mIRC так и справку для него
(которая также очень помогла и ответила на некоторые вопросы),на русском языке.Также там можно найти неплохие статьи
в том числе и по mIRC скриптингу.http://www.neora.ru - Аналогично, сайт по тематике IRC сетей, огромное количество
хороших статей как для начинающих так и для "закаленных"
http://ircinfo.ru/ - Неплохой сайт где как говорит титл сайта можно скачать ирц ботов и клиентов, а также скрипты, ну и ественно
имеються статьи по основным командам, установке и настройке WinDrop/EggDrop.
А также 2 статьи - http://www.megabyte-web.ru/47-2007/tvoya-podruzhka-irca-chast-4-mirc-skripting.html
и http://rtfm.inetik.ru/index.php?shstate=125
http://irc.vsi.ru/forum/showthread.php?p=72#post72 - Описание IRC сервисов (Nickserv,ChanServ,MemoServ)
Гритсы: Немалую благодарность выражаю FIXER'у за моральную поддержку
May be to be continued...
P.S: ортиклес в хтмл валяеццо туд: http://t3sla.nm.ru/article.html ибо тут неоч. хорошо получились разбитые строки)
suriv