#21 

Dimitry
Ниндзя по зачистке капусты
Имя: Дмитрий
Откуда: Германия
Зарегистрирован: 2003-04-18
Сообщений: 18212
На форуме: 1724 час.
Репутация: 1220 (99%) ±
Инфо  Вебсайт  Написать

ПЕРЕХОД на безфреймовую версию ЧАСТЬ 2 (часть 1 выше)

Скрываем iframe с сообщениями left и выводим сообщения сразу в DIV (leftdiv)

Данное обновление только для чатов безфреймовой версии - исправляет баг google chrome,
при котором если поступают новые сообщения и вы производите выбор в select, то поле выбора сбрасывается.

Обновление затронет только 3 файла: irc.html(фрейм сообщений), chat.inc(шаблон внутри чата) и jscripts.dat(скрипты внутри чата)

1. В файле irc.html изменений немного, так как теперь этот фрейм скрыт, вывод информации перед сообщениями будет чуть иначе.
Просто добавляем синюю строку для очистки фрейма сообщений и начальной загрузки содержимого, ниже из HTML её можно убрать:

<!DOCTYPE html>
<html>
<head>
<META http-equiv=Content-Type content="text/html; charset=windows-1251">
<link rel=STYLESHEET type="text/css" href="style.css">
</head>
<script>
/* Функция - перенаправитель команд */
function f(var1,var2,var3,var4,var5,var6,var7,var8,var9,var10,var11,var12,var13,var14) {
parent.f(var1,var2,var3,var4,var5,var6,var7,var8,var9,var10,var11,var12,var13,var14);
}
/* Задаём изначальное содержимое перед сообщениями */
parent.document.getElementById("leftdiv").innerHTML="<center><font size=4><b>Мы приветствуем Вас в нашем чате!</b></font></center><br>";

</script>
<body onload="if(confirm('Извините, связь прервалась! Перезагрузить чат?')) parent.loadframes();">
<!--Этот фаил должен быть не больше 1кб, ниже будет загрузка JS-сообщений-->

2. Теперь в файле chat.inc вынесем iframe left наверх в скрытой форме и обновим DIV сообщений leftdiv, изменения показаны синим:

<!-- HIDDEN FRAMES -->
<iframe name=hidden width=0 height=0 style="display:none;"></iframe>
<iframe name=left width=0 height=0 style="display:none;"></iframe>


<!-- TOP FRAME -->
<div id=topdiv style="position:absolute; height:40px; left:0px; right:0px; top:0px; padding-left:10px; border:1px gray solid;">

</div>

<!-- GAME FRAME -->
<div id=gamediv style="position:absolute; height:60px; left:0px; right:295px; top:45px; display:none; z-index:1; border:1px gray solid;">
    <iframe name=gameframe src=start.html style="position:absolute; width:100%; height:100%; border:0px;"></iframe>
</div>

<!-- LEFT FRAME -->
<div id=leftdiv  style="position:absolute; overflow-y:scroll; padding-left:10px; left:0px; right:295px; top:45px; bottom:65px;  border:1px gray solid;">

</div>

3. Ну и скрипты чата jscripts.dat, тут работы побольше, сначала находим функции up() и wr() и обновим их полностью:

/* Функции плавной прокрутки и включение дозагрузки */
var loaded=0;
var scrolled=0;
function up() {
if(loaded==0) onloaded();
var leftdiv=document.getElementById("leftdiv");
var left=leftdiv.scrollHeight-leftdiv.clientHeight-leftdiv.scrollTop;
if(left<=0 || (scrolled==1 && left>250)) return;
leftdiv.scrollTop=Math.ceil(leftdiv.scrollTop+left/(1+slowscroll));
setTimeout('up()',20);
}

/* Удаляет старое сообщ. печатает новое и прокручивает вниз */
function wr(text) {
var leftdiv=document.getElementById("leftdiv");
if(loaded==1 && maxmsgs>0) {
    var count=leftdiv.getElementsByTagName('div').length;
    if(maxmsgs<count) leftdiv.removeChild(leftdiv.getElementsByTagName('div')[0]);
}
var div=document.createElement('div'); div.innerHTML=text;
leftdiv.appendChild(div);
if(loaded==1) up();
}

Далее в функции f() находим красное и меняем на document.getElementById("leftdiv")

почти в начале функции
if(loaded==1) parent.left.document.getElementsByTagName("body")[0].innerHTML="";text="очищаю фрейм сообщений";}

почти в самом нижу
parent.left.document.body.innerHTML="Подождите, осуществляется переход в другую комнату ...";

ещё чуть ниже
parent.left.document.body.innerHTML="";

в результате получаем такие строки

if(loaded==1) document.getElementById("leftdiv").innerHTML="";text="очищаю фрейм сообщений";}
...
document.getElementById("leftdiv").innerHTML="Подождите, осуществляется переход в другую комнату ...";
...
document.getElementById("leftdiv").innerHTML="";

Ну и на последок нужно обновить пару строк в функциях loadframes() и ajax() - они находятся в самом низу скриптов, изменения синим:
if(ajaxon) {ajax(1); return;} - этот код был просто перемещён выше

