Введение

Клиент Internet Relay Chat с открытым исходным кодом

Visual IRC (ViRC) — это клиент Internet Relay Chat с открытым исходным кодом для операционной системы Windows. В отличие от многих других IRC-клиентов, почти вся функциональность ViRC реализована с помощью встроенного IRC-скрипта, что позволяет расширять или изменять поведение программы, не изменяя исходный код.

История

Visual IRC (16 бит) – Выпущен в 1995 году для Windows 3.x, разработанный MeGALiTH. Эта программа обладала множеством встроенных функций, но также поддерживала скриптинг с помощью VPL (ViRC Programming Language) – предшественника ViRCScript и Versus. Visual IRC '96 (и позднее Visual IRC '97, Visual IRC '98) – Выпущен в 1996 году, разработанный MeGALiTH. Это была первая 32-битная версия ViRC, созданная для Windows 9x/NT. Многие функции, встроенные в 16-битный ViRC, обрабатывались скриптом по умолчанию в ViRC '96. ViRC '98 содержал код, предоставленный Тарой МакГрю, известной как "Mr2001", в частности, улучшения для движка ViRCScript. Язык скриптов был несовместим с предыдущей версией. В более поздних версиях были добавлены функции голосовой связи и видеоконференций. Разработка второго поколения замедлилась, и к 2000 году Visual IRC фактически прекратил своё существование. Изначальный автор MeGALiTH (Адриан Кэйбл) передал исходный код пользователю Mr2001 (Тара МакГрю), который ранее внес свой вклад в код, и тайно разрабатывал клон под названием Bisual IRC (BIRC). Вместо возобновления разработки кодовой базы ViRC '98, он объединил некоторые функции ViRC '98 в BIRC и выпустил его как Visual IRC 2. Visual IRC 2 – Впервые выпущенный Mr2001, случайно в 2001 году, язык скриптов Versus в этой версии основан на ViRCScript, но внутренне он был почти полностью переписан. Фактически, ViRC 2 имеет лишь несколько сотен строк кода, общих с ViRC '98. Функции голосовой и видеосвязи были удалены в этой версии, поскольку библиотеки, использовавшиеся для их реализации, больше не поддерживались. Большая часть исходного кода BIRC, ViRC 2 и связанных утилит была опубликована под лицензией GPL на веб-сайте проекта и SourceForge.

Против

Versus – это язык сценариев, изначально разработанный для IRC-клиента Bisual IRC и в настоящее время используемый с Visual IRC. Он во многом похож на языки сценариев, используемые ircII и mIRC, а также на Tcl и C. Название "Versus" было выбрано, поскольку его можно было сократить до "VS", что было распространенной аббревиатурой для ViRCScript – языка, использовавшегося в Visual IRC с 1996 по 1998 год. Versus оставался в значительной степени обратно совместимым с ViRCScript, поэтому существующая документация и комментарии, упоминавшие "VS", в основном сохраняли свою актуальность применительно к Versus. Название также отсылало к происхождению BIRC как замены ViRC. Object Versus, или OVS, обозначает объектно-ориентированные возможности Versus. Скрипты могут определять классы и работать с объектами и методами вместо текстовых данных и псевдонимов, однако на практике OVS в основном используется для манипулирования объектами VCL, составляющими интерфейс ViRC.

Хранение сценариев

Скрипты хранятся в файлах, обычно с расширением файла, хотя иногда используется расширение lib. Файл скрипта Versus содержит только операторы, которые интерпретируются при загрузке скрипта; любые блоки, определенные в скрипте (см. ниже), заменяют блоки с тем же именем, определенные в предыдущих скриптах.

Блоки, которые могут быть определены в скрипте

