derv-net/lib.js
2025-05-26 21:02:47 -04:00

109 lines
No EOL
3.3 KiB
JavaScript

import { readFile } from "fs/promises";
var illegalRe = /[\/\?<>\\:\*\|":]/g;
var controlRe = /[\x00-\x1f\x80-\x9f]/g;
var reservedRe = /^\.+$/;
var windowsReservedRe = /^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i;
function sanitize(input, replacement) {
var sanitized = input
.replace(illegalRe, replacement)
.replace(controlRe, replacement)
.replace(reservedRe, replacement)
.replace(windowsReservedRe, replacement);
return sanitized.slice(0,200);
}
async function importRouters(app, routers) {
for (let router in routers) {
await app.use(router, (await import(routers[router])).default)
}
}
function apiStat(res, next, message, success = false, redirect = '/') {
res.api = { success, message, redirect };
next();
}
async function splitUp(content) {
let out = content.split(/(\s+)/g);
for (let i in out) {
let res = out[i];
if (res.startsWith('file::')) {
let type = res.split('.').pop();
let inner = '';
let path = new URL(res.slice('file::'.length), 'https://tbg.dervland.net/').pathname;
if (type == 'txt' || type == 'json') {
let san = sanitize(path.split('/').pop(), '');
inner = await readFile(`${process.cwd()}/uploads/${san}`, 'utf-8');
}
let innerJson = {};
try {
innerJson = JSON.parse(inner)
} catch (err) {
innerJson = {};
}
if (innerJson.pal) {
//type = '!neoboxels'
}
out[i] = ['file', path, type, inner];
continue;
}
if (res.startsWith('https://')) {
out[i] = ['link', res];
continue;
}
let urlThing = "";
if (res[0] == '@' || res[0] == '#') {
let type = res[0] == '@' ? '/users/' : '/walls/get/hub/';
let type2 = res[0] == '@' ? '' : '/0';
urlThing = new URL(type + res.slice(1) + type2, 'https://tbg.dervland.net/').pathname
}
if (res[0] == '@') {
out[i] = ['curl', res, urlThing];
continue;
}
if (res[0] == '#') {
out[i] = ['curl', res, urlThing];
continue;
}
out[i] = [res];
}
return out;
}
async function replyIterator(replies, db) {
for (let reply of replies) {
if (reply.childType == 'hub') {
reply.comment = { type: reply.childType, id: reply.childId, content: `The ${reply.childId} hub.`, username: false, date: undefined };
continue;
} else if (reply.childType == 'users') {
reply.comment = { type: reply.childType, id: reply.childId, content: `User ${reply.childId}'s wall.`, username: false, date: undefined };
continue;
}
let dat = await db.all('SELECT * FROM comment WHERE id = ?', [
reply.childId
]);
if (reply.childType != 'comment' || dat.length < 1) {
reply.comment = 'fail';
continue;
}
reply.comment = dat[0];
reply.comment.type = reply.childType;
//reply.comment.id = reply.childId;
}
for (let reply of replies) {
reply.comment.content = await splitUp(reply.comment.content)
}
return replies;
}
export { importRouters, apiStat, replyIterator, splitUp };