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

Создание плагинов для 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-ы можно увидеть на сервере, во время его работы, или на клиенте, в закладке “Каналы”.

 

 

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

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

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

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

 

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

В 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:

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

  1. //////////////////////////////////////////////////////////////
  2. // //
  3. // MyChat Client SDK, version 2.1 from 27.02.2010 //
  4. // Copyright(c) Alexey Pikurov / Network Software Solutions //
  5. // hobit@ nsoft-s.com //
  6. // http://www.nsoft-s.com //
  7. // //
  8. //////////////////////////////////////////////////////////////
  9. // в тех местах, где находится комментарий "здесь может //
  10. // находиться ваш код", следует писать желаемую реакцию //
  11. // плагина на события, возникающие в чате //
  12. //////////////////////////////////////////////////////////////
  13.  
  14. {$E mcp} // директива компилятора для генерации расширения библиотеки .mcp
  15.  
  16. library empty;
  17.  
  18. uses
  19. mcplugin_info, // информация о плагине
  20. mcplugin_func, // функции SDK, модуль редактировать запрещено
  21. windows;
  22.  
  23. // процедура, которая выполняется, когда плагин подключается к клиенту
  24. procedure mcPluginStart;stdcall;
  25. begin
  26. // здесь может находиться ваш код
  27. end;
  28. ......

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

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

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

  1.  //////////////////////////////////////////////////////////////
  2. // //
  3. // MyChat Client SDK, version 2.1 from 27.02.2010 //
  4. // Copyright(c) Alexey Pikurov / Network Software Solutions //
  5. // hobit@ nsoft-s.com //
  6. // http://www.nsoft-s.com //
  7. // //
  8. //////////////////////////////////////////////////////////////
  9.  
  10. unit mcplugin_info;
  11.  
  12. interface
  13.  
  14. // информационные константы. Заполнение обязательно
  15. const
  16.  
  17. //Название плагина
  18. pluginName = 'Мой первый плагин для MyChat';
  19. //Версия плагина
  20. pluginVersion = '1.0';
  21. //Автор плагина, копирайт
  22. pluginCopyright = 'Ivan Susanin';
  23. //WEB-сайт создателя плагина
  24. pluginWWW = '';
  25. //Адрес электронной почты создателя плагина
  26. pluginEmail = 'ivan@ syberia.ru';
  27. //Дата создания плагина
  28. pluginReleaseDate = '28.02.2010';
  29. //Описание того, для чего сделан плагин.
  30. //Любая произвольная текстовая информация,
  31. //можно использовать переводы строк #13#10
  32. pluginDescription = 'Тестовый плагин, выводит в'+
  33. 'окне канала по правой кнопке мышки "Hello world!"';
  34. //Есть ли у плагина окно настроек. 0 - нет, 1 - есть
  35. pluginOptionsPresent = 0;
  36. //Есть ли у плагина окно. 0 - нет, 1 - есть. Если у плагина есть окно, то
  37. //пункт вызова плагина будет отображаться в меню "Плагины" MyChat Client-а
  38. // и ему будет присвоена "быстрая" клавиша для вызова
  39. pluginWindowPresent = 0;
  40. //Нужно ли встраивать плагин
  41. //в контекстное меню панели контактов. 1- да, 0 -нет
  42. pluginPopupMenuContactsPanel = 0;
  43. //Нужно ли встраивать плагин
  44. //в контекстное меню в тексте каналов чата. 1- да, 0 -нет
  45. pluginPopupMenuUserInChannelText = 1;
  46. ......

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

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

6. Пишем код

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

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

  1. procedure mcPluginOnClickPopupMenuChannelWindowText(uid:dword);stdcall;
  2.  
  3. begin
  4.  
  5. mcSendMessageToTextChannel(uid, 'Hello world!');
  6.  
  7. end;

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

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


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

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

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

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


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

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

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

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

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

Еще почитать:

AntiCAPS скрипт для публичных каналов MyChat Server
Пример простого скрипта на MSL
Как установить чат в локальной сети?

Все статьи 

 

Наши клиенты


Rambler's Top100