feat: add minecraft ping command
ci/woodpecker/push/lint Pipeline was successful Details
ci/woodpecker/push/clippy Pipeline was successful Details
ci/woodpecker/push/build Pipeline was successful Details

user-register
Jef Roosens 2023-05-15 14:24:31 +02:00
parent 38994a29a0
commit c966529a2b
Signed by: Jef Roosens
GPG Key ID: B75D4F293C7052DB
2 changed files with 49 additions and 1 deletions

View File

@ -0,0 +1,47 @@
use crate::{Context, Error};
use async_minecraft_ping::ServerDescription;
const DEFAULT_SERVER: &str = "rustybever.be";
/// Ping a minecraft server
#[poise::command(prefix_command, slash_command)]
pub async fn ping_mc(
ctx: Context<'_>,
#[description = "Address of the server"] address: Option<String>,
#[description = "Port the server runs on"] port: Option<u16>,
) -> Result<(), Error> {
let mut full_name = address.unwrap_or(DEFAULT_SERVER.to_string());
let mut builder = async_minecraft_ping::ConnectionConfig::build(&full_name);
if let Some(port) = port {
builder = builder.with_port(port);
full_name += &format!(":{}", port);
}
let conn = builder.connect().await?;
let status = conn.status().await?.status;
let description = match status.description {
ServerDescription::Plain(s) => s,
ServerDescription::Object { text } => text,
};
ctx.send(|f| {
f.embed(|e| {
e.description(format!("Server information for {}", full_name))
.field("version", status.version.name, false)
.field("description", description, false)
.field(
"players",
format!(
"{} of {} player(s) online",
status.players.online, status.players.max
),
false,
)
})
})
.await?;
Ok(())
}

View File

@ -1,9 +1,10 @@
mod affluence;
mod minecraft;
use crate::{Context, Data, Error};
pub fn commands() -> Vec<poise::structs::Command<Data, Error>> {
vec![help(), affluence::available()]
vec![help(), affluence::available(), minecraft::ping_mc()]
}
/// Show this help menu