diff --git a/src/inc/routes/apiv2/upload.mjs b/src/inc/routes/apiv2/upload.mjs index de90f52..db2b273 100644 --- a/src/inc/routes/apiv2/upload.mjs +++ b/src/inc/routes/apiv2/upload.mjs @@ -758,8 +758,8 @@ export default router => { } } - // Broadcast new_item event for live grid updates (only if auto-approved) - if (!isApprovalRequired) { + // Broadcast new_item event for live grid updates (only if auto-approved and public) + if (!isApprovalRequired && targetVisibility === 0) { try { await db`SELECT pg_notify('new_item', ${JSON.stringify({ id: itemid, @@ -775,8 +775,8 @@ export default router => { } } - // Push to Matrix Channel (only if auto-approved) - if (!isApprovalRequired) { + // Push to Matrix Channel (only if auto-approved and public) + if (!isApprovalRequired && targetVisibility === 0) { try { const self = router.self; const matrixCfg = cfg.clients?.find(c => c.type === 'matrix'); diff --git a/src/inc/routes/mod.mjs b/src/inc/routes/mod.mjs index 10f3238..70b04f2 100644 --- a/src/inc/routes/mod.mjs +++ b/src/inc/routes/mod.mjs @@ -114,7 +114,7 @@ export default (router, tpl) => { } const f0ck = await db` - select i.dest, i.mime, i.username, i.id, ta.tag_id + select i.dest, i.mime, i.username, i.id, i.visibility, ta.tag_id from "items" i left join tags_assign ta on ta.item_id = i.id and ta.tag_id in (1, 2) where i.id = ${id} and i.active = false @@ -156,65 +156,69 @@ export default (router, tpl) => { console.error('[MOD APPROVE] Failed to notify user:', err); } - // Push to Discord Webhook (Direct) - try { - const discordClient = cfg.clients.find(c => c.type === 'discord'); - if (discordClient && discordClient.webhook_url) { - const message = `${f0ck[0].username} uploaded a new video ${cfg.main.url.full}/${id}`; - const payload = JSON.stringify({ content: message }); - const url = new URL(discordClient.webhook_url); - const options = { - hostname: url.hostname, - path: url.pathname + url.search, - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Content-Length': Buffer.byteLength(payload) - } - }; - const reqDiscord = https.request(options, (resDiscord) => { - if (resDiscord.statusCode >= 400) { - console.error(`[MOD APPROVE] Webhook returned status ${resDiscord.statusCode}`); - } - }); - reqDiscord.on('error', (err) => { - console.error('[MOD APPROVE] Webhook failed:', err); - }); - reqDiscord.write(payload); - reqDiscord.end(); - } - } catch (err) { - console.error('[MOD APPROVE] Discord Webhook error:', err); - } + const isPublic = (f0ck[0].visibility || 0) === 0; - // Push to Matrix Channel - try { - const matrixCfg = cfg.clients.find(c => c.type === 'matrix'); - if (matrixCfg?.notification_channel_id && router.self?.bot?.clients) { - const clients = await Promise.all(router.self.bot.clients); - const matrixWrapper = clients.find(c => c.type === 'matrix'); - if (matrixWrapper?.client) { + if (isPublic) { + // Push to Discord Webhook (Direct) + try { + const discordClient = cfg.clients.find(c => c.type === 'discord'); + if (discordClient && discordClient.webhook_url) { const message = `${f0ck[0].username} uploaded a new video ${cfg.main.url.full}/${id}`; - await matrixWrapper.client.send(matrixCfg.notification_channel_id, message); - console.log(`[MOD APPROVE] Matrix notification sent for item ${id}`); + const payload = JSON.stringify({ content: message }); + const url = new URL(discordClient.webhook_url); + const options = { + hostname: url.hostname, + path: url.pathname + url.search, + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Content-Length': Buffer.byteLength(payload) + } + }; + const reqDiscord = https.request(options, (resDiscord) => { + if (resDiscord.statusCode >= 400) { + console.error(`[MOD APPROVE] Webhook returned status ${resDiscord.statusCode}`); + } + }); + reqDiscord.on('error', (err) => { + console.error('[MOD APPROVE] Webhook failed:', err); + }); + reqDiscord.write(payload); + reqDiscord.end(); } + } catch (err) { + console.error('[MOD APPROVE] Discord Webhook error:', err); } - } catch (err) { - console.error('[MOD APPROVE] Matrix notification error:', err); - } - // Broadcast new_item event for live grid updates - try { - await db`SELECT pg_notify('new_item', ${JSON.stringify({ - id: id, - dest: f0ck[0].dest, - mime: f0ck[0].mime, - username: f0ck[0].username, - tag_id: f0ck[0].tag_id, - is_oc: !!f0ck[0].is_oc - })})`; - } catch (err) { - console.error('[MOD APPROVE] new_item notify failed:', err); + // Push to Matrix Channel + try { + const matrixCfg = cfg.clients.find(c => c.type === 'matrix'); + if (matrixCfg?.notification_channel_id && router.self?.bot?.clients) { + const clients = await Promise.all(router.self.bot.clients); + const matrixWrapper = clients.find(c => c.type === 'matrix'); + if (matrixWrapper?.client) { + const message = `${f0ck[0].username} uploaded a new video ${cfg.main.url.full}/${id}`; + await matrixWrapper.client.send(matrixCfg.notification_channel_id, message); + console.log(`[MOD APPROVE] Matrix notification sent for item ${id}`); + } + } + } catch (err) { + console.error('[MOD APPROVE] Matrix notification error:', err); + } + + // Broadcast new_item event for live grid updates + try { + await db`SELECT pg_notify('new_item', ${JSON.stringify({ + id: id, + dest: f0ck[0].dest, + mime: f0ck[0].mime, + username: f0ck[0].username, + tag_id: f0ck[0].tag_id, + is_oc: !!f0ck[0].is_oc + })})`; + } catch (err) { + console.error('[MOD APPROVE] new_item notify failed:', err); + } } } diff --git a/src/inc/routes/notifications.mjs b/src/inc/routes/notifications.mjs index 02bc72e..3937a36 100644 --- a/src/inc/routes/notifications.mjs +++ b/src/inc/routes/notifications.mjs @@ -211,6 +211,7 @@ db.listen('motd', (payload) => { db.listen('new_item', (payload) => { try { const data = JSON.parse(payload); + if (data.visibility && data.visibility !== 0) return; console.log(`[SSE] Broadcasting new_item (id: ${data.id}) to ${clients.size} clients`); for (const client of clients) { client.send({ type: 'new_item', data }); diff --git a/src/upload_handler.mjs b/src/upload_handler.mjs index dd27bab..5c6f74a 100644 --- a/src/upload_handler.mjs +++ b/src/upload_handler.mjs @@ -717,33 +717,35 @@ export const handleUpload = async (req, res, self) => { // Auto-tagging from embedded metadata was removed — the user must select suggestions explicitly. - // Discord Webhook - try { - const discordClient = cfg.clients.find(c => c.type === 'discord'); - if (discordClient && discordClient.webhook_url) { - const message = `${req.session.user} uploaded a new ${actualMime.split('/')[0]}: ${cfg.main.url.full}/${itemid}`; - const payload = JSON.stringify({ content: message }); - const url = new URL(discordClient.webhook_url); - const options = { - hostname: url.hostname, - path: url.pathname + url.search, - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Content-Length': Buffer.byteLength(payload) - } - }; - const reqDiscord = https.request(options, (resDiscord) => { }); - reqDiscord.on('error', (err) => console.error('[UPLOAD] Discord Webhook failed:', err)); - reqDiscord.write(payload); - reqDiscord.end(); + // Discord Webhook (only for public uploads) + if (targetVisibility === 0) { + try { + const discordClient = cfg.clients.find(c => c.type === 'discord'); + if (discordClient && discordClient.webhook_url) { + const message = `${req.session.user} uploaded a new ${actualMime.split('/')[0]}: ${cfg.main.url.full}/${itemid}`; + const payload = JSON.stringify({ content: message }); + const url = new URL(discordClient.webhook_url); + const options = { + hostname: url.hostname, + path: url.pathname + url.search, + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Content-Length': Buffer.byteLength(payload) + } + }; + const reqDiscord = https.request(options, (resDiscord) => { }); + reqDiscord.on('error', (err) => console.error('[UPLOAD] Discord Webhook failed:', err)); + reqDiscord.write(payload); + reqDiscord.end(); + } + } catch (err) { + console.error(`[BACKGROUND ERROR] Discord notification failed:`, err); } - } catch (err) { - console.error(`[BACKGROUND ERROR] Discord notification failed:`, err); } - // Broadcast new_item event for live grid updates (only if auto-approved) - if (!manualApproval) { + // Broadcast new_item event for live grid updates (only if auto-approved and public) + if (!manualApproval && targetVisibility === 0) { try { await db`SELECT pg_notify('new_item', ${JSON.stringify({ id: itemid, @@ -759,20 +761,22 @@ export const handleUpload = async (req, res, self) => { } } - // Push to Matrix Channel - try { - const matrixCfg = cfg.clients.find(c => c.type === 'matrix'); - if (matrixCfg?.notification_channel_id && self?.bot?.clients) { - const clients = await Promise.all(self.bot.clients); - const matrixWrapper = clients.find(c => c.type === 'matrix'); - if (matrixWrapper?.client) { - const message = `${req.session.user} uploaded a new item ${cfg.main.url.full}/${itemid}`; - await matrixWrapper.client.send(matrixCfg.notification_channel_id, message); - console.log(`[UPLOAD] Matrix notification sent for item ${itemid}`); + // Push to Matrix Channel (only if auto-approved and public) + if (!manualApproval && targetVisibility === 0) { + try { + const matrixCfg = cfg.clients.find(c => c.type === 'matrix'); + if (matrixCfg?.notification_channel_id && self?.bot?.clients) { + const clients = await Promise.all(self.bot.clients); + const matrixWrapper = clients.find(c => c.type === 'matrix'); + if (matrixWrapper?.client) { + const message = `${req.session.user} uploaded a new item ${cfg.main.url.full}/${itemid}`; + await matrixWrapper.client.send(matrixCfg.notification_channel_id, message); + console.log(`[UPLOAD] Matrix notification sent for item ${itemid}`); + } } + } catch (err) { + console.error('[UPLOAD] Matrix notification error:', err); } - } catch (err) { - console.error('[UPLOAD] Matrix notification error:', err); } // Staff Notifications