Author Topic: Неправильное время сообщений в истории(XEP-136)  (Read 17151 times)

0 Members and 3 Guests are viewing this topic.

Offline Davis

Всем привет

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, то у него все ОК со временем.

Получается, что миранда первый раз пишет в локальную историю сама с правильным временем (если сообщение живое), а потом запрашивает историю с сервера и тут добавляет к времени час. Можно ли это как-то поправить?
« Last Edit: 13 05 2016, 12:37:23 by Davis »
 

Offline Mikalair

В первую очередь проверьте настройки часовых поясов на сервере и клиентских виндах.

Post Merge: 13 05 2016, 18:28:49
с включенным переходом на летнее время
В этом по идее может быть проблема.
If you like my work, you can donate to me via Bitcoin: 1CHAseNjVFfLQViLWAhh1fe6fGTiR6p1UM
 

Offline Davis

Я же  написал - стоит GMT+2 и включен переход на летнее время

Наверняка с летним временем связано, но ошибка, по всей видимости, в миранде.
 

Offline Davis

Вобщем я скачал миранду, подебажил ее и нашел проблему. И даже ее решил:
http://trac.miranda-ng.org/ticket/1250
Там полная неразбериха с таймштампами в модуле архива
 
The following users thanked this post: Apollo2k4

Offline ghazan

спасибо. там еще кучка мусора проследовала в помойку заодно :)
исправлено в ревизии 16870
 
The following users thanked this post: Apollo2k4, Davis

Offline Davis

Раз уж я зацепился за джаббер :)

в файле 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

Правда я пока не смог овладеть всей логикой работы функции IsDuplicateEvent, особенно в части статических переменных PreviousXXX. Подозреваю там какой-нить метод половинного деления. Но также есть подозрения, что из-за этих статических правильно она работает только при первом запуске.
 
The following users thanked this post: Apollo2k4

Offline Davis

Ну и еще одну бяку древнюю пофиксил http://trac.miranda-ng.org/ticket/1251
 
The following users thanked this post: Apollo2k4, ghazan

Offline ghazan

немного развернул и тоже вкрутил :) может ты попробуешь MAM добавить в жабер? :) это гораздо круче будет, чем старый добрый XEP-0136
 

Offline Magic

немного развернул и тоже вкрутил :) может ты попробуешь MAM добавить в жабер? :) это гораздо круче будет, чем старый добрый XEP-0136

+1 за MAM, опенфайр уже умеет с последней версией плагина мониторинга, было бы неплохо в миранде видеть его поддержку)
Если ручки растут из попки - это ножки
 

Offline Davis

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: смотрите дальше более элегантный способ
« Last Edit: 08 06 2016, 13:46:22 by Davis »
 

Offline ghazan

Davis,
а я накладывал патч руками, потому что правильно делать патч не диффом, а svn-клиентом, против соотв ревизии. каталогов-то таких у меня точно нет :)
щас подрихтую

а еще можно в гитхаб слать всё это
 

Offline Davis

Уж простите неуча :)
Причем я фиксю ревизию 15967, но смотрю и последнюю - вдруг там уже пофиксено.
Ибо это пока моя боевая ревизия
 

Offline ghazan

1. а зачем в конец события лепить ноль? его потом db_event_get сам присобачит, ажно целых два

2. а если в моем вкарде нет FullName? оно будет запрашивать вкард при каждом запуске до потери пульса?
 

Offline Davis

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. Че ж этот гугль нотификации форума этого и баг-трекера постоянно в спам кидает? :(
« Last Edit: 29 05 2016, 12:41:35 by Davis »
 

Offline Apollo2k4

P.S. Че ж этот гугль нотификации форума этого и баг-трекера постоянно в спам кидает?
Не только Google, добавьте адрес трекера в адресную книгу, должен перестать.
«Все глупости совершаются с серьёзным выражением лица» © Кён «Меланхолия Сузумии Харухи»

Правильно заданный вопрос – 50% решения.
Правила постинга
 
The following users thanked this post: Davis