first prototype

This commit is contained in:
Max Känner 2024-10-10 12:42:44 +02:00
parent 9c528e8e68
commit 36f6033320
5 changed files with 1462 additions and 3 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
/target
.envrc
.direnv

1368
Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -3,4 +3,13 @@ name = "vikunja-gatherer"
version = "0.1.0"
edition = "2021"
[lints.clippy]
pedantic = "warn"
nursery = "warn"
[dependencies]
chrono = "0.4.38"
markdown = "0.3.0"
regex = "1.11.0"
reqwest = { version = "0.12.8", features = ["blocking", "json"] }
serde = { version = "1.0.210", features = ["derive"] }

View File

@ -24,7 +24,10 @@
{
devShells.default = mkShell {
# 👇 we can just use `rustToolchain` here:
buildInputs = [ rustToolchain ];
buildInputs = [
rustToolchain
openssl
];
};
}
);

View File

@ -1,3 +1,81 @@
fn main() {
println!("Hello, world!");
use std::{env, fs};
use chrono::{Datelike, Utc};
use regex::Regex;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
struct Task {
title: String,
created: String,
description: String,
done: bool,
}
fn main() {
let client = reqwest::blocking::Client::new();
// get all tasks
let response = client
.get("https://vikunja.luhbots-hannover.de/api/v1/tasks/all")
.header(
reqwest::header::AUTHORIZATION,
format!("Bearer {}", env::var("VIKUNJA_TOKEN").unwrap()),
)
.query(&[
// search for tasks containing "Teamtreffen"
("s", "Teamtreffen"),
// sort by creation data
("sort_by", "created"),
// sort in descending order (newest first)
("order_by", "desc"),
])
.send()
.unwrap();
// get the task for today from the returned tasks
let now = Utc::now();
let current_card_title = format!(
"Teamtreffen {:02}.{:02}.{}",
now.day() - 1,
now.month(),
now.year()
);
println!("searching for task with title {current_card_title:?}");
let task = response
.json::<Vec<Task>>()
.unwrap()
.into_iter()
.find(|task| task.title == current_card_title)
.unwrap();
let re = Regex::new("<p>([^<]+)</p>").unwrap();
let points = re
.captures_iter(&task.description)
.map(|c| c.extract::<1>().1[0])
.collect::<Vec<_>>();
let template = fs::read_to_string("../vorlage.md").unwrap();
let mut template = template.replace(
"dd.mm.yyyy",
format!("{:02}.{:02}.{}", now.day(), now.month(), now.year()).as_str(),
);
template.extend(
points
.iter()
.filter(|point| **point != "Rasender Report" && **point != "Was ging die Woche?")
.map(|point| format!("\n# {point}\n")),
);
fs::write(
format!(
"{:02}.{:02}.{:02}.md",
now.year() % 100,
now.month(),
now.day()
),
template,
)
.unwrap();
}