Implement server notice to all users

This commit is contained in:
Brayd 2023-06-25 13:40:08 +02:00
parent 63b7c95e5f
commit 00f9fa6621
Signed by: brayd
GPG Key ID: C2B176B9DEB8BA48
1 changed files with 97 additions and 0 deletions

97
src/main.rs Normal file
View File

@ -0,0 +1,97 @@
use reqwest::Error;
use serde_json::json;
#[tokio::main]
async fn main() -> Result<(), Error> {
// Ask for the admin token
println!("Please enter the admin token:");
let mut token = String::new();
std::io::stdin().read_line(&mut token).expect("Failed to read line");
let token = token.trim();
// Ask for the server notice message
println!("Please enter the server notice message:");
let mut server_notice = String::new();
std::io::stdin().read_line(&mut server_notice).expect("Failed to read line");
let server_notice = server_notice.trim();
// Ask for the server's basis url
println!("Please enter the server's basis url (Example: https://matrix.org):");
let mut server_url = String::new();
std::io::stdin().read_line(&mut server_url).expect("Failed to read line");
let server_url = server_url.trim();
get_users(token, server_notice, server_url).await?;
Ok(())
}
async fn get_users(token: &str, server_notice: &str, server_url: &str) -> Result<(), Error> {
let token_formatted = format!("Bearer {}", token);
let url_formatted = format!("{}/_synapse/admin/v2/users", server_url);
let client = reqwest::Client::new();
let res = client.get(&url_formatted)
.header("Authorization", token_formatted)
.send()
.await?;
println!("Status: {}", res.status());
let body = res.text().await?;
// Get all name values from the json response and print them out
let json: serde_json::Value = serde_json::from_str(&body).unwrap();
let users = json["users"].as_array().unwrap();
// Get all name values from the json response write them to a list and print them out
let mut user_list = Vec::new();
for user in users {
user_list.push(user["name"].to_string());
}
println!("{:?}", user_list[0]);
// let user_id = user_list[0].clone();
// let user_id_trimmed = &user_id[1..user_id.len() - 1];
for user in user_list {
println!("{}", user);
send_server_notice(token, user, server_notice, server_url).await?;
}
// get_user_by_id(token, user_id).await?;
Ok(())
}
// Send a server notification to a user as defined in the homeserver.yaml
async fn send_server_notice(token: &str, user: String, server_notice: &str, server_url: &str) -> Result<(), Error> {
let token_formatted = format!("Bearer {}", token);
let url_formatted = format!("{}/_synapse/admin/v1/send_server_notice", server_url);
// Trim the user id to remove the quotation marks
let user_trimmed = &user[1..user.len() - 1];
let client = reqwest::Client::new();
let res = client.post(url_formatted)
.header("Authorization", token_formatted)
.json(&json!({
"user_id": user_trimmed,
"content": {
"msgtype": "m.text",
"body": server_notice
}
}))
.send()
.await?;
println!("Status: {}", res.status());
let body = res.text().await?;
println!("{}", body);
Ok(())
}