Создание плагинов для MyChat. Часть 1. Архитектура

MyChat — это не просто чат для сети или корпоративный мессенджер. Это ещё и очень гибкая и расширяемая система, которую можно настроить практически под любые свои нужды.

Мы начинаем цикл статей по написанию программ-дополнений для MyChat Client. Поскольку тема очень большая, а возможности, предоставляемые этой технологией — очень широки, статей будет достаточно много.

Для успешного создания программ-дополнений для MyChat читателю достаточно будет базового знания языка и среды программирования Delphi. Версия — принципиально не важна, но статьи будут ориентированы на Delphi 7, и все примеры будут даваться применительно к этой среде программирования.

  1. Что такое плагин?
  2. Архитектура MyChat
  3. Менеджер плагинов
  4. Как устроены плагины в MyChat?
  5. Самый первый простой плагин для MyChat
  6. Пишем код
  7. Как оно работает?
  8. Заключение

1. Что такое плагин?


Итак, что же такое плагин? Это DLL библиотека, которая подключается к программе и позволяет каким-то образом расширить её возможности. Иногда плагины (от английского plug-in) ещё называют программами-дополнениями. В наших статьях будут встречаться оба написания, смысл их одинаков.

Строго говоря, программа-родитель и плагин могут быть написаны даже на разных языках программирования, главное — соблюдать правильные соглашения вызовов функций и передачу параметров.

Для того, чтобы плагин смог сделать что-то полезное — в MyChat есть специальный механизм MyChat Plugins SDK. Говоря попросту — это набор функций, которые может вызывать плагин и набор функций, которые может вызывать программа из плагина.


2. Архитектура MyChat


Чтобы успешно создавать программы-дополнения — разработчик должен понимать схему работы программы, под которую он собирается создавать что-либо. Поэтому вкратце обрисуем схему работы MyChat.

MyChat — это клиент-серверный многопользовательский чат. Все клиенты подключаются к одному серверу, и для каждого клиента сервер создаёт специальную структуру данных, которая находится в памяти, пока клиент онлайн.

У каждого зарегистрированного клиента системы есть номер — UIN. Другими словами — уникальный идентификатор, обычное число, больше нуля. Этот номер не может быть изменён и он принадлежит клиенту с момента регистрации его на сервере. Если пользователя удалить — UIN не освобождается, а выделяется новый. Таким образом обеспечивается целостность базы данных сервера.

Когда пользователь отправляет сообщение другому пользователю — происходит что-то очень похожее на отправку SMS сообщений в сети сотового оператора. Только вместо номеров мобильных телефонов используются именно эти номера пользователей, UIN-ы.

В MyChat также есть понятие каналов, или конференций. В каналах, когда один пользователь отправляет сообщение — его получают все люди, которые находятся с этим человеком в одном канале. Каналы, или комнаты, могут иметь разные названия — но каждому из каналов сервер MyChat также назначает специальный номер — UID. В отличие от номера пользователя, который никогда не изменяется — UID выделяется динамически, во время работы сервера. Пока канал существует — у него есть номер. Как только из канала вышли все люди — он автоматически удаляется. UID — это также число, больше нуля. UID также не повторяются, но важно помнить — что при создании канала UID никак непривязан к названию канала — и при следуюшем запуске сервера он может быть иным. UID-ы можно увидеть на сервере, во время его работы, или на клиенте, в закладке “Каналы".

Список каналов MyChat


3. Менеджер плагинов


Теперь, когда мы более-менее уяснили схему работы системы, перейдём к изучению самой системы плагинов в MyChat Client.

Плагин, это динамическая библиотека (DLL). В MyChat принято, что это файл с расширением .mcp (MyChat Plugin Library). Подключаются эти программы-дополнения с помощью “Менеджера плагинов" из главного меню клиента “Плагины" - “Управление плагинами" или по горячей клавише Alt+P.

Менеджер плагинов выглядит так:

Менеджер плагинов MyChat

