Miranda NG Official Community Forum

Miranda NG русскоязычный форум => Общие разговоры о Miranda NG => Topic started by: Davis on 13 05 2016, 12:29:10

Title: Неправильное время сообщений в истории(XEP-136)
Post by: Davis on 13 05 2016, 12:29:10
Всем привет

openfire 3.10.3+monitoring plugin 1.4.4+miranda
стоит галка "включить историю на сервер XEP-136..."

Недавно заметил, что миранда при подгрузке истории рисует неправильное время - на час вперед.
Скорее всего это началось после перехода на летнее время.
И на сервере и на рабочий станциях в настройках времени UTC+2 с включенным переходом на летнее время, т.е. сейчас +3

Т.е. я пишу кому-то сообщение в 13:00. Оно есть у меня в окне, оно есть в истории. Время правильное.
Через минут 15 я опять открываю беседу - там два одинаковых сообщения - в 13:00 и в 14:00. То же самое и в окне истории.
При этом на самом сервере это сообщение одно и с правильным временем(если смотреть через админку), есди смотреть прямо в MySQL, то вот реальное сообщение:

body: тест 11:38
sentdate: 1463042342061
Судя по всему это: 12 мая 2016 г. 8:39:02 UTC
Т.е. на сервере все правильно сохранилось

Если смотреть эту же историю через Xabber, который тоже поддерживает XEP-136, то у него все ОК со временем.

Получается, что миранда первый раз пишет в локальную историю сама с правильным временем (если сообщение живое), а потом запрашивает историю с сервера и тут добавляет к времени час. Можно ли это как-то поправить?
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: Mikalair on 13 05 2016, 18:28:12
В первую очередь проверьте настройки часовых поясов на сервере и клиентских виндах.

Post Merge: 13 05 2016, 18:28:49
с включенным переходом на летнее время
В этом по идее может быть проблема.
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: Davis on 13 05 2016, 18:32:28
Я же  написал - стоит GMT+2 и включен переход на летнее время

Наверняка с летним временем связано, но ошибка, по всей видимости, в миранде.
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: Davis on 24 05 2016, 12:16:43
Вобщем я скачал миранду, подебажил ее и нашел проблему. И даже ее решил:
http://trac.miranda-ng.org/ticket/1250 (http://trac.miranda-ng.org/ticket/1250)
Там полная неразбериха с таймштампами в модуле архива
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: ghazan on 24 05 2016, 19:04:00
спасибо. там еще кучка мусора проследовала в помойку заодно :)
исправлено в ревизии 16870
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: Davis on 26 05 2016, 09:34:55
Раз уж я зацепился за джаббер :)

в файле jabber_archive line 299:
Code: [Select]
dbei.cbBlob = (DWORD)mir_strlen(szEventText);
Практически везде в остальных местах используется strlen +1, в частности когда я отправляю сообщение, то размер Blob strlen+1.
 А когда оно же приходит из архива, то размер получается на единицу меньше.
Поэтому в функции IsDuplicateEvent(hContact, dbei) когда сравнимаются два ивента, сравнение failed даже тогда, когда по  сути ивенты одинаковые. И сообщения дублируются

Я добавил +1 и функция стала работать лучше. :)
Проблема давняя - http://forum.miranda-ng.org/index.php?topic=3643.15 (http://forum.miranda-ng.org/index.php?topic=3643.15)

Правда я пока не смог овладеть всей логикой работы функции IsDuplicateEvent, особенно в части статических переменных PreviousXXX. Подозреваю там какой-нить метод половинного деления. Но также есть подозрения, что из-за этих статических правильно она работает только при первом запуске.
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: Davis on 26 05 2016, 11:34:21
Ну и еще одну бяку древнюю пофиксил http://trac.miranda-ng.org/ticket/1251 (http://trac.miranda-ng.org/ticket/1251)
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: ghazan on 26 05 2016, 16:11:15
немного развернул и тоже вкрутил :) может ты попробуешь MAM добавить в жабер? :) это гораздо круче будет, чем старый добрый XEP-0136
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: Magic on 26 05 2016, 19:35:29
немного развернул и тоже вкрутил :) может ты попробуешь MAM добавить в жабер? :) это гораздо круче будет, чем старый добрый XEP-0136