/* [Подготовка фреймов и загрузка сообщений] */
var userlist="<table id=ul width=100%></table>";
function loadframes() {
if(document && parent.left && parent.left.document && document.getElementById('users') && document.getElementsByName('text0')[0]){
    /* Последняя стадия загрузки */
    if(interval) window.clearInterval(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;
    /* Подготовка таблицы никлиста */
    uc = 0;
    us = new Array();
    ucc= new Array();
    document.getElementById('users').innerHTML=userlist;
    /* Загрузка движка сообщений */
    document.getElementById("leftdiv").innerHTML='Загрузка ...';
    if(ajaxon) {ajax(1); return;}
   
    parent.left.location.href='irc.html?'+myid+'&r='+Math.random();
    /* Загрузка актуального стиля, если был изменён */
    if(mystyle) window.setTimeout("setstyle(mystyle);",3000);
    /* Проверка непрерывного соединения */
    interval=window.setTimeout(
    'if(location.port!=88 && confirm("Проблема потокового соединение через стандартный порт. Нажмите ОК для перехода на другой порт или Отмена для дальнейших действий.")) location.href="http://"+location.hostname+":88"+location.pathname+"?"+yourkey; '+
    'else if(confirm("Нажмите OK если хотите перейти на ажакс движок чата или Отмена для продолжения загрузки.")) ajax(1); '
    ,1000*15); /* Время для проверки потокового движка 15 сек */
}}
var interval=window.setInterval("loadframes()",100);

var ajaxon=0;
var http = null;
var ajaxreq=0;
function ajax(start) {
if(ajaxreq) return; ajaxreq=1;
var file="./ajax.html?sess="+myid+"&r="+Math.random(1);
if(start) {ajaxon=1; file+="&start=1";
    document.getElementById("leftdiv").innerHTML="";
    window.setInterval("ajax()",15000);
}
//Mozilla, Opera, Safari, IE7, else IE6
if (typeof XMLHttpRequest != 'undefined') {http = new XMLHttpRequest();}
else {
try {http  = new ActiveXObject("Msxml2.XMLHTTP");}
catch(e) {try {http  = new ActiveXObject("Microsoft.XMLHTTP");} catch(e) {http  = null;}}
}
if (http) {
    http.open('GET', file, true);
    http.onreadystatechange = new Function("if(http.readyState != 4) return;parent.left.document.write(http.responseText);ajaxreq=0;");
    http.send(null);
}}


Моя анкета на vmeste.eu
Если сообщение Вам помогло, отблагодарите участника повысив его репутацию!
PS. То, что нас не убивает, то делает нас сильнее!

Неактивен

#22 

Dimitry
Ниндзя по зачистке капусты
Имя: Дмитрий
Откуда: Германия
Зарегистрирован: 2003-04-18
Сообщений: 18212
На форуме: 1724 час.
Репутация: 1220 (99%) ±
Инфо  Вебсайт  Написать

Мелкие доработки по использованию userid и не только (только для чатов 5й версии)

Внимание!!! Данное обновление является необходимым для решения проблем с открытием русских анкет через Firefox.
На данный момент были затронуты почти все скрипты и все места где было возможно сделать доступ по UserID.
Там где это не сделано, вероятно будет сделано со временем позже, и выложено в теме багов.

И так приступим:

1. Все md5 сессии и хеш ссылки теперь защищены секретным кодом, без данного кода злоумышленник не сможет вычислить md5-хеш и выполнять дейсткия от пользоватлелей.

2. Теперь загружаемые файлы через чат имеют приставку chat_, а через почту post_ (время для чистки таких файлов  после их загрузки теперь разное, 3 дня и 30 дней соответственно)

3. Шаблон search.inc открытие анкеты по ID изменяем синее:

for(var i=0;i<u.length;i++) document.write("<a href=?inc=info&userid="+u[i][3]+"  target=_blank><font color="+u[i][1]+">"+u[i][0]+"</font></a><br>");

4. Шаблон gb.inc открытие анкеты по ID изменяем синее:

posts[i]="<table  width=500 align=center style='table-layout:fixed;'><tr><td class=title align=left width=150>"+g_p[i][3]+"<td class=title align=right> #"+g_p[i][0]+"</tr><tr><td width=150 valign=top align=left style=padding:10px;padding-left:4px;><a href=# onclick='put(\""+g_p[i][1]+", \"); return false;'><font color='"+g_p[i][4]+"'>"+g_p[i][1]+"</font></a>  [<a href=?inc=info&userid="+g_p[i][8] +" target=info>?</a>]<br>"+avator+"</td><td valign=top align=left style='padding:10px;word-wrap:break-word;'>"+message+"<tr><td align=left>"+g_p[i][6]+"<td align=right>"+mod+"</table><br>";

5. Шаблон forum.inc открытие анкеты по ID изменяем синее:

posts[i]="<table  width=90% align=center style='table-layout:fixed;'><tr><td class=title width=150 align=left><a name=post"+f_p[i][0]+" href=?inc=forum&forum="+forum+"&topic="+topic+"&post="+f_p[i][0]+"#post"+f_p[i][0]+" class=title>"+f_p[i][3]+"</a></td><td class=title align=right> #"+num+"</td></tr><tr><td width=150 valign=top align=left style=padding-top:10px;><a href=# onclick='put(\""+f_p[i][1]+", \"); return false;'>"+f_p[i][1]+"</a> [<a href=?inc=info&userid="+f_p[i][13]+" target=info>?</a>]<br>"+avator+name+mw+rang(f_p[i][1],f_p[i][7])+"Сообщений:"+f_p[i][7]+"<br>  <a href=?inc=post&act=new&nick="+mynick+"&id="+myid+"&tonick="+f_p[i][1]+"  target=pm><font class=low>Написать письмо</font></a><br><font class=low>"+f_p[i][6]+"</font>&nbsp;</td><td valign=top align=left style='padding:10px; word-wrap: break-word;'>"+message+"<tr><td align=left>"+isonline+"<td align=right>"+mod+"</td></tr></table><br>";

6. Для форума выводим последнюю активную тему в списке форумов, добавляем синее в шаблоне forum.inc:

lasttopic=""; if(f_f[i][11]) lasttopic="<a href=?inc=forum&forum="+f_f[i][0]+"&topic="+f_f[i][11]+">"+f_f[i][12]+"</a><br>"+f_f[i][5]+" от "+f_f[i][4]+"";
forums[f_f[i][0]]="<tr><td width=20><div class="+icon+"></div></td><td align=left> <a href=?inc=forum&forum="+f_f[i][0]+" onclick='return access("+i+");'>"+f_f[i][1]+"</a><br>"+f_f[i][2]+moders+"</td><td align=center>"+f_f[i][6]+"</td><td align=center>"+f_f[i][7]+"</td><td>"+lasttopic+"</td></tr>";

7. Доступ к никам в галеереи по ID, в шаблоне gallery.inc меняем синее:
(все текущие базы были переведены с использованием ID)

if(gal_upload>0) info+=" [<a href='?inc=info&userid="+x[8]+"' target='"+x[2]+"'>?</a>]";

....

posts[i]="<table  width=500 align=center style='table-layout:fixed;'><tr><td class=title align=left width=150>"+g_p[i][3]+"</td><td class=title align=right> #"+g_p[i][0]+"</tr><tr><td width=150 valign=top align=left style=padding:10px;padding-left:4px;><a href=# onclick='put(\""+g_p[i][1]+", \"); return false;'><font color='"+g_p[i][4]+"'>"+g_p[i][1]+"</font></a>  [<a href=?inc=info&userid="+g_p[i][10]+" target=info>?</a>]<br>"+avator+"</td><td valign=top align=left style='padding:10px;word-wrap:break-word;'>"+message+"</td></tr><tr><td align=left>"+g_p[i][6]+"</td><td align=right>"+mod+"</td></tr></table><br>";

8. Информер теперь также знает ID пользователей: (подробнее https://forum.vmeste.eu/viewtopic.php?pid=5680#p5680)
- в послед. зарегистрированных
- в именинниках
- в списке кто онлайн
- в последних сообщениях
- в выводе фотографий
- в выводе последних тем
(не реализовано только в списке забаненых и темах форума )

9. Внутри чата (шаблон chat.inc) теперь переменная yourkey содержит userid, кто использует yourkey, делать ничего не потребуется.
В противном случае можно составлять свои ссылки используя переменные userid и id.

10. Однако для использования userid в скриптах чата jscripts.dat, например для открытия анкеты по ID, следует найти все ниже указанные строки и добавить или изменить синее:

...

if(nick_r) {loaded=1; f(room_r,6,nick_r,'',inchat_r,'',color_r,'',mw_r,st_r,icon_r,status_r,love_r,clan_r,userid_r);loaded=0;}

...

function add(nick,colornick,st,mw,icon,status,inchat,time,room,love,clan,userid){
if(loaded==0) return;
var l=us.length;
for(var i = 0;i<l;i++ ) if(us[i]!=null && us[i][0]==nick) break;
us[i]=new Array(nick,colornick,st,mw,icon,status,room,love,clan,userid);
if (i==l) {uc++; update(room,1);}
if(room==myroom) {
nickid="!"+nick;
obj=document.getElementById(nickid);
var ul=document.getElementById('ul');
if(obj) ul.deleteRow(obj.rowIndex);
index=ul.rows.length;
seprules(1,st,mw);
var obj=ul.insertRow(index); obj.id=nickid;
format(i,obj);
}}

function del(nick,colornick,st,mw,icon,status,inchat,time,room,userid) {
if(loaded==0) return;
for(var i=0; i<us.length; i++)
if( us[i] != null && us[i][0] == nick )  {uc--; update(us[i][6],-1); us[i] = null; break;}
if(room==myroom) {
nickid="!"+nick;
obj=document.getElementById(nickid);
var ul=document.getElementById('ul');
ul.deleteRow(obj.rowIndex);
seprules(-1,st,mw);
}}


/* Добавление ника в таблицу участников */
function format(i,tr){
if(us[i]==null) return "";
nick=us[i][0];
color=us[i][1];
stat=us[i][2];
stat2=us[i][5];
mw_u=us[i][3];
icon=us[i][4];
love=us[i][7];
clan=us[i][8];
userid=us[i][9];

...

set_mw="<a href=index.php?inc=info&userid="+userid+" onclick=\"parent.wo(this.href,'Анкета','400','320','yes');return false;\" target="+us[i][0]+">"+mw+"</a>";

...

function f(room,cmd,nick,tonick,text,time,colornick,color,var9,var10,var11,var12,var13,var14,userid) {

...

add(nick,colornick,st,mw,icon,status,inchat,time,room,love,clan,userid);

...

del(nick,colornick,st,mw,icon,status,inchat,time,room,userid);

...

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);

...

f(a[0]*1,a[1]*1,a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],a[12],a[13],a[14],a[15]);

...


Моя анкета на vmeste.eu
Если сообщение Вам помогло, отблагодарите участника повысив его репутацию!
PS. То, что нас не убивает, то делает нас сильнее!

Неактивен

#23 

Dimitry
Ниндзя по зачистке капусты
Имя: Дмитрий
Откуда: Германия
Зарегистрирован: 2003-04-18
Сообщений: 18212
На форуме: 1724 час.
Репутация: 1220 (99%) ±
Инфо  Вебсайт  Написать

Добавление нового движка WebSocket (решение всех проблем с движками)
(Обновление доработано! Если вы уже установили данное обновление, переустановите его!)

Установка (выполнить нужно все 4 пункта)

1. В скрпитах чата jscripts.dat, сначала находим функцию onloaded() и изменяем строку на синюю:

/* Дозагрузка - выполняется после загрузки фрейма сообщений */
function onloaded() {
window.setTimeout('scrolled=1;',5000);
if(interval) {window.clearTimeout(interval); interval="";}
if(topic) wr(topic);
...

2. Далее для чатов 5й версии заменим полностью функции disconnect() и loadengines() в скриптах jscripts.dat (для старых версий в irc2.html)
Синим показано добавленное или изменённое, а зелёным рекомендуемое для отладки: (можно полностью заменить функции)

/* [NEW ENGINES - обработка и функции новых движков] */
var engine="";
var engine_url="";
var engine_uri="";

/* Обработчик ошибок подключения */
function disconnect(type,error) {
    if(type=="io") {wr("<font color=red>Ошибка подключения к серверу "+error+", подождите окончания загрузки ...</font>"); }
    else if(type=="security") {return; wr("<font color=red>Ошибка безопасности при подключении к серверу "+error+", подождите окончания загрузки ...</font>"); }
    else if(!interval) {
        wr("<font color=red>По какой то причине Вы были отключены от сервера, переподключение через <b id=restarter>10</b> секунд ...</font>");
        interval=window.setInterval("var obj=document.getElementById('restarter'); obj.innerHTML=obj.innerHTML-1; if(obj.innerHTML<=0) loadframes();",1000);
    }
}



...


/* Определение и загрузка движков чата */
var ws="";
function loadengine() {
    //fix for reconnect
    if(ws) ws.onclose = function(e) {};
    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'];
    var browser=navigator.userAgent.match(/(Chrome|Firefox|Opera|Safari|MSIE|K-Meleon)( |\/)(\w+\.\w+)/i); if(!browser) var browser=new Array('','unknown','',0);
    if(!engine_on) {
        if(window.WebSocket && (!window.chrome || browser[3]>=16)) engine_on="WebSocket";
        else if(window.postMessage && window.chrome) engine_on="postMessage";
        else if(flashver) engine_on="flash";
        else engine_on="ajax";
    }
    wr("<font color=green>Браузер <b>"+browser[1]+"/"+browser[3]+"</b>, версия <b>Flash "+flashver+"</b>, движок <b>"+engine_on+"</b>, подключение ...</font>");
    engine=engine_on;

    engine_uri="/?sess="+myid+"&engine="+engine;
    engine_url="http://"+engine_host+":"+engine_port+engine_uri;
    if(engine=="WebSocket") {
        ws = new WebSocket("ws://"+engine_host+":"+engine_port+engine_uri);
        ws.onopen = function(e) {};
        ws.onmessage = function(e) {eval(e.data.replace(new RegExp('<scr'+'ipt>','gm'),'').replace(new RegExp('</scr'+'ipt>','gm'),''));};
        ws.onerror = function(e) {disconnect("io","websocket");};
        ws.onclose = function(e) {window.setTimeout("disconnect();",1000);};
    }

    if(engine=="postMessage") parent.left.location.href=engine_url+"&r="+Math.random();
    if(engine=="flash") {
        if(!document.getElementById('socket')) {var newdiv = document.createElement('div'); newdiv.setAttribute('id','socket'); document.body.appendChild(newdiv);}
        swfobject.embedSWF("socket.swf?"+Math.random(), "socket", "0", "0", "9", "expressInstall.swf", {scope:"myObject"}, {allowscriptaccess:"always"}); 
        window.onunload=function(){myObject.close();}
    }
    if(engine=="ajax")  {
        if(engine_path) engine_url="/"+engine_path+"?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);
    }
}

3. Ну этот шаг простой но рекомендуемый,  в chat.inc (в старых версиях irc2.html) там где грузятся сообщения, если там пусто, написать Загрузка..., так:

<!-- LEFT FRAME -->
<div id=leftdiv class=header-body style="position:absolute; overflow-y:scroll; padding-left:10px; left:0px; right:295px; top:45px; bottom:65px; border:1px gray solid;">
Загрузка ...
</div>

4. Возвращаемся к скриптам чатов jscripts.dat и перед движками, меняем красное на синее:
(в старых версиях возможны отличия которые нужно внимательно сравнить и вероятно оставить без изменения)

    /* Проверка непрерывного соединения */
    interval=window.setTimeout(
    'if(!ajaxon && confirm("Проблема подключения к потоковому движку на порту "+engine_port+". Нажмите OK если хотите перейти на Ajax движок или Отмена для продолжения загрузки.")) {engine_on="ajax"; loadframes();} '+
    'else alert("Не удалось подключиться к потоковому движку на порту "+engine_port+" или Ваш браузер просто не поддерживает новые технологии. Попробуйте использовать браузер Google Chrome.");'
    ,1000*10); /* Время для проверки потокового движка 10 сек */
    /* Загрузка движка сообщений */
    document.getElementById("leftdiv").innerHTML='Загрузка ...';
    loadengine();
}
var interval=window.setTimeout("if(confirm('Чат не был загружен в установленное время, вероятно некоторые элементы страницы грузятся очень долго, продолжить загрузку?')) loadframes();",10000);

на

    /* Проверка непрерывного соединения */
    interval=window.setTimeout(
    'if(engine_on!="ajax" && !ajaxon) {wr("<font color=red>Проблема подключения к потоковому движку на порту "+engine_port+". Пробуем подключиться через <b>ajax</b> движок ...</font>"); window.setTimeout("engine_on=\\"ajax\\"; loadframes();",5000);} ' +
    'else wr("<font color=red>Не удалось подключиться к движку чата, вероятно Ваш браузер просто не поддерживает новые технологии.<br>Попробуйте использовать новый современный браузер <a href=http://google.com/chrome target=_blank>Google Chrome</a>.</font>");'
    ,1000*10); /* Время для проверки потокового движка 10 сек */
    /* Загрузка движка сообщений */
    document.getElementById("leftdiv").innerHTML='Загрузка ...';
    loadengine();
}
var interval=window.setTimeout('wr("<font color=red>Чат не был загружен в установленное время, вероятно некоторые элементы страницы грузятся очень долго, <a href=# onclick=\'loadframes(); return false;\'>нажмите для продолжения</a> ...</font>");',10000);

Как работает новая система оповещения о проблемах и смены движков

Ддя начала следует сказать что теперь при отключении от чата, при плохой связи, или при перезагрузке севрера, больше нет алерта, а начинается отсчёт 10 секунд после которого окно автоматически переподключается! Вот пример:

По какой то причине Вы были отключены от сервера, переподключение через 10 секунд ...

Далее опишем саму процедуру проблемных подключений к чату:

1. Пользователь входит в чат и видит в окне сообщений слово:

Загрузка ...

2. Если сам чат не может загрузиться за 10 секунд, например много картинок или внешние файлы которые не грузятся, то пользователь увидит в окне:

Загрузка ...
Чат не был загружен в установленное время, вероятно некоторые элементы страницы грузятся очень долго, нажмите для продолжения ...

3. Если пользователь ничего не нажмёт то чат ещё может сам загрузиться, если нажмёт, то сразу начнётся загрузка и подключение движка, т.е. стартанёт loadframes();

Загрузка ...
Браузер Chrome/23.0, версия Flash 11.5.31, движок WebSocket, подключение ...

4. Спустя 10 секунд, если сообщения не загрузились в окне будет так:

Загрузка ...
Браузер Chrome/23.0, версия Flash 11.5.31, движок WebSocket, подключение ...
Проблема подключения к потоковому движку на порту 7777. Пробуем подключиться через ajax движок ...

5. Ура!!! Ничего делать не нужно, через 5 секунд будет автоматическая загрузка ajax движка, окно выглядит так:

Загрузка ...
Браузер Chrome/23.0, версия Flash 11.5.31, движок ajax, подключение ...

6. В случае если и ajax движок не загрузится за 10 секунд, в окне будет так:

Загрузка ...
Браузер Chrome/23.0, версия Flash 11.5.31, движок ajax, подключение ...
Не удалось подключиться к движку чата, вероятно Ваш браузер просто не поддерживает новые технологии.
Попробуйте использовать новый современный браузер Google Chrome.

7. The End. Такое практически исключено, так как ажакс движок работает во всех браузерах, ну не считая конечно IE 5.

Все таймеры можно изменять на своё усмотрение, например увеличить для загрузки чата, если в чате очень много картинок большого размера.
В результате, если у пользователя нет никаких проблем с потоковыми движками, он просто увидит моргнувшую зелёную надпись, а может и не увидит вообще. Если же порт 7777 заблокирован, например человек заходит с работы, то будет та самая красная надпись на 5 секунд, а после неё загрузится ажакс.
Прощай надоедливые алерты и мороки с выбором движков, в этом обновлении система автоматически выберет идеальный движок и запустит чат без лишних движений! Различные селекты и кнопки переключения движков при входе и внутри чата, теперь больше не нужны.


Моя анкета на vmeste.eu
Если сообщение Вам помогло, отблагодарите участника повысив его репутацию!
PS. То, что нас не убивает, то делает нас сильнее!

Неактивен

#24 

Dimitry
Ниндзя по зачистке капусты
Имя: Дмитрий
Откуда: Германия
Зарегистрирован: 2003-04-18
Сообщений: 18212
На форуме: 1724 час.
Репутация: 1220 (99%) ±
Инфо  Вебсайт  Написать

Добавление LIVE уведомлений в чат

В чат приходят мгновенные уведомления о новой почте (включая подарки и загс), о новых регистрациях, о новых сообщениях в гостевой и форуме, о вступлении пользователя в сообщество, и добавлении пользователями новых фотографий! Можно много на что прикрутить данную фишку, но я пока сделал на самое основное! Все уведомления приходят для всех пользователей, но для почтовых уведомлений присутствует условие - только для получателя.

В скриптах чата jscripts.dat в функции f() в самом конце перед /* Конец функции f() */ добавляем этот код:

/* Функция вывода уведомлений */
if(cmd==11) {
    if(text=="post" && tonick==mynick) wr(set_time+"Уведомление: <i>У Вас новая почта от <a href=?inc=info&userid="+userid+" target=_blank><font color="+colornick+">"+set_nick+"</font></a> с заголовком \"<a href=?inc=post&"+yourkey+"&read="+var10+" target=_blank>"+var9+"</a>\"</i><br>");
    if(text=="reg") wr(set_time+"Уведомление: <i>Зарегистрировался новый пользователь <a href=?inc=info&userid="+userid+" target=_blank><font color="+colornick+">"+set_nick+"</font></a>.</i><br>");
    if(text=="clan") wr(set_time+"Уведомление: <i>Пользователь <a href=?inc=info&userid="+userid+" target=_blank><font color="+colornick+">"+set_nick+"</font></a> вступил в сообщество \""+var9+"\".</i><br>");
    if(text=="gallery") wr(set_time+"Уведомление: <i>Пользователь <a href=?inc=info&userid="+userid+" target=_blank><font color="+colornick+">"+set_nick+"</font></a> добавил новую <a href=?inc=gallery&gallery="+nick+"&foto="+var9+" target=_blank>фотографию</a> в галерею.</i><br>");
    if(text=="gb") wr(set_time+"Уведомление: <i>Новое сообщение от <a href=?inc=info&userid="+userid+" target=_blank><font color="+colornick+">"+set_nick+"</font></a> в <a href=?inc=gb target=_blank>гостевой</a>.</i><br>");
    if(text=="forum") wr(set_time+"Уведомление: <i>Новое сообщение от <a href=?inc=info&userid="+userid+" target=_blank><font color="+colornick+">"+set_nick+"</font></a> в теме форума \"<a href=?inc=forum&forum="+var11+"&topic="+var10+"&post="+var12+"#post"+var12+" target=_blank>"+var9+"</a>\"</i><br>");
}


Моя анкета на vmeste.eu
Если сообщение Вам помогло, отблагодарите участника повысив его репутацию!
PS. То, что нас не убивает, то делает нас сильнее!

Неактивен

#25 

Dimitry
Ниндзя по зачистке капусты
Имя: Дмитрий
Откуда: Германия
Зарегистрирован: 2003-04-18
Сообщений: 18212
На форуме: 1724 час.
Репутация: 1220 (99%) ±
Инфо  Вебсайт  Написать

Поставим запятую в развитии mpchat - переход на UTF-8 (все чаты переведены на UTF-8)

Наступил новый год и была создана копия движка чата в кодировке UTF-8.
Все чаты с 31.01.13 работают только на UTF-8 кодировке, восстановление старых чатов больше не выполняется.


Моя анкета на vmeste.eu
Если сообщение Вам помогло, отблагодарите участника повысив его репутацию!
PS. То, что нас не убивает, то делает нас сильнее!

Неактивен

#26 

Dimitry
Ниндзя по зачистке капусты
Имя: Дмитрий
Откуда: Германия
Зарегистрирован: 2003-04-18
Сообщений: 18212
На форуме: 1724 час.
Репутация: 1220 (99%) ±
Инфо  Вебсайт  Написать

Новая функция транслитерации текста в реальном времени
- данный транслит поддерживается всеми браузермани кроме IE<9
- пример можно увидеть в главном чате - кнопка TR, обновление только для безфреймовых чатов

1. в скриптах чата jscripts.dat в функциях нижнего фрейма находим такой код:

/* Транслирует текст на русский по звучанию */
document.write("<"+"script src=http://mpchat.com/blank/translit.js></"+"script>");
function translit(msg){
if (document.fmsg.trans.value == 1 && msg) {
for (i=0; i<engRegSmall.length; i++) {msg = msg.replace(engRegSmall[i], rusSmall[i])}
for (i=0; i<engRegBig.length; i++) {msg = msg.replace(engRegBig[i], rusBig[i])}
}
return msg;
}

и заменяем на такой

/* Транслирует текст на русский по звучанию */
var tr={'а':'a','б':'b','в':'v','г':'g','д':'d','е':'e','ё':'jo','ж':'zh','з':'z','и':'i','й':'j','к':'k','л':'l','м':'m','н':'n','о':'o','п':'p','р':'r','с':'s','т':'t','у':'u','ф':'f','х':'h','ц':'c','ш':'sh','щ':'w','ы':'y','ь':"'",'ъ':"''",'э':'je','ю':'ju','я':'ja'};
var enabletrans=0;
function checktrans() {
    var obj=document.getElementById('trbutton');
    if(enabletrans==1) {enabletrans=0; obj.style.fontWeight='normal';}
    else {enabletrans=1; obj.style.fontWeight='bold';}
    document.fmsg.text0.focus();

function autotrans(el,e) {
    var e=e || window.event;
    var code = e.which;
    if(typeof el.selectionStart != "number" || !((code>=65 && code<=123) || code==35 || code==39)) return true;
    var txt=String.fromCharCode(code);
    var pos=el.selectionStart;
    el.value=el.value.substr(0,el.selectionStart)+el.value.substr(el.selectionEnd);
    var pre=""; if(pos) {pre=el.value.substr(pos-1,1); if(tr[pre]) pre=tr[pre]; else pre="";}
    var pretxt = pre+txt; var r=""; var del=0;
    if(pretxt.length==2) for(k in tr) if(tr[k]==pretxt) {r=k; del=1; break;}
    if(!r) for(k in tr) if(tr[k]==txt) {r=k; break;}
    el.value=el.value.substr(0,pos-del)+r+el.value.substr(pos);
    pos=pos+1-del; el.setSelectionRange(pos, pos);
    return false;
}

2. далее чуть ниже в функции msg_send удаляем такую строку:

msg_text=translit(msg_text);

3. теперь открываем шаблон чата внутри chat.inc и перед <!-- CHAT FRAME --> добавляем:

<!-- TRANSLIT HELP -->
<script>
var out='<table id=trlist style="display:none; position:absolute; z-index:10; right:10px; bottom:55px; ">';
out+='<tr>'; for(i in tr) out+='<td>'+i+'</td>'; out+='</tr>';
out+='<tr>'; for(i in tr) out+='<td>'+tr[i]+'</td>'; out+='</tr>';
out+='</table>';
document.write(out);
</script>

4. ниже в любом месте добавляем кнопку TR

<input id=trbutton type=button onclick="checktrans();"  onmouseover="var obj=document.getElementById('trlist'); obj.style.display='inline-table';" onmouseout="var obj=document.getElementById('trlist'); obj.style.display='none';" value="TR" title="Включить автоматическую транслитерацию Ctrl+Alt">

5. ну и само поле ввода текста должно выглядеть так: (синее добавлено)

<input type=text name=text0 maxlength=500 style="width:400px;"  onkeypress="if(enabletrans) return autotrans(this,event);" onkeydown="if(event.ctrlKey && event.altKey) {checktrans(); return false;}">


Моя анкета на vmeste.eu
Если сообщение Вам помогло, отблагодарите участника повысив его репутацию!
PS. То, что нас не убивает, то делает нас сильнее!

Неактивен

#27 

Dimitry
Ниндзя по зачистке капусты
Имя: Дмитрий
Откуда: Германия
Зарегистрирован: 2003-04-18
Сообщений: 18212
На форуме: 1724 час.
Репутация: 1220 (99%) ±
Инфо  Вебсайт  Написать

Переход викторины на WebSocket с полным редактированием

В связи с тем что старый движок викторины значительно устарел, викторина была переведена на новый движок через WebSocket.
Старый движок больше не работает, поэтому всем кто использует викторину необходимо провести это обновление:

1. В файле стилей style.css меняем #gamecode на #gamediv:
(это действие выполнено автоматически, но можно проверить всё ли нормально)

/* стиль для игры - викторина */
#gamediv table {border-collapse:collapse;}
#gamediv td {padding:2px; font:18px Verdana;text-align:center; width:20px; height:15px;}

2. В файле chat.inc вырезаем iframe, находим такой кусок кода:
(это действие выполнено автоматически, но можно проверить всё ли нормально)

<!-- GAME FRAME -->
<div id=gamediv class=header-body style="position:absolute; height:60px; left:0px; right:295px; top:45px; display:none; z-index:1; border:1px gray solid;">
<iframe name=gameframe src=start.html style="position:absolute; width:100%; height:100%; border:0px;"></iframe>
</div>

и заменяем на этот код:

<!-- GAME FRAME -->
<div id=gamediv class=header-body style="position:absolute; padding:10px 10px 0 10px; height:60px; left:0px; right:295px; top:45px; display:none; z-index:1; background-color:inherit; border:1px gray solid;">
</div
>

3. В скриптах чата jscripts.dat находим такой кусок кода:

/* Загружает викторину в верхушку чата */
var gameon=0;
function startgame(){
    if(gameon==0){
    gameframe.location.href='http://'+engine_host+':'+engine_port+'/?chat='+chatlogin;
    gameon=1; document.getElementById('gamediv').style.display="block";
  }
    else {
    gameframe.location.href='start.html';
    gameon=0; document.getElementById('gamediv').style.display="none";
    }
}

заменяем на новый код:

/* Загружает викторину в верхушку чата */
var gameon=0;
var gamews="";
function startgame() {
    if(gameon==0){
        if(!window.WebSocket) return false;
        gameon=1; document.getElementById('gamediv').style.display="block";
        document.getElementById('gamediv').innerHTML='Загрузка...';
        if(location.protocol=="https:") gamews = new WebSocket("wss://"+engine_host+":"+(engine_port+1)+"/?app=game&chat="+chatlogin+"&engine=WebSocket"); else
        gamews = new WebSocket("ws://"+engine_host+":"+engine_port+"/?app=game&chat="+chatlogin+"&engine=WebSocket");
        gamews.onmessage = function(e) {eval(e.data.replace(new RegExp('<scr'+'ipt>','gm'),'').replace(new RegExp('</scr'+'ipt>','gm'),''));};
    }
    else {
        gameon=0; document.getElementById('gamediv').style.display="none";
        if(gamews) {gamews.close(); gamews="";}
    }
}
function setgame(sec,word,ask) {
    if(ask) document.getElementById('gamediv').innerHTML='<div id=gameword></div><a href=? onclick="alert(\'Чтобы ответить на вопрос вы должны в течении указанного времени ввести предполагаемое слово или фразу в поле ввода чата поставив перед ним знак процента!  (Например:%ответ) Не забудьте включить транслит, если у вас нет русских букв! Рейтинг викторины находится в Топ100 участников. Более 100 000 вопросов не дадут вам скучать.\'); return false;">[?]</a> <font size=2 face=Verdana>'+ask+'</font>';
    var obj=document.getElementById('gameword'); if(!obj) return;
    var sym=''; var html='<table border=1><tr>';
    for(i=0;i<word.length;i++){
        sym=word.substr(i,1); if(sym==' ') sym='&nbsp;';
        html+='<td>'+sym+'</td>';
    }
    obj.innerHTML=html+'<td style=color:red>'+sec+'</td></tr></table>';
}

4. Это действие только для выкупленных чатов, добавляем в файле write.php синее:

$check=0; if($txt) $check=(int)file_get_contents("http://$config[engine_host]:$config[engine_port]/?app=game&chat=$chat&word=".urlencode($txt)."&hash=$config[engine_hash]",false,stream_context_create($opt));

Если вы всё сделали правильно, то викторина будет работать.


Моя анкета на vmeste.eu
Если сообщение Вам помогло, отблагодарите участника повысив его репутацию!
PS. То, что нас не убивает, то делает нас сильнее!

Неактивен

#28 

Dimitry
Ниндзя по зачистке капусты
Имя: Дмитрий
Откуда: Германия
Зарегистрирован: 2003-04-18
Сообщений: 18212
На форуме: 1724 час.
Репутация: 1220 (99%) ±
Инфо  Вебсайт  Написать

Изменение тарифов и условий для чатов
Тарифы: http://mpchat.com/?to=money
Условия: http://mpchat.com/?to=recom

Что стало лучше:
1. Для чатов тарифа стандарт увеличен предел регистраций до 5000.
2. Выделяемое место для тарифа стандарт теперь вне зависимости от активности и уровня чата всегда 300мб. (ранее от 50-300)
3. Появилась удобная смена тарифа на странице заказов, с автоматическим пересчетом даты окончания продления.
4. Больше нет требования содержать чат в активном состоянии, это не на что не влияет. Но появилось общее требование оплачивать чат.
5. Отменен платёж за активацию чата. Теперь новые чаты получают 7 дней для теста, а затем можно продлить чат по любому из тарифов.

Что стало хуже:
1. Тариф Стандарт больше не является бесплатным, его стоимость теперь составляет 1 евро в месяц.
2. Мы больше не реагируем на жалобы из-за рекламных ссылок любых других чатов, каждый чат может и должен сам справляться с рекламным спамом используя различные методы блокировок. Связано это с тем, что обычно сами админы лишь косвенно виновны в распространении рекламы их чата и поэтому они не могут быть наказаны.

Что со старыми чатами?
Чтобы сделать переход для старых чатов более плавным, на данный момент действует временная отсрочка при которой старые чаты продолжают работать по старым условиям. Учтите что это условие сохранится не долго и рано или поздно придётся всем оплачивать чаты, поэтому рекомендуется зарание задуматься об оплате.


Моя анкета на vmeste.eu
Если сообщение Вам помогло, отблагодарите участника повысив его репутацию!
PS. То, что нас не убивает, то делает нас сильнее!

Неактивен

#29 

Dimitry
Ниндзя по зачистке капусты
Имя: Дмитрий
Откуда: Германия
Зарегистрирован: 2003-04-18
Сообщений: 18212
На форуме: 1724 час.
Репутация: 1220 (99%) ±
Инфо  Вебсайт  Написать

Переход сервиса чатов на PHP 7.0

Работы по переходу удачно завершены, в процессе работ чаты продолжали работать.
Если вы обнаружите какие либо проблемы или ошибки, напишите в тему Bugs - ошибки.


Выкупленным чатам

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

1. В файле ini.php найдём в 2х разных строчках
$$nvars[$i]
заменим на
${$nvars[$i]}

2. В functions.php обновим полностью 2 функции:
function db_connect() и function output()

3. После функции db_connect() добавим новую функцию mysqli_result, она есть тут:
https://wiki.vmeste.eu/?page=88

4. Выполнить автозамену используя скрпит указанный в конце информации.
Для выполнения автозамены нужно раскомментировать одну строку.
https://wiki.vmeste.eu/?page=88

5. Переключаем на PHP7.0 в панели хостинга и тестируем чат.

PS> Если кто-то планирует обновляться полностью, то лучше дождаться первой версии Mpchat CMS, чат с уклоном на CMS систему. (ориентировочно 2017г)


Моя анкета на vmeste.eu
Если сообщение Вам помогло, отблагодарите участника повысив его репутацию!
PS. То, что нас не убивает, то делает нас сильнее!

Неактивен

#30 

Dimitry
Ниндзя по зачистке капусты
Имя: Дмитрий
Откуда: Германия
Зарегистрирован: 2003-04-18
Сообщений: 18212
На форуме: 1724 час.
Репутация: 1220 (99%) ±
Инфо  Вебсайт  Написать

Изменения в сервисе с целью перехода на Mpchat CMS 6 версию сервиса для совместимости

Около года назад были разработаны некоторые отдельные части системы, но по сей день они не интегрированы в сервис.
Чтобы поставить точку в старых разработках, я решил всё таки доделать и вставить данные новшества, обозвав новую версию Mpchat CMS v6.

ВНИМАНИЕ!  До исчезновения этой надписи, данная информация будет дополняться новыми изменениями.
Из-за большого кол-ва изменений для обновления выкупленного чата лучше заменять все PHP скрипты, а потом добавить свои правки.
Сейчас производится тестирование Альфа версии для новых чатов, старые чаты могут попробовать обновить все шаблоны. (без гарантий)
Последнее изменение: 10.12.2016


Особенности новой версии системы Mpchat CMS 6
- общий шаблонизатор для inc файлов putinclude() и компоненты CMS шаблонов
- добавлена переменная %loadtime% для всех шаблонов
- добавлена вставка переменных шаблонов (title|keys|description|...)
- новая динамическая система комментариев с MySQL (которая будет использоваться везде)
- api.js - базовый JS модуль для системы CMS (подключает JSLib.js мини аналог jQuery), содержит функции авторизации и комментариев
- общая динамическая система авторизации через Cookie (гостем или пользователем)
- легкий ключ (i_aidn) теперь генерируется через api.js и хранится в Cookie
- вход в чат теперь возможен просто перейдя по ссылке, вводить данные или использовать <form> больше ненужно
- используется корень системы в качестве базы для API <base href="./">
- Загружено за теперь ссумирует время информера и время шаблонного скрипта
- ошибки теперь выводятся в редактируемый шаблон error.inc
- зарезервирована переменная $r для выдачи API запросов или возврата в функциях
- вырезана возможность перехода на UTF-8 (давно все перешли)
- зарезервирована переменная $cfg массив в котором теперь хранятся все настройки
- изменены все участки кода работы с settings.sys, теперь для этого есть функция getconfig() и setconfig()
- новый файл настроек config.sys будет в формате json  (старый settings.sys был в текстовом)
- настройки анкеты теперь принимают input поле type=color, таким образом можно удобно выбирать цвет средствами браузера
- движок теперь не проверяет IP адрес по умолчанию, но можно настроить проверку IP провайдера, или как раньше жёскую проверку (не рекомендуется)
- движок теперь поддерживает Websocket соединения на стандартном порту 443 (тестируется), ajax планируется удалить совсем, если упадёт спрос!
- сервис больше не даёт выбор движка пользователю, даже в мобильной версии, поэтому необходимо исправить функцию loadframes() в mobile.inc
- галочка запомнить ник больше не нужна, запоминание через COOKIE активно всегда, поэтому вход одновременно несколькими никами больше не возможен, для второго ника нужно открыть другой браузер
- все скрипты более не нуждаются в параметрах сессий id и sess и переменных $sess, $id, %id% и %myid%, можно удалять из шаблонов и ссылок везде кроме скриптов jscripts.dat (там myid нужен для движка), а также определитель старой авторизации в informer.php, gb.inc, forum.inc, gallery.inc
- параметр engrus_on теперь включен всегда, т.е. совместное использование латиницы и кирилицы запрещено для всех


Шаблоны
index.inc - в шаблон добавлены вставки header и body, а также вставлено содержимое из файла index.html (удалён) вместо %include%
feedback.inc - в шаблон добавлены вставки header и body
top100.inc - в шаблон добавлены вставки header и body
search.inc - в шаблон добавлены вставки header и body
who.inc - в шаблон добавлены вставки header и body
reg.inc - в шаблон добавлены вставки header и body
mail.inc - в шаблон добавлены вставки header и body
gb.inc - шаблон гостевой полностью переписан с header и body и использованием новой библиотеки api.js с поддержкой новой системы комментариев и динамической авторизации (без перезагрузки страницы)
gallery.inc - шаблон галереи частично переписан с header и body и использованием новой библиотеки api.js с поддержкой новой системы комментариев и динамической авторизации (без перезагрузки страницы), кроме этого загрузка фото и ссылки на галереи теперь привязаны к ID пользователя
info.inc - в шаблон анкеты добавлен api.js и комментарии к анкете
error.inc - новый шаблон страницы ошибок, добавлены вставки header и body
exit.inc - новый шаблон страницы выхода из чата или выхода при бане, добавлены вставки header и body (переименован из exit.html)
prav.inc - новый шаблон страницы правил чата, добавлены вставки header и body (переименован из prav.html)
help.inc - новый шаблон страницы помощи чата, добавлены вставки header и body (переименован из help.html)

PHP файлы
informer.php - добавлена поддержка json и jsonp через json=1 и jsonp=varname соответственно, добавлены переменные авторизации
feedback.php - удалёна вставка JS переменных var mynick='$mpnick'; var myid='$id'; var xcode='';
top100.php - удалёна вставка JS переменных  var loadtime='$loadtime'; var mynick='$mpnick';\nvar myid='$id';\n
search.php - удалёна вставка JS переменных  var loadtime='$loadtime';
gb.php - СКРИПТ УСТАРЕЛ И БУДЕТ ПОЛНОСТЮ УДАЛЁН, а пока удалена вставка JS переменных  var loadtime='$loadtime';
reg.php - удалёна вставка JS переменных  var xcode='';
mail.php - удалёна вставка JS переменных var xcode='';
index_chat.php - СКРИПТ УДАЛЁН, функционал внедрён в ini.php


Изменения в скриптах и шаблонах чата для перехода на новую версию
(для чатов размещенных на сервисе  выполняются автоматически)

1. Переименовываем файл exit.html в exit.inc, а потом в скриптах чатов jscripts.dat и шаблоне чата chat.inc находим exit.html? и заменяем на ?inc=exit&
2. В шаблоне exit.inc заменим var nick=get['nick']; на var nick='%mynick%';
3. В шаблоне gallery.inc находим строку и заменяем 2 на 8.

info+="<a href=?inc=gallery&gallery="+x[2]+">"+x[2]+"</a>";

а также находим строку и заменяем 0 на 2

for(var i=0;i<g_g.length;i++) wr("<a href='?inc=gallery&gallery="+g_g[i][0]+"'>"+g_g[i][0]+"("+g_g[i][1]+")</a> ");

а также чуть ниже найдём похожую строку и добавим синее:

if(gallery) wr("<b>"+galleryname+"</b><br><br>");

ещё ниже найдём строку и заменим mynick на myuserid:

if(mynick) wr("<b>"+mynick+"</b> (<a href=?inc=gallery&gallery="+mynick+">моя галерея</a>)");

4. В шаблоне info.inc найдём gallery=%nick% и заменим на gallery=%userid%


Моя анкета на vmeste.eu
Если сообщение Вам помогло, отблагодарите участника повысив его репутацию!
PS. То, что нас не убивает, то делает нас сильнее!

Неактивен

#31 

Dimitry
Ниндзя по зачистке капусты
Имя: Дмитрий
Откуда: Германия
Зарегистрирован: 2003-04-18
Сообщений: 18212
На форуме: 1724 час.
Репутация: 1220 (99%) ±
Инфо  Вебсайт  Написать

Ускоренная загрузка чата и отключение AJAX движка

Технология WebSocket есть практически в каждом браузере, её популярность достигает 98% и постоянно растёт, в связи с этим пришло время отказаться от комплексного решения с использованием  старого AJAX движка. Движок вскоре будет удалён из системы, а поэтому рекомендуется привести в порядок скрипты чата. Кроме этого были произведены изменения по ускорению загрузки чата с медленным интернетом.

Что будет если не сделать это обновление?

В случае если вы не сделаете это обновление, после полного отключения движка AJAX, примерно у 3% пользователей чат не будет загружаться вообще, а также чат не будет загружаться достаточно быстро на медленном интернете.

Обновление

На всякий случай, перед обновлением, сохраните ваши скрипты чата на ПК.

1. Откроем шаблон чат внутри chat.inc и найдя тег body удалим в нем красное:

<body class=chat-body style="margin:0px; padding:0px; overflow:hidden;" onload="document.fmsg.text0.focus(); loadframes();">

(красное удалено автоматически для всех чатов на сервисе)
-----------

2. Ваш чат перестал загружаться как следует, не пугайтесь! Так и должно быть, проведя изменения в этом шаге, всё опять заработает.
Открываем скрипты чата jscripts.dat и идём в самый низ, будьте внимательны, удалите красное, обновите синее и добавьте новый зеленый код.

/* Подготовка таблицы никлиста */
    uc = 0;
    us = new Array();
    ucc= new Array();
    document.getElementById('users').innerHTML=userlist;
    /* Проверка непрерывного соединения */
    interval=window.setTimeout('wr("<font color=red>Не удалось подключиться к движку чата.<br>Попробуйте использовать новый современный браузер <a href=https://www.google.com/chrome target=_blank>Google Chrome</a>.</font>");',10000);

    /* Загрузка движка сообщений */
    document.getElementById("leftdiv").innerHTML='Загрузка ...';
    loadengine();
}
var interval=window.setTimeout('wr("<font color=red>Чат не был загружен в установленное время, вероятно некоторые элементы страницы грузятся очень долго, <a href=# onclick=\'loadframes(); return false;\'>нажмите для продолжения</a> ...</font>");',10000);

/* [NEW ENGINES - обработка и функции новых движков] */
var engine="";
var engine_url="";
var engine_uri="";

/* Обработчик ошибок подключения */
function disconnect(type,error) {
    if(type=="io") {wr("<font color=red>Ошибка подключения к серверу "+error+", подождите окончания загрузки ...</font>"); }
    else if(type=="security") {return; wr("<font color=red>Ошибка безопасности при подключении к серверу "+error+", подождите окончания загрузки ...</font>"); }
    else if(!interval) {
        wr("<font color=red>По какой то причине Вы были отключены от сервера, переподключение через <b id=restarter>10</b> секунд ...</font>");
        interval=window.setInterval("var obj=document.getElementById('restarter'); obj.innerHTML=obj.innerHTML-1; if(obj.innerHTML<=0) loadframes();",1000);
    }
}

/* Анализ полученной строки и передача в функцию f() */
function r(msg) {
    if(msg=="started") {document.getElementById("leftdiv").innerHTML=""; return;}
    if(msg=="loaded") {up(); loaded=1; return;}
    if(msg=="disconnected") {if(ajaxon) window.clearInterval(ajaxon); disconnect(); return;}
    var a=msg.split('|');
    f(a[0]*1,a[1]*1,a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],a[12],a[13],a[14],a[15]);
}

