f0ckv2/src/inc/trigger/parser.mjs

103 lines
3.8 KiB
JavaScript
Raw Normal View History

2020-04-03 11:12:35 +00:00
import cfg from "../../../config.json";
import sql from "../sql.mjs";
2020-04-09 16:44:09 +00:00
import lib from "../lib.mjs";
2020-04-03 11:12:35 +00:00
import fs from "fs";
import { exec as _exec } from "child_process";
import { promisify } from "util";
const exec = promisify(_exec);
const regex = /https?:\/\/[\w\S(\.|:|/)]+/gi;
export default async bot => {
return [{
name: "parser",
call: regex,
active: true,
f: e => {
const links = e.message.match(regex)?.filter(link => {
return (
!link.includes("f0ck.me")
);
});
if(links.length === 0)
return false;
2020-10-13 08:59:06 +00:00
if(e.message.match(/(!|-)ignore/))
return false;
2020-04-03 11:12:35 +00:00
2020-10-13 08:59:06 +00:00
if(!e.channel.includes("f0ck") && !e.message.match(/(!|-)f0ck/i))
return false;
//e.reply(`parsing ${links.length} link${links.length > 1 ? "s" : ""}...`);
2020-04-03 11:12:35 +00:00
links.forEach(async link => {
// check repost (link)
const q_repost = await sql.query("select id from items where src = ?", [ link ]);
if(q_repost.length > 0)
return e.reply(`repost motherf0cker (link): ${cfg.main.url}/${q_repost[0].id}`);
// generate uuid
const uuid = (await sql.query("select left(uuid(), 8) as uuid"))[0].uuid;
// read metadata
const meta = JSON.parse((await exec(`youtube-dl --skip-download --dump-json "${link}"`)).stdout);
const filename = `${uuid}.${meta.ext}`;
2020-10-13 08:59:06 +00:00
e.reply(`downloading ${filename}...`);
2020-04-03 11:12:35 +00:00
// download data
2020-04-09 16:44:09 +00:00
const start = new Date();
const source = (await exec(`youtube-dl "${link}" --max-filesize 10000m -o ./tmp/${filename}`)).stdout.trim();
2020-04-03 11:12:35 +00:00
if(source.match(/larger than/))
return e.reply("too large lol");
2020-04-09 16:44:09 +00:00
const end = ~~((new Date() - start) / 1e3);
2020-04-03 11:12:35 +00:00
// generate checksum
const checksum = (await exec(`sha256sum ./tmp/${filename}`)).stdout.trim().split(" ")[0];
const size = fs.statSync(`./tmp/${filename}`).size;
// mime check
const mime = (await exec(`file --mime-type -b ./tmp/${filename}`)).stdout.trim();
if(!cfg.allowed.includes(mime))
return e.reply(`lol, go f0ck yourself (${mime})`);
// check repost (checksum)
const q_repostc = await sql.query("select id from items where checksum = ?", [ checksum ]);
if(q_repostc.length > 0)
return e.reply(`repost motherf0cker (checksum): ${cfg.main.url}/${q_repostc[0].id}`);
await fs.promises.copyFile(`./tmp/${filename}`, `./public/b/${filename}`);
await fs.promises.unlink(`./tmp/${filename}`).catch(_=>{});
const insertq = await sql.query(
"insert into items (src, dest, mime, size, checksum, username, userchannel, usernetwork, stamp, active) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
2020-10-13 08:59:06 +00:00
[ link, filename, mime, size, checksum, e.user.nick || e.user.username, e.channel, e.network, ~~(new Date() / 1000), 1 ]
2020-04-03 11:12:35 +00:00
);
// generate thumbnail
let thumb_orig = (await exec(`youtube-dl --get-thumbnail "${link}"`)).stdout.trim();
if(!thumb_orig.startsWith("http")) {
if(mime.startsWith("image") && mime !== "image/gif")
thumb_orig = `./public/b/${filename}`;
else {
await exec(`ffmpegthumbnailer -i./public/b/${filename} -s1024 -o./tmp/${insertq.insertId}`);
thumb_orig = `./tmp/${insertq.insertId}`;
}
}
await exec(`convert "${thumb_orig}" -resize "200x200^" -gravity center -crop 128x128+0+0 +repage ./public/t/${insertq.insertId}.png`);
await fs.promises.unlink(`./tmp/${insertq.insertId}`).catch(_=>{});
e.reply([
`title: ${meta.fulltitle}`,
2020-10-13 08:59:06 +00:00
`size: ${lib.formatSize(size)} ${lib.calcSpeed(size, end)} (ytdl: ${end})`,
2020-04-03 11:12:35 +00:00
`link: ${cfg.main.url}/${insertq.insertId}`
]);
});
}
}];
};