diff --git a/debug/check_last_item.mjs b/debug/check_last_item.mjs deleted file mode 100644 index 40e9c59..0000000 --- a/debug/check_last_item.mjs +++ /dev/null @@ -1,15 +0,0 @@ -import db from "../src/inc/sql.mjs"; - -(async () => { - try { - const item = (await db`select * from items order by id desc limit 1`)?.[0]; - console.log("Last Item:", item); - if (item) { - const tags = await db`select * from tags_assign where item_id = ${item.id}`; - console.log("Tags:", tags); - } - } catch (err) { - console.error(err); - } - process.exit(0); -})(); diff --git a/debug/trigger.mjs b/debug/trigger.mjs index 3adf86d..63e899c 100644 --- a/debug/trigger.mjs +++ b/debug/trigger.mjs @@ -6,14 +6,13 @@ import { promises as fs } from "fs"; network: "console", message: _args.join(" "), args: _args.slice(1), - channel: "#w0bm", + channel: "console", user: { prefix: "console!console@console", nick: "console", username: "console", account: "console" }, - raw: {}, reply: (...args) => console.log(args), replyAction: (...args) => console.log(args), replyNotice: (...args) => console.log(args) @@ -25,14 +24,11 @@ import { promises as fs } from "fs"; )).filter(t => t[0].call.test(_e.message)).map(t => ({ name: t[0].name, f: t[0].f })); try { - if (trigger.length === 0) + if(trigger.length === 0) return console.error("no matches"); - for (const t of trigger) { - console.log(`triggered > ${t.name} (${_e.message})`); - await t.f(_e); - } - } catch (err) { + console.log(`triggered > ${trigger[0].name} (${_e.message})`); + await trigger[0].f(_e); + } catch(err) { console.error(err); } - process.exit(0); })(); diff --git a/init.sh b/init.sh deleted file mode 100755 index ce6ee5d..0000000 --- a/init.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -npm i -npm start diff --git a/src/inc/trigger/parser.mjs b/src/inc/trigger/parser.mjs index 357d2ff..ddb3c14 100644 --- a/src/inc/trigger/parser.mjs +++ b/src/inc/trigger/parser.mjs @@ -9,8 +9,8 @@ import fs from "fs"; import path from "path"; const regex = { - all: /https?:\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?/gi, - yt: /(?:youtube\.com\/\S*(?:(?:\/e(?:mbed))?\/|watch\/?\?(?:\S*?&?v\=))|youtu\.be\/)([a-zA-Z0-9_-]{6,11})/gi, + all: /https?:\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?/gi, + yt: /(?:youtube\.com\/\S*(?:(?:\/e(?:mbed))?\/|watch\/?\?(?:\S*?&?v\=))|youtu\.be\/)([a-zA-Z0-9_-]{6,11})/gi, imgur: /(?:https?:)?\/\/(\w+\.)?imgur\.com\/(\S*)(\..{3,4})/i, fourchan: /https?:\/\/i\.4cdn\.org\/(\w+)\/(\d+)\.(\w{3,4})/i, instagram: /(?:https?:\/\/www\.)?instagram\.com\S*?\/(?:p|reel)\/(\w{11})\/?/im @@ -23,35 +23,35 @@ export default async bot => { name: "parser", call: regex.all, active: true, - f: async e => { + f: e => { const links = e.message.match(regex.all)?.filter(link => !link.includes(cfg.main.url.domain)) || []; let repost; - if (e.media) + if(e.media) links.push(e.media); - - if (links.length === 0) + + if(links.length === 0) return false; - if (e.message.match(/\!i(gnore)?\b/)) + if(e.message.match(/\!i(gnore)?\b/)) return false; - if (!e.channel.includes("w0bm") && (!e.message.match(/\!w(0bm)?\b/i) && (typeof e.raw.forward_from == 'undefined'))) + if(!e.channel.includes("w0bm") && (!e.message.match(/\!w(0bm)?\b/i) && (typeof e.raw.forward_from == 'undefined'))) return false; - if (e.type === 'tg' && // proto: tg + if(e.type === 'tg' && // proto: tg !e.message.match(/\!w(0bm)?\b/i) && // !w / !w0bm !e.raw.forward_date && // is forwarded? !mediagroupids.has(e.raw.media_group_id) // prepared mediagroup? ) { return false; } - else if (e.raw.media_group_id && e.message.match(/\!w(0bm)?\b/i)) { + else if(e.raw.media_group_id && e.message.match(/\!w(0bm)?\b/i)) { mediagroupids.add(e.raw.media_group_id); } console.log(`parsing ${links.length} link${links.length > 1 ? "s" : ""}...`); - for (const link of links) { + links.forEach(async link => { //if(regex.imgur.test(link)) // return await e.reply(`fuck imgur... seriously`); @@ -63,7 +63,7 @@ export default async bot => { // check repost (link) repost = await queue.checkrepostlink(link); - if (repost) + if(repost) return await e.reply(`repost motherf0cker (link): ${cfg.main.url.full}/${repost}`); // generate uuid @@ -73,41 +73,39 @@ export default async bot => { // read metadata let ext; - const proxyArgs = cfg.main.socks ? `--proxy ${cfg.main.socks}` : ''; - if (link.match(regex.instagram)) { + if(link.match(regex.instagram)) { // is instagram try { // @flummi -> is there a variable for the actual work directory so it doesn't have to be hardcoded? - const meta = JSON.parse((await queue.exec(`yt-dlp ${proxyArgs} -f 'bv*[height<=720]+ba/b[height<=720] / wv*+ba/w' --skip-download --dump-json "${link}"`)).stdout); + const meta = JSON.parse((await queue.exec(`yt-dlp --proxy ${cfg.main.socks} -f 'bv*[height<=720]+ba/b[height<=720] / wv*+ba/w' --skip-download --dump-json "${link}"`)).stdout); ext = meta.ext; - } catch (err) { + } catch(err) { const tmphead = (await fetch(link, { method: "HEAD" })).headers["content-type"]; // this can be undefined for unsupported mime types, but will be caught in the general mime check below ext = cfg.mimes[tmphead]; } } - else if (link.match(regex.imgur)) { + else if(link.match(regex.imgur)) { // imghure ext = link.split('.').pop(); } - else if (link.match(regex.yt)) { + else if(link.match(regex.yt)) { //yt - fuck anti bot protection try { - const meta = JSON.parse((await queue.exec(`yt-dlp ${proxyArgs} -f 'bv*[height<=720]+ba/b[height<=720] / wv*+ba/w' -I 1 --skip-download --dump-json "${link}"`)).stdout); + const meta = JSON.parse((await queue.exec(`yt-dlp --proxy ${cfg.main.socks} -f 'bv*[height<=720]+ba/b[height<=720] / wv*+ba/w' -I 1 --skip-download --dump-json "${link}"`)).stdout); ext = meta.ext; - } catch (err) { - console.error("YT-DLP Error:", err); + } catch(err) { const tmphead = (await fetch(link, { method: "HEAD" })).headers["content-type"]; // this can be undefined for unsupported mime types, but will be caught in the general mime check below ext = cfg.mimes[tmphead]; } } - else if (link.match(regex.fourchan)) { + else if(link.match(regex.fourchan)) { //4chan - fuck cloudflare :) try { - const meta = JSON.parse((await queue.exec(`yt-dlp ${proxyArgs} -f 'bv*[height<=720]+ba/b[height<=720] / wv*+ba/w' --skip-download --dump-json "${link}"`)).stdout); + const meta = JSON.parse((await queue.exec(`yt-dlp --proxy ${cfg.main.socks} -f 'bv*[height<=720]+ba/b[height<=720] / wv*+ba/w' --skip-download --dump-json "${link}"`)).stdout); ext = meta.ext; - } catch (err) { + } catch(err) { const tmphead = (await fetch(link, { method: "HEAD" })).headers["content-type"]; // this can be undefined for unsupported mime types, but will be caught in the general mime check below ext = cfg.mimes[tmphead]; @@ -119,15 +117,14 @@ export default async bot => { try { const meta = JSON.parse((await queue.exec(`yt-dlp -f 'bv*[height<=720]+ba/b[height<=720] / wv*+ba/w' --skip-download --dump-json "${link}"`)).stdout); ext = meta.ext; - } catch (err) { - console.error('err:', err); - if (e.type == 'tg') - return await e.editMessageText(msg.result.chat.id, msg.result.message_id, err); - return await e.reply('something went wrong lol / check maxfilesize?'); + } catch(err) { + const tmphead = (await fetch(link, { method: "HEAD" })).headers["content-type"]; + // this can be undefined for unsupported mime types, but will be caught in the general mime check below + ext = cfg.mimes[tmphead]; } } - if (!Object.values(cfg.mimes).includes(ext?.toLowerCase())) { + if(!Object.values(cfg.mimes).includes(ext?.toLowerCase())) { return console.log('mime schmime ' + ext); } @@ -139,44 +136,44 @@ export default async bot => { const start = new Date(); let source; - if (link.match(regex.instagram)) { + if(link.match(regex.instagram)) { try { // add --cookies on local instance if you want to avoid getting rate limited or optionally use a socks proxy from a network that is not being detected as a public network - source = (await queue.exec(`yt-dlp ${proxyArgs} -f 'bv*[height<=1080]+ba/b[height<=1080] / wv*+ba/w' "${link}" --max-filesize ${maxfilesize / 1024}k --postprocessor-args "ffmpeg:-bitexact" -o "./tmp/${uuid}.%(ext)s" --print after_move:filepath --merge-output-format "mp4"`)).stdout.trim(); - } catch (err) { - if (e.type == 'tg') + source = (await queue.exec(`yt-dlp --proxy ${cfg.main.socks} -f 'bv*[height<=1080]+ba/b[height<=1080] / wv*+ba/w' "${link}" --max-filesize ${maxfilesize / 1024}k --postprocessor-args "ffmpeg:-bitexact" -o "./tmp/${uuid}.%(ext)s" --print after_move:filepath --merge-output-format "mp4"`)).stdout.trim(); + } catch(err) { + if(e.type == 'tg') return await e.editMessageText(msg.result.chat.id, msg.result.message_id, "instagram dl error"); return await e.reply("instagram dl error", err); } } - else if (link.match(regex.imgur)) { + else if(link.match(regex.imgur)) { // imghure via torsocks // needs torsocks setup so this is optional try { await queue.exec(`torsocks wget ${link} -O ./tmp/${uuid}.${ext}`); source = `./tmp/${uuid}.${ext}`; - } catch (err) { + } catch(err) { console.error('err:', err); - if (e.type == 'tg') + if(e.type == 'tg') return await e.editMessageText(msg.result.chat.id, msg.result.message_id, err); return await e.reply('something went wrong lol'); } } - else if (link.match(regex.yt)) { + else if(link.match(regex.yt)) { try { // add --cookies on local instance if you want to avoid getting rate limited or optionally use a socks proxy from a network that is not being detected as a public network - source = (await queue.exec(`yt-dlp ${proxyArgs} -f 'bv*[height<=720]+ba/b[height<=720] / wv*+ba/w' "${link}" -I 1 --max-filesize ${maxfilesize / 1024}k --postprocessor-args "ffmpeg:-bitexact" -o "./tmp/${uuid}.%(ext)s" --print after_move:filepath --merge-output-format "mp4"`)).stdout.trim(); - } catch (err) { - if (e.type == 'tg') + source = (await queue.exec(`yt-dlp --proxy ${cfg.main.socks} -f 'bv*[height<=720]+ba/b[height<=720] / wv*+ba/w' "${link}" -I 1 --max-filesize ${maxfilesize / 1024}k --postprocessor-args "ffmpeg:-bitexact" -o "./tmp/${uuid}.%(ext)s" --print after_move:filepath --merge-output-format "mp4"`)).stdout.trim(); + } catch(err) { + if(e.type == 'tg') return await e.editMessageText(msg.result.chat.id, msg.result.message_id, "yt dl error"); return await e.reply("yt dl error", err); } } - else if (link.match(regex.fourchan)) { + else if(link.match(regex.fourchan)) { // 4chan via proxy - fuck cloudflare try { - source = (await queue.exec(`yt-dlp ${proxyArgs} -f 'bv*[height<=720]+ba/b[height<=720] / wv*+ba/w' "${link}" --max-filesize ${maxfilesize / 1024}k --postprocessor-args "ffmpeg:-bitexact" -o "./tmp/${uuid}.%(ext)s" --print after_move:filepath --merge-output-format "mp4"`)).stdout.trim(); - } catch (err) { - if (e.type == 'tg') + source = (await queue.exec(`yt-dlp --proxy ${cfg.main.socks} -f 'bv*[height<=720]+ba/b[height<=720] / wv*+ba/w' "${link}" --max-filesize ${maxfilesize / 1024}k --postprocessor-args "ffmpeg:-bitexact" -o "./tmp/${uuid}.%(ext)s" --print after_move:filepath --merge-output-format "mp4"`)).stdout.trim(); + } catch(err) { + if(e.type == 'tg') return await e.editMessageText(msg.result.chat.id, msg.result.message_id, "yt dl error"); return await e.reply("yt dl error", err); } @@ -185,23 +182,23 @@ export default async bot => { // everything except the exceptions try { source = (await queue.exec(`yt-dlp -f 'bv*[height<=720]+ba/b[height<=720] / wv*+ba/w' "${link}" --max-filesize ${maxfilesize / 1024}k --postprocessor-args "ffmpeg:-bitexact" -o "./tmp/${uuid}.%(ext)s" --print after_move:filepath --merge-output-format "mp4"`)).stdout.trim(); - } catch (err) { + } catch(err) { console.error('err:', err); - if (e.type == 'tg') + if(e.type == 'tg') return await e.editMessageText(msg.result.chat.id, msg.result.message_id, err); return await e.reply('something went wrong lol / check maxfilesize?'); } } // - if (!source) { - if (e.type == 'tg') + if(!source) { + if(e.type == 'tg') return await e.editMessageText(msg.result.chat.id, msg.result.message_id, "something went wrong lol"); return await e.reply("something went wrong lol"); } - if (source.match(/larger than/)) { - if (e.type == 'tg') + if(source.match(/larger than/)) { + if(e.type == 'tg') return await e.editMessageText(msg.result.chat.id, msg.result.message_id, "too large lol"); return await e.reply("too large lol"); } @@ -209,38 +206,38 @@ export default async bot => { // filesize check const size = fs.statSync(source).size; - if (size > maxfilesize) { - await fs.promises.unlink(source).catch(_ => { }); - if (e.type == 'tg') + if(size > maxfilesize) { + await fs.promises.unlink(source).catch(_=>{}); + if(e.type == 'tg') return await e.editMessageText(msg.result.chat.id, msg.result.message_id, `too large lol. (${lib.formatSize(size)} / ${lib.formatSize(maxfilesize)})`); return await e.reply(`too large lol. (${lib.formatSize(size)} / ${lib.formatSize(maxfilesize)})`); } - + // mime check let mime = (await queue.exec(`file --mime-type -b ${source}`)).stdout.trim(); try { - if (mime == 'video/x-matroska') { // mkv failsafe + if(mime == 'video/x-matroska') { // mkv failsafe await queue.exec(`ffmpeg -i ./tmp/${uuid}.mkv -codec copy ./tmp/${uuid}.mp4`); - await fs.promises.unlink(source).catch(_ => { }); + await fs.promises.unlink(source).catch(_=>{}); source = source.replace(/\.mkv$/, '.mp4'); mime = 'video/mp4'; } - if (source.match(/\.opus$/)) { // opus failsafe + if(source.match(/\.opus$/)) { // opus failsafe await queue.exec(`ffmpeg -i ./tmp/${uuid}.opus -codec copy ./tmp/${uuid}.ogg`); await fs.promises.unlink(source); source = source.replace(/\.opus$/, '.ogg'); mime = 'audio/ogg'; } - } catch (err) { - await fs.promises.unlink(source).catch(_ => { }); - if (e.type == 'tg') + } catch(err) { + await fs.promises.unlink(source).catch(_=>{}); + if(e.type == 'tg') return await e.editMessageText(msg.result.chat.id, msg.result.message_id, "something went wrong lol"); return await e.reply("something went wrong lol"); } - if (!Object.keys(cfg.mimes).includes(mime)) { - await fs.promises.unlink(source).catch(_ => { }); - if (e.type == 'tg') + if(!Object.keys(cfg.mimes).includes(mime)) { + await fs.promises.unlink(source).catch(_=>{}); + if(e.type == 'tg') return await e.editMessageText(msg.result.chat.id, msg.result.message_id, `lol, go f0ck yourself (${mime})`); return await e.reply(`lol, go f0ck yourself (${mime})`); } @@ -250,9 +247,9 @@ export default async bot => { // check repost (checksum) repost = await queue.checkrepostsum(checksum); - if (repost) { - await fs.promises.unlink(source).catch(_ => { }); - if (e.type == 'tg') + if(repost) { + await fs.promises.unlink(source).catch(_=>{}); + if(e.type == 'tg') return await e.editMessageText(msg.result.chat.id, msg.result.message_id, `repost motherf0cker (checksum): ${cfg.main.url.full}/${repost}`); return await e.reply(`repost motherf0cker (checksum): ${cfg.main.url.full}/${repost}`); } @@ -260,7 +257,7 @@ export default async bot => { const filename = path.basename(source); await fs.promises.copyFile(source, `./public/b/${filename}`); - await fs.promises.unlink(source).catch(_ => { }); + await fs.promises.unlink(source).catch(_=>{}); // user alias let username = e.user.nick || e.user.username; @@ -271,42 +268,33 @@ export default async bot => { where lower(user_alias.alias) ilike ${username} limit 1 `)?.[0]?.user; - if (alias) { + if(alias) { username = alias; } await db` - insert into items ${db({ - src: e.media ? "" : link, - dest: filename, - mime: mime, - size: size, - checksum: checksum, - username: username, - userchannel: e.channel, - usernetwork: e.network, - stamp: ~~(new Date() / 1000), - active: true - }, 'src', 'dest', 'mime', 'size', 'checksum', 'username', 'userchannel', 'usernetwork', 'stamp', 'active') + insert into items ${ + db({ + src: e.media ? "" : link, + dest: filename, + mime: mime, + size: size, + checksum: checksum, + username: username, + userchannel: e.channel, + usernetwork: e.network, + stamp: ~~(new Date() / 1000), + active: true + }, 'src', 'dest', 'mime', 'size', 'checksum', 'username', 'userchannel', 'usernetwork', 'stamp', 'active') } `; const itemid = await queue.getItemID(filename); - // auto-tag sfw - await db` - insert into tags_assign ${db({ - item_id: itemid, - tag_id: 1, // sfw - user_id: 2 // f0ck - }, 'item_id', 'tag_id', 'user_id') - } - `; - // generate thumbnail try { await queue.genThumbnail(filename, mime, itemid, link); - } catch (err) { + } catch(err) { await queue.exec(`magick ./mugge.png ./public/t/${itemid}.webp`); } @@ -327,13 +315,13 @@ export default async bot => { let outputmsgirc = `[f0cked] link: ${cfg.main.url.full}/${itemid} | size: ${lib.formatSize(size)} | speed: ${speed}`; let outputmsgtg = `[f0cked] size: ${lib.formatSize(size)} | speed: ${speed}`; - if (tags?.length > 0) { + if(tags?.length > 0) { const tagstr = tags.join(', '); outputmsgirc += ` | tags: ${tagstr}`; outputmsgtg += ` | tags: ${tagstr}`; } - if (e.type == 'tg') { + if(e.type == 'tg') { await e.deleteMessage(msg.result.chat.id, msg.result.message_id); await e.reply(outputmsgtg, { reply_markup: JSON.stringify({ @@ -351,7 +339,7 @@ export default async bot => { else { await e.reply(outputmsgirc); } - } + }); } }]; };