/* Обработчик AJAX подключений */
var ajaxon=0;
var ajaxreq=0;
function ajax(url,post) {
    if(!XMLHttpRequest) {alert("Ваш браузер не поддерживает технологию Ajax, попробуйте обновить браузер!"); return false;}
    var http = new XMLHttpRequest();
    //IE8+ Crossdomain fix
    var XDR=0; if(!engine_path && window.XDomainRequest) {http = new XDomainRequest();XDR=1;}
    //check run and get request
    if(!url) url=engine_url+"&r="+Math.random();
    if(ajaxreq) return; ajaxreq=1;
  http.open('GET', url, true);
    var response = function() {
        if(http.readyState && http.readyState != 4) return;
        var msg=http.responseText;
        eval(msg.replace(new RegExp('<scr'+'ipt>','gm'),'').replace(new RegExp('</scr'+'ipt>','gm'),''));
        ajaxreq=0;
    }
    if(XDR) http.onload = response;
    else http.onreadystatechange = response;   
    http.send(post);
}


/* Определение и загрузка движков чата */
var ws="";
function loadengine() {
    //fix for reconnect
    if(ws) ws.onclose = function(e) {};
    if(ajaxon) window.clearInterval(ajaxon);
    //load new engine
    var browser=navigator.userAgent.match(/(Chrome|Firefox|Opera|Safari|MSIE|K-Meleon)( |\/)(\w+\.\w+)/i); if(!browser) var browser=new Array('','unknown','',0);
    if(!engine_on) {
        if(window.WebSocket) engine_on="WebSocket";
        else { wr("<font color=red>Ваш браузер не поддерживает технологию WebSocket.<br>Попробуйте использовать новый современный браузер <a href=https://www.google.com/chrome target=_blank>Google Chrome</a>.</font>"); return; }
    }
   
    wr("<font color=green>Браузер <b>"+browser[1]+"/"+browser[3]+"</b>, движок <b>"+engine_on+"</b>, подключение ...</font>");
    engine=engine_on;
    engine_uri="/?chat="+chatlogin+"&sess="+myid+"&engine="+engine;
    engine_url="http://"+engine_host+":"+engine_port+engine_uri;
    if(engine=="WebSocket") {
        if(location.protocol=="https:") ws = new WebSocket("wss://"+engine_host+":"+(engine_port+1)+engine_uri); else
        ws = new WebSocket("ws://"+engine_host+":"+engine_port+engine_uri);
        ws.onopen = function(e) {};
        ws.onmessage = function(e) {eval(e.data.replace(new RegExp('<scr'+'ipt>','gm'),'').replace(new RegExp('</scr'+'ipt>','gm'),''));};
        ws.onerror = function(e) {disconnect("io","websocket");};
        ws.onclose = function(e) {window.setTimeout("disconnect();",1000);};
    }
    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);
    }

}