Отличительной особенностью системы программ-дополнений в MyChat является то, плагины можно загружать, выгружать, включать и выключать не перезапуская MyChat Client — “на лету". Это значительно упрощает жизнь разработчикам и очень ускоряет процесс создания и отладки.

В MyChat каждый плагин должен иметь название, причём это название должно быть уникальным. Т.е. не может быть загружено два плагина с одним и тем же именем. Напротив каждого загруженного плагина в колонке “Название плагина" можно снять галочку — тогда плагин будет как бы в “замороженном" состоянии. Он загружен — но не активен. Кнопка “Выгрузить плагин" выгружает плагин из памяти, а “Загрузить плагин" - открывает диалог загрузки файла и после выбора нужно попросту копирует файл плагина в профиль и загружает его.

По двойному щелчку левой кнопкой мышки или по нажатию кнопки “О плагине" будет показано информационное окошко со сводной информацией о плагине и его создателе:

Информация о плагине MyChat

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


4. Как устроены плагины в MyChat?


Каждый плагин в MyChat состоит минимум из трёх файлов:

  1. DPR-файл проекта;
  2. mcplugin_func.pas — библиотека функций из SDK, изменять её нельзя;
  3. mcplugin_info.pas — информационный модуль, обязательно заполнение всех полей.

Все функции в плагине можно условно разделить на два вида: это функции, которые вызывает программа MyChat Client из плагина — по событиям, которые возникают в чате. Назовём условно их “events". И второй вид — это функции, которые сам плагин вызывает из программы MyChat Client — назовём их "tools".

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

В DPR-файле проекта как раз и находятся пустые функции-заготовки events, в каждой из них находится комментарий “Здесь может находиться ваш код“. В файле же mcplugin_func.pas описаны все tools, которые может вызывать плагин из основной программы.

Основную программу MyChat Client, из-под которой запускаются плагины, мы будем называть “main".

С терминологией определились, теперь самое время попробовать сделать хоть что-то полезное.


5. Самый первый простой плагин для MyChat


По давней программистской традиции первая программа выводит на экран сакральное “Hello world!". Мы не будем сильно оригинальничать и сделаем что-то подобное применительно к MyChat.

Пусть наш первый плагин по щелчку правой кнопкой мышки в канале будет выводить контекстное меню с названием плагина, щёлкнув по которому в канал будет отправлено сообщение от нашего имени — “Hello world!".

Качаем прототип пустого плагина — http://www.nsoft-s.com/mychat/plugins/empty.zip и запускаем Delphi.

Открываем empty.dpr:

Открытие плагина MyChat в Проводнике

Мы видим главный модуль плагина:

            //////////////////////////////////////////////////////////////
            //                                                          //
            // MyChat Client SDK, version 2.1 from 27.02.2010           //
            // Copyright(c) Alexey Pikurov / Network Software Solutions //
            // hobit@ nsoft-s.com                                       //
            // http://www.nsoft-s.com                                   //
            //                                                          //
            //////////////////////////////////////////////////////////////
            // в тех местах, где находится комментарий "здесь может     //
            // находиться ваш код", следует писать желаемую реакцию     //
            // плагина на события, возникающие в чате                   //
            //////////////////////////////////////////////////////////////

            {$E mcp} // директива компилятора для генерации расширения библиотеки .mcp

            library empty;

            uses
                mcplugin_info, // информация о плагине
                mcplugin_func, // функции SDK, модуль редактировать запрещено
                windows;

            // процедура, которая выполняется, когда плагин подключается к клиенту
            procedure mcPluginStart;stdcall;
            begin
                // здесь может находиться ваш код
            end;
            ......
        

Первое, что нам нужно сделать — назвать свой плагин. Заменяем слово empty в заголовке библиотеки: library myfirstplugin. Заходим в меню Delphi: "File" — "Save Project As…" и сохраняем проект.

Сохранение проекта в MyChat

Второе — заполнить справочную информацию. Переходим на модуль mcplugin_info (Ctrl+щелчок левой кнопкой мышки по названию модуля в списке uses):

Заполнение информации о плагине MyChat

