/- *boke, tp=trill-post, cnt=contact, tlonc=tlon-channels /+ kaji, plib=trill-utils, lib=boke, sr=sortug, const=constants /= index /web/index /= nav /web/layout/nav :: /= blog /web/blog/router /= title /web/blog/title :: /= board /web/board/router :: /= feed /web/feed/router :: /= search /web/search/router :: /= chat-page /web/chat/chat :: /= tv /web/tv/router /= tvp /web/tv/tv /= about /web/about /= merch /web/merch :: :: common /= modals /web/components/modals /= cm /web/components/common :: /= root /web/root /= login /web/login /= subscribe /web/subscribe /= user /web/user /= editor /web/editor :: /* spinner %noun /web/assets/spinner/svg /* favicon %noun /web/assets/favicon/ico |% ++ eyre-bail (error-response:kaji 404) ++ manx-bail (error-page:kaji 404) +$ request $% [%eyre p=eyre-order:kaji] [%kaji tab=@t req=kaji-req] == ++ route |= [r=request =bowl:gall s=state] ^- kaji-res:kaji |^ ?- -.r %eyre :- %res ^- eyre-res:kaji =/ rl=req-line:kaji (parse-req:kaji req.p.r) =/ met method.request.req.p.r =/ fpath=(pole knot) [met pat.rl] ?: ?=([%apps %canvas rest=*] pat.rl) (serve-canvas rest.pat.rl rl) ?: ?=([~ @] ext.rl) (serve-assets rl) :: ?: ?=([[%session ~] [~ %js]] [pat ext]:rl) :- %full (serve-other:kaji %js (crip "window.ship = {(trip (rsh 3 (scot %p our.bowl)))};")) ?+ fpath eyre-bail [%'GET' rest=*] (serve-get rl(pat rest.fpath)) == %kaji :- %sse ^- sse-res:kaji ?- -.req.r %blog-redi (redirect-post post.req.r .y .y) %board-redi (redirect-post post.req.r .n .n) %redi (ui-effect [%redi url.req.r]) %tv-chat (give-tv-chat +.req.r) %radio-chat (give-radio-chat +.req.r) %chat-msg (give-chat-msg +.req.r) == == ++ kaji-bail :- [%tab ~] :~([%redi '/404']) ++ ui-effect |= e=effect:kaji ^- sse-res:kaji :- [%tab ~] :~(e) :: :: Eyre handling :: ++ serve-assets |= rl=req-line:kaji ~& serving-assets=rl ?+ [pat ext]:rl eyre-bail [[%spinner ~] [~ %svg]] [%mime ['image' 'svg+xml' ~] spinner] [[%favicon ~] [~ %ico]] [%mime ['image' 'x-icon' ~] favicon] :: [[%fonts @t ~] [~ %ttf]] ~& pat.rl :: ~& ~(key by fonts) :: =/ font (~(got by fonts) 'name') :: [%mime /application/octet-stream font] == ++ serve-get |= rl=req-line:kaji ^- eyre-res:kaji =/ pat pat.rl ?+ pat ~(show blog [rl s bowl]) [~ ~] serve-root [%blog rest=*] (blog [rl(pat rest.pat) s bowl]) :: [%board rest=*] (board rl(pat rest.pat) s bowl) :: [%feed rest=*] (feed rl(pat rest.pat) s bowl) :: [%search rest=*] (search rl(pat rest.pat) s bowl) :: [%tv rest=*] (tv rl(pat rest.pat) s bowl) :: :: users [%login rest=*] serve-login [%subscribe ~] serve-subscribe [%logout ~] logout [%user ~] serve-profile [%user u=@t ~] (serve-user u.pat) [%chat ~] serve-chat [%about ~] serve-about [%book ~] serve-merch :: admin [%bianji rest=*] (serve-editor rest.pat) :: [%f rest=*] (serve-fragment rest.pat) == ++ serve-root :- %page =/ page (root [s bowl]) (index ~[title page] bowl) ++ serve-login :- %page (index ~[(login src.bowl)] bowl) ++ serve-profile :- %page =/ page (user src.bowl s bowl) (index ~[page] bowl) ++ serve-subscribe :- %page (index ~[(subscribe src.bowl)] bowl) ++ serve-user |= suser=@t :- %page =/ who (slaw %p suser) ?~ who manx-bail =/ page (user u.who s bowl) (index ~[page] bowl) :: ++ serve-editor |= p=path :- %page ?. (is-admin:lib src.bowl) manx-bail =/ bunt [*thread:tp *full-node:tp] =/ pid (~(get by paths.s) p) =/ pp ?~ pid bunt =/ poast (get:gorm:tp feed.s u.pid) =/ ted (get:torm:tp threads.s u.pid) ?~ ted bunt ?~ poast bunt :- u.ted (node-to-full:plib u.poast feed.s) =/ page=manx (editor pp s bowl) (index ~[page] bowl) ++ serve-chat :- %page =/ contacts (get-contacts:cnt bowl) =/ pat /chat/(scot %p our.bowl)/chat/posts/newest/200/post =/ scry ~(scry io:sr bowl) =/ chat-posts (scry %channels pat paged-posts:tlonc) =/ chat-core ~(. chat-page [contacts bowl]) =/ page (main:chat-core chat-posts) (index ~[page] bowl) ++ serve-about :- %page (index ~[title about] bowl) ++ serve-merch :- %page (index ~[merch] bowl) ++ serve-fragment |= pat=(pole knot) :- %html ?+ pat manx-bail [%mobile-nav ~] ~(smol nav bowl) == ++ logout :- %full ^- simple-payload:http [[303 ['location' '/~/logout'] ['redirect' '/']~] ~] :: :: Kaji handling :: ++ redirect-post |= [=post:tp blog-view=? is-blog=?] ^- sse-res:kaji =/ ted (get:torm:tp threads.s thread.post) ?~ ted kaji-bail =/ pat-string=@t %- spat (get-path:lib path.u.ted blog-view is-blog) =/ url ?~ parent.post pat-string =/ hash (enc:kaji [author.post id.post]) =/ id "comment-{hash}" (crip "{(trip pat-string)}?goto={id}") (ui-effect [%redi url]) ++ give-tv-chat |= [name=@t p=post:tp] =/ m :: TODO FIX THIS CRAP. inner vs outer html is annoying af ;div ;+ (chat-msg:tvp p) == =/ effects :~ [%add m '#chat-container' %bottom ~] [%custom *manx %s 'scroll'] == :_ effects [%custom ~[/tv/our/[name]]] ++ give-radio-chat |= [s=@p p=*] :: =/ m :: TODO FIX THIS CRAP. inner vs outer html is annoying af :: ;div :: ;+ (chat-msg:tvp p) :: == :: =/ effects :~ [%add m '#chat-container' %bottom ~] :: [%custom *manx %s 'scroll'] == :: :_ effects [%custom ~[/tv/our/(scot %p s)]] :- [%tab ~] ~ ++ give-chat-msg |= [=flag:tlonc q=memo:tlonc] =/ subpath /chat/(scot %p p.flag)/[q.flag] =/ contacts (get-contacts:cnt bowl) =/ tlonchat ~(. chat-page [contacts bowl]) =/ m ;div ;+ (post-div:tlonchat q) == :- [%custom ~[subpath]] :~ [%add m '#chat-container' %bottom ~] [%custom *manx %s 'scroll'] == :: lets play with globs +$ glob-reference [hash=@uvH location=glob-location] :: +$ glob-location $% [%http =cord] [%ames =ship] == +$ version [major=@ud minor=@ud patch=@ud] +$ glob (map path mime) +$ href $% [%glob base=term =glob-reference] [%site =path] == :: glob handling, TODO put in kaji.hoon ++ serve-canvas |= [p=(pole knot) rl=req-line:kaji] =/ pat /charges/canvas =/ scry ~(scry io:sr bowl) =/ scry-res (scry %docket pat *) =/ glob ((soft glob) scry-res) ?~ glob eyre-bail =/ glob u.glob :: ~& glob=~(key by glob) =/ suffix (weld p (drop ext.rl)) ?: =(suffix /desk/js) :+ %mime /text/js 'window.desk = "canvas";' =/ requested=path ?: (~(has by glob) suffix) suffix /index/html =/ data=(unit mime) (~(get by glob) requested) ?~ data ~& >>> glob-not-found=suffix eyre-bail :: =/ lmao ?: (cfind:sr 'start' (spat suffix) .n) ~& > `@t`q.q.u.data .n .n :: =/ clean (replace:string:sr "/apps/canvas" "/canvas" (trip q.q.u.data)) :: =. q.q.u.data (crip clean) :: =/ lmao ?: (cfind:sr 'start' (spat suffix) .n) ~& >> `@t`q.q.u.data .n .n [%glob u.data] -- --