ghazan,
Спасибо за доверие :)
К сожалению у меня нет на это достаточно времени.
Вот на допиливание openfire 3.10.3+MirandaNg иногда нахожу
Есть еще несколько вопросов:
1. Предыдущее предложение:
Spoiler
--- Orig/jabber_archive.cpp 2015-07-21 19:55:00.000000000 +0300
+++ Davis\jabber_archive.cpp 2016-05-26 12:03:40.180875000 +0300
@@ -293,11 +270,18 @@
DBEVENTINFO dbei = { sizeof(DBEVENTINFO) };
dbei.eventType = EVENTTYPE_MESSAGE;
dbei.szModule = m_szModuleName;
- dbei.cbBlob = (DWORD)mir_strlen(szEventText);
+ dbei.cbBlob = (DWORD)mir_strlen(szEventText) + 1;
dbei.flags = DBEF_READ + DBEF_UTF + from;
dbei.pBlob = szEventText;
не понравилось что ли?
2. Где-то тут на форуме уже было. Свежеустановленная миранда, которая создает профиль согласно указаниям INI файлов и оттуда же подгружает первоначальные настройки, так и не запрашивает с сервера VCard пользователя.
Карточки других пользователей я при запуске запрашиваю вызовом сервиса WhenWasIt/Birthdays/RefreshDetails из планировщика. А вот собственная подгружается только если открыть "Личные Данные..."
И раз я наладил автовход в конференции с ником, то я тут же обнаружил, что ников у половины юзеров нет именно по вышеприведенной причине.
Вот фикс для этого:
Spoiler
--- Orig/jabber_iqid.cpp 2015-08-28 16:22:40.000000000 +0300
+++ Davis\jabber_iqid.cpp 2016-05-27 11:42:55.587125000 +0300
@@ -193,7 +199,9 @@
QueryPrivacyLists(m_ThreadInfo);
ptrA szServerName(getStringA("LastLoggedServer"));
- if (szServerName == NULL || mir_strcmp(m_ThreadInfo->conn.server, szServerName))
+
+ ptrT FN( getTStringA(NULL, "FullName"));
+ if (szServerName == NULL || mir_strcmp(m_ThreadInfo->conn.server, szServerName) || FN == NULL)
SendGetVcard(m_szJabberJID);
setString("LastLoggedServer", m_ThreadInfo->conn.server);
При подключении к серверу проверяется наличие собственного FullName, если нет - запрос VCard.
UPD: смотрите дальше более элегантный способ
Вот так:
Spoiler
--- Orig/jabber_iqid.cpp 2015-08-28 16:22:40.000000000 +0300
+++ Davis\jabber_iqid.cpp 2016-05-30 16:06:12.656625000 +0300
@@ -193,8 +199,24 @@
QueryPrivacyLists(m_ThreadInfo);
ptrA szServerName(getStringA("LastLoggedServer"));
- if (szServerName == NULL || mir_strcmp(m_ThreadInfo->conn.server, szServerName))
+
+ MCONTACT hContact = HContactFromJID(m_szJabberJID);
+ time_t tmLast = getDword(hContact, "LastOwnVCardAsk", 0);
+ bool AskNeeded = tmLast == 0;
+ if (tmLast != 0)
+ {
+ time_t tmAskPeriod = getDword(hContact, "OwnVCardAskPeriodHours", 0);
+ if (tmAskPeriod != 0)
+ {
+ AskNeeded = (tmLast + tmAskPeriod * 60 * 60 <= time(NULL));
+ }
+ }
+
+ if (szServerName == NULL || mir_strcmp(m_ThreadInfo->conn.server, szServerName)
+ || AskNeeded) {
SendGetVcard(m_szJabberJID);
+ setDword(hContact, "LastOwnVCardAsk", time(NULL));
+ }
setString("LastLoggedServer", m_ThreadInfo->conn.server);
m_pepServices.ResetPublishAll();
И волки сыты и овцы целы
P.S. Вот я тупилка! Для обновления VCard при коннекте достаточно удалить в базе ключ "LastLoggedServer"!
А это же ж можно сделать ActMan без изменения кода :)