Skip to content

Instantly share code, notes, and snippets.

@PanIntegralus
Last active July 25, 2024 20:14
Show Gist options
  • Save PanIntegralus/5a0fc28e78f619fb713ef78bc9b29eeb to your computer and use it in GitHub Desktop.
Save PanIntegralus/5a0fc28e78f619fb713ef78bc9b29eeb to your computer and use it in GitHub Desktop.
Grab info from system and send to Discord Webhook

Didn't remember I made this when learning Rust.

use sysinfo::{
    Components, Disks, Networks, System,
};

use serde::Serialize;
use reqwest;

#[derive(Serialize)]
struct WebhookData {
    content: String,
}

#[tokio::main]
async fn main() {
    let mut webhook_message: String = "".to_string();
    // Please note that we use "new_all" to ensure that all list of
    // components, network interfaces, disks and users are already
    // filled!
    let mut sys = System::new_all();

    // First we update all information of our `System` struct.
    sys.refresh_all();

    webhook_message.push_str("# system:\n");
    // RAM and swap information:
    webhook_message.push_str(format!("total memory: {} bytes\n", sys.total_memory()).as_str());
    webhook_message.push_str(format!("used memory : {} bytes\n", sys.used_memory()).as_str());
    webhook_message.push_str(format!("total swap  : {} bytes\n", sys.total_swap()).as_str());
    webhook_message.push_str(format!("used swap   : {} bytes\n", sys.used_swap()).as_str());

    // Display system information:
    webhook_message.push_str(format!("System name:             {:?}\n", System::name()).as_str());
    webhook_message.push_str(format!("System kernel version:   {:?}\n", System::kernel_version()).as_str());
    webhook_message.push_str(format!("System OS version:       {:?}\n", System::os_version()).as_str());
    webhook_message.push_str(format!("System host name:        {:?}\n", System::host_name()).as_str());

    // Number of CPUs:
    webhook_message.push_str(format!("NB CPUs: {}\n", sys.cpus().len()).as_str());

    // We display all disks' information:
    webhook_message.push_str("# disks:\n");
    let disks = Disks::new_with_refreshed_list();
    for disk in &disks {
        webhook_message.push_str(format!("{disk:?}\n").as_str());
    }

    // Network interfaces name, total data received and total data transmitted:
    let networks = Networks::new_with_refreshed_list();
    webhook_message.push_str("# networks:\n");
    for (interface_name, data) in &networks {
        webhook_message.push_str(format!("{interface_name}: {} B (down) / {} B (up)\n", data.total_received(), data.total_transmitted()).as_str());
        // If you want the amount of data received/transmitted since last call
        // to `Networks::refresh`, use `received`/`transmitted`.
    }

    // Components temperature:
    let components = Components::new_with_refreshed_list();
    webhook_message.push_str("# components:\n");
    for component in &components {
        webhook_message.push_str(format!("{component:?}\n").as_str());
    }

    println!("{webhook_message}");
    let client = reqwest::Client::new();
    let data = WebhookData {
        content: webhook_message,
    };
    let json_data = serde_json::to_string(&data).unwrap();
    client
        .post("WEBHOOK_URL_HERE")
        .header("Content-Type", "application/json")
        .body(json_data)
        .send()
        .await;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment