this repo has no description
3
fork

Configure Feed

Select the types of activity you want to include in your feed.

*: cache session, moar refactoring

Gee Sawra 36d99e18 21fe78e9

+50 -21
+50 -21
src/lib.rs
··· 4 4 use atrium_api::types; 5 5 use atrium_api::types::string::Datetime; 6 6 use bsky_sdk::BskyAgent; 7 + use std::fmt::Display; 7 8 use std::sync::LazyLock; 8 9 use worker::*; 9 10 mod model; 10 11 11 12 const KV_MAIN: &str = "skeetfm"; 13 + const KV_SESSION: &str = "session_data"; 12 14 static KV_PREFIX: LazyLock<String> = LazyLock::new(|| KV_MAIN.to_string() + "_"); 13 15 static KV_BLOB_CACHE: LazyLock<String> = LazyLock::new(|| KV_PREFIX.clone() + "blobcache"); 14 16 ··· 25 27 async fn get_now_playing(u: String) -> Option<model::NowPlaying> { 26 28 let res: model::Root = reqwest::get(u).await.unwrap().json().await.unwrap(); 27 29 28 - for e in res.recenttracks.track { 29 - match e.attr { 30 - Some(a) => { 31 - if a.nowplaying == "false" || a.nowplaying.is_empty() { 32 - continue; 33 - } 30 + let track = match res.recenttracks.track.first() { 31 + Some(t) => t, 32 + None => return None, 33 + }; 34 34 35 - let img = e.image.iter().find(|i| i.size == "extralarge"); 35 + if let Some(attr) = track.attr.clone() { 36 + match attr.nowplaying.as_str() { 37 + "false" | "" => return None, 38 + "true" => { 39 + let img = track.image.iter().find(|i| i.size == "extralarge"); 36 40 return Some(model::NowPlaying { 37 - artist: e.artist.text, 38 - title: e.name, 39 - url: e.url, 41 + artist: track.artist.text.clone(), 42 + title: track.name.clone(), 43 + url: track.url.clone(), 40 44 image: img.unwrap().text.clone(), 41 45 }); 42 46 } 43 - None => return None, 47 + _ => return None, 44 48 } 45 49 } 46 50 ··· 106 110 pass: String, 107 111 pds: String, 108 112 ) { 109 - let agent = BskyAgent::builder() 110 - .config(bsky_sdk::agent::config::Config { 111 - endpoint: pds, 112 - ..Default::default() 113 - }) 114 - .build() 115 - .await 116 - .unwrap(); 117 - 118 - agent.login(user, pass).await.unwrap(); 113 + let agent = bsky_agent(env, user, pass, pds).await; 119 114 120 115 agent 121 116 .create_record(feed::post::RecordData { ··· 131 126 }) 132 127 .await 133 128 .unwrap(); 129 + } 130 + 131 + async fn bsky_agent(env: &Env, user: String, pass: String, pds: String) -> BskyAgent { 132 + let kv = env.kv(KV_MAIN).unwrap(); 133 + 134 + let agent = BskyAgent::builder() 135 + .config(bsky_sdk::agent::config::Config { 136 + endpoint: pds, 137 + ..Default::default() 138 + }) 139 + .build() 140 + .await 141 + .unwrap(); 142 + 143 + env.secret("asd").unwrap().fmt(f) 144 + 145 + let login = async || { 146 + let s = agent.login(user.clone(), pass.clone()).await.unwrap(); 147 + kv.put(KV_SESSION, serde_json::to_string(&s).unwrap()) 148 + .unwrap() 149 + .execute() 150 + .await 151 + .unwrap(); 152 + }; 153 + 154 + if let Some(s) = kv.get(KV_SESSION).json().await.unwrap() { 155 + if agent.resume_session(s).await.is_ok() { 156 + return agent; 157 + } 158 + }; 159 + 160 + login().await; 161 + 162 + agent 134 163 } 135 164 136 165 struct Vars {