+1 за MAM, опенфайр уже умеет с последней версией плагина мониторинга, было бы неплохо в миранде видеть его поддержку)
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: Davis on 27 05 2016, 09:00:35
ghazan,
Спасибо за доверие :)
К сожалению у меня нет на это достаточно времени.
Вот на допиливание openfire 3.10.3+MirandaNg иногда нахожу

Есть еще несколько вопросов:

1. Предыдущее предложение:
Spoiler
Code: [Select]
--- 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;
[close]

не понравилось что ли?

2. Где-то тут на форуме уже было. Свежеустановленная миранда, которая создает профиль согласно указаниям INI файлов и оттуда же подгружает первоначальные настройки, так и не запрашивает с сервера VCard пользователя.
Карточки других пользователей я при запуске запрашиваю вызовом сервиса WhenWasIt/Birthdays/RefreshDetails из планировщика. А вот собственная подгружается только если открыть "Личные Данные..."
И раз я наладил автовход в конференции с ником, то я тут же обнаружил, что ников у половины юзеров нет именно по вышеприведенной причине.

Вот фикс для этого:

Spoiler
Code: [Select]
--- 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);
[close]

При подключении к серверу проверяется наличие собственного FullName, если нет - запрос VCard.
UPD: смотрите дальше более элегантный способ
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: ghazan on 27 05 2016, 09:57:16
Davis,
а я накладывал патч руками, потому что правильно делать патч не диффом, а svn-клиентом, против соотв ревизии. каталогов-то таких у меня точно нет :)
щас подрихтую

а еще можно в гитхаб слать всё это
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: Davis on 27 05 2016, 09:58:56
Уж простите неуча :)
Причем я фиксю ревизию 15967, но смотрю и последнюю - вдруг там уже пофиксено.
Ибо это пока моя боевая ревизия
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: ghazan on 27 05 2016, 10:46:06
1. а зачем в конец события лепить ноль? его потом db_event_get сам присобачит, ажно целых два

2. а если в моем вкарде нет FullName? оно будет запрашивать вкард при каждом запуске до потери пульса?
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: Davis on 27 05 2016, 11:12:48
1. Я не знаю зачем. тут трабла в том, что когда миранда пишет в локальную историю живое сообщение - там +1, а когда достает из серверного архива - без единички. В функции IsDuplicateEvent затем есть оператор сравнения ивентов ==
Code: [Select]
29 bool operator==(const DBEVENTINFO &ev1, const DBEVENTINFO &ev2)
30 {
31         return ev1.timestamp == ev2.timestamp && ev1.eventType == ev2.eventType && ev1.cbBlob == ev2.cbBlob && (ev1.flags & DBEF_SENT) == (ev2.flags & DBEF_SENT);
32 }

, который кроме всего прочего сравнивает cbBlob(но не содержимое сообщения!). И тут эти различия сказываются, одно и то же сообщение тут имеет разную длину и дублируется в итоге.
Мне без разницы, добавлять в базу завершающий ноль или нет, но я  поискал по всему солюшену подобное присвоение и везде, кроме одного какого-то протокола, используется +1. Поэтому проще поправить в одном месте, добавив эту единичку.

2. Это место исполняется только при подключении к серверу. Т.е. не часто. Потом, я выбрал проверку FullName, опираясь на свои знания(скудные) Миранды. В моих условиях - это 100% признак. Конечно где-то он может быть не так однозначен. Если ты можешь предложить другой признак - вызывался ли запрос своего VCard хотя бы раз - великолепно!  ::)

