almatyd/index.ts

83 lines
2.3 KiB
TypeScript
Raw Normal View History

2024-12-18 17:13:52 +00:00
import * as net from "net";
import * as sq from "sqlite3";
import * as pp from "proxy-protocol-js";
2024-12-16 20:57:37 +00:00
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;
2024-12-16 20:57:37 +00:00
}
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
});
2024-12-17 18:39:56 +00:00
const textEncoder = new TextEncoder();
2024-12-16 20:57:37 +00:00
let srv = net.createServer(function(socket: net.Socket) {
2024-12-18 17:13:52 +00:00
let a = socket.address() as net.AddressInfo;
if (!a.hasOwnProperty('address')) {
2024-12-16 20:57:37 +00:00
console.log("?!?!?!");
socket.end();
return;
}
2024-12-18 17:13:52 +00:00
let addr = a.address;
2024-12-16 20:57:37 +00:00
socket.on('data', function(data: Buffer | string) {
switch (data[0]) {
case 0x30:
const store = db.prepare("INSERT INTO messages VALUES (?,?,?)");
let t = new Date;
2024-12-18 17:13:52 +00:00
let a = addr;
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();
2024-12-16 20:57:37 +00:00
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);
});
2024-12-16 20:57:37 +00:00
return;
2024-12-18 17:13:52 +00:00
case 'P'.charCodeAt(0):
if (addr == "127.0.0.1") {
addr = pp.V1ProxyProtocol.parse(String(data)).source.ipAddress;
} else {
console.log("Address " + addr + " tried to use proxy protocol.");
}
return;
2024-12-16 20:57:37 +00:00
}
2024-12-18 17:13:52 +00:00
console.log(addr + "???" + data[0]);
2024-12-16 20:57:37 +00:00
});
socket.on('error', function(e: Error) {
console.log(e.stack);
});
})
console.log("Starting.");
srv.listen(port, ip);