feat(tazjin/tgsa): cache generated bbcode in-memory per message
Change-Id: Id36266ef20585bfbdffb197ab08aba2978cb86cb Reviewed-on: https://cl.tvl.fyi/c/depot/+/5471 Reviewed-by: tazjin <tazjin@tvl.su> Autosubmit: tazjin <tazjin@tvl.su> Tested-by: BuildkiteCI
This commit is contained in:
parent
78c966dc78
commit
91198685b4
1 changed files with 27 additions and 8 deletions
|
@ -1,6 +1,8 @@
|
||||||
use anyhow::{anyhow, Context, Result};
|
use anyhow::{anyhow, Context, Result};
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use std::sync::RwLock;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
|
||||||
struct TgLink {
|
struct TgLink {
|
||||||
username: String,
|
username: String,
|
||||||
message_id: usize,
|
message_id: usize,
|
||||||
|
@ -34,6 +36,7 @@ impl TgLink {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fetch_embed(link: &TgLink) -> Result<String> {
|
fn fetch_embed(link: &TgLink) -> Result<String> {
|
||||||
|
println!("fetching {}#{}", link.username, link.message_id);
|
||||||
let response = crimp::Request::get(&link.to_url())
|
let response = crimp::Request::get(&link.to_url())
|
||||||
.send()
|
.send()
|
||||||
.context("failed to fetch embed data")?
|
.context("failed to fetch embed data")?
|
||||||
|
@ -159,15 +162,28 @@ fn to_bbcode(link: &TgLink, msg: &TgMessage) -> Result<String> {
|
||||||
Ok(out)
|
Ok(out)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_tg_link(link: &TgLink) -> Result<String> {
|
type Cache = RwLock<HashMap<TgLink, String>>;
|
||||||
|
|
||||||
|
fn handle_tg_link(cache: &Cache, link: &TgLink) -> Result<String> {
|
||||||
|
if let Some(bbcode) = cache.read().unwrap().get(&link) {
|
||||||
|
println!("serving {}#{} from cache", link.username, link.message_id);
|
||||||
|
return Ok(bbcode.to_string());
|
||||||
|
}
|
||||||
|
|
||||||
let embed = fetch_embed(&link)?;
|
let embed = fetch_embed(&link)?;
|
||||||
let msg = parse_tgmessage(&embed)?;
|
let msg = parse_tgmessage(&embed)?;
|
||||||
to_bbcode(&link, &msg).context("failed to make bbcode")
|
let bbcode = to_bbcode(&link, &msg).context("failed to make bbcode")?;
|
||||||
|
|
||||||
|
cache.write().unwrap().insert(link.clone(), bbcode.clone());
|
||||||
|
|
||||||
|
Ok(bbcode)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
crimp::init();
|
crimp::init();
|
||||||
|
|
||||||
|
let cache: Cache = RwLock::new(HashMap::new());
|
||||||
|
|
||||||
rouille::start_server("0.0.0.0:8472", move |request| {
|
rouille::start_server("0.0.0.0:8472", move |request| {
|
||||||
match TgLink::parse(request.raw_url()) {
|
match TgLink::parse(request.raw_url()) {
|
||||||
None => rouille::Response::text(
|
None => rouille::Response::text(
|
||||||
|
@ -194,16 +210,19 @@ pm me on the forums if this makes you mad or something.
|
||||||
"#,
|
"#,
|
||||||
),
|
),
|
||||||
Some(link) => {
|
Some(link) => {
|
||||||
let result = handle_tg_link(&link);
|
let result = handle_tg_link(&cache, &link);
|
||||||
match result {
|
match result {
|
||||||
Ok(bbcode) => rouille::Response::text(bbcode),
|
Ok(bbcode) => rouille::Response::text(bbcode),
|
||||||
Err(err) => rouille::Response::text(format!(
|
Err(err) => {
|
||||||
|
println!("something failed: {}", err);
|
||||||
|
rouille::Response::text(format!(
|
||||||
r#"something broke: {}
|
r#"something broke: {}
|
||||||
|
|
||||||
nobody has been alerted about this and it has probably not been
|
nobody has been alerted about this and it has probably not been
|
||||||
logged. pm me on the forums if you think it's important enough."#,
|
logged. pm me on the forums if you think it's important enough."#,
|
||||||
err
|
err
|
||||||
)),
|
))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue