2024-01-07 10:40:54 -05:00
|
|
|
use crate::{Error, EMBED_COLOR};
|
2023-12-07 22:01:13 -05:00
|
|
|
|
2023-12-30 23:57:27 -05:00
|
|
|
use gamedig::protocols::{
|
|
|
|
valve::{
|
|
|
|
Engine, GatheringSettings, Response
|
|
|
|
},
|
|
|
|
types::TimeoutSettings,
|
|
|
|
valve,
|
2023-12-29 07:00:44 -05:00
|
|
|
};
|
|
|
|
use std::{
|
2023-12-30 23:57:27 -05:00
|
|
|
str::FromStr,
|
|
|
|
net::SocketAddr,
|
|
|
|
time::Duration,
|
2023-12-29 07:00:44 -05:00
|
|
|
collections::HashMap,
|
|
|
|
env::var
|
|
|
|
};
|
2023-12-30 23:57:27 -05:00
|
|
|
use reqwest::{
|
|
|
|
Client,
|
|
|
|
header::USER_AGENT
|
|
|
|
};
|
2024-01-11 21:41:29 -05:00
|
|
|
use poise::CreateReply;
|
|
|
|
use serenity::builder::CreateEmbed;
|
2024-01-01 22:42:40 -05:00
|
|
|
use once_cell::sync::Lazy;
|
2023-12-11 20:35:57 -05:00
|
|
|
use cargo_toml::Manifest;
|
2023-12-07 22:01:13 -05:00
|
|
|
use serde_json::Value;
|
2023-12-08 06:25:44 -05:00
|
|
|
use tokio::join;
|
2023-12-07 22:01:13 -05:00
|
|
|
|
2024-01-01 22:42:40 -05:00
|
|
|
static PMS_BASE: Lazy<String> = Lazy::new(||
|
|
|
|
var("WG_PMS").expect("Expected a \"WG_PMS\" in the envvar but none was found")
|
|
|
|
);
|
2023-12-07 22:01:13 -05:00
|
|
|
|
2023-12-30 23:57:27 -05:00
|
|
|
fn query_server() -> Result<Response, Error> {
|
|
|
|
let server_ip = var("ATS_SERVER_IP").expect("Expected a \"ATS_SERVER_IP\" in the envvar but none was found");
|
|
|
|
let addr = SocketAddr::from_str(&server_ip).unwrap();
|
|
|
|
let engine = Engine::Source(None);
|
|
|
|
let gather_settings = GatheringSettings {
|
|
|
|
players: true,
|
|
|
|
rules: false,
|
|
|
|
check_app_id: false
|
|
|
|
};
|
|
|
|
|
|
|
|
let read_timeout = Duration::from_secs(2);
|
|
|
|
let write_timeout = Duration::from_secs(2);
|
|
|
|
let retries = 1;
|
|
|
|
let timeout_settings = TimeoutSettings::new(
|
|
|
|
Some(read_timeout),
|
|
|
|
Some(write_timeout),
|
|
|
|
retries
|
|
|
|
).unwrap();
|
|
|
|
|
|
|
|
let response = valve::query(
|
|
|
|
&addr,
|
|
|
|
engine,
|
|
|
|
Some(gather_settings),
|
|
|
|
Some(timeout_settings)
|
|
|
|
);
|
|
|
|
|
|
|
|
Ok(response?)
|
|
|
|
}
|
|
|
|
|
|
|
|
async fn pms_serverstatus(url: &str) -> Result<Vec<Value>, Error> {
|
|
|
|
let bot_version = Manifest::from_path("Cargo.toml").unwrap().package.unwrap().version.unwrap();
|
|
|
|
|
|
|
|
let client = Client::new();
|
|
|
|
let req = client.get(url)
|
|
|
|
.header(USER_AGENT, format!("Kon/{}/Rust", bot_version))
|
|
|
|
.send()
|
|
|
|
.await?;
|
|
|
|
let response = req.json::<HashMap<String, Value>>().await?;
|
|
|
|
let servers = response["data"].as_array().unwrap()[0]["servers_statuses"]["data"].as_array().unwrap().clone();
|
|
|
|
|
|
|
|
Ok(servers)
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Query the server statuses
|
|
|
|
#[poise::command(slash_command, subcommands("ats", "wg"), subcommand_required)]
|
|
|
|
pub async fn status(_: poise::Context<'_, (), Error>) -> Result<(), Error> {
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Retrieve the server status from ATS
|
|
|
|
#[poise::command(slash_command)]
|
|
|
|
pub async fn ats(ctx: poise::Context<'_, (), Error>) -> Result<(), Error> {
|
2024-01-11 21:41:29 -05:00
|
|
|
let embed = CreateEmbed::new().color(EMBED_COLOR);
|
2023-12-30 23:57:27 -05:00
|
|
|
match query_server() {
|
|
|
|
Ok(response) => {
|
2024-01-11 21:41:29 -05:00
|
|
|
ctx.send(CreateReply::default()
|
|
|
|
.embed(embed
|
2023-12-30 23:57:27 -05:00
|
|
|
.title("American Truck Simulator Server Status")
|
|
|
|
.fields(vec![
|
|
|
|
("Name", format!("{}", response.info.name), true),
|
|
|
|
("Players", format!("{}/{}", response.info.players_online, response.info.players_maximum), true)
|
|
|
|
])
|
|
|
|
)).await?;
|
|
|
|
}
|
|
|
|
Err(why) => println!("Error querying the server: {:?}", why)
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
2023-12-08 06:25:44 -05:00
|
|
|
/// Retrieve the server statuses from Wargaming
|
2023-12-07 22:01:13 -05:00
|
|
|
#[poise::command(slash_command)]
|
2023-12-30 23:57:27 -05:00
|
|
|
pub async fn wg(ctx: poise::Context<'_, (), Error>) -> Result<(), Error> {
|
2023-12-08 06:25:44 -05:00
|
|
|
let pms_asia = &PMS_BASE;
|
|
|
|
let pms_eu = PMS_BASE.replace("asia", "eu");
|
2024-01-11 21:41:29 -05:00
|
|
|
let embed = CreateEmbed::new().color(EMBED_COLOR);
|
2023-12-07 22:01:13 -05:00
|
|
|
|
2023-12-08 06:25:44 -05:00
|
|
|
let (servers_asia, servers_eu) = join!(pms_serverstatus(&pms_asia), pms_serverstatus(&pms_eu));
|
2023-12-07 22:01:13 -05:00
|
|
|
|
2023-12-08 06:25:44 -05:00
|
|
|
let mut embed_fields = Vec::new();
|
|
|
|
for server in servers_eu.unwrap() {
|
2023-12-07 22:01:13 -05:00
|
|
|
let name = server["name"].as_str().unwrap().to_owned();
|
|
|
|
let status = match server["availability"].as_str().unwrap() {
|
|
|
|
"1" => "Online",
|
|
|
|
"-1" => "Offline",
|
|
|
|
_ => "Unknown"
|
|
|
|
};
|
2023-12-08 06:25:44 -05:00
|
|
|
embed_fields.push((name, status, true));
|
2023-12-07 22:01:13 -05:00
|
|
|
}
|
|
|
|
|
2023-12-08 06:25:44 -05:00
|
|
|
for server in servers_asia.unwrap() {
|
2023-12-07 22:01:13 -05:00
|
|
|
let name = server["name"].as_str().unwrap().to_owned();
|
|
|
|
let status = match server["availability"].as_str().unwrap() {
|
|
|
|
"1" => "Online",
|
|
|
|
"-1" => "Offline",
|
|
|
|
_ => "Unknown"
|
|
|
|
};
|
2023-12-08 06:25:44 -05:00
|
|
|
embed_fields.push((name, status, true));
|
2023-12-07 22:01:13 -05:00
|
|
|
}
|
|
|
|
|
2024-01-11 21:41:29 -05:00
|
|
|
ctx.send(CreateReply::default().embed(embed.title("World of Tanks Server Status").fields(embed_fields))).await?;
|
2023-12-07 22:01:13 -05:00
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|