/* Загрузка чата сразу после загрузки HTML */
if(document.addEventListener) document.addEventListener('DOMContentLoaded', loadframes, false);
else if(document.attachEvent) document.attachEvent('onreadystatechange', loadframes);

(зеленое добавлено автоматически для всех чатов на сервисе)
-----------

3. Теперь открываем шаблон мобильной версии mobile.inc и повторяем шаги 1 и 2. (всё в одном шаблоне)
Также следует убрать выбор движка который находится почти в самом низу шаблона, просто удаляем этот ненужный код:

Движок<br>
<select name=engine_on style="width:140px;">
<option value="">непрерывный</option>
<option value="ajax">AJAX движок</option>
</select><br>

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


Моя анкета на vmeste.eu
Если сообщение Вам помогло, отблагодарите участника повысив его репутацию!
PS. То, что нас не убивает, то делает нас сильнее!

Неактивен

#32 

Dimitry
Ниндзя по зачистке капусты
Имя: Дмитрий
Откуда: Германия
Зарегистрирован: 2003-04-18
Сообщений: 18212
На форуме: 1724 час.
Репутация: 1220 (99%) ±
Инфо  Вебсайт  Написать

Переход на SSL https, отказ от Flash технологии и полезные советы

Переход на SSL - завершен

Для всех субдоменов mpchat.com был куплен SSL сертификат, SSL уже работает.
С сегодняшнего дня, все чаты работающие на бесплтаных доменах mpchat автоматически перенаправляются на https соединение на поддомен вида https://chat.mpchat.com Чаты у которых свой собственный домен, могут активировать в параметрах SSL для всех доменов и поставить галочку - перенаправлять всех на главный домен с https. Кроме этого, для очень старых чатов с использованием irc2.html автоматически исправлена загрузка через SSL. Теперь эти чаты также работают. Проверьте работу вашего чата, а также ссылки в админ панели.

