From c72ecb8847aeccbbb86eb55d5b27b28b392e6c14 Mon Sep 17 00:00:00 2001 From: zsyg <3872006562@qq.com> Date: Fri, 17 Oct 2025 21:46:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=B8=8B=E8=BD=BD=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E4=B8=AD=E7=89=88=E6=9C=AC=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MCSJ.csproj | 20 +++++++++++ Program.cs | 45 ++++++++++++++++++++++++ Tools/DownloadService.cs | 72 ++++++++++++++++++++++++++++++++++++++ Tools/VersionManager.cs | 75 ++++++++++++++++++++++++++++++++++++++++ resources/serverlist.txt | 5 +++ 5 files changed, 217 insertions(+) create mode 100644 MCSJ.csproj create mode 100644 Program.cs create mode 100644 Tools/DownloadService.cs create mode 100644 Tools/VersionManager.cs create mode 100644 resources/serverlist.txt diff --git a/MCSJ.csproj b/MCSJ.csproj new file mode 100644 index 0000000..9b5322e --- /dev/null +++ b/MCSJ.csproj @@ -0,0 +1,20 @@ + + + + Exe + net8.0 + enable + enable + + + + + + + + + PreserveNewest + + + + diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..5c459b2 --- /dev/null +++ b/Program.cs @@ -0,0 +1,45 @@ +using System; +using System.Threading.Tasks; +using MCSJ.Tools; + +namespace MCSJ +{ + class Program + { + static async Task Main(string[] args) + { + var versionManager = new VersionManager(); + var downloadService = new DownloadService(versionManager); + + while (true) + { + Console.WriteLine("MC服务器下载工具"); + Console.WriteLine("1. 显示所有版本"); + Console.WriteLine("2. 下载指定版本"); + Console.WriteLine("3. 退出"); + Console.Write("请选择操作: "); + + var input = Console.ReadLine(); + + switch (input) + { + case "1": + versionManager.DisplayAllVersions(); + break; + case "2": + Console.Write("请输入要下载的版本名称: "); + var version = Console.ReadLine(); + await downloadService.DownloadVersion(version); + break; + case "3": + return; + default: + Console.WriteLine("无效输入,请重新选择"); + break; + } + + Console.WriteLine(); + } + } + } +} diff --git a/Tools/DownloadService.cs b/Tools/DownloadService.cs new file mode 100644 index 0000000..761150f --- /dev/null +++ b/Tools/DownloadService.cs @@ -0,0 +1,72 @@ +using System; +using System.IO; +using System.Net.Http; +using System.Threading.Tasks; + +namespace MCSJ.Tools +{ + public class DownloadService + { + private readonly VersionManager _versionManager; + private readonly HttpClient _httpClient; + + public DownloadService(VersionManager versionManager) + { + _versionManager = versionManager; + _httpClient = new HttpClient(); + } + + public async Task DownloadVersion(string version) + { + var url = _versionManager.GetDownloadUrl(version); + if (url == null) + { + Console.WriteLine($"版本 {version} 不存在"); + return; + } + + try + { + Console.WriteLine($"开始下载 {version}..."); + + var response = await _httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead); + response.EnsureSuccessStatusCode(); + + var totalBytes = response.Content.Headers.ContentLength ?? -1; + var downloadedBytes = 0L; + var buffer = new byte[8192]; + var isMoreToRead = true; + + using (var stream = await response.Content.ReadAsStreamAsync()) + using (var fileStream = new FileStream($"{version}.jar", FileMode.Create, FileAccess.Write)) + { + while (isMoreToRead) + { + var read = await stream.ReadAsync(buffer, 0, buffer.Length); + if (read == 0) + { + isMoreToRead = false; + } + else + { + await fileStream.WriteAsync(buffer, 0, read); + + downloadedBytes += read; + if (totalBytes > 0) + { + var progress = (double)downloadedBytes / totalBytes * 100; + Console.Write($"\r下载进度: {progress:F2}%"); + } + } + } + } + + Console.WriteLine($"\n{version} 下载完成!"); + } + catch (Exception ex) + { + Console.WriteLine($"下载失败: {ex.Message}"); + } + } + } +} diff --git a/Tools/VersionManager.cs b/Tools/VersionManager.cs new file mode 100644 index 0000000..0c8d202 --- /dev/null +++ b/Tools/VersionManager.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.IO; + +namespace MCSJ.Tools +{ + public class VersionManager + { + private readonly Dictionary _versions = new(); + + public VersionManager() + { + LoadVersions(); + } + + private void LoadVersions() + { + try + { + var filePath = Path.Combine("resources", "serverlist.txt"); + Console.WriteLine($"尝试从路径加载版本列表: {Path.GetFullPath(filePath)}"); + + if (!File.Exists(filePath)) + { + throw new FileNotFoundException($"服务器列表文件不存在: {filePath}"); + } + + var content = File.ReadAllText(filePath); + var entries = content.Split(new[] {' ', '\n', '\r'}, StringSplitOptions.RemoveEmptyEntries); + + foreach (var entry in entries) + { + var colonIndex = entry.IndexOf(':'); + if (colonIndex > 0 && colonIndex < entry.Length - 1) + { + var version = entry.Substring(0, colonIndex); + var url = entry.Substring(colonIndex + 1); + _versions[version] = url; + } + else + { + Console.WriteLine($"忽略无效条目: {entry} (缺少冒号分隔或格式不正确)"); + } + } + + if (_versions.Count == 0) + { + throw new Exception("没有找到有效的版本条目"); + } + + Console.WriteLine($"成功加载 {_versions.Count} 个版本"); + } + catch (Exception ex) + { + Console.WriteLine($"加载版本列表失败: {ex.Message}"); + Console.WriteLine($"当前工作目录: {Directory.GetCurrentDirectory()}"); + Console.WriteLine("请确保serverlist.txt格式为: 版本名:下载URL (每行一个或空格分隔)"); + } + } + + public void DisplayAllVersions() + { + Console.WriteLine("可用版本列表:"); + foreach (var version in _versions.Keys) + { + Console.WriteLine(version); + } + } + + public string GetDownloadUrl(string version) + { + return _versions.TryGetValue(version, out var url) ? url : null; + } + } +} diff --git a/resources/serverlist.txt b/resources/serverlist.txt new file mode 100644 index 0000000..336c7c5 --- /dev/null +++ b/resources/serverlist.txt @@ -0,0 +1,5 @@ +vanilla1.21.10:https://file.mslmc.cn/mirrors/vanilla/95495a7f485eedd84ce928cef5e223b757d2f764/server.jar +vanilla1.21.9:https://file.mslmc.cn/mirrors/vanilla/11e54c2081420a4d49db3007e66c80a22579ff2a/server.jar +vanilla1.21.8:https://file.mslmc.cn/mirrors/vanilla/6bce4ef400e4efaa63a13d5e6f6b500be969ef81/server.jar +vanilla1.21.7:https://file.mslmc.cn/mirrors/vanilla/05e4b48fbc01f0385adb74bcff9751d34552486c/server.jar +vanilla1.21.6:https://file.mslmc.cn/mirrors/vanilla/6e64dcabba3c01a7271b4fa6bd898483b794c59b/server.jar \ No newline at end of file