cobble_core/minecraft/servers/
mod.rs

1mod server;
2
3use crate::error::CobbleResult;
4pub use server::*;
5use std::path::{Path, PathBuf};
6use tokio::task;
7
8/// Loads all servers from the minecraft folder.
9#[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}