Post upvote ratio, permalink and reddit link

This commit is contained in:
spikecodes 2021-01-03 13:06:49 -08:00
parent 67090e9b08
commit 0dd114c166
7 changed files with 62 additions and 31 deletions

View File

@ -64,48 +64,49 @@ async fn media(data: &serde_json::Value) -> (String, String) {
// POSTS // POSTS
async fn parse_post(json: &serde_json::Value) -> Result<Post, &'static str> { async fn parse_post(json: &serde_json::Value) -> Result<Post, &'static str> {
// Retrieve post (as opposed to comments) from JSON // Retrieve post (as opposed to comments) from JSON
let post_data: &serde_json::Value = &json["data"]["children"][0]; let post: &serde_json::Value = &json["data"]["children"][0];
// Grab UTC time as unix timestamp // Grab UTC time as unix timestamp
let unix_time: i64 = post_data["data"]["created_utc"].as_f64().unwrap().round() as i64; let unix_time: i64 = post["data"]["created_utc"].as_f64().unwrap().round() as i64;
// Parse post score // Parse post score and upvote ratio
let score = post_data["data"]["score"].as_i64().unwrap(); let score = post["data"]["score"].as_i64().unwrap();
let ratio: f64 = post["data"]["upvote_ratio"].as_f64().unwrap_or(1.0) * 100.0;
// Determine the type of media along with the media URL // Determine the type of media along with the media URL
let media = media(&post_data["data"]).await; let media = media(&post["data"]).await;
// Build a post using data parsed from Reddit post API // Build a post using data parsed from Reddit post API
let post = Post { Ok(Post {
title: val(post_data, "title"), id: val(post, "id"),
community: val(post_data, "subreddit"), title: val(post, "title"),
body: rewrite_url(&val(post_data, "selftext_html")), community: val(post, "subreddit"),
author: val(post_data, "author"), body: rewrite_url(&val(post, "selftext_html")),
author: val(post, "author"),
author_flair: Flair( author_flair: Flair(
val(post_data, "author_flair_text"), val(post, "author_flair_text"),
val(post_data, "author_flair_background_color"), val(post, "author_flair_background_color"),
val(post_data, "author_flair_text_color"), val(post, "author_flair_text_color"),
), ),
url: val(post_data, "permalink"), permalink: val(post, "permalink"),
score: format_num(score), score: format_num(score),
upvote_ratio: ratio as i64,
post_type: media.0, post_type: media.0,
flair: Flair( flair: Flair(
val(post_data, "link_flair_text"), val(post, "link_flair_text"),
val(post_data, "link_flair_background_color"), val(post, "link_flair_background_color"),
if val(post_data, "link_flair_text_color") == "dark" { if val(post, "link_flair_text_color") == "dark" {
"black".to_string() "black".to_string()
} else { } else {
"white".to_string() "white".to_string()
}, },
), ),
flags: Flags { flags: Flags {
nsfw: post_data["data"]["over_18"].as_bool().unwrap_or(false), nsfw: post["data"]["over_18"].as_bool().unwrap_or(false),
stickied: post_data["data"]["stickied"].as_bool().unwrap_or(false), stickied: post["data"]["stickied"].as_bool().unwrap_or(false),
}, },
media: media.1, media: media.1,
time: Utc.timestamp(unix_time, 0).format("%b %e %Y %H:%M UTC").to_string(), time: Utc.timestamp(unix_time, 0).format("%b %e %Y %H:%M UTC").to_string(),
}; })
Ok(post)
} }
// COMMENTS // COMMENTS

View File