Псевдонимы — это подпрограммы. Их можно вызывать из командной строки любого окна или из других частей скрипта. Псевдонимы, возвращающие значение, называются функциями; псевдоним может определить, ожидается ли возвращение значения, и затем действовать как функция или команда соответствующим образом. Классы используются в объектно-ориентированном скрипте (OVS). Каждый класс может содержать свойства, методы, конструктор и деструктор. События используются для обработки сообщений с IRC-сервера, а также определенных системных или клиентских событий, таких как завершение передачи файла или открытие нового окна. Серверные события используют регулярные выражения или собственные подстановочные знаки Versus для сопоставления сообщений с сервера. Если несколько серверных событий соответствуют конкретному сообщению, будет выполнено только то, которое имеет наивысший приоритет (вычисляемый на основе длины шаблона и относительной "ценности" подстановочных знаков в нем). Клиентские события идентифицируются по имени: например, <OnCreateWindow foo> и <OnCreateWindow bar> будут запущены при открытии нового окна. Они также могут включать шаблоны, которые ограничивают конкретные события, способные вызвать это событие (например, запускаться только при создании нового окна канала). Деревья меню и элементы меню определяют контекстные меню, которые могут появляться для различных элементов интерфейса клиента, а также главное меню, которое всегда видимо. Блоки деревьев меню определяют структуру меню и устанавливают заголовки для каждого элемента; блоки элементов меню определяют код скрипта, который будет выполнен при нажатии на элемент. Панели инструментов и элементы панелей инструментов аналогичны деревьям меню и блокам элементов меню, но они определяют панели инструментов, связанные с каждым окном. Новые панели инструментов можно добавить в интерфейс, просто выбрав уникальное имя. Псевдонимы, методы (включая конструкторы и деструкторы), события, элементы меню и элементы панелей инструментов называются подпрограммами или блоками кода.

Файлы

Скрипты могут получать доступ к файлам с помощью функций $RandomRead и $ReadLine, а также команд CreateFile и AppendText. Скрипты также могут использовать VCL-класс TStringList для чтения всего текстового файла в память, его обработки и сохранения.

Переменные

Все переменные могут содержать до 4 ГиБ данных. Имена переменных начинаются со знака доллара ($) и прописной буквы, строчной буквы или символа подчеркивания. Переменные могут содержать любые символы, хотя обычно они используются для представления текста. Локальные переменные задаются командой @L и существуют только в контексте подпрограммы, которая их создала. Они удаляются по завершении подпрограммы. Некоторые локальные переменные предопределены, например, $C для имени текущего канала. Глобальные переменные задаются командой @ и доступны из любой подпрограммы. Они удаляются при завершении работы клиента. Псевдонимы могут возвращать значение, устанавливая глобальную переменную $fresult. Сохраненные переменные задаются командой @S и, как и глобальные переменные, доступны из любого места. Их значения немедленно сохраняются в постоянное хранилище и восстанавливаются при следующем запуске клиента.

Ассоциативные массивы

Ассоциативные массивы сопоставляют ключи значениям. Ключи и значения могут содержать до 4 ГиБ данных без ограничений на используемые символы. Локальные, глобальные и хранимые значения массивов можно задать с помощью команд @L, @ и @S, и они работают аналогично соответствующим переменным. При установке хранимого значения массива весь массив сохраняется. Для установки или получения значения для конкретного ключа используется синтаксис $arrayname[key]. Использование синтаксиса $arrayname без указания ключа рассматривает массив как список пар ключ-значение, позволяя скрипту задать все содержимое массива сразу или перебрать уже существующие ключи.

Псевдоизменные

Псевдопеременные (или pvars) синтаксически похожи на переменные, но их значения нельзя изменять. Псевдопеременные $0–$9 содержат параметры, переданные текущей подпрограмме, в порядке их следования. $0 содержит имя подпрограммы, $1 – первое слово строки параметров и так далее. Псевдопеременные $0–$9 содержат параметры, переданные текущей подпрограмме, а также все последующие параметры. $0 содержит имя подпрограммы и всю строку параметров, $1 – все параметры, $2 – все параметры, начиная со второго, и так далее. Специальная последовательность $?="PROMPT STRING" вызывает появление диалогового окна с запросом на ввод значения.