if (process.argv[2] == null) { console.log("No IP specified"); process.exit(1) } if (process.argv[3] == null) { console.log("No port specified"); process.exit(1) } const ip = process.argv[2]; const port = Number(process.argv[3]); function msgToString(time: Date, address: string, msg: string) { return "[" + time.getDate() + "." + (time.getMonth() + 1) + "." + time.getFullYear() + " " + time.getHours() + ":" + time.getMinutes() + "] {" + address + "} " + msg; } import * as sq from "sqlite3"; const db = new sq.Database("data.db"); db.run("CREATE TABLE IF NOT EXISTS messages (time INTEGER PRIMARY KEY, address TEXT NOT NULL, msg TEXT NOT NULL) STRICT"); let msize = 0; db.each("SELECT time, address, msg FROM messages", (err: Error, m: {time: number; address: string; msg: string}) => { msize += textEncoder.encode(msgToString(new Date(m.time), m.address, m.msg)).length }); const textEncoder = new TextEncoder(); import * as net from "net"; let srv = net.createServer(function(socket: net.Socket) { let addr = socket.address() as net.AddressInfo; if (!addr.hasOwnProperty('address')) { console.log("?!?!?!"); socket.end(); return; } socket.on('data', function(data: Buffer | string) { switch (data[0]) { case 0x30: const store = db.prepare("INSERT INTO messages VALUES (?,?,?)"); let t = new Date; let a = addr.address; let m = String(data.slice(1)).replace("/\n/g", "\\n").replace("/\x1b/g", "\\x1b"); msize += textEncoder.encode(msgToString(t, a, m)).length store.run(Number(t),a,m); store.finalize(); socket.end() return; case 0x31: socket.write(String(msize)); socket.end(); return; case 0x32: let str = ""; db.each("SELECT time, address, msg FROM messages", (err: Error, m: {time: number; address: string; msg: string}) => { str += msgToString(new Date(m.time), m.address, m.msg); }, () => { socket.write(str); }); return; } console.log(addr.address + "???" + data[0]); }); socket.on('error', function(e: Error) { console.log(e.stack); }); }) console.log("Starting."); srv.listen(port, ip);