// Переменные голосовух let mediaRecorder; let setIntervalSound; let timerSecMessage = 0; let flagVoice = false; const chunksVoice = []; Element.prototype.remove = function () { this.parentElement.removeChild(this); } 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]); } } } 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, globalMsg: 0, ignoreList: {x: 0, nms: []}, 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()}
${login} Инф. о ${login} Clear
`); } }, 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) { const obj = top.frames.main.document.getElementById('frvrks'); if (obj !== undefined) { let newhtml = ''; let i = 1; while (i <= frc.x) { newhtml += ``; i++; } newhtml = `
${newhtml}
`; $(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 += `
${this.ignoreList.nms[j]} Инф. о ${this.ignoreList.nms[j]} Clear
`; } j++; } win.add('ignorListWin', 'Список игнорируемых', `
${date}
`, {}, 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; }, subValSend: '', subSend: async function () { let textmsg = $('#textmsg') if (textmsg.val() !== '') { if (textmsg.val() !== this.subValSend) { if (this.nozpros === 0) { 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) { if (!top.frames['main'].smnpty) { top.frames['main'].location.href = "main.php"; } } this.btl = $.cookie('btl'); } if (this.rtime !== this.ct[$.cookie('chatCfg0')] && this.ct[$.cookie('chatCfg0')]) { 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 = ''; // ["27205347","Merlin","8","1.99","Radminion","capitalcity","capitalcity","349","","","0","-4","0","0","","0",""] 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) { return 'невидимка[??]' } rt = data[1]; if (rt === 'Администратор') rt = this.efftxt('fire', rt); if (ol === true) { rt = `${rt}`; } else rt = `${rt}`; if (parseInt(data[13]) !== 0) rt = `${rt}`; if (parseInt(data[10]) > 0) { rt = `${rt}`; } if (data[8] !== undefined) data_work(8) else if (data[9] !== undefined) data_work(9) // тут function rtData(count) { return rt = `Склонность${rt}`; } if (parseInt(data[4]) !== 0 && clanImage !== undefined) { //data:${c.clanImage.mime_type};base64,${c.clanImage.img} rt = `Клан${rt}`; } if (parseInt(data[16]) > 0) rtData(16) rtData(3) if (c.lvl > -1) { if (c.city === data[6]) { if (parseInt(data[12]) > 0) { rt = `Персонаж сражается${rt}`; } else { rt = `Приват${rt}`; } } else { rt = `Город${rt}`; } } rt += `[${data[2]}]Инф. о ${data[1]}`; if (parseInt(data[11]) > c.time) { rt += ` Кляп`; this.addRefMolch(data[0], data[11]); } if (data[14] !== "") { rt += ` Травма`; } if (parseInt(data[13]) > 0) { if (parseInt(data[13]) === 2) { rt += ` `; } else { rt += ` `; } } if (parseInt(data[15]) === 1) rt = `${rt}` 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]}`)) { let msg = ''; if (parseInt(data[0]) !== 0) { if (c.admin > 0 && parseInt(data[12]) === 1) { msg += ' unactive '; } if (data[3] !== '') { let login = data[3]; if (data[16] > 0) { login = 'Невидимка'; } msg += `[${data[3]}]`; 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]) { 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 += `${this.trim(receiverList[i])}`; 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}]`, `${zmlogin}`); } if (data[5].match(reflcd) != null) { reflcd = data[5].match(reflcd)[1]; data[5] = data[5].replace(`[reflesh_main_zv_priem:${reflcd}]`, ''); } } //Собираем массив кому адресовано сообщение if (parseInt(data[2]) === 6) { //личная системка, внимание msg += ' Внимание! '; } else if (parseInt(data[2]) === 2) { if (forYou > 0) { msg += ` to [${to2}]`; } else { msg += ` to [${to2}]`; } } 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 += ' private [klan]'; } else { msg += ` private [ ${to} ]`; } } } } msg += ' '; } data[5] = data[5].replaceAll("[s1;]", '"'); data[5] = data[5].replaceAll("[s2;]", '\''); data[5] = data[5].replaceAll("[s3;]", '<'); data[5] = data[5].replaceAll("[s4;]", '>'); if ($.cookie('chatCfg2')) { data[5] = chat.testSmile(data[5]); } let voiceMessageReg = data[5].match(/audio_[0-9]{10}[.]mp3/g) let color = 'black'; if (data[6] !== 'Black' && data[6] !== '') { color = data[6]; } if (voiceMessageReg) { msg += ` `; } else { if (data.length === 10) { msg += `${data[5]}`; } else { msg += `${chat.regexpURL_true(data[5])}` } } if (parseInt(data[2]) === 21) { //e text let text = `[loginfrom] ${data[5]}`; const ftps = `${data[3]}`; 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}]`, `${mblogin}`); } msg = `${text}`; } 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 = ` ! ${msg}`; } if (parseInt(data[10]) > 0) { msg = ` G ${msg}`; } let msg22 = ' 0) { msg22 += `oncontextmenu="chat.deleteMessage(${data[0]}); return false;" `; } // ОПТИМИЗАЦИЯ!!! (ничего не понятно, но очень интересно!) 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]} `; } 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]} `; } msg = msg22 + msg; } this.msgcount++; msg = `${msg}
`; if (msg_see === 1) { if (this.trim(data[3].toLowerCase()) === c.login.toLowerCase() || forYou === 1) { 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]}\:`, `Именной смайлик`); } else { txt = txt.replace(`\:${txr[i]}\:`, `Смайлик`); } j++; } } } i++; } return txt; }, 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( /(${match}` } else { return `${match}` } } ) finallyStr = finallyStr.replace(regexpForbiddenWords, () => "") return finallyStr }, 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}
Общий онлайн: ${data.xu}` } 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; /*{ "0":["27318846","Дмитрий","8","50","0","capitalcity","capitalcity","9","","","0","0","0","0","","0",""], "1":["27205347","Merlin","8","1.99","Radminion","capitalcity","capitalcity","349","","","0","-4","0","0","","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 += `${this.gUser(ji[fSort[flSortSee[i]]], true)}`; } else { onll += `${this.gUser(ji[fSort[flSortSee[i]]], true)}`; } } 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("Ошибка, проверьте подключение или работоспособность микрофона! Если Вы подключили микрофон и всё работает - перезагрузите страницу и попробуйте снова!") 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() } } };