Avatar service

From Miranda NG
Revision as of 19:19, 13 June 2021 by Dart Raiden (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Plugin:AVS/ru
Jump to navigation Jump to search
Other languages:
Avatar service
Нет изображения
Имя файла AVS.dll
Авторы Nightwish, Pescuma
Скачать
Стабильная версия: 32-bit, 64-bit
Версия в разработке: 32-bit, 64-bit

Загружает и управляет аватарами для других плагинов.

О плагине

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

Как это работает

Если у контакта есть аватар, сервис MS_AV_GETAVATARBITMAP возвращает указатель на запись в кэше. Сервис МОЖЕТ вернуть 0, если доступный аватар отсутствует. Это не значит, что аватара нет вообще, а значит лишь то, что аватар ещё не готов к использованию. Когда кто-то вызывает сервис, запрашивающий аватар, плагин поппытается получить аватар (если это возможно) и, как только аватар готов к использованию, уведомить всех подписчиков через перехватываемое событие. Если аватар уже находится в кэше, возвращается кэшированная запись.

При смене аватара плагин запускает событие, передавая хэндл контакта в wParam и структуру данных с информацией об аватаре в lParam. Плагины, использующие идентификаторы изображений, возвращаемые MS_AV_GETAVATARBITMAP, ДОЛЖНЫ подписываться на ME_AV_AVATARCHANGED, поскольку исходный идентификатор может стать недействительным при смене аватара.

Получение аватаров происходит в отдельном потоке с разумными паузами, чтобы не сработала защита от флуда. Аватары кэшируются «в памяти».

Пример использования

#include "m_avatars.h"

struct avatarCacheEntry *ace = 0;
HBITMAP hbmAvatar = 0;

ace = (struct avatarCacheEntry *)CallService(MS_AV_GETAVATARBITMAP, (WPARAM)hContact, 0);

/*
   now, check the return value. if it is 0, then the avatar is not yet ready or unavailble
   for that contact. if it was only "not ready", your plugin will be notified by the
   hookable event ME_AV_AVATARCHANGED
   
   if the return value is != 0, then it is a valid bitmap handle. DON'T DESTROY IT IN YOUR CODE
*/


/*
 * event function
 * initialise with:
 * HANDLE hEvent = HookEvent(ME_AV_AVATARCHANGED, AvatarChanged);
 */
 
static int AvatarChanged(WPARAM wParam, LPARAM lParam)
{
        struct avatarCacheEntry *ace = (struct avatarCacheEntry *)lParam;
        HANDLE hContact = (HANDLE)wParam;
        
        if(ace == NULL)
                return 0;
        if(ace->cbSize != sizeof(struct avatarCacheEntry))
                return 0;               // safety check(s)

        HBITMAP hbmAvatar = ace->hbmPic;
        ...
        ...                
}