Конец для flash - эпилог

Как уже и так многие вкурсе, флеш уже давно не жилец, если он и работает у 30% посетителей, то не всегда и не все скрипты.
В связи с этим мы перешли только на HTML5 технологии, и теперь можно избавиться от Flash полностью.
Всем кто использует где либо флеш в своих чатах рекомендуется его заменить на HTML5 решения.
Чуть подробнее про смерть flash тут: https://hi-tech.mail.ru/news/adobe-zakroet-flash/

Зачистка Flash

Старый сервер вебкамер работающий через Flash уже отключен.

Все сервисные ненужные флеш файлы удалены из системы:
mpchat.com/blank/player.swf
mpchat.com/blank/color.swf
mpchat.com/blank/webcam.swf
mpchat.com/blank/expressInstall.swf

Если кто-то начнёт чудить и всё таки захочет использовать эти ненужные файлы, их можно скачать с архива по ссылке.
http://imgs.su/users/1/1501584330.zip

Перестали работать звуки от Pegass или другие звуки на базе flash player.swf?

Замените в коде строчку:

document.getElementById("Sound").innerHTML="<embed type='application/x-shockwave-flash' src='https://mpchat.com/blank/player.swf'  allowfullscreen='false' flashvars='file="+sound+"&autostart=true' width='0' height='0'>";

