2021-12-06 10:21:11 +01:00
import cfg from "../config.mjs" ;
2021-12-04 12:19:47 +01:00
import sql from "../sql.mjs" ;
import lib from "../lib.mjs" ;
import fs from "fs" ;
import url from "url" ;
2021-12-06 10:21:11 +01:00
const allowedMimes = [ "audio" , "image" , "video" ] ;
2021-12-04 12:19:47 +01:00
const auth = async ( req , res , next ) => {
if ( ! req . session )
return res . redirect ( "/login" ) ;
return next ( ) ;
} ;
export default ( router , tpl ) => {
2021-12-18 19:52:38 +01:00
router . get ( /^\/?(?:tag\/(?<tag>.+?))?(?:user\/(?<user>.+?))?(?:\/(?<mime>image|audio|video))?(?:\/p\/(?<page>\d+))?(?:\/(?<itemid>\d+))?$/ , async ( req , res ) => {
2021-12-06 10:21:11 +01:00
const user = req . params . user ? ? null ;
2021-12-20 17:55:47 +01:00
const tag = lib . parseTag ( req . params . tag ? ? null ) ;
2021-12-06 10:21:11 +01:00
const mime = ( req . params . mime ? ? "" ) ;
const smime = allowedMimes . includes ( mime ) ? mime + "/%" : mime === "" ? "%" : "%" ;
const page = + ( req . params . page ? ? 1 ) ;
const itemid = + ( req . params . itemid ? ? null ) ;
const output = {
2021-12-18 19:52:38 +01:00
user , tag , mime , smime , page , itemid
2021-12-04 12:19:47 +01:00
} ;
2021-12-06 10:21:11 +01:00
const mode = itemid > 0 ? "item" : "index" ;
const modequery = mime == "audio" ? lib . getMode ( 0 ) : lib . getMode ( req . session . mode ? ? 0 ) ;
let data ;
if ( user && ( await sql ( "items" ) . where ( "username" , "like" , user ) . count ( "* as total" ) ) [ 0 ] . total === 0 )
return res . end ( "200 - user not found lol" ) ;
if ( mode === "item" ) { // item!
2021-12-20 17:55:47 +01:00
if ( itemid === 404 )
2021-12-06 10:21:11 +01:00
return res . end ( "404 - lol" ) ;
2021-12-04 12:19:47 +01:00
2021-12-20 17:55:47 +01:00
let items = sql ( "items" ) . select ( "*" ) . orderBy ( "items.id" , "desc" ) . whereRaw ( modequery ) ;
if ( tag ) {
items = items . innerJoin (
sql ( "tags" )
. select ( "tags_assign.item_id" , "tags.tag" )
. leftJoin ( "tags_assign" , "tags_assign.tag_id" , "tags.id" )
. where ( "tags.tag" , "like" , "%" + tag + "%" )
. groupBy ( "tags_assign.item_id" )
. as ( "st" ) ,
"st.item_id" , "items.id"
) ;
2021-12-06 10:21:11 +01:00
}
2021-12-20 17:55:47 +01:00
if ( user )
items = items . andWhere ( "username" , "like" , "%" + user + "%" ) ;
if ( mime )
items = items . andWhere ( "mime" , "like" , mime + "/%" ) ;
items = await items ;
2021-12-06 10:21:11 +01:00
2021-12-20 17:55:47 +01:00
const item = items . findIndex ( i => i . id === itemid ) ;
const actitem = items [ item ] ;
2021-12-06 10:21:11 +01:00
2021-12-20 17:55:47 +01:00
if ( ! actitem ) // sfw-check!
return res . end ( "Sorry, this f0ck either doesn't exist (yet) or hasn't been tagged yet, please remain patient, a support assistant will be shortly with you." ) ;
2021-12-06 10:21:11 +01:00
2021-12-20 17:55:47 +01:00
const tags = await lib . getTags ( itemid ) ;
const cheat = items . slice ( Math . max ( 0 , item - 3 ) , item + 4 ) . map ( i => i . id ) ;
const link = lib . genLink ( { user , tag , mime , act _page : itemid } ) ;
2021-12-06 10:21:11 +01:00
data = {
user : {
2021-12-20 17:55:47 +01:00
name : actitem . username ,
channel : actitem . usernetwork == "Telegram" && actitem . userchannel !== "f0ck.me" ? "anonymous" : actitem . userchannel ,
network : actitem . usernetwork
2021-12-06 10:21:11 +01:00
} ,
item : {
2021-12-20 17:55:47 +01:00
id : actitem . id ,
2021-12-06 10:21:11 +01:00
src : {
2021-12-20 17:55:47 +01:00
long : actitem . src ,
short : url . parse ( actitem . src ) . hostname ,
2021-12-06 10:21:11 +01:00
} ,
2021-12-20 17:55:47 +01:00
thumbnail : ` ${ cfg . websrv . paths . thumbnails } / ${ actitem . id } .png ` ,
coverart : ` ${ cfg . websrv . paths . coverarts } / ${ actitem . id } .png ` ,
dest : ` ${ cfg . websrv . paths . images } / ${ actitem . dest } ` ,
mime : actitem . mime ,
size : lib . formatSize ( actitem . size ) ,
timestamp : lib . timeAgo ( new Date ( actitem . stamp * 1e3 ) . toISOString ( ) ) ,
2021-12-06 10:21:11 +01:00
tags : tags
} ,
2021-12-20 17:55:47 +01:00
title : ` ${ actitem . id } - f0ck.me ` ,
2021-12-06 10:21:11 +01:00
pagination : {
2021-12-20 17:55:47 +01:00
end : items [ items . length - 1 ] ? . id ,
start : items [ 0 ] ? . id ,
next : items [ item + 1 ] ? . id ,
prev : items [ item - 1 ] ? . id ,
page : actitem . id ,
2021-12-06 10:21:11 +01:00
cheat : cheat ,
link : link ,
uff : true
} ,
link : link ,
tmp : output
} ;
2021-12-04 12:19:47 +01:00
}
2021-12-06 10:21:11 +01:00
else { // page!
2021-12-18 19:52:38 +01:00
let total , rows ;
if ( tag ) {
2021-12-20 17:55:47 +01:00
if ( tag . match ( /sfw/ ) || tag . length <= 2 )
return res . end ( "f0ck you!" ) ;
total = ( await sql ( "items" )
. select ( "items.id" , "items.mime" , "st.tag" )
. innerJoin (
sql ( "tags" )
. select ( "tags_assign.item_id" , "tags.tag" )
. leftJoin ( "tags_assign" , "tags_assign.tag_id" , "tags.id" )
. where ( "tags.tag" , "like" , "%" + tag + "%" )
. groupBy ( "tags_assign.item_id" )
. as ( "st" ) ,
"st.item_id" , "items.id"
)
2021-12-18 19:52:38 +01:00
. whereRaw ( modequery )
. count ( "* as total" )
) [ 0 ] ? . total ;
}
else {
total = ( await sql ( "items" )
. whereRaw ( modequery )
. andWhere ( "items.mime" , "like" , smime )
. andWhere ( "items.username" , "like" , user ? user : "%" )
. count ( "* as total" )
) [ 0 ] ? . total ;
}
if ( ! total || total . length === 0 )
return res . end ( "no f0cks given lol" ) ;
2021-12-06 10:21:11 +01:00
const pages = + Math . ceil ( total / cfg . websrv . eps ) ;
const act _page = Math . min ( pages , page || 1 ) ;
const offset = Math . max ( 0 , ( act _page - 1 ) * cfg . websrv . eps ) ;
2021-12-18 19:52:38 +01:00
if ( tag ) {
2021-12-20 17:55:47 +01:00
rows = await sql ( "items" )
. select ( "items.id" , "items.mime" , "st.tag" , "tags_assign.tag_id" )
. joinRaw ( "left join tags_assign on tags_assign.item_id = items.id and (tags_assign.tag_id = 1 or tags_assign.tag_id = 2)" )
. innerJoin (
sql ( "tags" )
. select ( "tags_assign.item_id" , "tags.tag" )
. leftJoin ( "tags_assign" , "tags_assign.tag_id" , "tags.id" )
. where ( "tags.tag" , "like" , "%" + tag + "%" )
. groupBy ( "tags_assign.item_id" )
. as ( "st" ) ,
"st.item_id" , "items.id"
)
2021-12-18 19:52:38 +01:00
. whereRaw ( modequery )
. orderBy ( "items.id" , "desc" )
. offset ( offset )
. limit ( cfg . websrv . eps ) ;
}
else {
rows = await sql ( "items" )
. select ( "items.id" , "items.mime" , "tags_assign.tag_id" )
. joinRaw ( "left join tags_assign on tags_assign.item_id = items.id and (tags_assign.tag_id = 1 or tags_assign.tag_id = 2)" )
. whereRaw ( modequery )
. andWhere ( "items.mime" , "like" , smime )
. andWhere ( "items.username" , "like" , user ? user : "%" )
. orderBy ( "items.id" , "desc" )
. offset ( offset )
. limit ( cfg . websrv . eps ) ;
}
2021-12-06 10:21:11 +01:00
if ( rows . length === 0 )
return res . end ( "oops" ) ;
rows . forEach ( e => {
if ( ! fs . existsSync ( ` public/t/ ${ e . id } .png ` ) )
fs . copyFileSync ( "public/s/img/broken.png" , ` public/t/ ${ e . id } .png ` ) ;
} ) ;
const cheat = [ ] ;
for ( let i = Math . max ( 1 , act _page - 3 ) ; i <= Math . min ( act _page + 3 , pages ) ; i ++ )
cheat . push ( i ) ;
2021-12-18 19:52:38 +01:00
const link = lib . genLink ( { user , tag , mime , act _page } ) ;
2021-12-06 10:21:11 +01:00
data = {
items : rows ,
pagination : {
start : 1 ,
end : pages ,
prev : ( act _page > 1 ) ? act _page - 1 : null ,
next : ( act _page < pages ) ? act _page + 1 : null ,
page : act _page ,
cheat : cheat ,
link : link ,
uff : false
2021-12-04 12:19:47 +01:00
} ,
2021-12-06 10:21:11 +01:00
last : rows [ rows . length - 1 ] . id ,
link : link ,
tmp : output
} ;
}
res . reply ( { body : tpl . render ( mode , data , req ) } ) ;
2021-12-04 12:19:47 +01:00
} ) ;
router . get ( /^\/(about)$/ , ( req , res ) => {
res . reply ( {
2021-12-09 17:01:31 +01:00
body : tpl . render ( req . url . split [ 0 ] , { tmp : null } , req )
2021-12-04 12:19:47 +01:00
} ) ;
} ) ;
router . get ( /^\/mode\/(\d)/ , auth , async ( req , res ) => {
const mode = + req . url . split [ 1 ] ;
2021-12-18 19:52:38 +01:00
let referertmp = req . headers . referer ;
2021-12-04 12:19:47 +01:00
let referer = "" ;
2021-12-18 19:52:38 +01:00
if ( referertmp . match ( /f0ck\.me/ ) )
referer = referertmp . split ( "/" ) . slice ( 3 ) . join ( "/" ) ;
2021-12-04 12:19:47 +01:00
if ( cfg . allowedModes [ mode ] ) {
await sql ( "user_options" )
. insert ( {
user _id : req . session . id ,
mode : mode ,
theme : req . theme ? ? "f0ck"
} )
. onConflict ( "user_id" )
. merge ( ) ;
}
res . redirect ( ` / ${ referer } ` ) ;
} ) ;
return router ;
} ;