2023-01-10 16:29:32 +00:00
// Переменные голосовух
2023-06-11 11:50:52 +00:00
let mediaRecorder ;
let setIntervalSound ;
let timerSecMessage = 0 ;
let flagVoice = false ;
const chunksVoice = [ ] ;
Element . prototype . remove = function ( ) {
this . parentElement . removeChild ( this ) ;
2022-06-06 21:30:34 +00:00
}
2023-06-11 11:50:52 +00:00
NodeList . prototype . remove = HTMLCollection . prototype . remove = function ( ) {
let i = 0 , len = this . length ;
for ( ; i < len ; i ++ ) {
if ( this [ i ] && this [ i ] . parentElement ) {
this [ i ] . parentElement . removeChild ( this [ i ] ) ;
}
}
2022-06-06 21:30:34 +00:00
}
2023-06-11 11:50:52 +00:00
const chat = {
key : '' ,
room : '' ,
count : 0 ,
time : 0 ,
t : null , //timer
t2 : null , //timer 2
t _all : { } , //time molch
r : 0 ,
g : 0 ,
rtime : 37 ,
ct : { '-1' : 0 , '1' : 15 , '2' : 30 , '3' : 60 , '4' : 300 } ,
saveData : null ,
msg _id : 0 ,
nrg : 0 ,
nozpros : 0 ,
newmsg : 0 ,
sound : 0 ,
translit : 0 ,
filter : 0 ,
globalMsg : 0 ,
ignoreList : { x : 0 , nms : [ ] } ,
citySys : 0 ,
inObj : null ,
userSendMessage : false ,
efftxt : function ( id , txt ) {
return txt ;
} ,
ignore : function ( login ) {
if ( this . ignoreList [ login ] !== undefined ) {
if ( $ ( '#ignr_alu' ) . attr ( 'id' ) !== undefined ) {
$ ( ` #ignr_u_ ${ this . ignoreList [ login ] } ` ) . remove ( ) ;
}
delete this . ignoreList . nms [ this . ignoreList [ login ] ] ;
delete this . ignoreList [ login ] ;
return
//msg
}
this . ignoreList . x ++ ;
this . ignoreList [ login ] = this . ignoreList . x ;
this . ignoreList . nms [ this . ignoreList . x ] = login ;
let ingr _alu = $ ( '#ignr_alu' )
if ( ingr _alu . attr ( 'id' ) !== undefined ) {
ingr _alu . html ( ` ${ ingr _alu . html ( ) } <div id="ignr_u_ ${ this . ignoreList . x } "><b> ${ login } </b> <a target="_blank" href="/info/ ${ login } "><img alt="Инф. о ${ login } " src=" ${ c . img2 } /i/inf_capitalcity.gif" onMouseOver="top.hi(this, \' <b>Инф. о ${ login } </b> \' ,event,5,-2,2,2, \' \' );" onMouseOut="top.hic();" onMouseDown="top.hic();"></a> <small><a href="javascript:void(0)" onclick="chat.ignorUn( ${ this . ignoreList . x } )">Clear</a></small></div> ` ) ;
}
} ,
getRandom : function ( a , b ) {
return a + ( ( b - a ) * Math . random ( ) ) ;
} ,
feerverk _id : 0 ,
feerverk : function ( name ) {
const frc = {
'name' : 'fw04' ,
'x' : 19 ,
'top' : this . getRandom ( 1 , 35 ) ,
'left' : this . getRandom ( 0 , 365 ) ,
'width' : 135 ,
'sound' : this . getRandom ( 8 , 10 ) ,
'height' : 99 ,
'zad' : 3
} ;
if ( name === 'fw04' ) {
frc . left -= 35 ;
}
if ( frc . name !== undefined ) {
this . sendSound ( frc . sound ) ;
const obj = top . frames . main . document . getElementById ( 'frvrks' ) ;
if ( obj !== undefined ) {
let newhtml = '' ;
let i = 1 ;
while ( i <= frc . x ) {
newhtml += ` <img alt="" style="display:none" id="frvanim_ ${ this . feerverk _id } _img ${ i } " width=" ${ frc . width } " height=" ${ frc . height } " src=" ${ c . img2 } /fw/ ${ frc . name } / ${ i } .gif"> ` ;
i ++ ;
}
newhtml = ` <div id="frvanim_ ${ this . feerverk _id } " style="z-index:5000;position:absolute;width: ${ frc . width } px;height: ${ frc . height } px;left: ${ frc . left } px;top: ${ frc . top } px;"> ${ newhtml } </div> ` ;
$ ( obj ) . append ( newhtml ) ;
this . feerverk _go ( this . feerverk _id , frc . x - 1 , frc . name , frc . x , frc . zad ) ;
this . feerverk _id ++ ;
}
}
} ,
feerverk _go : function ( id , time _back , img , x , zad ) {
if ( zad > 0 ) {
setTimeout ( ` chat.feerverk_go( ${ id } , ${ time _back } , " ${ img } ", ${ x } , 0); ` , 500 * zad ) ;
} else {
time _back -- ;
top . frames . main . document . getElementById ( ` frvanim_ ${ id } ` ) ;
if ( time _back > 0 ) {
const img1 = top . frames . main . document . getElementById ( ` frvanim_ ${ id } _img ${ ( x - time _back + 1 ) } ` ) ; //текущая
if ( img1 !== undefined ) img1 . style . display = 'none' ;
const img2 = top . frames . main . document . getElementById ( ` frvanim_ ${ id } _img ${ ( x - time _back + 2 ) } ` ) ; //текущая
if ( img2 !== undefined ) img2 . style . display = '' ;
setTimeout ( ` chat.feerverk_go( ${ id } , ${ time _back } , " ${ img } ", ${ x } , 0); ` , 50 ) ;
} else top . frames . main . document . getElementById ( ` frvanim_ ${ id } ` ) . remove ( ) ;
}
} ,
ignorUn : function ( x ) {
$ ( ` #ignr_u_ ${ x } ` ) . remove ( ) ;
this . ignore ( this . ignoreList . nms [ x ] ) ;
} ,
ignorListOpen : function ( ) {
let date = '' ;
let j = 1 ;
while ( j <= this . ignoreList . x ) {
if ( this . ignoreList [ this . ignoreList . nms [ j ] ] !== undefined ) {
date += ` <div id="ignr_u_ ${ j } "> <b> ${ this . ignoreList . nms [ j ] } </b> <a target="_blank" href="/info/ ${ this . ignoreList . nms [ j ] } "><img alt="Инф. о ${ this . ignoreList . nms [ j ] } " src=" ${ c . img2 } /i/inf_capitalcity.gif" onMouseOver="top.hi(this, \' <b>Инф. о ${ this . ignoreList . nms [ j ] } </b> \' ,event,5,-2,2,2, \' \' );" onMouseOut="top.hic();" onMouseDown="top.hic();"></a> <small><a href="javascript:void(0)" onclick="chat.ignorUn( ${ j } )">Clear</a></small></div> ` ;
}
j ++ ;
}
win . add ( 'ignorListWin' , 'Список игнорируемых' , ` <div id="ignr_alu"> ${ date } </div> ` , { } , 0 , 1 , 'min-width:200px;' ) ;
} ,
// смайлы
addSmile : function ( id ) {
let textmsg = $ ( '#textmsg' )
textmsg . val ( ` ${ textmsg . val ( ) } : ${ id } : ` ) ;
textmsg . focus ( ) ;
} ,
lookSmiles : function ( ) {
if ( $ ( '#chbtn8' ) . attr ( 'class' ) === 'db cp chatBtn8_1' ) {
return this . lookSmilesWork ( '' , 'chatBtn8_2' )
}
return this . lookSmilesWork ( 'none' , 'chatBtn8_1' )
} ,
lookSmilesWork : function ( display , className ) {
$ ( '#ttSmiles' ) . css ( 'display' , display ) ;
$ ( '#chbtn8' ) . attr ( 'class' , ` db cp ${ className } ` ) ;
} ,
// оптимизация всех кнопок
greyButton _work : function ( elemId , className , method , count ) {
$ ( elemId ) . attr ( 'class' , ` db cp ${ className } ` ) ;
this [ method ] = count ;
} ,
// кнопка лейки
// 1
filterMsg : function ( ) {
if ( $ ( '#chbtn1' ) . attr ( 'class' ) === 'db cp chatBtn1_1' ) {
return this . greyButton _work ( '#chbtn1' , 'chatBtn1_2' , "filter" , 1 )
}
return this . greyButton _work ( '#chbtn1' , 'chatBtn1_1' , "filter" , 0 )
} ,
// кнопка системных сообщений
// 2
systemMsg : function ( ) {
if ( $ ( '#chbtn4' ) . attr ( 'class' ) === 'db cp chatBtn4_1' ) {
this . greyButton _work ( '#chbtn4' , 'chatBtn4_2' , "citySys" , 1 )
$ . cookie ( 'citySys' , 1 ) ;
return
}
this . greyButton _work ( '#chbtn4' , 'chatBtn4_1' , "citySys" , 0 )
$ . cookie ( 'citySys' , 0 ) ;
} ,
// кнопка аудиосообщений
// 3
soundChat : function ( ) {
let chbtn7 = $ ( '#chbtn7' )
if ( chbtn7 . attr ( 'class' ) === 'db cp chatBtn7_1' ) {
return this . greyButton _work ( '#chbtn7' , 'chatBtn7_2' , "sound" , 1 )
} else if ( chbtn7 . attr ( 'class' ) === 'db cp chatBtn7_2' ) {
return this . greyButton _work ( '#chbtn7' , 'chatBtn7_3' , "sound" , 2 )
}
return this . greyButton _work ( '#chbtn7' , 'chatBtn7_1' , "sound" , 0 )
} ,
// кнопка транслита
// 4
translitChat : function ( ) {
if ( $ ( '#chbtn6' ) . attr ( 'class' ) === 'db cp chatBtn6_1' ) {
return this . greyButton _work ( '#chbtn6' , 'chatBtn6_2' , "translit" , 1 )
}
return this . greyButton _work ( '#chbtn6' , 'chatBtn6_1' , "translit" , 0 )
} ,
subValSend : '' ,
subSend : async function ( ) {
let textmsg = $ ( '#textmsg' )
if ( textmsg . val ( ) !== '' ) {
if ( textmsg . val ( ) !== this . subValSend ) {
if ( this . nozpros === 0 ) {
this . trmb ( ) ;
const textmsg = $ ( '#textmsg' ) . val ( ) ;
if ( cb _date [ cb _select ] === 7 && ( textmsg . match ( /to *\[(.*?)].*/i ) || textmsg . match ( /private *\[(.*?)].*/i ) ) ) {
for ( const cb in cb _date ) {
if ( cb _date [ cb ] === 5 ) {
open _cb ( cb , null ) ;
}
}
}
if ( typeof window . online _send _jqxhr === "undefined" || window . online _jqxhr . readyState === 4 ) {
window . online _send _jqxhr = $ . post ( 'online.php?r' + c . rnd + '&cas' + ( ( new Date ( ) . getTime ( ) ) + Math . random ( ) ) , {
msg : textmsg ,
key : this . key ,
mid : this . msg _id ,
rndo : c . rnd ,
cb : cb _date [ cb _select ]
} , function ( data ) {
chat . clearText ( ) ;
chat . fc ( ) ;
chat . genchatData ( data , 1 ) ;
chat . scrollNow ( true )
document . getElementById ( "textmsg" ) . value = ''
} ) ;
}
}
}
}
} ,
addto : function ( login , type2 ) {
let textmsg = $ ( '#textmsg' )
let inObjId = $ ( '#' + $ ( this . inObj ) . attr ( 'id' ) )
const loginaddT = login ;
let s = '' ;
if ( inObjId . attr ( 'id' ) === undefined ) {
textmsg . focus ( ) ;
s = textmsg . val ( ) ;
} else $ ( this . inObj ) . focus ( ) ;
const reg555 = new RegExp ( "private\\s*\\[(.*?)\\]" , "" ) ;
const reg551 = new RegExp ( "to\\s*\\[(.*?)\\]" , "" ) ;
const test1 = s . match ( reg555 ) ;
let type ;
if ( s . match ( reg555 ) == null ) {
type = "to" ;
} else if ( s . match ( reg551 ) == null ) {
type = "private" ;
}
let type3 = 'to' ;
const reg2 = new RegExp ( "" + type + "(\\s*)\\[(.*?)\\]" , "" ) ;
const cs = s . replace ( reg2 , "" + type + "$1[,$2,]" ) ;
const slogin = login . replace ( /([\^.*{}$%?\[\]+|\/\(\)])/g , "\\$1" ) ;
const reg = new RegExp ( "" + type + "\\s*\\[.*,\\s*" + slogin + "\\s*,.*\\]" , "" ) ;
let result = '' ;
const reg3 = new RegExp ( "" + type + "\\s*\\[(.*?)\\]" , "" ) ;
let res ;
while ( res = s . match ( reg3 ) ) {
result += ` ${ res [ 1 ] } , ` ;
s = s . replace ( reg3 , '' ) ;
}
result = result . replace ( /,$/ , '' ) ;
const prar = result . split ( ',' ) ;
for ( let i = 0 ; i < prar . length ; i ++ ) {
prar [ i ] = prar [ i ] . replace ( /^\s+/ , '' ) ;
prar [ i ] = prar [ i ] . replace ( /\s+$/ , '' ) ;
}
const str = prar . join ( ', ' ) ;
if ( str ) login += ', ' ;
let space = '' ;
if ( ! s . match ( /^\s+/ ) ) space = ' ' ;
const prob = '' ;
let main = $ ( '#main' )
if ( inObjId . attr ( 'id' ) === undefined && ( this . inObj == null || main . contents ( ) . find ( '#' + this . inObj . id ) . attr ( 'id' ) === undefined ) ) {
if ( ! cs . match ( reg ) ) {
if ( type2 === 'to' ) {
if ( test1 != null ) type2 = 'private' ;
}
if ( loginaddT === 'klan' && type2 === 'private' ) {
if ( login === 'klan, ' ) {
s = type2 + ' [klan] to [' + prob + '' + str + '' + prob + ']' + space + s ;
} else {
s = type2 + ' [klan]' + space + s ;
}
} else {
s = type2 + ' [' + prob + '' + login + str + '' + prob + ']' + space + s ;
}
} else {
if ( type3 === 'to' ) type3 = "private" ;
s = type3 + ' [' + prob + '' + str + '' + prob + ']' + space + s ;
}
} else s = login + str ;
if ( this . inObj != null && main . contents ( ) . find ( ` # ${ this . inObj . id } ` ) . attr ( 'id' ) !== undefined ) {
$ ( '#main' ) . contents ( ) . find ( ` # ${ this . inObj . id } ` ) . val ( s ) ;
} else if ( $ ( '#' + $ ( this . inObj ) . attr ( 'id' ) ) . attr ( 'id' ) === undefined ) {
$ ( '#textmsg' ) . val ( s ) ;
} else $ ( this . inObj ) . val ( s ) ;
} ,
clearText : function ( ) {
$ ( '#textmsg' ) . val ( '' ) ;
} ,
reflesh : function ( ) {
this . time = 0 ;
this . testTimer ( true ) ;
} ,
reMoney : function ( ) {
$ ( '#moneyGM' ) . html ( ` ${ c . money } кр. ` ) ;
} ,
testTimer : function ( n ) {
clearTimeout ( this . t ) ;
if ( $ . cookie ( 'btl' ) !== this . btl ) {
if ( $ . cookie ( 'btl' ) > 0 ) {
this . sendSound ( 2 ) ;
if ( top . frames [ 'main' ] . smnpty === undefined ) {
top . frames [ 'main' ] . location . href = "main.php" ;
}
}
this . btl = $ . cookie ( 'btl' ) ;
}
if ( this . rtime !== this . ct [ $ . cookie ( 'chatCfg0' ) ] && this . ct [ $ . cookie ( 'chatCfg0' ) ] !== undefined ) {
this . rtime = this . ct [ $ . cookie ( 'chatCfg0' ) ] ;
if ( this . time > this . rtime ) this . time = this . rtime ;
}
if ( this . rtime >= 5 || this . r === 0 ) //was >- 30 lakris fix
{
if ( this . time < 1 ) {
const aot = {
0 : 0 ,
1 : 1 ,
2 : 0
} ;
if ( $ ( '#chcf10' ) . attr ( 'checked' ) === true ) aot [ 2 ] = 1 ;
if ( $ ( '#autoRefOnline' ) . attr ( 'checked' ) === true || this . r === 0 || n !== false ) {
aot [ 0 ] = 1 ;
}
if ( this . nozpros === 0 && ( typeof window . online _jqxhr === "undefined" || window . online _jqxhr . readyState === 4 ) ) {
window . online _jqxhr = $ . getJSON ( ` online.php?r ${ c . rnd } &cas ${ ( ( new Date ( ) . getTime ( ) ) + Math . random ( ) ) } ` , {
key : this . key ,
mid : this . msg _id ,
r1 : aot [ 0 ] ,
r2 : aot [ 1 ] ,
r3 : aot [ 2 ] ,
rndo : c . rnd
} , function ( data ) {
if ( data . rnd != null ) {
chat . genchatData ( data ) ;
if ( data . key !== undefined ) chat . saveData = data ;
this . g ++ ;
c . rnd = data . rnd ;
}
} ) ;
}
this . time = 5 ;
this . r ++ ;
} else this . time -- ;
this . t = setTimeout ( 'chat.testTimer(false);clearTimeout(this.t);' , 1000 ) ;
}
} ,
gUser : function ( data , ol ) {
let rt = '' ;
function data _work ( count ) {
data [ count ] = data [ count ] . replaceAll ( "\\" , '\\\\' ) ;
data [ count ] = data [ count ] . replaceAll ( "[s1;]" , '"' ) ;
data [ count ] = data [ count ] . replaceAll ( "[s2;]" , '`' ) ;
data [ count ] = data [ count ] . replaceAll ( "[s3;]" , '' ) ;
data [ count ] = data [ count ] . replaceAll ( "[s4;]" , '' ) ;
data [ count ] = data [ count ] . replaceAll ( "<" , '' ) ;
data [ count ] = data [ count ] . replaceAll ( ">" , '' ) ;
}
if ( data [ 1 ] !== undefined ) {
rt = data [ 1 ] ;
if ( rt === 'Администратор' ) rt = this . efftxt ( 'fire' , rt ) ;
if ( ol === true ) {
rt = ` <a href="javascript:void(0)" onClick="chat.addto( \' ${ data [ 1 ] } \' , \' to \' )"> ${ rt } </a> ` ;
} else rt = ` <b> ${ rt } </b> ` ;
if ( data [ 13 ] !== 0 ) rt = ` <span class="uCss ${ data [ 13 ] } "> ${ rt } </span> ` ;
if ( data [ 10 ] > 0 ) {
rt = ` <s onmouseout="top.hic()" onmousedown="top.hic()" onmouseover="top.hi(this, \' Персонаж был заблокирован \' ,event,3,1,1,2, \' \' )"> ${ rt } </s> ` ;
}
if ( data [ 8 ] !== 0 ) data _work ( 8 )
else if ( data [ 9 ] !== 0 ) data _work ( 9 )
// тут
function rtData ( count ) {
return rt = ` <img alt="Склонность" height="15" src=" ${ c . img2 } /i/align/align ${ data [ count ] } .gif"> ${ rt } ` ;
}
if ( data [ 4 ] !== 0 ) {
rt = ` <a href="/clan/ ${ data [ 4 ] } " title=" ${ data [ 4 ] } " target="_blank"><img alt="Клан" width="24" height="15" src=" ${ c . img2 } /i/clan/ ${ data [ 4 ] } .gif"></a> ${ rt } ` ;
}
if ( data [ 16 ] > 0 ) rtData ( 16 )
rtData ( 3 )
if ( c . lvl > - 1 ) {
if ( c . city === data [ 6 ] ) {
if ( data [ 12 ] > 0 ) {
rt = ` <a href="javascript:void(0)" onClick="chat.addto( \' ${ data [ 1 ] } \' , \' private \' )"><img alt="Персонаж сражается" title="Персонаж сражается" src=" ${ c . img2 } /i/lock1.gif" width="20" height="15"></a> ${ rt } ` ;
} else {
rt = ` <a href="javascript:void(0)" onClick="chat.addto( \' ${ data [ 1 ] } \' , \' private \' )"><img alt="Приват" src=" ${ c . img2 } /i/lock.gif" width="20" height="15"></a> ${ rt } ` ;
}
} else {
rt = ` <img alt="Город" style="padding-right:3px;" onmouseout="top.hic()" onmousedown="top.hic()" onmouseover="top.hi(this, \' Персонаж сейчас в ${ data [ 6 ] } \' ,event,3,1,1,2, \' \' )" src=" ${ c . img2 } /i/city_ico/ ${ data [ 6 ] } .gif" width="17" height="15"> ${ rt } ` ;
}
}
rt += ` [ ${ data [ 2 ] } ]<a href=" ${ c . https } /info/ ${ data [ 0 ] } " target="_blank"><img alt="Инф. о ${ data [ 1 ] } " style="vertical-align:baseline" width="12" height="11" src=" ${ c . img2 } /i/inf_ ${ data [ 5 ] } .gif" title="Инф. о ${ data [ 1 ] } " /></a> ` ;
if ( data [ 11 ] > c . time ) {
rt += ` <img alt="Кляп" id="img_molch ${ data [ 1 ] } " width="24" height="15" style="cursor:help" src=" ${ c . img2 } /i/sleep2.gif" onmouseout="top.hic()" onmousedown="top.hic()" onmouseover="top.hi(this, \' Н а персонажа наложено заклятие молчания.<br>Будет молчать еще <span id=\\ \' molch ${ data [ 0 ] } \\ \' > ${ this . timeOut ( data [ 11 ] ) } </span> \' ,event,3,1,1,2, \' \' );chat.justRefMolch( ${ data [ 0 ] } )"> ` ;
this . addRefMolch ( data [ 0 ] , data [ 11 ] ) ;
}
if ( data [ 14 ] !== "" ) {
rt += ` <img alt="Травма" width="24" height="15" style="cursor:help" src=" ${ c . img2 } /i/travma2.gif" onmouseout="top.hic()" onmousedown="top.hic()" onmouseover="top.hi(this, \' У персонажа ${ data [ 14 ] } \' ,event,3,1,1,2, \' \' );"> ` ;
}
if ( data [ 13 ] > 0 ) {
if ( data [ 13 ] === 2 ) {
rt += ` <a target="main" href="/main.php?atak_user= ${ data [ 0 ] } " title="Кровавое нападение на ${ data [ 1 ] } "><img alt="" width="13" height="13" src=" ${ c . img2 } /i/clear.gif"></a> ` ;
} else {
rt += ` <a target="main" href="/main.php?atak_user= ${ data [ 0 ] } " title="Напасть на ${ data [ 1 ] } "><img alt="" width="13" height="13" src=" ${ c . img2 } /i/curse_attack.gif"></a> ` ;
}
}
if ( data [ 15 ] === 1 ) rt = ` <span class=woman > ${ rt } </span> `
} else rt = '<i>невидимка</i>[??]'
return rt ;
} , mlch : { } ,
justRefMolch : function ( id ) {
$ ( ` #molch ${ id } ` ) . html ( this . timeOut ( this . mlch [ id ] ) ) ;
} ,
addRefMolch : function ( id , tm ) {
this . t _all [ id ] = setTimeout ( ` chat.refMolch( ${ id } ) ` , 1000 ) ;
this . mlch [ id ] = tm ;
} ,
refMolch : function ( id ) {
clearTimeout ( this . t _all [ id ] ) ;
if ( this . mlch [ id ] > 0 ) {
$ ( ` #molch ${ id } ` ) . html ( this . timeOut ( this . mlch [ id ] ) ) ;
this . t _all [ id ] = setTimeout ( ` chat.refMolch( ${ id } ) ` , 1000 ) ;
return
}
$ ( ` #img_molch ${ id } ` ) . remove ( ) ;
return delete this . mlch [ id ] , this . t _all ;
} ,
fc : function ( ) {
$ ( '#textmsg' ) . focus ( ) ;
} ,
timeOut : function ( v ) {
let msPerDay = '' ;
let dt = new Date ( ) ;
dt . setTime ( ( v - c . time ) * 1000 ) ;
let m1 = dt . getUTCMonth ( ) ;
let d1 = dt . getUTCDay ( ) ;
let h1 = dt . getUTCHours ( ) ;
let min1 = dt . getUTCMinutes ( ) ;
let sec = dt . getUTCSeconds ( ) ;
if ( m1 > 0 ) msPerDay = ` ${ m1 } мес. ` ;
if ( d1 > 0 && Math . floor ( ( v - c . time ) / ( 60 * 60 * 24 ) ) === d1 ) msPerDay = ` ${ d1 } д. ` ;
if ( h1 > 0 ) msPerDay += ` ${ h1 } ч. ` ;
if ( min1 > 0 ) msPerDay += ` ${ min1 } мин. ` ;
if ( sec > 0 && msPerDay !== '' ) msPerDay += ` ${ sec } сек. ` ;
if ( msPerDay === '' ) msPerDay = 'меньше минуты.' ;
return msPerDay ;
} ,
deleteMessage : async function ( id , fc ) {
if ( fc === 1 ) top . msgdeleted ( id )
else {
$ ( ` #msg_ ${ id } ` ) . remove ( ) ;
$ ( ` #msg_ ${ id } _sys ` ) . remove ( ) ;
if ( c . admin > 0 ) {
await fetch ( ` online.php?jack= ${ c . rnd } &cas ${ ( ( new Date ( ) . getTime ( ) ) + Math . random ( ) ) } ` , {
method : "POST" ,
delMsg : id
} )
}
}
} ,
clear : function ( ) {
if ( $ ( '#textmsg' ) . val ( ) === '' ) {
if ( confirm ( 'Очистить окно чата?' ) ) {
if ( window . des === 1 ) {
$ ( ` #canal ${ cb _date [ cb _select ] } ` ) . html ( '' ) ;
$ ( '#textmsg' ) . focus ( ) ;
return
}
$ ( '#canal5' ) . html ( '' ) ;
$ ( '#textmsg' ) . focus ( ) ;
return
}
}
return $ ( '#textmsg' ) . val ( '' ) ;
} ,
scrollNow : function ( userTrue ) {
var $chat _list = document . getElementById ( "chat_list" )
var $countChatList = $chat _list . scrollHeight - $chat _list . scrollTop
if ( $countChatList < $chat _list . offsetHeight + 100 ) {
return $chat _list . scrollBy ( 0 , $chat _list . scrollHeight )
}
if ( userTrue ) return $chat _list . scrollBy ( 0 , $chat _list . scrollHeight )
} ,
msgcount : 0 ,
sendMsg : function ( data ) { //отсылка сообщения?
// Если системное сообщение от моба - длина массива == 10
// Иначе - длина массива == 17
// все data[] строчные!!!
// data[0] - какое-то число (или строка 'new')
// data[1] - видимо номер сообщения в чате за всё время
// data[2] - число 2, 3, 4, 6, 8, 21 или строка 'delete'
// data[3] - ник, если покрашенный (отправитель)
// data[4] - ник, если не покрашенный (получатель)
// data[5] - само сообщение в чате из инпута
// data[6] - цвет покраски ника. Если цвета нет - пустая строка
// data[7] - 0
// data[8] - 0
// data[9] - 0
// data[10] - 0
// data[11] - 0
// data[12] - 0 (что-то для админов)
// data[13] - время
// data[14] - полная дата
// data[15] - пустая строка
// data[16] - 0 (флаг невидимки)
let to ;
let to2 ;
let cls ;
let forYou ;
let msg _see = 1 ;
let global _type = 0 ;
if ( data [ 5 ] !== undefined && data [ 5 ] . substring ( 0 , 7 ) === 'global:' ) {
global _type = 1 ;
data [ 5 ] = data [ 5 ] . substring ( 7 ) ;
}
if ( data [ 0 ] === 'new' ) {
data [ 0 ] = ` new_msg_ ${ this . newmsg ++ } ` ;
}
if ( data [ 2 ] === 'delete' ) this . deleteMessage ( data [ 0 ] ) ;
else if ( data [ 'd' ] > 0 ) this . deleteMessage ( data [ 'd' ] ) ;
else if ( data [ 's' ] > 0 ) this . deleteMessage ( data [ 's' ] ) ;
else if (
data [ 0 ] !== undefined &&
( top . document . getElementById ( ` msg_ ${ data [ 0 ] } ` ) === undefined ||
top . document . getElementById ( ` msg_ ${ data [ 0 ] } ` ) === null )
// Без этой проверки на NULL не показывались сообщения!
) {
let msg = '' ;
if ( parseInt ( data [ 0 ] ) !== 0 ) {
if ( c . admin > 0 && parseInt ( data [ 12 ] ) === 1 ) {
msg += '<small style="color:red;text-decoration:blink"> <b>un</b>active </small>' ;
}
if ( data [ 3 ] !== '' ) {
let login = data [ 3 ] ;
if ( data [ 16 ] > 0 ) {
login = 'Невидимка' ;
}
msg += ` [<a href="javascript:void(0)" oncontextmenu="top.infoMenu( \' ${ login } \' ,event, \' chat \' ); return false;" onClick="chat.addto( \' ${ login } \' , \' to \' )"> ${ data [ 3 ] } </a>] ` ;
if ( chat . ignoreList [ data [ 3 ] ] !== undefined && chat . ignoreList [ data [ 3 ] ] !== null ) msg _see = 0 ;
}
if ( data [ 4 ] ) { //кому написали, разбор массива
let receiverList = [ ] ;
let i = 0 ;
let vl = '' ;
forYou = 0 ;
to = '' ;
to2 = '' ;
receiverList = data [ 4 ] . split ( ',' ) ;
while ( i !== - 1 ) {
if ( receiverList [ i ] !== undefined ) {
vl = this . trim ( receiverList [ i ] ) ;
if ( vl . toLowerCase ( ) === c . login . toLowerCase ( ) ) {
forYou ++ ;
}
if ( vl . toLowerCase ( ) === c . login . toLowerCase ( ) ) {
vl = this . trim ( data [ 3 ] ) ;
}
if ( i > 0 ) {
to += ', ' ;
to2 += ', ' ;
}
if ( data [ 3 ] !== '' ) {
to += ` <span style="cursor:pointer;" onclick="chat.addto( \' ${ vl } \' , \' private \' );" oncontextmenu="top.infoMenu( \' ${ this . trim ( receiverList [ i ] ) } \' ,event, \' chat \' ); return false;"> ${ this . trim ( receiverList [ i ] ) } </span> ` ;
if ( this . trim ( receiverList [ i ] . toLowerCase ( ) ) !== c . login . toLowerCase ( ) ) {
to2 += this . trim ( receiverList [ i ] ) ;
} else {
if ( data [ 2 ] === 2 ) to2 += this . trim ( receiverList [ i ] ) ;
else to2 += this . trim ( vl ) ;
}
}
} else i = - 2 ;
i ++ ;
}
if ( parseInt ( data [ 2 ] ) === 6 || parseInt ( data [ 2 ] ) === 8 ) {
let zmlogin = new RegExp ( "\\[login:(.*?)\\]" , "" ) ;
let reflcd = new RegExp ( "\\[reflesh_main_zv_priem:(.*?)\\]" , "" ) ;
if ( data [ 5 ] . match ( zmlogin ) != null ) {
zmlogin = data [ 5 ] . match ( zmlogin ) [ 1 ] ;
data [ 5 ] = data [ 5 ] . replace ( ` [login: ${ zmlogin } ] ` , ` <a onMouseDown="top.loginGo( \' ${ zmlogin } \' ,event);" oncontextmenu="top.infoMenu( \' ${ zmlogin } \' ,event, \' chat \' ); return false;" title=" ${ zmlogin } " style="cursor:pointer;" onClick="chat.multiAddto( \' ${ zmlogin } \' , \' to \' );"> ${ zmlogin } </a> ` ) ;
}
if ( data [ 5 ] . match ( reflcd ) != null ) {
reflcd = data [ 5 ] . match ( reflcd ) [ 1 ] ;
data [ 5 ] = data [ 5 ] . replace ( ` [reflesh_main_zv_priem: ${ reflcd } ] ` , '' ) ;
}
}
2022-12-19 18:26:14 +00:00
2023-06-11 11:49:06 +00:00
//Собираем массив кому адресовано сообщение
if ( parseInt ( data [ 2 ] ) === 6 ) {
//личная системка, внимание
msg += ' <span style="color:red">Внимание!</span> ' ;
} else if ( parseInt ( data [ 2 ] ) === 2 ) {
if ( forYou > 0 ) {
msg += ` <span style="color: ${ data [ 6 ] } "><b>to [ ${ to2 } ]</b></span> ` ;
} else {
msg += ` <span style="color: ${ data [ 6 ] } ">to [ ${ to2 } ]</span> ` ;
}
} else if ( parseInt ( data [ 2 ] ) === 3 ) {
if ( this . trim ( data [ 3 ] . toLowerCase ( ) ) === c . login . toLowerCase ( ) ) {
forYou ++ ;
}
if ( data [ 3 ] !== '' ) {
if ( data [ 4 ] === 'klan' && parseInt ( data [ 2 ] ) === 3 ) {
msg += ' <span class="klan"><span style="cursor:pointer" onclick="chat.multiaddto(\'klan\',\'private\');">private [klan]</span></span>' ;
} else {
msg += ` <span class="private"><span style="cursor:pointer" onclick="chat.multiaddto( \' ${ to2 } \' , \' private \' );">private [ </span> ${ to } <span style="cursor:pointer" onclick="chat.multiAddto( \' ${ to2 } \' , \' private \' );"> ]</span></span> ` ;
}
}
}
}
msg += ' ' ;
}
2022-12-19 18:26:14 +00:00
2023-06-11 11:50:52 +00:00
data [ 5 ] = data [ 5 ] . replaceAll ( "[s1;]" , '"' ) ;
data [ 5 ] = data [ 5 ] . replaceAll ( "[s2;]" , '\'' ) ;
data [ 5 ] = data [ 5 ] . replaceAll ( "[s3;]" , '<' ) ;
data [ 5 ] = data [ 5 ] . replaceAll ( "[s4;]" , '>' ) ;
2022-06-06 21:30:34 +00:00
2023-06-11 11:50:52 +00:00
if ( $ . cookie ( 'chatCfg2' ) !== '0' ) {
data [ 5 ] = chat . testSmile ( data [ 5 ] ) ;
}
2022-12-19 18:26:14 +00:00
2023-06-11 11:50:52 +00:00
let voiceMessageReg = data [ 5 ] . match ( /audio_[0-9]{10}[.]mp3/g )
let color = 'black' ;
if ( data [ 6 ] !== 'Black' && data [ 6 ] !== '' ) {
color = data [ 6 ] ;
}
2022-12-19 18:26:14 +00:00
2023-06-11 11:50:52 +00:00
if ( voiceMessageReg ) {
msg += ` <span style="color: ${ color } ;">
< audio id = "audioPlayerChat" controls style = "width:300px;max-width:400px;height:200px" >
2022-06-06 21:30:34 +00:00
< source src = "/audio/${voiceMessageReg[0]}" type = "audio/mp3" >
< / a u d i o >
2023-06-11 11:50:52 +00:00
< / s p a n > ` ;
} else {
if ( data . length === 10 ) {
msg += ` <span style="color: ${ color } ;"> ${ data [ 5 ] } </span> ` ;
} else {
msg += ` <span style="color: ${ color } ;"> ${ chat . regexpURL _true ( data [ 5 ] ) } </span> `
}
}
if ( parseInt ( data [ 2 ] ) === 21 ) {
//e text
let text = ` [loginfrom] ${ data [ 5 ] } ` ;
const ftps = ` <i><a href="javascript:void(0)" oncontextmenu="top.infoMenu( \' ${ data [ 3 ] } \' ,event, \' chat \' ); return false;" onClick="chat.addto( \' ${ data [ 3 ] } \' , \' to \' )"> ${ data [ 3 ] } </a></i> ` ;
let mblogin = new RegExp ( "\\[login:(.*?)\\]" , "" ) ;
text = text . replace ( '[loginfrom]' , ftps ) ;
if ( text . match ( mblogin ) != null ) {
mblogin = text . match ( mblogin ) [ 1 ] ;
text = text . replace ( ` [login: ${ mblogin } ] ` , ` <i><a href="javascript:void(0)" oncontextmenu="top.infoMenu( \' ${ mblogin } \' ,event, \' chat \' ); return false;" onClick="chat.addto( \' ${ mblogin } \' , \' to \' )"> ${ mblogin } </a></i> ` ) ;
}
msg = ` <i> ${ text } </i> ` ;
}
if ( parseInt ( data [ 1 ] ) > 0 ) {
let td = new Date ( ( parseInt ( data [ 1 ] ) ) * 1000 ) ;
td = [ td , null , null , null ] ;
td [ 1 ] = td [ 0 ] . getHours ( ) ;
td [ 2 ] = td [ 0 ] . getMinutes ( ) ;
td [ 3 ] = td [ 0 ] . getSeconds ( ) ;
td [ 4 ] = td [ 0 ] . getDay ( ) ;
td [ 5 ] = td [ 0 ] . getMonth ( ) ;
td [ 6 ] = td [ 0 ] . getFullYear ( ) ;
let j = 1 ;
while ( j < 6 ) {
if ( td [ j ] < 10 ) td [ j ] = ` 0 ${ td [ j ] } ` ;
j ++ ;
}
cls = forYou > 0 ? 'date2' : 'date' ;
if ( parseInt ( data [ 11 ] ) > 0 ) {
msg = ` <span style="cursor:help;color:red;" onmouseout="top.hic()" onmousedown="top.hic()" onmouseover="top.hi(this, \' Отправитель наказан за нарушение правил общения<br>Отключить отображение подобных сообщений можно в настройках чата. \' ,event,3,1,1,3, \' \' )"> <b>!</b> </span> ${ msg } ` ;
}
if ( parseInt ( data [ 10 ] ) > 0 ) {
msg = ` <span style="cursor:help;color:green;" onmouseout="top.hic()" onmousedown="top.hic()" onmouseover="top.hi(this, \' Это глобальное сообщение, оно может быть отправлено из любой локации<br>Отключить отображение подобных сообщений можно в настройках чата. \' ,event,3,1,1,3, \' \' )"> <b>G</b> </span> ${ msg } ` ;
}
let msg22 = '<span ' ;
if ( c . admin > 0 ) {
msg22 += ` oncontextmenu="chat.deleteMessage( ${ data [ 0 ] } );
2022-12-19 18:26:14 +00:00
return false ; " ` ;
2023-06-11 11:50:52 +00:00
}
// ОПТИМИЗАЦИЯ!!! (ничего не понятно, но очень интересно!)
if ( parseInt ( data [ 8 ] ) === 2 ) {
if ( data [ 14 ] === undefined || data [ 14 ] === null ) {
data [ 14 ] = '--:--' ;
}
if ( data [ 14 ] === '--:--' && parseInt ( data [ 1 ] ) > 0 ) {
data [ 14 ] = data [ 1 ] ;
const date14 = new Date ( parseInt ( data [ 14 ] ) * 1000 ) ;
data [ 14 ] = ` ${ date14 . getHours ( ) } : ${ date14 . getMinutes ( ) } ` ;
}
msg22 += ` class=" ${ cls } "> ${ data [ 14 ] } </span> ` ;
} else {
if ( data [ 13 ] === undefined || data [ 13 === null ] ) {
data [ 13 ] = '--:--' ;
}
if ( data [ 13 ] === '--:--' && parseInt ( data [ 1 ] ) > 0 ) {
data [ 13 ] = data [ 1 ] ;
const date13 = new Date ( parseInt ( data [ 13 ] ) * 1000 ) ;
data [ 13 ] = ` ${ date13 . getHours ( ) } : ${ date13 . getMinutes ( ) } ` ;
}
msg22 += ` class=" ${ cls } "> ${ data [ 13 ] } </span> ` ;
}
msg = msg22 + msg ;
}
this . msgcount ++ ;
msg = ` <span class="m0c1" id="msg_ ${ data [ 0 ] } "> ${ msg } <br></span> ` ;
if ( forYou > 0 && this . sound > 0 && this . trim ( data [ 3 ] . toLowerCase ( ) ) !== c . login . toLowerCase ( ) ) {
this . sendSound ( 1 ) ;
}
if ( msg _see === 1 ) {
if ( this . trim ( data [ 3 ] . toLowerCase ( ) ) === c . login . toLowerCase ( ) || forYou === 1 || this . filter === 0 ) {
if ( data [ 9 ] > 0 ) this . sendSound ( data [ 9 ] ) ;
if ( data [ 15 ] ) {
this . feerverk ( data [ 15 ] ) ;
this . feerverk ( data [ 15 ] ) ;
}
if ( window . des === 1 ) {
if ( parseInt ( data [ 2 ] ) < 4 || global _type === 1 ) {
//Обычный чат
chat . textColor _Work ( '#canal5' , msg , 5 )
if ( global _type === 1 ) {
//Системный чат
chat . textColor _Work ( '#canal4' , msg , 4 )
}
} else {
//Системный чат
chat . textColor _Work ( '#canal4' , msg , 4 )
chat . textColor _Work ( '#canal5' , msg , 5 )
}
} else {
const htmlElementsMessage = new DOMParser ( ) . parseFromString ( msg , "text/html" ) . getElementsByTagName ( "span" ) [ 0 ] ;
document . getElementById ( 'canal5' ) . append ( htmlElementsMessage )
//$('#canal5').html(`${$('#canal5').html()}${msg}`);
}
}
}
this . scrollNow ( false ) ;
}
} ,
/ * *
* @ param { * } canal
* @ param { string } messg
* @ param { number } count
* /
textColor _Work : function ( canal , messg , count ) {
const htmlElementsMessage = new DOMParser ( ) . parseFromString ( messg , "text/html" ) . getElementsByTagName ( "span" ) [ 0 ] ;
const idCanal = canal . match ( /canal[0-9]/ ) ;
const idCanal0 = document . getElementById ( idCanal [ 0 ] ) ;
if ( ! idCanal0 ) $ ( canal ) . html ( ` ${ $ ( canal ) . html ( ) } ${ messg } ` )
else idCanal0 . append ( htmlElementsMessage )
top . blueTextSee ( count ) ;
} ,
testKey : function ( m , v ) {
let i = 0 , r = v ;
v = false ;
while ( i !== - 1 ) {
if ( m [ i ] !== undefined ) {
if ( m [ i ] === r ) {
v = i ;
i = - 2 ;
}
} else i = - 2 ;
i ++ ;
}
return v ;
} ,
isNumber : function ( s ) {
return s = ! isNaN ( s )
} ,
testSmile : function ( txt ) {
let txr = txt . split ( ':' ) ;
let i = 1 ,
j = 0 ,
smid = 0 ;
let imsml ;
while ( i <= txr . length ) {
if ( txr [ i ] !== undefined ) {
smid = this . testKey ( sml , txr [ i ] ) ;
imsml = txr [ i ] . split ( '-' ) ;
if ( ( ( smid !== false || smid === 0 ) && this . isNumber ( txr [ i ] ) !== true ) || ( imsml !== undefined && imsml [ 0 ] === '%usersmile%' ) ) {
if ( j < 3 && this . isNumber ( sml [ smid ] ) !== true && ( sml [ smid ] !== undefined || imsml [ 0 ] === '%usersmile%' ) ) {
// тут
if ( imsml [ 0 ] === '%usersmile%' ) {
txt = txt . replace ( ` \: %usersmile%- ${ imsml [ 1 ] } \: ` , ` <img alt="Именной смайлик" src=" ${ c . img2 } /i/smile/ ${ ( imsml [ 1 ] . toLowerCase ( ) ) } .gif" title="Именной смайлик"> ` ) ;
} else {
txt = txt . replace ( ` \: ${ txr [ i ] } \: ` , ` <img alt="Смайлик" src=" ${ c . img2 } /i/smile/ ${ ( txr [ i ] . toLowerCase ( ) ) } .gif" style="cursor:pointer" width=" ${ sml [ smid + 1 ] } " height=" ${ sml [ smid + 2 ] } " onclick="chat.addSmile( \' ${ ( txr [ i ] . toLowerCase ( ) ) } \' )"> ` ) ;
}
j ++ ;
}
}
}
i ++ ;
}
return txt ;
} ,
trmb : function ( ) {
if ( this . translit === 1 ) {
$ ( '#textmsg' ) . val ( this . convert2 ( $ ( '#textmsg' ) . val ( ) ) ) ;
}
} ,
regexpURL _true ( str ) {
let key ;
let finallyStr = str ;
const arrURL = str . match ( /[-a-zA-Z0-9А -я@:;%_\+.~#?&\/=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:;%_\+.~#?&\/=]*)?/gi ) ;
const domainsRUS = str . match ( /[a-zA-Z0-9А -я-]+[.,:;\/?!@#$%^&*()_+-`'"|]+(ком|р у |юа)+/gi ) ;
const domainsEN = str . match ( /[a-zA-Z0-9А -я-]+[ .,:;\/?!@#$%^&*()_+-`'"|]+\b(c[o]+m|ua|r[u]{1,}|net|cc)+\b/gi ) ;
const regexpForbiddenWords = /\b(old|rebk|combatz|sbkru|urlidru|real|obk2com|bitly|owly|cruelbk|likebk|isgd|fightbk|my-|my-combatc|mbk|anti|ws|s3s|bakubk|idealbk|bespridel|perbk|online|cf|artovik|probk|twar|oyy|krbk|habk|timebk|sbi|eea|sokbk|inbk|refbk|bk20|analogbk|monstrbk|awOev|cruelcity|tlgr|vntr|supbk|cu|tn|af|svel|kwn|krati|ohh|gHjq|ogw|lur|lmy|idz|hop|eee|bestbk|pixl|ssylka|f34r|exelendbk|9tl|qil|2t9|NjQ0|net|bishky|getl|ixz|nvm|prok|5char|tdl|pick|jj|FORM|zik|biz|sns|snsh|pnut|pb8|short|legendabk|prnt|coombats|tiny|orDе NВ К |nbk|orden|club|utf|ubit|clc|wocmaet|wiecej|ourl|3le|NikY|fia|iop|ordenbk|sW|sw|so|xcombat|world|death|legendbattles|plu|dbe|kombatz|over|dek|ci8|goldbk|Zeus|nxt|is|Ndpx|pw|kutt|JovdeT|cort|rexno|bly|tFXUQ|fyi|yf0ck|lst|numl|yx5ru|vhGyJ|GEROY|MOYEP|fuck|lnnk|dhaF|oko|x8b4q|Ru2q|psce|yx5|bg9xH|Rich|Lands|yx|bgH|huxoqM|bgxH|Nextbk|idea|PLAYBK|dance|coronabk|hitbk|ttpham|RС о мbа ts|dedmoroz|wmj9bz|king|ZEBK|urlgo|ZniD)+\b/g ;
finallyStr = str . replace ( regexpForbiddenWords , ( ) => "" )
const allURL = new Set ( ) ;
if ( domainsEN ) for ( key of domainsEN ) {
if ( ! key . match ( /^[A-zА -я0-9]+$/i ) ) allURL . add ( key )
}
if ( domainsRUS ) for ( key of domainsRUS ) {
if ( ! key . match ( /^[A-zА -я0-9]+$/i ) ) allURL . add ( key )
}
if ( arrURL ) for ( key of arrURL ) allURL . add ( key )
if ( ! allURL . size ) return finallyStr
let falseURL = false ;
if ( falseURL ) return "В сообщении присутствуют запрещенные ссылки."
finallyStr = finallyStr . replace (
/(<img src=")?(https?:\/\/)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z()]{1,6}\b([-a-zA-Z0-9()@:%_;\+.~#?&\/\/=]*)/gi ,
( match ) => {
if ( /^(<img src=")/ . test ( match ) ) {
return match
} else if ( match . match ( /new-combats\.com/i ) ) return match
else if ( match . match ( /inf\.php/i ) ) return match
else if ( /^(https?:\/\/)/ . test ( match ) ) {
return ` <a class="URL-a" href=" ${ match } " target="_blank"> ${ match } </a> `
} else {
return ` <a class="URL-a" href="https:// ${ match } " target="_blank"> ${ match } </a> `
}
}
)
finallyStr = finallyStr . replace ( regexpForbiddenWords , ( ) => "" )
return finallyStr
} ,
convert2 : function ( txt ) {
let trn ;
trn = txt . split ( ' ' ) ;
for ( let i = 0 ; i < trn . length ; i ++ ) {
if ( trn [ i ] . indexOf ( "https://" ) < 0 && trn [ i ] . indexOf ( '@' ) < 0 && trn [ i ] . indexOf ( "www." ) < 0 && ! ( trn [ i ] . charAt ( 0 ) === ":" && trn [ i ] . charAt ( trn [ i ] . length - 1 ) === ":" ) ) {
if ( ( i < trn . length - 1 ) && ( trn [ i ] === "to" || trn [ i ] === "private" ) && ( trn [ i + 1 ] . charAt ( 0 ) === "[" ) ) {
while ( ( i < trn . length - 1 ) && ( trn [ i ] . charAt ( trn [ i ] . length - 1 ) !== "]" ) ) i ++ ;
} else {
trn [ i ] = this . convert ( trn [ i ] ) ;
}
}
}
return trn . join ( ' ' ) ;
} ,
map _en : Array ( 's`h' , 'S`h' , 'S`H' , 's`Х ' , 'sh`' , 'Sh`' , 'SH`' , "'o" , 'yo' , "'O" , 'Yo' , 'YO' , 'zh' , 'w' , 'Zh' , 'ZH' , 'W' , 'ch' , 'Ch' , 'CH' , 'sh' , 'Sh' , 'SH' , 'e`' , 'E`' , "'u" , 'yu' , "'U" , 'Yu' , "YU" , "'a" , 'ya' , "'A" , 'Ya' , 'YA' , 'a' , 'A' , 'b' , 'B' , 'v' , 'V' , 'g' , 'G' , 'd' , 'D' , 'e' , 'E' , 'z' , 'Z' , 'i' , 'I' , 'j' , 'J' , 'k' , 'K' , 'l' , 'L' , 'm' , 'M' , 'n' , 'N' , 'o' , 'O' , 'p' , 'P' , 'r' , 'R' , 's' , 'S' , 't' , 'T' , 'u' , 'U' , 'f' , 'F' , 'h' , 'H' , 'c' , 'C' , '`' , 'y' , 'Y' , "'" ) ,
map _ru : Array ( 'с х ' , 'С х ' , 'С Х ' , 'с Х ' , 'щ' , 'Щ' , 'Щ' , 'ё' , 'ё' , 'Ё' , 'Ё' , 'Ё' , 'ж' , 'ж' , 'Ж' , 'Ж' , 'Ж' , 'ч' , 'Ч' , 'Ч' , 'ш' , 'Ш' , 'Ш' , 'э' , 'Э' , 'ю' , 'ю' , 'Ю' , 'Ю' , 'Ю' , 'я' , 'я' , 'Я' , 'Я' , 'Я' , 'а ' , 'А ' , 'б ' , 'Б' , 'в' , 'В ' , 'г ' , 'Г' , 'д' , 'Д' , 'е ' , 'Е ' , 'з' , 'З ' , 'и' , 'И' , 'й' , 'Й' , 'к' , 'К ' , 'л' , 'Л' , 'м' , 'М ' , 'н' , 'Н ' , 'о ' , 'О ' , 'п' , 'П' , 'р ' , 'Р ' , 'с ' , 'С ' , 'т' , 'Т ' , 'у ' , 'У ' , 'ф' , 'Ф' , 'х ' , 'Х ' , 'ц' , 'Ц' , 'ъ' , 'ы' , 'Ы' , 'ь' ) ,
addSm : function ( i ) {
$ ( '#textmsg' ) . focus ( ) ;
top . document . textmsg . value += ` : ${ i } : ` ;
} ,
convert _work : function ( id ) {
newstr = str . match ( id ) [ 0 ] ;
str = str . replace ( str . match ( id ) [ 0 ] , '' ) ;
} ,
convert : function ( str ) {
const p1 = new RegExp ( "private\\s*\\[(.*?)\\]" , "" ) ;
const t1 = new RegExp ( "to\\s*\\[(.*?)\\]" , "" ) ;
let newstr = '' ;
if ( str . match ( p1 ) != null ) this . convert _work ( p1 )
else if ( str . match ( t1 ) != null ) this . convert _work ( t1 )
for ( let i = 0 ; i < this . map _en . length ; ++ i )
while ( str . indexOf ( this . map _en [ i ] ) >= 0 ) str = str . replace ( this . map _en [ i ] , this . map _ru [ i ] ) ;
newstr += str ;
return newstr ;
} ,
sendSound : function ( s ) {
let svolm = 100 ;
if ( this . sound === 0 ) svolm = 0
else if ( this . sound === 1 ) svolm = 25 ;
else if ( this . sound === 2 ) svolm = 100 ;
const isInternetExplorer = navigator . appName . indexOf ( "Microsoft" ) !== - 1 ;
if ( isInternetExplorer && window . document [ "Sound" ] && typeof window . document [ "Sound" ] . SetVariable !== "undefined" ) {
window . document [ "Sound" ] . SetVariable ( "Volume" , svolm ) ;
window . document [ "Sound" ] . SetVariable ( "Sndplay" , s ) ;
} else if ( document . getElementById ( 'Sound2' ) && typeof document . getElementById ( 'Sound2' ) . SetVariable !== "undefined" ) {
document . getElementById ( 'Sound2' ) . SetVariable ( "Volume" , svolm ) ;
document . getElementById ( 'Sound2' ) . SetVariable ( "Sndplay" , s ) ;
}
} ,
trim : function ( s ) {
return this . rtrim ( this . ltrim ( s ) ) ;
} ,
ltrim : function ( s ) {
return s . replace ( /^\s+/ , '' ) ;
} ,
rtrim : function ( s ) {
return s . replace ( /\s+$/ , '' ) ;
} ,
multiaddto : function ( users , tp ) {
const arr = users . split ( ',' ) ;
let i = arr . length ;
while ( i >= 0 ) {
if ( arr [ i ] !== undefined ) {
this . addto ( arr [ i ] , tp ) ;
}
i -- ;
}
} ,
//Генерируем данные
// data - JSON С УЖЕ СУЩЕСТВУЮЩИМИ ПОЛЯМИ!!!! но можеть быть NULL
// data.rn = online room name
// data.list = online users list
/ * *
* Генератор данных чата .
* @ param { json | null } data
* @ param { number } [ prs ]
* /
genchatData : function ( data , prs ) {
let i ;
//console.log(JSON.parse(data));
if ( prs === 1 && typeof data === "string" ) { // срабатывает если текст пришёл от игрока о _О
data = JSON . parse ( data ) ;
}
if ( data === null && this . saveData !== null ) {
data = this . saveData ;
data . js = '' ;
data . rn = undefined ;
data . key = undefined ;
}
//Получаем сообщение
//Приваты судя не прилетают.
if ( data . msg !== undefined ) {
const ms = JSON . parse ( data . msg ) ;
//console.log(ms)
// 0:"4396466" id?
// 1:"1686338170" timestamp?
// 2:"2" type?
// 3:"Merlin" who
// 4:"Дмитрий" whom
// 5:" кому " message
// 6:"" ??
// 7:"0" ??
// 8:"0" ??
// 9:"0" ??
// 10:"0" ??
// 11:"0" ??
// 12:"0" ??
// 13:"22:16" time
// 14:"09.06.2023 22:16" datetime
// 15:"" ??
// 16:"0" ??
if ( ms [ 'ld' ] > this . msg _id ) this . msg _id = ms [ 'ld' ] ;
i = 0 ;
while ( i <= ms [ 'id' ] ) {
if ( ms [ ` m ${ i } ` ] !== undefined ) {
// console.group(ms[`m${i}`])
this . sendMsg ( ms [ ` m ${ i } ` ] ) ;
}
i ++ ;
}
}
//Если есть JS
if ( data . js !== '' ) eval ( data . js ) ;
if ( data . rnd !== undefined ) c . rnd = data . rnd ;
if ( data . rn !== undefined && data . rn !== null ) { // делаем заголовок людей онлайн
let showAllUsersCheckbox = document . getElementById ( 'chcf10' ) ;
let showRoomName = document . getElementById ( 'roomName' ) ;
if ( showAllUsersCheckbox . checked ) {
showRoomName . innerHTML = ` ${ data . rn } <br><small>Общий онлайн: ${ data . xu } </small> `
} else {
showRoomName . innerHTML = ` ${ data . rn } ( ${ data . xu } ) `
}
}
if ( data . key !== undefined ) this . key = data . key ;
if ( data . list !== undefined && data . list !== null ) { //делаем список людей онлайн
let jj ;
i = 0 ;
let ji = JSON . parse ( data . list ) ,
onll = '' ,
fSort = { } ,
flSort = { } ,
flSortSee = '"Служба Поддержки"' ;
//сортируем данные
while ( i <= data . xu ) {
if ( ji [ i ] !== undefined ) {
jj = ji [ i ] [ 1 ] . toLowerCase ( ) ; //по логину
fSort [ jj ] = i ;
flSort [ i ] = jj ;
flSortSee += ` ," ${ flSort [ i ] } " ` ;
}
i ++ ;
}
flSortSee = eval ( ` [ ${ flSortSee } ] ` ) ;
if ( $ . cookie ( 'chatCfg9' ) === 1 ) flSortSee . sort ( game . sort2 ) ;
else flSortSee . sort ( game . sort1 ) ;
//Выводим данные
i = 0 ;
let onll _alh = '' ; //список алхимиков?
while ( i <= data . xu ) {
if ( fSort [ flSortSee [ i ] ] !== undefined ) {
if ( ji [ fSort [ flSortSee [ i ] ] ] [ 3 ] === 50 ) {
onll _alh += ` <span class="m0c1"> ${ this . gUser ( ji [ fSort [ flSortSee [ i ] ] ] , true ) } </span> ` ;
} else {
onll += ` <span class="m0c2"> ${ this . gUser ( ji [ fSort [ flSortSee [ i ] ] ] , true ) } </span> ` ;
}
}
i ++ ;
}
let onlineList = document . getElementById ( 'onlist' ) ;
onlineList . innerHTML = ` ${ onll _alh } ${ onll } `
}
} ,
voiceMessage : function ( ) {
flagVoice = ! flagVoice
if ( flagVoice ) return chat . startRecording ( flagVoice )
return chat . startRecording ( flagVoice )
} ,
startRecording : function ( flag ) {
if ( flag ) {
if ( navigator . mediaDevices . getUserMedia ) {
const pVoiceMessages = document . getElementById ( "timerVoiceMess" ) ;
pVoiceMessages . hidden = false
const constraints = {
audio : true
} ;
const onSuccess = function ( stream ) {
mediaRecorder = new MediaRecorder ( stream ) ;
mediaRecorder . start ( )
timerSecMessage = 0
let timerMlSecMessage = 1 ;
setIntervalSound = setTimeout ( function tickMlsec ( ) {
if ( timerSecMessage === 60 ) {
flagVoice = ! flagVoice
chat . styleRecordButton ( {
textButt : "Запись" ,
color : "" ,
backgroundColor : "" ,
allSetting : true
} )
return
}
if ( timerSecMessage > 9 ) pVoiceMessages . textContent =
` 00: ${ timerSecMessage } , ${ timerMlSecMessage } `
else pVoiceMessages . textContent =
` 00:0 ${ timerSecMessage } , ${ timerMlSecMessage } `
if ( ++ timerMlSecMessage > 9 ) {
timerMlSecMessage = 0
++ timerSecMessage
}
setIntervalSound = setTimeout ( tickMlsec , 100 )
} , 100 )
chat . styleRecordButton ( {
textButt : "Завершить" ,
color : "rgb(165, 0, 0)" ,
backgroundColor : "rgba(255, 0, 0, 0.083)" ,
allSetting : false
} )
mediaRecorder . ondataavailable = function ( e ) {
chunksVoice . push ( e . data )
}
} ;
const onError = function ( err ) {
console . log ( ` Ошибка: ${ err } ` )
alert ( "Ошибка, проверьте подключение или работоспособность микрофона!" )
} ;
navigator . mediaDevices . getUserMedia ( constraints ) . then ( onSuccess , onError )
} else console . log ( "Аудиосообщения не поддерживаются вашим браузером!" )
return
}
chat . styleRecordButton ( {
textButt : "Запись" ,
color : "" ,
backgroundColor : "" ,
allSetting : true
} )
} ,
styleRecordButton : function ( objArgs ) {
const {
textButt ,
color ,
backgroundColor ,
allSetting
} = objArgs ;
const buttonVoiceMess = document . getElementById ( "record" ) ;
const pVoiceMessages = document . getElementById ( "timerVoiceMess" ) ;
if ( allSetting ) {
clearInterval ( setIntervalSound )
pVoiceMessages . textContent = "00:00,0"
buttonVoiceMess . textContent = textButt
buttonVoiceMess . style . color = color
buttonVoiceMess . style . backgroundColor = backgroundColor
pVoiceMessages . hidden = allSetting
if ( ! mediaRecorder ) return alert ( "Ошибка, проверьте подключение или работоспособность микрофона! Если Вы подключили микрофон и всё работает - перезагрузите страницу <F5> и попробуйте снова!" )
mediaRecorder . stop ( )
mediaRecorder . onstop = function ( ) {
chat . mediaRecorderStop ( )
}
mediaRecorder . stream . getAudioTracks ( ) . forEach ( function ( track ) {
track . stop ( )
} )
return
}
const footerTop = document . getElementsByClassName ( "allChat" ) [ 1 ] . offsetTop ;
const tdLeft = buttonVoiceMess . parentElement . offsetLeft ;
const VoiceWidth = buttonVoiceMess . clientWidth ;
const pVoiceWidth = pVoiceMessages . clientWidth ;
pVoiceMessages . style . top = ` ${ footerTop - 30 } px `
pVoiceMessages . style . left = ` ${ ( tdLeft + 9 ) + ( ( VoiceWidth - pVoiceWidth ) / 2 ) } px `
buttonVoiceMess . textContent = textButt
buttonVoiceMess . style . color = color
buttonVoiceMess . style . backgroundColor = backgroundColor
pVoiceMessages . hidden = allSetting
} ,
mediaRecorderStop : function ( ) {
if ( timerSecMessage < 2 ) {
chunksVoice . pop ( )
return
}
const blob = new Blob ( chunksVoice , {
'type' : 'audio/mp3; codecs=opus'
} ) ;
chunksVoice . pop ( )
const fileReader = new FileReader ( ) ;
fileReader . readAsArrayBuffer ( blob )
fileReader . onload = async function ( ) {
const inputWindow = document . getElementById ( "textmsg" ) ;
const arrayBuffer = fileReader . result ;
const response = await fetch ( "/audio.php" , {
method : "POST" ,
body : arrayBuffer
} ) ;
const timeStampFile = await response . text ( ) ;
inputWindow . value =
` ${ inputWindow . value } audio_ ${ timeStampFile } .mp3 `
await chat . subSend ( )
}
}
} ;