на эту

document.getElementById("Sound").innerHTML="<audio src='"+sound+"' autoplay>";

Если у вас другая строка, заменяйте тег embed или object по аналогии на audio.
Искать и удалять флеш файлы в коде можно по слову .swf.

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

- больше не используйте flash скрипты в чатах
- все стили, картинки и прочие элементы старайтесь загружать только в чат
- используйте по возможности короткие URL адреса всегда без домена, например: "img/fon.jpg", "styles/style.css", "js/script.js", "?inc=forum"
- если необходимо использовать полный URL адрес с чужим доменом, старайтесь указывать его с https:// (если поддерживает)

У вас не загружается чат?

Если ваш чат после данных обновлений перестал загружаться, и вы не можете в этом никак разобраться, можно просто восставноить стандартные скрипты и шаблон внутри чата. Если же вы не хотите этого делать, напишите мне лично, я постараюсь помочь в решении критических проблем с загрузкой чата!!!
(в зависимости от объёма работы, бесплатно или платно)


Моя анкета на vmeste.eu
Если сообщение Вам помогло, отблагодарите участника повысив его репутацию!
PS. То, что нас не убивает, то делает нас сильнее!

Неактивен

#33 

Dimitry
Ниндзя по зачистке капусты
Имя: Дмитрий
Откуда: Германия
Зарегистрирован: 2003-04-18
Сообщений: 18212
На форуме: 1724 час.
Репутация: 1220 (99%) ±
Инфо  Вебсайт  Написать

