cobble_core/minecraft/servers/
mod.rs1mod server;
2
3use crate::error::CobbleResult;
4pub use server::*;
5use std::path::{Path, PathBuf};
6use tokio::task;
7
8#[cfg_attr(doc_cfg, doc(cfg(feature = "servers")))]
10#[instrument(name = "load_servers", level = "debug", skip_all, fields(servers_file))]
11pub async fn load_servers(servers_file: impl AsRef<Path> + Send) -> CobbleResult<Vec<Server>> {
12 if !servers_file.as_ref().is_file() {
13 trace!("servers.dat does not exist.");
14 return Ok(vec![]);
15 }
16
17 trace!("Reading servers from file...");
18 let servers_file = PathBuf::from(servers_file.as_ref());
19 task::spawn_blocking(move || {
20 let nbt_file = std::fs::File::open(&servers_file)?;
21
22 let servers = fastnbt::from_reader::<_, ServersDat>(nbt_file)?
23 .servers
24 .into_iter()
25 .map(|server| {
26 let accept_textures = match server.accept_textures {
27 Some(0) => AcceptTextures::Disabled,
28 Some(1) => AcceptTextures::Enabled,
29 _ => AcceptTextures::Prompt,
30 };
31
32 Server {
33 name: server.name,
34 ip: server.ip,
35 accept_textures,
36 path: servers_file.clone(),
37 }
38 })
39 .collect::<Vec<_>>();
40
41 Ok(servers)
42 })
43 .await?
44}