К клиенту greylink возможно подключение внешних плагинов. Плагин должен быть оформлен в виде DLL c именем ChatBot.dll и экспортировать функцию bot_init со следующей спецификацией:
extern "C" __declspec(dllexport) bool __stdcall bot_init(BotInit* _init)где структура BotInit описывается так:
struct BotInit { typedef bool (__stdcall * tInit)(struct BotInit *); typedef bool (__stdcall * tSendMessage)(int msgid, const WCHAR* objid, const void* param, unsigned paramsize); typedef bool (__stdcall * tRecvMessage)(int msgid, const WCHAR* objid, const void* param, unsigned paramsize); typedef void*(__stdcall * tQueryInfo)(int queryid, const WCHAR* objid, const void *param, unsigned paramsize); typedef void (__stdcall * tFreeInfo)(void *info); DWORD apiVersion; WCHAR* appName; WCHAR* appVersion; tSendMessage SendMessage; tQueryInfo QueryInfo; tFreeInfo FreeInfo; DWORD botApiVersion; WCHAR* botId; WCHAR* botVersion; WCHAR* botCopyright; tRecvMessage RecvMessage; DWORD eventMask; // v3 enum SEND_CODES { SEND_PM = 0, SEND_SIM_PM = 1, SEND_CM = 2, SEND_SIM_CM = 3, SEND_CLOSE = 4, SEND_PRIVMODE = 5, SEND_BAN = 6, SEND_SLOT = 7, SEND_DL_MAGNET = 8, SEND_SEARCH = 9, // v3 SEND_SYSLOG_MSG = 10, // v3 SET_RECV_EVENTS = 20 // v3 }; enum RECV_CODES { RECV_COMMAND = 40, RECV_PM = 41, RECV_CM = 42, RECV_USER_UPDATE = 43, RECV_USER_PART = 44, RECV_HUB_CONNECT = 45, RECV_HUB_DISCONNECT = 46, RECV_PM_DROPPED = 47, RECV_SEARCH_QUERY = 48, // v3 RECV_SEARCH_RESULT = 49, // v3 }; enum QUERY_CODES { QUERY_USER_BY_UID = 80, QUERY_HUB_BY_URL = 81, QUERY_CONNECTED_HUBS = 82, QUERY_HUB_USERS = 83, QUERY_RUNNING_UPLOADS = 84, QUERY_QUEUED_UPLOADS = 85, QUERY_DOWNLOADS = 86, QUERY_SELF = 87 }; enum PrivateAccessMode { PM_NORMAL = 0, PM_SKIPPASSWORD = 1, PM_IGNORE = 2, PM_HARDIGNORE = 3 }; // for SEND_SEARCH: struct SearchParams { int searchContent; // enum SearchTypeModes int sizeMode; // enum SearchSizeModes uint64_t size; }; enum SearchTypeModes { TYPE_ANY = 0, TYPE_AUDIO, TYPE_COMPRESSED, TYPE_DOCUMENT, TYPE_EXECUTABLE, TYPE_PICTURE, TYPE_VIDEO, TYPE_DIRECTORY, TYPE_TTH ,TYPE_CD_IMAGE }; enum SearchSizeModes { SIZE_DONTCARE = 0x00, SIZE_ATLEAST = 0x01, SIZE_ATMOST = 0x02, SIZE_EXACT = 0x03 }; // for SET_RECV_EVENTS enum EventFlags { F_RECV_COMMAND = 1 << 0, F_RECV_PM = 1 << 1, F_RECV_CM = 1 << 2, F_RECV_USER_UPDATE = 1 << 3, F_RECV_USER_PART = 1 << 4, F_RECV_HUB_CONNECT = 1 << 5, F_RECV_HUB_DISCONNECT = 1 << 6, F_RECV_PM_DROPPED = 1 << 7, F_RECV_SEARCH_QUERY = 1 << 8, F_RECV_SEARCH_RESULT = 1 << 9 }; };Функция плагина bot_init анализирует поля apiVersion, appName, appVersion. Если плагин умеет работать с данным клиентом и данной версией API, плагин заполняет поля botApiVersion, botId, botVersion, botCopyright, RecvMessage и возвращает true. Иначе greylink выгружает DLL. В поле botApiVersion плагин указывает предпочтительную версию API (если клиент поддерживает несколько версий API, он может переключится на версию, запрошенную плагином). Текущая версия API: 3 Для версии API 3 и выше, плагин должен заполнить поле eventMask, если хочет получать сообщения о событиях (в любой момент список событий можно изменить вызовом SendMessage с msgid=SET_RECV_EVENTS)
Параметры функции | Описание |
msgid = SEND_PM objid = UID param = message | Отослать личное сообщение с содержимым message пользователю с кодом UID |
msgid = SEND_SIM_PM objid = UID param = message | Имитировать приём личного сообщения с содержимым message от пользователя с кодом UID |
msgid = SEND_СM objid = UID param = huburl | Отослать сообщение с содержимым message в общий чат хаба huburl |
msgid = SEND_SIM_CM objid = huburl param = message |
Имитировать приём сообщения с содержимым message в чат хаба huburl. Сообщение должно иметь вид <НИК> сообщение... |
msgid = SEND_CLOSE objid = UID param = message | Закрыть окно приватного чата с юзером UID |
msgid = SEND_PRIVMODE objid = UID param = &mode paramsize = 1 | Установить уровень доступа в личку для юзера с кодом UID. Код уровня доступа описан в перечислении PrivateAccessMode |
msgid = SEND_BAN objid = UID param = &isBanned paramsize = 1 | Включить или выключить бан юзера с кодом UID |
msgid = SEND_SLOT objid = UID param = &time paramsize = 4 | Дать пользователю экстра-слот на time секунд. При time=0 резервирование слота немедленно снимается (соединение не прерывается, для кика используйте бан+разбан) |
msgid = SEND_DL_MAGNET objid = magnet link param = target | Поставить магнет-ссылку на закачку. Если paramsize=0, закачиваем в download-каталог по умолчанию, иначе из (WCHAR*)param берём полный путь+имя файла |
msgid = SEND_SEARCH objid = search string param = struct SearchParams | Поставить поисковый запрос в очередь. При param == NULL, objid - строка: слова для поиска, разделенные пробелами. Если SearchParams::searchContent == SearchTypeModes::TYPE_TTH, то objid - TTH в строковом виде без лишних префиксов. |
msgid = SET_RECV_EVENTS param = &mask paramsize = 4 | Определяет, какие события передаются в RecvMessage. В зависимости от значения поля botApiVersion, указанного плагином в bot_init, настраивается начальное значение маски (для v1,v2 - все сообщения, поддерживаемые этими версиями API, для v3 и выше начальное значение маски 0, плагин должен установить список событий, на которые приходят оповещения. Флаги для mask нужно брать из enum EventFlags) |
msgid = SEND_SYSLOG_MSG objid = message | Посылает строку в системный лог (также отображается в строке статуса главного окна программы) |
Параметр1=Значение1|Параметр2=Значение2|Параметр3=Значение3|В строках символы | и \ кодируются соответственно сочетаниями \| и \\ В случаях, когда функция возвращает несколько блоков параметров (QUERY_DOWNLOADS и т.п.), блоки разделяются дополнительным символом | * Если param и paramsize не описаны, они должны быть NULL и 0 соответственно
Параметры функции | Описание |
queryid = QUERY_USER_BY_UID objid = UID | Запросить данные пользователя по его UID. Значения выходных параметров описаны ниже |
queryid = QUERY_HUB_BY_URL objid = huburl |
Запросить данные хаба по его url. Выходные параметры: URL,NAME,DESC,IP,PORT,ME |
queryid = QUERY_CONNECTED_HUBS | Возвращает список URL подключенных хабов |
queryid = QUERY_HUB_USERS objid = huburl | В данной версии API не реализовано, плагин может самостоятельно отслеживать актуальный список юзеров, используя сообщения RECV_USER_UPDATE и RECV_USER_PART |
queryid = QUERY_RUNNING_UPLOADS objid = UID | Текущие отдачи. Поля: UID,FILENAME,FILESIZE,POS, REASON (значок-причина получения слота) |
queryid = QUERY_QUEUED_UPLOADS objid = UID | Получить очередь ждущих юзеров (если objid=NULL), либо список файлов, который ожидает юзер UID |
queryid = QUERY_DOWNLOADS objid = UID | Получить данные из очереди закачки. Если objid!=NULL, выдаются только файлы, в источниках для которых есть указанный юзер |
queryid = QUERY_SELF | Не документировано. (Новые возможности, где эта информация была бы полезна, не дописаны) |
Параметры функции | Описание |
queryid = RECV_COMMAND objid = NULL param = command |
Пользователь набрал команду/bot command |
queryid = RECV_PM objid = UID param = message | Пришло ЛС от юзера UID. Если плагин вернул true, сообщение не показывается пользователю. Изменённое сообщение плагин может передать через SEND_SIM_PM. Сообщения, посланные плагином через SEND_SIM_PM, не приходят в RECV_PM |
queryid = RECV_CM objid = huburl param = message |
Пришло сообщение в чат хаба huburl. Ник юзера может быть получен из
текста сообщения по шаблонам: <НИК> Сообщение * НИК Сообщение Если плагин вернул true, сообщение не показывается пользователю. Изменённое сообщение плагин может передать через SEND_SIM_CM. Сообщения, посланные плагином через SEND_SIM_CM, приходят в RECV_CM, но не должны обрабатываться, так как в новых версиях API они могут не передаваться в RECV_CM |
queryid = RECV_USER_UPDATE objid = UID | Юзер зашёл на хаб или обновил свои данные (размер шары, кол-во слотов, примечание и т.п.) |
queryid = RECV_USER_PART objid = UID | Юзер ушёл с хаба |
queryid = RECV_HUB_CONNECT objid = huburl | Подключен хаб huburl |
queryid = RECV_HUB_DISCONNECT objid = huburl | Отключен хаб huburl |
queryid = RECV_PM_DROPPED objid = UID param = message | Проигнорировано сообщение пользователя (на пользователе игнор или включена защита паролем). Если плагин считает, что сообщение важное, он может повторить его через SEND_SIM_PM |
queryid = RECV_SEARCH_QUERY objid = search string param = доп. параметры |
От юзера поступил запрос на поиск. В objid указана строка запроса, либо, при поиске по TTH, строка "TTH:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX". В параметрах есть поля USER (ip или Ник при пассивном поиске), HIT (найден в шаре: 0 = нет, 2 = да, 1 = я частичный источник) |
queryid = RECV_SEARCH_RESULT objid = TTH param = доп. параметры | От юзера пришёл ответ на поиск. В дополнительных параметрах указывается: FILE (имя файла с путём в шаре), SIZE (размер файла), UID, CID, IP, HUBURL (юзера), SLOTS, FREE (слоты юзера: всего/свободно), TYPE (тип результата: файл/каталог/неполный источник). |