@ -25,13 +25,15 @@ pub struct Flags {
// Post containing content, metadata and media // Post containing content, metadata and media
pub struct Post { pub struct Post {
pub id: String,
pub title: String, pub title: String,
pub community: String, pub community: String,
pub body: String, pub body: String,
pub author: String, pub author: String,
pub author_flair: Flair, pub author_flair: Flair,
pub url: String, pub permalink: String,
pub score: String, pub score: String,
pub upvote_ratio: i64,
pub post_type: String, pub post_type: String,
pub flair: Flair, pub flair: Flair,
pub flags: Flags, pub flags: Flags,
@ -191,9 +193,11 @@ pub async fn fetch_posts(path: &str, fallback_title: String) -> Result<(Vec<Post
}; };
let unix_time: i64 = post["data"]["created_utc"].as_f64().unwrap_or_default().round() as i64; let unix_time: i64 = post["data"]["created_utc"].as_f64().unwrap_or_default().round() as i64;
let score = post["data"]["score"].as_i64().unwrap_or_default(); let score = post["data"]["score"].as_i64().unwrap_or_default();
let ratio: f64 = post["data"]["upvote_ratio"].as_f64().unwrap_or(1.0) * 100.0;
let title = val(post, "title"); let title = val(post, "title");
posts.push(Post { posts.push(Post {
id: val(post, "id"),
title: if title.is_empty() { fallback_title.to_owned() } else { title }, title: if title.is_empty() { fallback_title.to_owned() } else { title },
community: val(post, "subreddit"), community: val(post, "subreddit"),
body: rewrite_url(&val(post, "body_html")), body: rewrite_url(&val(post, "body_html")),
@ -204,6 +208,7 @@ pub async fn fetch_posts(path: &str, fallback_title: String) -> Result<(Vec<Post
val(post, "author_flair_text_color"), val(post, "author_flair_text_color"),
), ),
score: format_num(score), score: format_num(score),
upvote_ratio: ratio as i64,
post_type: "link".to_string(), post_type: "link".to_string(),
media: img, media: img,
flair: Flair( flair: Flair(
@ -219,7 +224,7 @@ pub async fn fetch_posts(path: &str, fallback_title: String) -> Result<(Vec<Post
nsfw: post["data"]["over_18"].as_bool().unwrap_or(false), nsfw: post["data"]["over_18"].as_bool().unwrap_or(false),
stickied: post["data"]["stickied"].as_bool().unwrap_or(false), stickied: post["data"]["stickied"].as_bool().unwrap_or(false),
}, },
url: val(post, "permalink"), permalink: val(post, "permalink"),
time: Utc.timestamp(unix_time, 0).format("%b %e '%y").to_string(), time: Utc.timestamp(unix_time, 0).format("%b %e '%y").to_string(),
}); });
} }

View File

