"Если вдруг открылся люк, не пугайся, это глюк!" (с) Если что-то работает не так, вы нашли ошибку или опечатку в программе — вам в этот раздел
ЕвгенийГуков
Добрый день.

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

Проблема проявляется в том, что myChat-клиент перестаёт переключаться между вкладками пользователей чата. Т.е. открыта вкладка чата с пользователем Сидоров. Хочу переключиться на чат с Петровым. По Петрову щелкнул, а переписка продолжает отображаться с Сидоровым. Иногда пользователи звонят с проблемой, что не могут отправить сообщение. По кнопке "Отправить" щёлкнули, а ничего не происходит. Это всё проявления одной и той же проблемы - сервер myChat повис. Когда происходит такая проблема, то войти в административную панель myChat-сервера нет возможности - процесс авторизации крутиться бесконечно. Если завершить myChat-клиент, то после запуска новой копии клиент не может зарегистрироваться на сервере.

Причём служба сервера продолжает работать. Ошибок в логах и каталоге Errors нет. Помогает перезапуск службы myChat-сервер.
Аватара пользователя
Алексей Пикуров
Здравствуйте.

У вас есть какие-либо скрипты, которые выполняются на сервере по таймеру или по каким-то событиям?
ЕвгенийГуков
Добрый день.

Да, есть. На событие OnPrivateMessage.
Аватара пользователя
Алексей Пикуров
Покажите исходный текст, пожалуйста.
ЕвгенийГуков
Код: Выделить всё
const
  sHost      = 'mail.pisem.net';
  sEmailFrom = '[email protected]';
  sPassword  = '**********'; 
  iPort      = 25;
 
  MSG_TYPE_COMMENT = 21;
 
function OnPrivateMessage(iCID, iUIN, iUINTo, iMsgType: integer; sMsg: string): boolean;
var
  sEmailTo, sReplyTo, sTextBody, sNameFrom, sNameTo: string;
begin
  result := true;
  if not mIsUINOnline(iUINTo) then begin
    sEmailTo := mGetUserPrimaryEmail(iUINTo);
    if Length(sEmailTo) > 0 then begin
      sNameFrom := mGetUserFullNameByPreset(iUIN, 2);   
      sNameTo   := mGetUserFullNameByPreset(iUINTo, 2);
      sTextBody := '<span style="color:green">' + FormatDateTime('[dd.mm.yyyy hh:nn:ss]', Now) + '</span>'+
                   '<span style="color:blue"><b> ' + sNameFrom + '</b></span>'+
                   '&gt; '+ ReplaceString(mConvertMsgToPlainText(sMsg, iMsgType), CRLF, '</br>', true, false)+
                   '<span style="color:grey"><p>_______________________________________________<br>'+
                   'Сообщение отправлено сервером MyChat. Просьба не отвечать на это сообщение.<br>';
      sReplyTo := mGetUserPrimaryEmail(iUIN);
      if Length(sReplyTo) > 0 then
         sTextBody := sTextBody + 'Если вы хотите ответить пользователю ' + sNameFrom +
                      ', то пишите на адрес: <a href="mailto:' + sReplyTo + '">' + sReplyTo + '</a>';
      sTextBody := sTextBody + '</p></span>';
      SendEmail(sHost, iPort, sEmailFrom, sPassword, sEmailFrom, true, sEmailTo,
                'Новое сообщение MyChat от ' + sNameFrom, sTextBody, 1, '');
      mSendPrivateMessage(iUINTo, iUIN, 'Я СЕЙЧАС НЕ В СЕТИ. Сообщение продублировано мне на e-mail.', MSG_TYPE_COMMENT);
    end;
  end;
end;

begin

end.
Аватара пользователя
Алексей Пикуров
Скрипт Ок, задержек по времени тут нет, отправка email асинхронная. Я не знаю, почему может зависать у вас сервер.

Судя по тому, что вы описываете, на сервере случился deadlock. Сервер работает, но из-за дедлока заблокировалась какая-то структура данных и дальнейшая нормальная работа становится невозможной.
ЕвгенийГуков
Добрый день.

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