ОсновноеRadiotalkПользовательское
MPCHAT - CMS хостинг чатов для профессионалов
90   •   Посмотреть все темы

Bugs - ошибки системы чатов и их исправление!

 

20090
Dimitry @Dimitry
Теперь yourkey содержит ID юзера, ник и сессию, таким образом по приоритету все скрпиты доступны через ID и при этом остаётся рабочим exit.html для выхода и функции удаления из чата.

20090
Dimitry @Dimitry
Как некоторые уже знают, новый касперский 2013 тормозит чат во всех браузерах кроме google chrome

Я долго искал решение проблемы, даже писал в поддержку касперского, бесполезно.
Единственное решение, это всем браузерам кроме google chrome включать флеш движок.
Но для того чтобы антивирусы не реагировали на флеш движок, автоматически для всех скриптов было проведено это обновление:

/* Обработчик Flash подключений */
var noheaders=1;
var myObject = {
start:0,
last:"",
loaded : function() {this.flashMovie = document.getElementById("socket");this.connect(engine_host,engine_port);},
connected : function() {this.start=0; this.last=""; this.write("GET "+engine_uri+"&noheaders="+noheaders+" HTTP/1.1\r\n\r\n");},
disconnected : function() {disconnect();},
ioError: function(msg) {disconnect("io",msg);},
securityError: function(msg) {disconnect("security",msg);},
connect : function(server, port) {this.flashMovie.connect(server, port);},
write : function(msg) {this.flashMovie.write(msg);},
close : function() {this.flashMovie.close();},
receive: function(msg) {
//проверка начала HTML ответа
if(!this.start && !noheaders) {
var a=msg.split('\r\n\r\n');
if(a.length>1) {msg=msg.substr(a[0].length+4); this.start=1;}
else return;
}

...

function loadengine() {
//fix for reconnect
if(engine=="postMessage") parent.left.location.href="about:blank";
if(engine=="flash" && myObject) myObject.close();
if(ajaxon) window.clearInterval(ajaxon);
//load new engine
var flashver=0; var ver = swfobject.getFlashPlayerVersion(); if(ver["major"]) flashver=ver['major'] +"."+ ver['minor'] +"."+ ver['release'];
if(flashver && !/chrome/i.test(navigator.userAgent)) engine_on="flash";

Проверил во всех браузерах с включенным касперским 2013, чат грузится отлично, и работает мгновенно!

20090
Dimitry @Dimitry
Ура товарисчи, теперь гости могут входить не вводя защитный надоедливый код.

Создана система мониторинга входов, в случае если за последние 10 секунд будет много входов система начнёт выдавать код.
А также в случае если одтн и тот-же пользователь будет входить через другие ники и спамить такими входами система сразу же выдаст код уже на второй попытке. Также проверяются некоторые другие параметры.

PS> Для отдельных чатов нужно обновить index_chat.php и who.php

20090
Dimitry @Dimitry
Пробуем исправление установки нужного стиля при загрузке (только для 5й версии)

В админке чата открываем скрипты чата, находим этот кусок кода и добавляем синюю строку.

/* [Подготовка фреймов и загрузка сообщений] */
var userlist="<table id=ul width=100%></table>";
function loadframes() {
/* Последняя стадия загрузки */
if(interval) window.clearTimeout(interval);
/* Подготовка фрейма привата */
if(parent.privatok==1) {document.getElementById("privatdiv").innerHTML='';}
/* Обнуление переменных */
loaded=0;
scrolled=0;
myhistory=myhistory1;
for(var i=0;i<rooms.length;i++) rooms[i][1]=0;
if(mystyle) setstyle(mystyle);
/* Подготовка таблицы никлиста */
uc = 0;
us = new Array();
ucc= new Array();
document.getElementById('users').innerHTML=userlist;
...

20090
Dimitry @Dimitry
Исправление флеш движка для Google Chrome

Урааа! Flash движок опять работает во всех браузерах, ранее в Google Chrome ломалась кодировка.
Исправлен был фаил socket.swf и автоматически скопирован во все чаты, обновление проводить не требуется.

20090
Dimitry @Dimitry
Исправил добавление доменов РФ, теперь можно добавлять их в обычном виде, но в параметрах они сохраняются в пунекоде, также теперь можно нормально работать в управлении ДНС с такими доменами. А то ранее можно было только добавить...

20090
Dimitry @Dimitry
Исправление старого фикса

- добавлено синее, ранее этот фикс не разрешал сразу включить ажакс движок если его выбирали при входе принудительно.
//FIX antivirus bug: enable flash for all without chrome
if(!engine_on && flashver && !/chrome/i.test(navigator.userAgent)) engine_on="flash";

20090
Dimitry @Dimitry
Добавил возможность создавать страниы в UTF-8 + автоопределение срабатывает если есть русский текст.

Использовать только для профи! Все данные из базы, информер, движок и база ников так и будут на 1251, но вроде как то можно выкрутиться задавая кодировку в теге script.

20090
Dimitry @Dimitry
BETEPAH, так чтоб не обидно было сделал выставление кодировки для пхп в параметрах, можешь себе выставить windows-1251 для получения правильных ажаксов, кому ажаксы для получения русских букв не нужны, делать это не нужно...

Сначала планирую отключить старый движок, для этого выпущу авто патчи для старых версий, потом может буду думать как перевести в UTF всю систему, ну или на выбор

20090
Dimitry @Dimitry
Исправление недоработки при переходе на использование ID в 5й версии

Для всех кто делал это обновление: https://vmeste.eu/forum?pid=300300#p300300
Там не хватало изменения одной строки, из-за которого при переходе по комнатам в списке ников могло пропадать значение ID из-за чего анкета не открывалась.
В обновление скриптов в выше указанной теме было добавлено это:
window.setTimeout("for(var i=0;i<us.length;i++) if(us[i]!=null) add(us[i][0],us[i][1],us[i][2],us[i][3],us[i][4],us[i][5],'','',us[i][6],us[i][7],us[i][8],us[i][9]);",500);

PS> Подчистил последнии 3 страницы в этой теме, чтобы немного кучковались все исправления, а то за меся их очень много было и очень важные при чём.

20090
Dimitry @Dimitry
Переход завершён отлично, жалоб не было, глюки что появлялись я исправил.
500 человек движок сегодня держал без проблем 😉

Также рекомендую прочитать концовку этого обновления, особенно связанное с переходом 3 и 4 под структуру файлов 5й версии и отключением 88 порта. https://vmeste.eu/forum?pid=301993#p301993

2615
Сергей @Pegass
Dimitry пишет:

**********
даааа, тут реальная мистика, но дело не в движке, это из-за каких то других ошибок в скриптах!

Я сейчас не дома, у кого серьёзные проблемы, временно поставьте стандартные скрипты.

Ну как всегда косяк в нестандартных, но частоиспользуемых скриптах(выявлено опытным путём)))
добавить красное

1) удаление сообщения в логе
if(text.substr(0,7)=="/remove" && remover[nick]) {
var timeremovez;
text=text.replace("/remove", "");
timeremovez = text.match(/см\.\s(\d\d.\d\d.\d\d)|\S+/g);
if (timeremovez!=null) {
var obj=parent.left.document.getElementById('leftdiv');var div=obj.getElementsByTagName('div');
for (var i=0; i<timeremovez.length; i++) {
for (var k=0; k<div.length; k++) {if (div[k].innerHTML.search(timeremovez[i])>=0){obj.body.removeChild(div[k]);k--;}}}};
if(nick!=mynick||timeremovez==null) return;
text='Вы удалили сообщение/я с '+timeremovez;
}

2 мигалка при указании времени

var timeremove = "";
if (text.search(/см\.\s(\d\d.\d\d.\d\d)/g)>=0) {timeremove = RegExp.$1} ;
if (timeremove) {var obj=parent.left.document.getElementById('leftdiv');
if(cmd==1 && privatok==1) {obj=parent.privat.document};var div=obj.getElementsByTagName('div');//здесь не понятно, вероятно тоже надо править тем у кого приват в отдельном фрейме
for (var i=0; i<div.length; i++) {if (div[i].innerHTML.search(timeremove)>=0) {timeremoveid=timeremove.replace(":", "");
text=text.replace(timeremove,"<span onclick=\"parent.showdiv('"+timeremoveid+"','"+cmd+"');\">"+timeremove+"</span>");div[i].id=timeremoveid;if (loaded==1&&mynick==tonick) showdiv(timeremoveid,cmd)}}};

ЗЫ ну и маленькое описание 1-я функция просто не работала, а вот вторая меняла ID у <div id='leftdiv'></div>, после чего leftdiv переставал существовать, а функция wr не могла его найти и говорила что нет метода appendchild для несуществующего элемента

Отредактировано Pegass - 11.11.2012
2615
Сергей @Pegass
Вот ещё под автофиксы
/* Проверка пользовательских команд для простого сообщения */
if(cmd==0) {
if(text.substr(0,7)=="/remove" && remover[nick]) {
var timeremovez;
text=text.replace("/remove", "");
timeremovez = text.match(/см\.\s(\d\d.\d\d.\d\d)|\S+/g);
if (timeremovez!=null) {
var obj=parent.left.document.getElementById('leftdiv');var div=obj.getElementsByTagName('div');
for (var i=0; i<timeremovez.length; i++) {
for (var k=0; k<div.length; k++) {if (div[k].innerHTML.search(timeremovez[i])>=0){obj.removeChild(div[k]);k--;}}}}; // было obj.body.removeChild(div[k]);
if(nick!=mynick||timeremovez==null) return;
text='Вы удалили сообщение/я с '+timeremovez;
}

function wr(text) {
if(loaded==1 && maxmsgs>0) {
var obj=parent.left.document.getElementById("leftdiv");var count=obj.getElementsByTagName('div').length;
if(maxmsgs<count) obj.removeChild(obj.getElementsByTagName('div')[0]);

/* было
var obj=parent.left.document;var count=obj.getElementsByTagName('div').length;
if(maxmsgs<count) obj.body.removeChild(obj.getElementsByTagName('div')[0]);*/

}
var div = document.createElement('div'); div.innerHTML = text;
parent.left.document.getElementById("leftdiv").appendChild(div);
if(loaded==1) up();
}

20090
Dimitry @Dimitry
Обнаружен баг который в 5й версии не давал переключиться с FLASH на AJAX движок

Из-за данного бага, если у человека закрыты все порты, например он с работы выходит, то он не мог перейти на AJAX.
Ошибка была автоматически исправлена, проверить можно в скриптах чата в разделе движков, добавлено синее:

close : function() {if(this.flashMovie) this.flashMovie.close();},

20090
Dimitry @Dimitry
Ошибка из-за которой пользователи всегда загружались на движке HTML5 postMessage (а антивирус блокировал его)

Данная ошибка присутствует только у тех кто ставил с форума селектор выбора движка при входе в чат.
Внимание!!! Данный селектор вообще не нужен в новыйх движках, но если вы хотите его оставить, то обязательно добавьте синюю строку:
<select name=engine_on>
<option value=''>автоматически
<option value='postMessage'>HTML5 stream
<option value='flash'>Flash stream
<option value='ajax'>Ajax refresh
</select>

20090
Dimitry @Dimitry
Серьёзная недоработка в готовом решении от ридза
https://vmeste.eu/forum?pid=181629#p181629 (тут уже исправил)

Очень много чатов воспользовались готовым решением от ридза, запрет для новичков на отправление ссылок,
но это не запрет ссылок, а запрет всей латиницы, причём очень грубый!
Если зайти в чат и написать латиницей то будет ошибка No text, и пользователь непонимает почему!

Исправление в скриптах, добавляем синее, после чего будет аллерт что нельзя писать латиницей:

if(parent.regist != 1||parent.mystatus==0) {msg_text=msg_text.replace(ssilka, ""); if(!msg_text) {alert("Вам нельзя писать латиницей!"); return false;} }

Вторая недоработка это запрет для гостей писать в приват
(в том же сообщении выше)

if(parent.regist != 1&&msg.split("/privat").length>1) {alert("Вам запрещено писать в приват!"); return false;}

20090
Dimitry @Dimitry
Для тех кто сегодня уже установил обновление с движком WebSocket

Обнаружена критическая проблема в случае если порт 7777 у посетителя заблокирован фаерволом или антивирусом, особенно на работе, то вываливалось куча окон которые не давали перейти на движок ажакс, это касается всех непрерывных движков (

Обновление было исправлено и переписано, тем кто сегодня уже обновился, требуется выполнить пункт 1 и обновить функцию disconnect() в пункте 2, остальное не изменилось. https://vmeste.eu/forum?pid=302291#p302291

Кроме этого теперь нет алерта при отключении от сервера, теперь появляется ошибка в окне с таймером 10 секунд, по истечении которого будет автоматическое переподключение.

20090
Dimitry @Dimitry
Баг автоматического переподключения при обрыве связи в последнем обновлении

Ошибка была в функции disconnect() и исправлена автоматически, ничего делать не нужно!

Было добавлено синее:
interval=window.setInterval("var obj=document.getElementById('restarter'); obj.innerHTML=obj.innerHTML-1; if(obj.innerHTML<=0) loadframes();",1000);

20090
Dimitry @Dimitry
Сделать было не сложно, поэтому реализовал антифлуд параметр для гостей

В параметрах после обычного антифлуда, появился новый параметр для гостей, по умолчанию в новых чатах он выставлен на 3 сек.
Кроме этого теперь внутри чата выводится этот самый параметр, вероятно пригодится: antiflood

Переменная допустимых символов вынесена в конфиг чата

Информация будет полезной для тех кто купил чат.
Тут указываются все символы которые безопасны для ника и могут быть указаны в параметрах.

$config[nick_syntax]='!#$%^&*[]()_+—=@®©™';

PS: Кто-то просил редактирование ID пользователя, данная вещь введена не будет по различным техническим причинам и з-за того что все связи с ником теряются. Поэтому только одна возможность, это опять же в отдельном чате через редактирование DB напрямую.

Сессии вынесены из blank/sess/ в chat/tmp/

В отдельных чатах ранее нужно было создавать папку blank/sess/, теперь этого делать больше не нужно.

Исправление удаления сообщений из движка при удалении их из лога

Это был последний недочёт отдельного чата, теперь через API запрос сообщения будут удаляться и для движка.
Требуется обновить файл log.php. Нужно протестировать работу данной фишки, пока не было возможности это сделать.

Появилась возможность блокировать анонимные прокси, а также банлист теперь содержит userid

В главной админке можно заблокировать IP 0.0.0.0 который очень часто относится к анонимным прокси.
При этом теперь можно указать тип блокировки по пользователю,
т.е. можно добавлять бан только для гостей, а можно для всех - это по умолчанию.
Кроме этого новые записи в бан лист теперь помимо ников содержат userid, они используются при нажатии на ник.
Ну и конечно же userid для списка забаненных используются отныне и в информере!

В информере теперь есть ID пользователей для последних тем форума

Подробнее в теме про информер.

Это ещё не всё!

20090
Dimitry @Dimitry
Важное авто-исправление для движков чата (автоматически сделано только для чатов сервиса)

Внимание!!! Данное обновление обязательно нужно выполнить чатам тарифа владелец, т.е. расположенным на отдельном хостинге.
В сессию движка необходимо добавить логин чата, иначе вскоре движок перестанет грузиться.

1. Обновление нужно сделать в файлах jscripts.dat и mobile.inc (для старых чатов также в irc2.html)
Процедура обновления для всех файлов одинакова, достаточно добавить синее в функцию loadengine() которая в самом низу перечисленных файлов:

function loadengine() {

...


engine_uri="/?chat="+chatlogin+"&sess="+myid+"&engine="+engine;

...

if(engine=="ajax") {
if(engine_path) engine_url="/"+engine_path+"?chat="+chatlogin+"&sess="+myid+"&engine="+engine;
if(ajaxon) window.clearInterval(ajaxon);
ajax(engine_url+"&start=1&r="+Math.random());
ajaxon=window.setInterval('ajax(engine_url+"&r="+Math.random());',10000);
}

}

2. Для работы мобильной версии, также необходимо добавить в самом верху скриптов в mobile.inc синюю строку:
...
<script>
var chatlogin='%chatlogin%';
var mynick='%mynick%';
var myid='%myid%';
var engine_on='%engine_on%';
var engine_host='%engine_host%';
var engine_port='%engine_port%';
var engine_path='%engine_path%';

3. Ну и в index_chat.php также добавить синее
//MOBILE index
if($mobile) {
echo putinclude("mobile","",array( "chatlogin"=>$chat, "mynick"=>$nick,"myid"=>$id,"engine"=>$engine,"engine_on"=>$engine_on,"engine_host"=>$config[engine_host],"engine_port"=>$config[engine_port],"engine_path"=>$config[engine_path]));
}

4. Для правильной работы AJAX, нужно скачать архив и обновить фаил .htaccess