From 4219b1d5d82ccf9589d03db1ea0b2449db159d31 Mon Sep 17 00:00:00 2001 From: prcrst Date: Fri, 7 Jul 2023 22:44:11 +0200 Subject: [PATCH] Prevent duplicate posts --- src/helper.rs | 6 ++-- src/main.rs | 92 +++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 77 insertions(+), 21 deletions(-) diff --git a/src/helper.rs b/src/helper.rs index b98dbf8..0c8ebc5 100644 --- a/src/helper.rs +++ b/src/helper.rs @@ -58,11 +58,11 @@ pub async fn get_community_id( Ok(data.community_view.community.id) } -pub async fn lemmy_login(client: &Client) -> Result, Box> { +pub async fn lemmy_login(client: &Client, user: &Sensitive, password: &Sensitive) -> Result, Box> { println!("Logging in"); let params = Login { - username_or_email: lemmy_user(), - password: lemmy_password()?, + username_or_email: user.clone(), + password: password.clone(), ..Default::default() }; diff --git a/src/main.rs b/src/main.rs index ecfac4a..ee36b7f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,16 +1,27 @@ use chrono::{Datelike, Month, Utc}; -use lemmy_api_common::{post::{CreatePost, PostResponse}, sensitive::Sensitive, lemmy_db_schema::newtypes::PostId}; +use lemmy_api_common::{ + lemmy_db_schema::{newtypes::PostId, source::post::Post, SortType}, + person::{GetPersonDetails, GetPersonDetailsResponse}, + post::{CreatePost, PostResponse}, + sensitive::Sensitive, +}; use reqwest::{Client, Url}; use serde::Deserialize; mod helper; -use crate::helper::{get_community_id, lemmy_community, lemmy_login}; +use crate::helper::{get_community_id, lemmy_community, lemmy_login, lemmy_password, lemmy_user}; #[derive(Debug, Deserialize, Default)] struct WordleData { days_since_launch: i64, } +impl std::fmt::Display for WordleData { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(f, "{}", self.days_since_launch) + } +} + async fn get_current_nyt_wordle_data() -> Result> { println!("Fetching NYT wordle data"); let now = Utc::now(); @@ -21,27 +32,22 @@ async fn get_current_nyt_wordle_data() -> Result().await?; - println!("{:?}", data); + println!("Wordle number: {}", data); Ok(data) } -async fn post_to_lemmy(data: &WordleData, client: &Client, auth: Sensitive) -> Result> { - println!("Posting to lemmy: {:?}", data); +async fn post_to_lemmy( + data: &WordleData, + client: &Client, + auth: Sensitive, + date: &chrono::DateTime, +) -> Result> { + println!("Posting number {} to lemmy", data); // Get the community id let community_id = get_community_id(client, lemmy_community()).await?; - let now = Utc::now(); - - let month = Month::try_from(now.month() as u8)?; - let title = format!( - "Wordle #{} - {} {} {} {}", - data.days_since_launch, - now.weekday(), - now.day(), - month.name(), - now.year() - ); + let title = make_title(data, date)?; let url = Url::parse( format!( "https://www.nytimes.com/games/wordle/index.html#{}", @@ -69,14 +75,64 @@ async fn post_to_lemmy(data: &WordleData, client: &Client, auth: Sensitive, +) -> Result> { + let month = Month::try_from(date.month() as u8)?; + Ok(format!( + "Wordle #{} - {} {} {} {}", + data.days_since_launch, + date.weekday(), + date.day(), + month.name(), + date.year() + )) +} + +async fn get_latest_post( + client: &Client, + user: &Sensitive, +) -> Result, Box> { + let params = GetPersonDetails { + username: Some(user.to_string()), + sort: Some(SortType::New), + ..Default::default() + }; + + let response = client + .get(helper::api_url("user")) + .query(¶ms) + .send() + .await?; + + // let data = response.text().await?; + + let data = response.json::().await?; + if let Some(postview) = data.posts.first() { + return Ok(Some(postview.post.clone())); + } + Ok(None) +} + #[tokio::main] async fn main() -> Result<(), Box> { println!("A wordle a day keeps the doctor away!"); + let now = Utc::now(); + let user = lemmy_user(); + let password = lemmy_password()?; + let client = Client::new(); - let auth = lemmy_login(&client).await?; + let auth = lemmy_login(&client, &user, &password).await?; let data = get_current_nyt_wordle_data().await?; - let id = post_to_lemmy(&data, &client, auth).await?; + if let Some(latest_post) = get_latest_post(&client, &user).await? { + if latest_post.name == make_title(&data, &now)? { + println!("The current wordle has already been posted."); + return Ok(()); + } + } + let id = post_to_lemmy(&data, &client, auth, &now).await?; println!("New post ID: {}", id); Ok(())