discord-bot/src/bin/update_data.rs

124 lines
2.7 KiB
Rust
Raw Normal View History

use skynet_discord_bot::{db_init, get_config, get_server_config_bulk, Config, ServerMembers, Servers, Wolves};
2023-10-27 00:39:03 +00:00
use serde::{Deserialize, Serialize};
use serenity::model::id::GuildId;
use sqlx::{Pool, Sqlite};
#[tokio::main]
async fn main() {
let config = get_config();
let db = match db_init(&config).await {
Ok(x) => x,
Err(_) => return,
};
2023-09-16 18:47:39 +00:00
// handle wolves api here
2023-10-27 00:39:03 +00:00
get_wolves(&db, &config).await;
2023-09-16 18:47:39 +00:00
}
2023-10-27 00:39:03 +00:00
#[derive(Deserialize, Serialize, Debug)]
struct WolvesResultUser {
committee: String,
wolves_id: String,
first_name: String,
last_name: String,
contact_email: String,
2023-10-27 00:39:03 +00:00
student_id: Option<String>,
note: Option<String>,
2023-09-16 18:47:39 +00:00
expiry: String,
2023-10-27 00:39:03 +00:00
requested: String,
approved: String,
sitename: String,
domain: String,
2023-09-16 18:47:39 +00:00
}
2023-10-27 00:39:03 +00:00
#[derive(Deserialize, Serialize, Debug)]
struct WolvesResult {
success: i8,
result: Vec<WolvesResultUser>,
}
2023-10-27 00:39:03 +00:00
#[derive(Deserialize, Serialize, Debug)]
struct WolvesResultLocal {
pub id_wolves: String,
pub email: String,
pub expiry: String,
}
2023-10-27 00:39:03 +00:00
async fn get_wolves(db: &Pool<Sqlite>, config: &Config) {
for server_config in get_server_config_bulk(db).await {
let Servers {
server,
2023-10-27 00:39:03 +00:00
wolves_api,
..
} = server_config;
2023-09-11 19:03:56 +00:00
2023-10-27 00:39:03 +00:00
for user in get_wolves_sub(config, &wolves_api).await {
2023-09-11 19:03:56 +00:00
add_users_wolves(db, &server, &user).await;
}
}
}
2023-10-27 00:39:03 +00:00
async fn get_wolves_sub(config: &Config, wolves_api: &str) -> Vec<WolvesResultUser> {
if config.wolves_url.is_empty() {
return vec![];
}
// get wolves data
if let Ok(mut res) = surf::post(&config.wolves_url).header("X-AM-Identity", wolves_api).await {
if let Ok(WolvesResult {
success,
result,
}) = res.body_json().await
{
if success != 1 {
return vec![];
}
return result;
}
}
vec![]
}
async fn add_users_wolves(db: &Pool<Sqlite>, server: &GuildId, user: &WolvesResultUser) {
// expiry
match sqlx::query_as::<_, Wolves>(
2023-09-11 19:03:56 +00:00
"
2023-09-17 23:03:25 +00:00
INSERT INTO wolves (id_wolves, email)
VALUES ($1, $2)
ON CONFLICT(id_wolves) DO UPDATE SET email = $2
2023-09-16 18:47:39 +00:00
",
)
2023-10-27 00:39:03 +00:00
.bind(&user.wolves_id)
.bind(&user.contact_email)
2023-09-16 18:47:39 +00:00
.fetch_optional(db)
.await
{
Ok(_) => {}
Err(e) => {
println!("Failure to insert into Wolves {:?}", user);
2023-09-16 18:47:39 +00:00
println!("{:?}", e);
}
}
match sqlx::query_as::<_, ServerMembers>(
2023-09-16 18:47:39 +00:00
"
INSERT OR REPLACE INTO server_members (server, id_wolves, expiry)
VALUES (?1, ?2, ?3)
",
)
2023-09-11 19:03:56 +00:00
.bind(*server.as_u64() as i64)
2023-10-27 00:39:03 +00:00
.bind(&user.wolves_id)
2023-09-11 19:03:56 +00:00
.bind(&user.expiry)
.fetch_optional(db)
.await
{
Ok(_) => {}
Err(e) => {
println!("Failure to insert into ServerMembers {} {:?}", server.as_u64(), user);
println!("{:?}", e);
}
}
2023-09-11 19:03:56 +00:00
}