const fs = require('node:fs/promises'); const path = require('path'); require('./utils/date-extensions.js'); // Добавляем метод TIME() к Date let s= {day:new Date(), num:0}; let synch_log=false; exports.save = async (data)=> { try { let currentDate = new Date(); data.time=currentDate.TIME(); const dir = './log/'+currentDate.getFullYear()+'-'+(currentDate.getMonth()+1); const file = dir+'/'+currentDate.getDate()+'.log'; //await fs.access('./log/'+currentDate.getFullYear()+'-'+(currentDate.getMonth()+1)).then(() => { //}).catch( async () => { await fs.mkdir('./log/'+currentDate.getFullYear()+'-'+(currentDate.getMonth()+1)); }); // await fs.access(file).then( async () => { // await fs.appendFile(file, JSON.stringify(data) + '#\n', { encoding: 'utf8' }); // }).catch(async () => { // await fs.writeFile(file, JSON.stringify(data) + '#\n', { encoding: 'utf8' }); // }); await fs.mkdir(dir, { recursive: true }); await fs.appendFile(file, JSON.stringify(data) + '#\n', { encoding: 'utf8' }); } catch(err) { // Проверяем, что socket_to_server существует и подключен if (global.socket_to_server && global.socket_to_server.readyState === 1) { try { await global.socket_to_server.send(JSON.stringify({ do: "err/add", name: err.name, message: err.message, stack: err.stack, info: "Сохранение логов-" + JSON.stringify(data) })); } catch (sendError) { console.error('[LOG] Ошибка отправки ошибки на сервер:', sendError.message); } } else { console.error('[LOG] socket_to_server недоступен для отправки ошибки:', err.message); } } } let SendLogs=async ()=> { let file='./log/'+s.day.getFullYear()+'-'+(s.day.getMonth()+1)+'/'+s.day.getDate()+'.log'; let dan; try { dan=(await fs.readFile(file, { encoding: 'utf8' })).split('#\n'); } catch (err) { dan=[""]; } let flag=false; for (let i=s.num; i< dan.length-1; i++) { // dan[i] //socket_to_server.send(JSON.stringify({do:"log", dan:dan[i]})); let dand try { dand= JSON.parse(dan[i]); } catch (err) { dand= {do:"err", inf:dan[i], err}; } let otv; try { if (global.send_to_server) { otv = await global.send_to_server({do:"log/add", dan:dand, num:i, data:s.day.getFullYear()+'-'+(s.day.getMonth()+1)+'-'+s.day.getDate()}); } else { console.warn('[LOG] send_to_server недоступен, пропускаем отправку логов'); otv = { do: "error", num: i }; } } catch (sendError) { console.error('[LOG] Ошибка отправки логов на сервер:', sendError.message); otv = { do: "error", num: i }; } if ( otv.do=="log" && otv.num == i ) {s.num=i+1; flag=true;} else return; } if (flag) save(); if ( s.day.getFullYear() < (new Date()).getFullYear() || s.day.getMonth()<(new Date()).getMonth() || s.day.getDate()< (new Date()).getDate() ) { s.day.setDate(s.day.getDate()+1); s.num=0; await SendLogs(); } else { // [+] отправка команды на WEB о том что все логи синхронизированны if (synch_log==false) { synch_log=true; if (global.wsServer && global.wsServer.clients) { global.wsServer.clients.forEach(client => client.send(JSON.stringify({do:"synch-log", synch_log}))); } } } } let timerLog= async ()=> { // [+] отправка команды на WEB о том что есть не синхронизированные логи if (synch_log && global.wsServer && global.wsServer.clients) { synch_log=false; global.wsServer.clients.forEach(client => client.send(JSON.stringify({do:"synch-log", synch_log}))); } await SendLogs(); setTimeout(timerLog, 300000); } let load =async ()=> { try {s= JSON.parse( await fs.readFile(path.join(__dirname, 'data/log.ini') ) ); s.day=new Date(s.day); } catch (e) { } setTimeout(timerLog, 5000); } let save =async ()=> { try { await fs.writeFile(path.join(__dirname, 'data/log.ini'), JSON.stringify(s)); } catch (e) { } } load(); exports.synch_log=()=>{return synch_log;}