MyChat — это не просто чат для сети или корпоративный мессенджер. Это ещё и очень гибкая и расширяемая система, которую можно настроить практически под любые свои нужды.
Мы начинаем цикл статей по написанию программ-дополнений для MyChat Client. Поскольку тема очень большая, а возможности, предоставляемые этой технологией — очень широки, статей будет достаточно много.
Для успешного создания программ-дополнений для MyChat читателю достаточно будет базового знания языка и среды программирования Delphi. Версия — принципиально не важна, но статьи будут ориентированы на Delphi 7, и все примеры будут даваться применительно к этой среде программирования.
- Что такое плагин?
- Архитектура MyChat
- Менеджер плагинов
- Как устроены плагины в MyChat?
- Самый первый простой плагин для MyChat
- Пишем код
- Как оно работает?
- Заключение
1. Что такое плагин?
Итак, что же такое плагин? Это DLL библиотека, которая подключается к программе и позволяет каким-то образом расширить её возможности. Иногда плагины (от английского plug-in) ещё называют программами-дополнениями. В наших статьях будут встречаться оба написания, смысл их одинаков.
Строго говоря, программа-родитель и плагин могут быть написаны даже на разных языках программирования, главное — соблюдать правильные соглашения вызовов функций и передачу параметров.
Для того, чтобы плагин смог сделать что-то полезное — в MyChat есть специальный механизм MyChat Plugins SDK. Говоря попросту — это набор функций, которые может вызывать плагин и набор функций, которые может вызывать программа из плагина.
2. Архитектура MyChat
Чтобы успешно создавать программы-дополнения — разработчик должен понимать схему работы программы, под которую он собирается создавать что-либо. Поэтому вкратце обрисуем схему работы MyChat.
MyChat — это клиент-серверный многопользовательский чат. Все клиенты подключаются к одному серверу, и для каждого клиента сервер создаёт специальную структуру данных, которая находится в памяти, пока клиент онлайн.
У каждого зарегистрированного клиента системы есть номер — UIN. Другими словами — уникальный идентификатор, обычное число, больше нуля. Этот номер не может быть изменён и он принадлежит клиенту с момента регистрации его на сервере. Если пользователя удалить — UIN не освобождается, а выделяется новый. Таким образом обеспечивается целостность базы данных сервера.
Когда пользователь отправляет сообщение другому пользователю — происходит что-то очень похожее на отправку SMS сообщений в сети сотового оператора. Только вместо номеров мобильных телефонов используются именно эти номера пользователей, UIN-ы.
В MyChat также есть понятие каналов, или конференций. В каналах, когда один пользователь отправляет сообщение — его получают все люди, которые находятся с этим человеком в одном канале. Каналы, или комнаты, могут иметь разные названия — но каждому из каналов сервер MyChat также назначает специальный номер — UID. В отличие от номера пользователя, который никогда не изменяется — UID выделяется динамически, во время работы сервера. Пока канал существует — у него есть номер. Как только из канала вышли все люди — он автоматически удаляется. UID — это также число, больше нуля. UID также не повторяются, но важно помнить — что при создании канала UID никак непривязан к названию канала — и при следуюшем запуске сервера он может быть иным. UID-ы можно увидеть на сервере, во время его работы, или на клиенте, в закладке “Каналы".
3. Менеджер плагинов
Теперь, когда мы более-менее уяснили схему работы системы, перейдём к изучению самой системы плагинов в MyChat Client.
Плагин, это динамическая библиотека (DLL). В MyChat принято, что это файл с расширением .mcp (MyChat Plugin Library). Подключаются эти программы-дополнения с помощью “Менеджера плагинов" из главного меню клиента “Плагины" - “Управление плагинами" или по горячей клавише Alt+P.
Менеджер плагинов выглядит так:
Отличительной особенностью системы программ-дополнений в MyChat является то, плагины можно загружать, выгружать, включать и выключать не перезапуская MyChat Client — “на лету". Это значительно упрощает жизнь разработчикам и очень ускоряет процесс создания и отладки.
В MyChat каждый плагин должен иметь название, причём это название должно быть уникальным. Т.е. не может быть загружено два плагина с одним и тем же именем. Напротив каждого загруженного плагина в колонке “Название плагина" можно снять галочку — тогда плагин будет как бы в “замороженном" состоянии. Он загружен — но не активен. Кнопка “Выгрузить плагин" выгружает плагин из памяти, а “Загрузить плагин" - открывает диалог загрузки файла и после выбора нужно попросту копирует файл плагина в профиль и загружает его.
По двойному щелчку левой кнопкой мышки или по нажатию кнопки “О плагине" будет показано информационное окошко со сводной информацией о плагине и его создателе:
Вся эта информация находится в самом плагине в специальной чётко описанной структуре данных. Поэтому разработчикам настоятельно рекомендуется её заполнять J
4. Как устроены плагины в MyChat?
Каждый плагин в MyChat состоит минимум из трёх файлов:
- DPR-файл проекта;
- mcplugin_func.pas — библиотека функций из SDK, изменять её нельзя;
- 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 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…" и сохраняем проект.
Второе — заполнить справочную информацию. Переходим на модуль mcplugin_info (Ctrl+щелчок левой кнопкой мышки по названию модуля в списке uses):
Заполняем необходимую нам информацию:
////////////////////////////////////////////////////////////// // // // 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:
Плагин успешно загружен.
7. Как оно работает?
Нажимаем в канале на любом месте в окне сообщений правую кнопку мышки и видим наш плагин:
Щёлкаем по имени плагина в меню, и — вуаля:
Плагин работает.
8. Заключение
Это самая первая, вводная статья в технологию написания программ-дополнений для MyChat, и, конечно, в ней рассмотрены только основные моменты создания плагинов.
В разделе "Плагины" на официальном сайте Network Software Solutions вы можете скачать исходные коды различных программ-дополнений, чтобы увидеть, каким образом можно использовать возможности MyChat Plugins SDK "на полную".
Полный исходный код плагина, рассмотренного в статье, а также скомпилированную библиотеку можно скачать здесь ~17Кб.