4 Commits

Author SHA1 Message Date
Lukas Wölfer
22fa677d8a Wrapped test 2025-08-12 21:43:06 +02:00
Lukas Wölfer
2faf8038fe Minor testing 2025-08-12 21:21:47 +02:00
Lukas Wölfer
33180e95a3 Worked on fetching 2025-08-12 21:03:49 +02:00
Lukas Wölfer
f37ca5e627 Made watchdog less verbose 2025-08-01 16:21:31 +02:00
7 changed files with 55 additions and 14 deletions

2
Cargo.lock generated
View File

@@ -2448,7 +2448,7 @@ dependencies = [
[[package]]
name = "teachertracker-rs"
version = "0.1.0"
version = "0.1.2"
dependencies = [
"chrono",
"futures",

View File

@@ -1,6 +1,6 @@
[package]
name = "teachertracker-rs"
version = "0.1.0"
version = "0.1.2"
edition = "2024"
authors = ["Lukas Wölfer <coding@thasky.one>"]
description = "A MediaWiki bot that updates score information of teachers"

1
emeline.json Normal file

File diff suppressed because one or more lines are too long

View File

@@ -51,6 +51,8 @@ pub struct CompState {
pub rank: DanceRank,
pub points: u16,
}
#[derive(Debug)]
pub struct DanceInfo {
pub firstname: String,
pub lastname: String,

View File

@@ -17,7 +17,7 @@ use mwbot::{
Bot,
generators::{Generator, SortDirection, categories::CategoryMemberSort},
};
use std::{error::Error, path::Path};
use std::path::Path;
use crate::watchdog::watch_wanted;

View File

@@ -11,11 +11,17 @@ pub async fn watch_wanted(bot: Bot) -> ! {
let _enter = span.enter();
let mut ignored_ids = vec![];
let mut watch_count = 0;
loop {
if ignored_ids.is_empty() {
tracing::info!("Watchdog check...");
watch_count += 1;
if watch_count >= 120 {
watch_count = 0;
let failed_id_info = if ignored_ids.is_empty() {
String::new()
} else {
tracing::info!("Watchdog check [{} failed ids]...", ignored_ids.len());
format!("[{} failed ids]", ignored_ids.len())
};
tracing::info!("Watchdog check{failed_id_info}...");
}
let wanted = wanted_ids(bot.clone()).await;
let mut new_ignored = vec![];

View File

@@ -11,14 +11,20 @@ pub async fn fetch_wsdc_info(id: u32) -> Result<DanceInfo, DanceInfoError> {
.map_err(DanceInfoError::ClientBuild)?;
let mut params = HashMap::new();
params.insert("q", id.to_string());
let response = client
.request(
reqwest::Method::POST,
"https://points.worldsdc.com/lookup2020/find",
)
let url = if cfg!(test) {
"https://o5grQU3Y.free.beeceptor.com/lookup2020/find"
} else {
"https://points.worldsdc.com/lookup2020/find"
};
params.insert("num", id.to_string());
let request = client
.request(reqwest::Method::POST, url)
.form(&params)
.send()
.build()
.map_err(DanceInfoError::RequestBuild)?;
let response = client
.execute(request)
.await
.map_err(DanceInfoError::Request)?;
@@ -26,10 +32,36 @@ pub async fn fetch_wsdc_info(id: u32) -> Result<DanceInfo, DanceInfoError> {
Ok(x.into())
}
#[cfg(test)]
mod tests {
#![allow(clippy::unwrap_used, reason="Allow unwrap in tests")]
use crate::worldsdc::fetch_wsdc_info;
#[test]
#[ignore = "Only run when the mock api is setup"]
fn test_fetch_wsdc() {
let rt = match tokio::runtime::Builder::new_current_thread()
.enable_all()
.build()
{
Ok(o) => o,
Err(e) => {
tracing::error!("Could not start runtime: {e}");
return;
}
};
let x = rt.block_on(fetch_wsdc_info(7));
dbg!(&x);
x.unwrap();
}
}
#[derive(thiserror::Error, Debug)]
pub enum DanceInfoError {
#[error("Failed to build client: {0}")]
ClientBuild(reqwest::Error),
#[error("Failed to build request: {0}")]
RequestBuild(reqwest::Error),
#[error("Request error: {0}")]
Request(reqwest::Error),
#[error("Failed to parse response: {0}")]