Add client preferences

This commit is contained in:
Zed
2019-08-13 19:44:29 +02:00
parent c42b2893ff
commit 966b3d5d62
12 changed files with 329 additions and 82 deletions

View File

@ -3,13 +3,14 @@ from net import Port
import jester, regex
import api, utils, types, cache, formatters, search, config, agents
import views/[general, profile, status]
import api, utils, types, cache, formatters, search, config, prefs, agents
import views/[general, profile, status, preferences]
const configPath {.strdefine.} = "./nitter.conf"
let cfg = getConfig(configPath)
proc showSingleTimeline(name, after, agent: string; query: Option[Query]): Future[string] {.async.} =
proc showSingleTimeline(name, after, agent: string; query: Option[Query];
prefs: Prefs): Future[string] {.async.} =
let railFut = getPhotoRail(name, agent)
var timeline: Timeline
@ -34,33 +35,41 @@ proc showSingleTimeline(name, after, agent: string; query: Option[Query]): Futur
if profile.username.len == 0:
return ""
let profileHtml = renderProfile(profile, timeline, await railFut)
return renderMain(profileHtml, title=cfg.title, titleText=pageTitle(profile), desc=pageDesc(profile))
let profileHtml = renderProfile(profile, timeline, await railFut, prefs)
return renderMain(profileHtml, prefs, title=cfg.title, titleText=pageTitle(profile),
desc=pageDesc(profile))
proc showMultiTimeline(names: seq[string]; after, agent: string; query: Option[Query]): Future[string] {.async.} =
proc showMultiTimeline(names: seq[string]; after, agent: string; query: Option[Query];
prefs: Prefs): Future[string] {.async.} =
var q = query
if q.isSome:
get(q).fromUser = names
else:
q = some(Query(kind: multi, fromUser: names, excludes: @["replies"]))
var timeline = renderMulti(await getTimelineSearch(get(q), after, agent), names.join(","))
return renderMain(timeline, title=cfg.title, titleText="Multi")
var timeline = renderMulti(await getTimelineSearch(get(q), after, agent),
names.join(","), prefs)
proc showTimeline(name, after: string; query: Option[Query]): Future[string] {.async.} =
return renderMain(timeline, prefs, title=cfg.title, titleText="Multi")
proc showTimeline(name, after: string; query: Option[Query];
prefs: Prefs): Future[string] {.async.} =
let agent = getAgent()
let names = name.strip(chars={'/'}).split(",").filterIt(it.len > 0)
if names.len == 1:
return await showSingleTimeline(names[0], after, agent, query)
return await showSingleTimeline(names[0], after, agent, query, prefs)
else:
return await showMultiTimeline(names, after, agent, query)
return await showMultiTimeline(names, after, agent, query, prefs)
template respTimeline(timeline: typed) =
if timeline.len == 0:
resp Http404, showError("User \"" & @"name" & "\" not found", cfg.title)
resp Http404, showError("User \"" & @"name" & "\" not found", cfg.title, prefs)
resp timeline
proc getCookiePrefs(request: Request): Prefs =
getPrefs(request.cookies.getOrDefault("preferences"))
setProfileCacheTime(cfg.profileCacheTime)
settings:
@ -70,58 +79,76 @@ settings:
routes:
get "/":
resp renderMain(renderSearch(), title=cfg.title)
let prefs = getCookiePrefs(request)
resp renderMain(renderSearch(), prefs, title=cfg.title)
post "/search":
if @"query".len == 0:
resp Http404, showError("Please enter a username.", cfg.title)
resp Http404, showError("Please enter a username.", cfg.title,
getCookiePrefs(request))
redirect("/" & @"query")
post "/saveprefs":
var prefs = getCookiePrefs(request)
genUpdatePrefs()
setCookie("preferences", $prefs.id, daysForward(360))
redirect("/settings")
get "/settings":
let prefs = getCookiePrefs(request)
resp renderMain(renderPreferences(prefs), prefs, title=cfg.title, titleText="Preferences")
get "/@name/?":
cond '.' notin @"name"
respTimeline(await showTimeline(@"name", @"after", none(Query)))
let prefs = getCookiePrefs(request)
respTimeline(await showTimeline(@"name", @"after", none(Query), prefs))
get "/@name/search":
cond '.' notin @"name"
let prefs = getCookiePrefs(request)
let query = initQuery(@"filter", @"include", @"not", @"sep", @"name")
respTimeline(await showTimeline(@"name", @"after", some(query)))
respTimeline(await showTimeline(@"name", @"after", some(query), prefs))
get "/@name/replies":
cond '.' notin @"name"
respTimeline(await showTimeline(@"name", @"after", some(getReplyQuery(@"name"))))
let prefs = getCookiePrefs(request)
respTimeline(await showTimeline(@"name", @"after", some(getReplyQuery(@"name")), prefs))
get "/@name/media":
cond '.' notin @"name"
respTimeline(await showTimeline(@"name", @"after", some(getMediaQuery(@"name"))))
let prefs = getCookiePrefs(request)
respTimeline(await showTimeline(@"name", @"after", some(getMediaQuery(@"name")), prefs))
get "/@name/status/@id":
cond '.' notin @"name"
let prefs = getCookiePrefs(request)
let conversation = await getTweet(@"name", @"id", getAgent())
if conversation == nil or conversation.tweet.id.len == 0:
resp Http404, showError("Tweet not found", cfg.title)
resp Http404, showError("Tweet not found", cfg.title, prefs)
let title = pageTitle(conversation.tweet.profile)
let desc = conversation.tweet.text
let html = renderConversation(conversation)
let html = renderConversation(conversation, prefs)
if conversation.tweet.video.isSome():
let thumb = get(conversation.tweet.video).thumb
let vidUrl = getVideoEmbed(conversation.tweet.id)
resp renderMain(html, title=cfg.title, titleText=title, desc=desc,
resp renderMain(html, prefs, title=cfg.title, titleText=title, desc=desc,
images = @[thumb], `type`="video", video=vidUrl)
elif conversation.tweet.gif.isSome():
let thumb = get(conversation.tweet.gif).thumb
let vidUrl = getVideoEmbed(conversation.tweet.id)
resp renderMain(html, title=cfg.title, titleText=title, desc=desc,
resp renderMain(html, prefs, title=cfg.title, titleText=title, desc=desc,
images = @[thumb], `type`="video", video=vidUrl)
else:
resp renderMain(html, title=cfg.title, titleText=title,
resp renderMain(html, prefs, title=cfg.title, titleText=title,
desc=desc, images=conversation.tweet.photos)
get "/pic/@sig/@url":
cond "http" in @"url"
cond "twimg" in @"url"
let prefs = getCookiePrefs(request)
let
uri = parseUri(decodeUrl(@"url"))
@ -129,7 +156,7 @@ routes:
filename = cfg.cacheDir / cleanFilename(path & uri.query)
if getHmac($uri) != @"sig":
resp showError("Failed to verify signature", cfg.title)
resp showError("Failed to verify signature", cfg.title, prefs)
if not existsDir(cfg.cacheDir):
createDir(cfg.cacheDir)
@ -151,10 +178,11 @@ routes:
get "/video/@sig/@url":
cond "http" in @"url"
cond "video.twimg" in @"url"
let prefs = getCookiePrefs(request)
let url = decodeUrl(@"url")
if getHmac(url) != @"sig":
resp showError("Failed to verify signature", cfg.title)
resp showError("Failed to verify signature", cfg.title, prefs)
let
client = newAsyncHttpClient()