Вебкамеры v2.1 через новую HTML5 WebRTC технологию (без flash) и переход на защищенное SSL соединение

Обновление доработано (необходимо повторить)
- вебкамеры теперь отображаются в виде окон
- добавлена возможность вывода сообщения: Смотрю вашу вебкамеру.
- добавлено правильное закрытие просмотра вебкамер для разных случаев
- добавлено описание простой установки модальных вебкамер от Pegass поверх стандарта (пункт 4)


Новые вебкамеры несколько месяцев будут доступны на всех тарифах, включая тариф Стандарт.
Побробнее о новой вверсии в этой теме: https://forum.vmeste.eu/viewtopic.php?id=17997

Установка

Замена стандартного кода проходит очень просто:

1. В скриптах чата jscripts.dat находим Разрешение на приватный просмотр и добавляем 2 синие строчки:

/* Разрешение на приватный просмотр вебкамеры */
    if(webcam && cmd==1) {
        if(text.indexOf("nocam")!=-1) text=text.replace("nocam","Просмотр не разрешен.");
        if(text.indexOf("yescam")!=-1) {var key=text.split("yescam"); text=text.replace("yescam"+key[1],"Просмотр разрешен."); if(tonick==mynick) text+=" (<a href=# onclick='loadvideo(\"webcam"+nick+"\",\""+webcamhost+"\",\""+nick+"\",0,\""+key[1]+"\"); return false;'>Начать просмотр</a>)";}
        if(text.indexOf("privatcam")!=-1) {text=text.replace("privatcam","Прошу разрешить просмотр вещания."); if(tonick==mynick) text+=" (<a href=# onclick='window.hidden.location.href = \"index.php?inc=write&r="+Math.random()+"&text=/privat "+nick+": yescam\"+privatcamkey;return false;'>Да</a> | <a href=# onclick='window.hidden.location.href = \"index.php?inc=write&r="+Math.random()+"&text=/privat "+nick+": nocam\";return false;'>Нет</a>)";}
        if(text.indexOf("iseeyourcam")!=-1) text = text.replace("iseeyourcam","Смотрю вашу трансляцию.</i>");
    }
    if(cmd==7 || cmd==8 || cmd==10) loadvideo("webcam"+nick,"",nick);

