From d64a0e494ff936602ac82c07d33767aa6fae80b6 Mon Sep 17 00:00:00 2001 From: alterwain Date: Mon, 17 Mar 2025 15:52:58 +0300 Subject: [PATCH] Servers instances added modified: src/config.rs modified: src/launcher.rs modified: src/main.rs modified: src/minecraft.rs modified: src/www/portable.html --- src/config.rs | 4 ++++ src/launcher.rs | 9 +++++++++ src/main.rs | 12 ++++++++++++ src/minecraft.rs | 14 ++++++++++++++ src/www/portable.html | 30 ++++++++++++++++++++++-------- 5 files changed, 61 insertions(+), 8 deletions(-) diff --git a/src/config.rs b/src/config.rs index ab5d288..a1ce667 100644 --- a/src/config.rs +++ b/src/config.rs @@ -61,6 +61,10 @@ impl LauncherConfig { self.user_name = user_name; } + pub fn servers(&self) -> &Vec { + &self.servers + } + pub fn add_server(&mut self, server: LauncherServer) { self.servers.push(server); } diff --git a/src/launcher.rs b/src/launcher.rs index c43854a..2562669 100644 --- a/src/launcher.rs +++ b/src/launcher.rs @@ -107,6 +107,15 @@ impl Launcher { } } + pub async fn get_servers_list(&self) -> Vec<(String, String, Option)> { + let mut v = Vec::new(); + let servers = self.config.servers(); + for server in servers { + v.push((server.domain.clone(), server.credentials.username.clone(), minecraft::server::get_server_icon(&server.domain, server.port).await.unwrap_or(None))); + } + v + } + pub fn get_instances_list(&self) -> Vec<(String, String, String)> { let mut v = Vec::new(); let mut instances = self.config.launcher_dir(); diff --git a/src/main.rs b/src/main.rs index e1fbedf..4bdefd8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -159,6 +159,18 @@ async fn main() { responder.respond(Response::new(serde_json::to_vec(&UIMessage { params: v }).unwrap())); } + "fetch_servers_list" => { + let resp = launcher.get_servers_list().await; + let mut v: Vec = Vec::new(); + v.push("fetch_servers_list".to_string()); + for (domain, nickname, image) in resp { + v.push(domain); + v.push(nickname); + v.push(image.unwrap_or(String::new())); + } + + responder.respond(Response::new(serde_json::to_vec(&UIMessage { params: v }).unwrap())); + } "check_download_status" => { if let Ok((percent, text)) = dl_rec.try_recv() { responder.respond(Response::new(serde_json::to_vec(&UIMessage { params: vec!["update_downloads".to_string(), text, percent.to_string()] }).unwrap())); diff --git a/src/minecraft.rs b/src/minecraft.rs index 0f892ce..f6907be 100644 --- a/src/minecraft.rs +++ b/src/minecraft.rs @@ -195,6 +195,20 @@ pub mod session { } } +pub mod server { + use std::error::Error; + + use base64::{prelude::BASE64_STANDARD, Engine}; + use surf::StatusCode; + + pub async fn get_server_icon(server: &str, port: u16) -> Result, Box> { + let mut r = surf::get(["https://eu.mc-api.net/v3/server/favicon/", server,":", &port.to_string()].concat()).await?; + if r.status() != StatusCode::Ok { return Ok(None); } + let resp = r.body_bytes().await.unwrap(); + Ok(Some(["data:image/png;base64,", &BASE64_STANDARD.encode(resp)].concat())) + } +} + pub mod assets { use std::{collections::HashMap, error::Error, path::PathBuf}; use serde::{Deserialize, Serialize}; diff --git a/src/www/portable.html b/src/www/portable.html index 5add9c4..fde6637 100644 --- a/src/www/portable.html +++ b/src/www/portable.html @@ -60,7 +60,7 @@
  • @@ -405,13 +405,6 @@ @@ -444,6 +437,9 @@ } else if( params[i] == "set_instances_list" ) { setInstancesList(params.slice(i+1)); break; + } else if( params[i] == "fetch_servers_list" ) { + setServersList(params.slice(i+1)); + break; } else if( params[i] == "locate_java" ) { setJavaPath(params[i+1]); break; @@ -534,6 +530,20 @@ } } + function setServersList(params) { + $(".server-instance").remove(); + for( let i = 0; i < params.length; i+=3) { + let instance = `
    + +
    +

    `+params[i]+`

    +

    `+params[i+1]+`

    +
    +
    `; + $("#servers-section").append(instance); + } + } + function updateDownloads(params) { let text = params[0]; let percentage = params[1]; @@ -547,6 +557,10 @@ } } + function showServersSection() { + $.post({url: "fetch_servers_list" }, processParams); + } + function showInstancesSection() { $.post({url: "fetch_instances_list" }, processParams); }