import router from "../router.mjs"; import cfg from "../../../config.json"; import url from "url"; import fs from "fs"; import { mimes } from "./inc/index.mjs"; import sql from "../sql.mjs"; import lib from "../lib.mjs"; import tpl from "../tpl.mjs"; tpl.readdir("views"); router.get(/^\/(audio\/?|image\/?|video\/?)?(p\/\d+)?$/, async (req, res) => { try { let mime = false; let q = false; if(['audio', 'image', 'video'].includes(req.url.split[0])) { mime = req.url.split[0]; q = " where " + (mimes[mime] ? mimes[mime].map(_mime => `mime = "${_mime}"`).join(" or ") : null); } const total = (await sql.query("select count(*) as total from items" + (mime ? q : "")))[0].total; const pages = +Math.ceil(total / cfg.websrv.eps); const page = Math.min(pages, +req.url.split[mime ? 2 : 1] || 1); const offset = (page - 1) * cfg.websrv.eps; const query = await sql.query(`select id, mime from items ${mime ? q : ""} order by id desc limit ?, ?`, [ offset, cfg.websrv.eps ]); let cheat = []; for(let i = Math.max(1, page - 3); i <= Math.min(page + 3, pages); i++) cheat.push(i); query.forEach(e => { if(!fs.existsSync(`public/t/${e.id}.png`)) fs.copyFileSync("public/s/img/broken.png", `public/t/${e.id}.png`); }); const data = { items: query, pagination: { start: 1, end: pages, prev: (page > 1) ? page - 1 : null, next: (page < pages) ? page + 1 : null, page: page, cheat: cheat, link: `/${mime ? mime + "/" : ""}p/` }, last: query[query.length - 1].id, filter: mime ? mime : undefined }; res.reply({ body: tpl.render("views/index", data) }); } catch(err) { console.log(err); res.reply({ body: "sorry bald wieder da lol :(" }); } }); router.get(/^\/((audio\/|video\/|image\/)?[0-9]+)$/, async (req, res) => { let id = false; let mime = false; let q = false; if(['audio', 'video', 'image'].includes(req.url.split[0])) { mime = req.url.split[0]; id = +req.url.split[1]; q = mimes[mime] ? mimes[mime].map(_mime => `mime = "${_mime}"`).join(" or ") : null; } else id = +req.url.split[0]; const query = (await sql.query(`select items.* from items where items.id = ? ${mime ? "and ("+q+")" : ""} limit 1`, [ id ]))?.shift(); if(!query?.id) return res.redirect("/404"); const tags = (await sql.query(`select tags.tag from tags_assign left join tags on tags.id = tags_assign.tag_id where tags_assign.item_id = ?`, [ id ])); const qmin = (await sql.query(`select id from items ${mime ? "where "+q : ""} order by id asc limit 1`))[0].id; const qmax = (await sql.query(`select id from items ${mime ? "where "+q : ""} order by id desc limit 1`))[0].id; const qnext = (await sql.query(`select id from items where id > ? ${mime ? "and ("+q+")" : ""} order by id asc limit 3`, [ id ])).reverse(); const qprev = (await sql.query(`select id from items where id < ? ${mime ? "and ("+q+")" : ""} order by id desc limit 3`, [ id ])); const cheat = qnext.concat([{ id: id }].concat(qprev)).map(e => +e.id); const next = qnext[qnext.length - 1] ? qnext[qnext.length - 1].id : false; const prev = qprev[0] ? qprev[0].id : false; const data = { user: { name: query.username, channel: query.userchannel, network: query.usernetwork }, item: { id: query.id, src: { long: query.src, short: url.parse(query.src).hostname, }, thumbnail: `${cfg.websrv.paths.thumbnails}/${query.id}.png`, coverart: `${cfg.websrv.paths.coverarts}/${query.id}.png`, dest: `${cfg.websrv.paths.images}/${query.dest}`, mime: query.mime, size: lib.formatSize(query.size), timestamp: lib.timeAgo(new Date(query.stamp * 1000).toISOString()), tags: tags }, title: `${query.id} - f0ck.me`, pagination: { start: qmax, end: qmin, prev: next, next: prev, page: query.id, cheat: cheat, link: `/${mime ? mime + "/" : ""}` }, filter: mime ? mime : undefined }; res.reply({ body: tpl.render("views/item", data) }); }); router.get(/^\/(contact|help|about)$/, (req, res) => { res.reply({ body: tpl.render(`views/${req.url.split[0]}`) }); });