-----------------

2. Далее в скрпитах чата jscripts.dat выберите  в поле быстрого перехода "Функции - нижнего фрейма" и прокрутите вниз до блока /* Функция включения и выключения вебкамер */  Затем замените найденный блок целиком на нижеуказанный:

/* Функция включения и выключения вебкамер */
document.write("<scr"+"ipt src=https://myradio24.com/player/webcam.js?"+Math.random()+"></scr"+"ipt>");
function loadvideo(obj,host,nick,rec,key) {
    var sharekey=""; if(nick) sharekey=nick; if(key) sharekey+="_"+key;
    var nickid=0; for(var i=0; i<sharekey.length; i++) nickid+=sharekey.charCodeAt(i)*(i+1);
    var camid="mpchat-"+chatlogin+"_"+nickid;
    var obj1=document.getElementById(obj);
    if(!obj1) {
        var obj1=document.createElement('DIV'); obj1.id=obj;
        document.getElementById("cams").appendChild(obj1);
    }   
    //destroy always
    if(window['class_'+obj]) window['class_'+obj].clickDestroy('class_'+obj);
    if(host=="") {obj1.innerHTML="&nbsp;"; obj1.style.display="none"; return;}   
    //broadcast
    if(rec) {       
        obj1.style.width="240px";
        obj1.innerHTML="<div style='background:#f3f3f3; padding:7px; text-align:left; font:bold 11px Verdana;'>Моя Камера <a href=# onclick='gettime=new Date().getTime(); setstatus(0); return false;' style='display:block; float:right; font-size:11px;'>закрыть</a></div> <div id=media_"+obj+" style='position:relative;'></div><br>";
        window['class_'+obj]=new WebCam(camid,nick,"vga","media_"+obj,0,"100%");
    }
    //watch
    else {
        window.hidden.location.href = "index.php?inc=write&text=/privat "+nick+": iseeyourcam";
        obj1.style.width="240px";
        obj1.innerHTML="<div style='background:#f3f3f3; padding:7px; text-align:left; font:bold 11px Verdana;'>"+nick+" <a href=# onclick='loadvideo(\""+obj+"\",\"\"); return false;' style='display:block; float:right; font-size:11px;'>закрыть</a></div> <div id=media_"+obj+" style='position:relative;'></div><br>";
        window['class_'+obj]=new WebCam(camid,nick,"vga",0,"media_"+obj,"100%");
    }
    obj1.style.display="block";
}

-----------------

3. Также для правильной работы рекомендуется настроить работу чата через https/SSL защищенное соединение.
Чаты на бесплатном домене вида chat.mpchat.com автоматически перенаправляются на адрес с SSL вида https://chat.mpchat.com/
Чаты тарифа профи могут в параметрах по ссылке  активации для своего домена Активировать SSL сертификат.
Чаты тарифа владелец, при использовании панели Webserv24, могут просто в настройках своего домена активировать Бесплатный SSL сертификат letsencrypt.
Если вы используете свой купленный домен, то РЕКОМЕНДУЕТСЯ в параметрах поставить галочку - перенаправлять всех на главный домен чата с https.
Если вы не хотите ставить эту галочку, то можно в титульник чата где вход, добавить JS скрипт перенаправления на https:

<script>if(location.protocol != 'https:') location.href=location.href.replace("http://","https://");</script>

-----------------

4. При желании ставим эксклюзивное решение вебкамер от пользователя Pegass.
ВАЖНО!!! Если у вас старое решение от Pegass, то необходимо удалить все строки из скриптов jscripts.dat где есть слово "close_webcam". Также нужно удалить все старые скрипты и стили js/css из шаблона чата chat.inc. (искать по слову "webcam")

Установка очень проста, создаем папку в корне чата pegass_webcam и закачиваем в неё 3 файла из архива https://files.radiofull.ru/files/pegass_webcam.zip
Затем просто в шаблон чата chat.inc после кода скриптов:

добавляем эти строки:

Готово!
Изменить ширину камер по умолчанию можно в самом низу pegass_webcam.js файла найдя width: 200


Моя анкета на vmeste.eu
Если сообщение Вам помогло, отблагодарите участника повысив его репутацию!
PS. То, что нас не убивает, то делает нас сильнее!

Неактивен

[ Generated in 0.011 seconds, 11 queries]