Заполняем необходимую нам информацию:

            //////////////////////////////////////////////////////////////
            //                                                          //
            // MyChat Client SDK, version 2.1 from 27.02.2010           //
            // Copyright(c) Alexey Pikurov / Network Software Solutions //
            // hobit@ nsoft-s.com                                       //
            // http://www.nsoft-s.com                                   //
            //                                                          //
            //////////////////////////////////////////////////////////////

            unit mcplugin_info;

            interface

            // информационные константы. Заполнение обязательно
            const

                //Название плагина
                pluginName            = 'Мой первый плагин для MyChat';
                //Версия плагина
                pluginVersion         = '1.0';
                //Автор плагина, копирайт
                pluginCopyright       = 'Ivan Susanin';
                //WEB-сайт создателя плагина
                pluginWWW             = '';
                //Адрес электронной почты создателя плагина
                pluginEmail           = 'ivan@ syberia.ru';
                //Дата создания плагина
                pluginReleaseDate     = '28.02.2010';
                //Описание того, для чего сделан плагин.
                //Любая произвольная текстовая информация,
                //можно использовать переводы строк #13#10
                pluginDescription     = 'Тестовый плагин, выводит в'+
                'окне канала по правой кнопке мышки "Hello world!"';
                //Есть ли у плагина окно настроек. 0 - нет, 1 - есть
                pluginOptionsPresent  = 0;
                //Есть ли у плагина окно. 0 - нет, 1 - есть. Если у плагина есть окно, то
                //пункт вызова плагина будет отображаться в меню "Плагины" MyChat Client-а
                // и ему будет присвоена "быстрая" клавиша для вызова
                pluginWindowPresent   = 0;
                //Нужно ли встраивать плагин
                //в контекстное меню панели контактов. 1- да, 0 -нет
                pluginPopupMenuContactsPanel          = 0;
                //Нужно ли встраивать плагин
                //в контекстное меню в тексте каналов чата. 1- да, 0 -нет
                pluginPopupMenuUserInChannelText      = 1;
            ......
        

Важный момент! Для того, чтоб интегрироваться в контекстное меню, которое вызывается по правому щелчку кнопкой мышки в канале, нужно установить константу pluginPopupMenuUserInChannelText в единицу.

Теперь, когда с приготовлениями закончено, самое время написать тот кусочек кода, ради которого всё и затевалось J


6. Пишем код


Перемещаемся в файл проекта (DPR). Теперь нужно найти тот event, который будет срабатывать при щелчке по нашему плагину в контекстном меню. Это функция mcPluginOnClickPopupMenuChannelWindowText.

Находим нужную функцию и пишем такой код:

            procedure mcPluginOnClickPopupMenuChannelWindowText(uid:dword);stdcall;
            begin
                mcSendMessageToTextChannel(uid, 'Hello world!');
            end;
        

Функция mcSendMessageToTextChannel, которую мы вызываем в коде — это отправка текстового сообщения в канал. Поскольку UID канала мы знаем (он передался в функции-событии), то можно легко отправить сообщение сразу же в этот канал.

Жмём Ctrl+F9, компилируем проект и загружаем файл myfirstplugin.mcp, который у нас получился в результате компиляции, в "Менеджер плагинов" MyChat Client:

Менеджер с плагинами MyChat

Плагин успешно загружен.


7. Как оно работает?


Нажимаем в канале на любом месте в окне сообщений правую кнопку мышки и видим наш плагин:

Плагин в меню MyChat

Щёлкаем по имени плагина в меню, и — вуаля:

Результат работы плагина в MyChat

Плагин работает.


8. Заключение


Это самая первая, вводная статья в технологию написания программ-дополнений для MyChat, и, конечно, в ней рассмотрены только основные моменты создания плагинов.

В разделе "Плагины" на официальном сайте Network Software Solutions вы можете скачать исходные коды различных программ-дополнений, чтобы увидеть, каким образом можно использовать возможности MyChat Plugins SDK "на полную".

Полный исходный код плагина, рассмотренного в статье, а также скомпилированную библиотеку можно скачать здесь ~17Кб.

Служба поддержки