P.S. Че ж этот гугль нотификации форума этого и баг-трекера постоянно в спам кидает? :(
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: Apollo2k4 on 27 05 2016, 12:22:47
P.S. Че ж этот гугль нотификации форума этого и баг-трекера постоянно в спам кидает?
Не только Google, добавьте адрес трекера в адресную книгу, должен перестать.
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: Davis on 29 05 2016, 12:45:04
ghazan,
2. Можно сделать скрытый параметр протокола - период обновления собственного вкард. По-умолчанию можно его поставить в "отключено". Т.е. по-дефолту вкард обновить один раз при создании параметра(или подключении к серверу). А такие как я корпоративные клиенты смогут поставить его в 12 часов и он будет обновляться каждое утро при логине. Как?
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: Davis on 30 05 2016, 13:13:23
Вот так:

Spoiler
Code: [Select]
--- 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();
[close]

И волки сыты и овцы целы

P.S. Вот я тупилка! Для обновления VCard при коннекте достаточно удалить в базе ключ "LastLoggedServer"!
А это же ж можно сделать ActMan без изменения кода :)
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: Davis on 02 06 2016, 15:16:17
Эпопея с XEP-0136 не закочилась :)
http://trac.miranda-ng.org/ticket/1261
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: Davis on 03 06 2016, 09:22:39
Исправил пред-предыдущее сообщение :)
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: randem on 21 12 2018, 10:27:58
Как вы настроили работу XEP-136 в связке Miranda + Openfire? Имею проблему: Необходимо хранение истории на сервере, чтобы при удалении пользователя история сообщений прилетала назад в клиент ( используется miranda ng 0.95.10). В качестве сервера используется openfire (версия 4.1.5) с Active Directory, который поддерживает XEP-0136, при наличии плагина Monitoring. Плагин стоит (версия 1.6.0), сообщения в вэб интерфейсе плагина показываются, значит xep-0136 походу работает. Но при удалении контакта (или удалении БД) в клиенте (miranda ng), после перезапуска, контакт подтягивается в ростер, но история сообщений не сохраняется. В настройках клиента (miranda ng) галочка "Включить историю на сервере (XEP-0136)" установлена. Может я чего то не понимаю.
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: Davis on 21 12 2018, 10:40:54
Звучит правильно.
Отличие в том, что я остановился на openfire 3.10.3 + допиленный мной Monitoring Service  1.4.3.6

В четверке я помню они одно время вообще выпиливали XEP-136 в пользу MAM(XEP-0313)
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: randem on 21 12 2018, 11:58:43
Звучит правильно.
Отличие в том, что я остановился на openfire 3.10.3 + допиленный мной Monitoring Service  1.4.3.6

В четверке я помню они одно время вообще выпиливали XEP-136 в пользу MAM(XEP-0313)

Очень странная работа протокола. Если бы сообщения не сохранялись на сервере, я бы подумал что архивация сообщений не происходит. Но раз в вэб-интерфейсе сообщения видны - значит xep-136 отрабатывает, иначе как miranda оставляет сообщения на сервере. Вопрос в том, почему не прилетает в mirand-у назад. Может логгирование какое включить?
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: Davis on 21 12 2018, 12:16:24
А при чем тут миранда?
Сервер _пересылает_ сообщения, он же их и архивирует плагином. Все. Безо всяких XEP в вашем случае.
Чтобы клиент, а не веб админка, получил архив, тут нужно либо 136 либо 313 с обеих сторон
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: randem on 21 12 2018, 14:06:21
Значит из этого следует что либо openfire с плагином Monitoring, либо miranda, не имеют XEP-136 на борту? Хотя у обоих вроде как поддержка XEP-136 заявлена (по данным сайтов (правда около официальных)). Меня поразило что перехват (архивирование) сообщений возможно без xep-ов. Получается "любой сервер во всемирной паутине" может сохранять переписку jabber клиентов?
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: Davis on 21 12 2018, 14:09:58
openfire с плагином Monitoring
Да, полагаю - это
Поэтому я остановился на старом сервере, у него есть 136, а у миранды нет 313, но миранда умеет доменный логин
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: randem on 22 12 2018, 06:14:24
Да, полагаю - это
Поэтому я остановился на старом сервере, у него есть 136, а у миранды нет 313, но миранда умеет доменный логин
Спасибо за описание работы механизма.  :THUMBS UP:
Хотел ещё спросить.  ::)
Как вы реализовывали автоматическое обновление vcard в mirand-е (имею ввиду поля должность, телефон, и прочее)?
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: Davis on 27 12 2018, 08:16:26
randem, дык все в этой теме :)
Чуть выше
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: Davis on 27 03 2019, 11:08:55
randem,
Решил протестировать современное состояние дел.
Поставил Openfire 4.3.2, плагин Monitoring Service 1.7.0. Он на самом деле умеет и XEP-0136 и XEP-0313

Потестировал клиенты на предмет подтягивания истории  с сервера при удалении профиля:
miranda-ng 0.95.10.1 - история подтягивается, по XEP-0136
conversations  2.4.2 - подтягивается по XEP-0313
xabber - вначале вроде подтягивал, теперешняя версия 2.6.2(591) разучилась
Title: Re: Неправильное время сообщений в истории(XEP-136)
Post by: dartraiden on 27 03 2019, 19:51:11
Логично, в Миранде в плане 0313 ничего не менялось.