@ -326,6 +326,24 @@ input[type="submit"]:hover { color: var(--accent); }
font-size: 16px; font-size: 16px;
} }
#post_footer {
display: flex;
justify-content: space-between;
opacity: 0.5;
font-size: 14px;
}
#post_links {
display: flex;
list-style: none;
padding: 0;
font-weight: bold;
}
#post_links > li {
margin-right: 15px;
}
.nsfw { .nsfw {
color: #FF5C5D; color: #FF5C5D;
margin-top: 20px; margin-top: 20px;

View File

@ -48,7 +48,7 @@
{% endif %} {% endif %}
<span class="datetime">{{ post.time }}</span> <span class="datetime">{{ post.time }}</span>
</p> </p>
<a href="{{ post.url }}" class="post_title"> <a href="{{ post.permalink }}" class="post_title">
{{ post.title }} {{ post.title }}
{% if post.flair.0 != "" %} {% if post.flair.0 != "" %}
<small class="post_flair" style="color:{{ post.flair.2 }}; background:{{ post.flair.1 }}">{{ post.flair.0 }}</small> <small class="post_flair" style="color:{{ post.flair.2 }}; background:{{ post.flair.1 }}">{{ post.flair.0 }}</small>
@ -62,6 +62,13 @@
<a id="post_url" href="{{ post.media }}">{{ post.media }}</a> <a id="post_url" href="{{ post.media }}">{{ post.media }}</a>
{% endif %} {% endif %}
<div class="post_body">{{ post.body }}</div> <div class="post_body">{{ post.body }}</div>
<div id="post_footer">
<ul id="post_links">
<li><a href="/{{ post.id }}">permalink</a></li>
<li><a href="https://reddit.com/{{ post.id }}">reddit</a></li>
</ul>
<p>{{ post.upvote_ratio }}% Upvoted</p>
</div>
</div> </div>
</div> </div>
<form id="sort"> <form id="sort">
@ -83,7 +90,7 @@
{% for reply3 in reply2.replies %} {% for reply3 in reply2.replies %}
{% call comment(reply3) %} {% call comment(reply3) %}
{% if reply3.replies.len() > 0 %} {% if reply3.replies.len() > 0 %}
<a class="deeper_replies" href="{{ post.url }}{{ reply3.id }}">&rarr; More replies</a> <a class="deeper_replies" href="{{ post.permalink }}{{ reply3.id }}">&rarr; More replies</a>
{% endif %} {% endif %}
</details></div> </details></div>
{% endfor %} {% endfor %}

View File

@ -39,7 +39,7 @@
{% if post.flair.0 != "" %} {% if post.flair.0 != "" %}
<small class="post_flair" style="color:{{ post.flair.2 }}; background:{{ post.flair.1 }}">{{ post.flair.0 }}</small> <small class="post_flair" style="color:{{ post.flair.2 }}; background:{{ post.flair.1 }}">{{ post.flair.0 }}</small>
{% endif %} {% endif %}
<a href="{{ post.url }}">{{ post.title }}</a> <a href="{{ post.permalink }}">{{ post.title }}</a>
</p> </p>
</div> </div>
<img class="post_thumbnail" src="{{ post.media }}"> <img class="post_thumbnail" src="{{ post.media }}">
@ -52,7 +52,7 @@
</div> </div>
<details class="comment_right" open> <details class="comment_right" open>
<summary class="comment_data"> <summary class="comment_data">
<a class="comment_link" href="{{ post.url }}">COMMENT</a> <a class="comment_link" href="{{ post.permalink }}">COMMENT</a>
<span class="datetime">{{ post.time }}</span> <span class="datetime">{{ post.time }}</span>
</summary> </summary>
<p class="comment_body">{{ post.body }}</p> <p class="comment_body">{{ post.body }}</p>

View File

@ -46,7 +46,7 @@
{% if post.flair.0 != "" %} {% if post.flair.0 != "" %}
<small class="post_flair" style="color:{{ post.flair.2 }}; background:{{ post.flair.1 }}">{{ post.flair.0 }}</small> <small class="post_flair" style="color:{{ post.flair.2 }}; background:{{ post.flair.1 }}">{{ post.flair.0 }}</small>
{% endif %} {% endif %}
<a href="{{ post.url }}">{{ post.title }}</a> <a href="{{ post.permalink }}">{{ post.title }}</a>
</p> </p>
</div> </div>
<img class="post_thumbnail" src="{{ post.media }}"> <img class="post_thumbnail" src="{{ post.media }}">

View File

@ -38,7 +38,7 @@
{% else %} {% else %}
<small class="post_flair" style="color:{{ post.flair.2 }}; background:{{ post.flair.1 }}">{{ post.flair.0 }}</small> <small class="post_flair" style="color:{{ post.flair.2 }}; background:{{ post.flair.1 }}">{{ post.flair.0 }}</small>
{% endif %} {% endif %}
<a href="{{ post.url }}">{{ post.title }}</a> <a href="{{ post.permalink }}">{{ post.title }}</a>
</p> </p>
</div> </div>
<img class="post_thumbnail" src="{{ post.media }}"> <img class="post_thumbnail" src="{{ post.media }}">
@ -51,7 +51,7 @@
</div> </div>
<details class="comment_right" open> <details class="comment_right" open>
<summary class="comment_data"> <summary class="comment_data">
<a class="comment_link" href="{{ post.url }}">COMMENT</a> <a class="comment_link" href="{{ post.permalink }}">COMMENT</a>
<span class="datetime">{{ post.time }}</span> <span class="datetime">{{ post.time }}</span>
</summary> </summary>
<p class="comment_body">{{ post.body }}</p> <p class="comment_body">{{ post.body }}</p>