From 14ce8772c85e0eb60a83b4e0080d917f03b0dd3d Mon Sep 17 00:00:00 2001 From: Licho Date: Sat, 11 Jan 2025 14:28:21 +0100 Subject: [PATCH] fixed demos upload fix #3002 --- .../.idea/projectSettingsUpdater.xml | 1 + Zero-K.info/Controllers/ReplaysController.cs | 13 +++++++- Zero-K.info/Web.config | 2 +- ZkLobbyServer/ReplayStorage.cs | 30 ++++++++++++++++--- 4 files changed, 40 insertions(+), 6 deletions(-) diff --git a/.idea/.idea.Zero-K/.idea/projectSettingsUpdater.xml b/.idea/.idea.Zero-K/.idea/projectSettingsUpdater.xml index 86cc6c63e..64af657f5 100644 --- a/.idea/.idea.Zero-K/.idea/projectSettingsUpdater.xml +++ b/.idea/.idea.Zero-K/.idea/projectSettingsUpdater.xml @@ -1,6 +1,7 @@ + \ No newline at end of file diff --git a/Zero-K.info/Controllers/ReplaysController.cs b/Zero-K.info/Controllers/ReplaysController.cs index 9c5b0e6a1..fcdb029ca 100644 --- a/Zero-K.info/Controllers/ReplaysController.cs +++ b/Zero-K.info/Controllers/ReplaysController.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; using System.Net; @@ -18,7 +19,17 @@ public ActionResult Index() { public ActionResult Download(string name) { - return Redirect(ReplayStorage.Instance.GetFileUrl(name)); + try + { + var url = ReplayStorage.Instance.GetFileUrl(name); + if (url != null) return Redirect(url); + } + catch (Exception ex) + { + Trace.TraceWarning("Error downloading replay {0}, attempting local copy: {1}", name, ex.Message); + } + + return File(ReplayStorage.Instance.GetLocalFileContent(name), "application/octet-stream", name); } } diff --git a/Zero-K.info/Web.config b/Zero-K.info/Web.config index 9ce0c3ad0..0ce38f56a 100644 --- a/Zero-K.info/Web.config +++ b/Zero-K.info/Web.config @@ -147,7 +147,7 @@ - + diff --git a/ZkLobbyServer/ReplayStorage.cs b/ZkLobbyServer/ReplayStorage.cs index 0617159a1..c69f80806 100644 --- a/ZkLobbyServer/ReplayStorage.cs +++ b/ZkLobbyServer/ReplayStorage.cs @@ -14,12 +14,26 @@ namespace ZkLobbyServer public class ReplayStorage { public static ReplayStorage Instance { get; } = new ReplayStorage(); - + BlobContainerClient azureContainer; + string basePath = GlobalConst.SpringieDataDir; + internal ReplayStorage() { - azureContainer = new BlobContainerClient(MiscVar.ReplaysConnectionString, MiscVar.ReplaysContainerName); + try + { + if (string.IsNullOrEmpty(MiscVar.ReplaysConnectionString) || string.IsNullOrEmpty(MiscVar.ReplaysContainerName)) + { + Trace.TraceWarning("Replay storage not configured, replays won't be stored in blobs"); + return; + } + + azureContainer = new BlobContainerClient(MiscVar.ReplaysConnectionString, MiscVar.ReplaysContainerName); + } catch (Exception ex) + { + Trace.TraceError("Error initializing replay storage: {0}", ex.Message); + } } public async Task UploadAndDeleteFileAsync(string path) @@ -65,17 +79,25 @@ public async Task GetFileContent(string replayName) return stream.ToArray(); } + + public byte[] GetLocalFileContent(string replayName) + { + var path = Path.Combine(basePath, "demos-server", replayName); + if (!File.Exists(path)) return null; + return File.ReadAllBytes(path); + } + public async Task MigrateReplays() { // replays themselves - var files = Directory.GetFiles(@"c:\Projekty\springie_spring\demos-server"); + var files = Directory.GetFiles(Path.Combine(basePath,"demos-server")); foreach (var fi in files) { await UploadAndDeleteFileAsync(fi); } // infologs - files = Directory.GetFiles(@"c:\Projekty\springie_spring","infolog_*.txt"); + files = Directory.GetFiles(basePath,"infolog_*.txt"); foreach (var fi in files) { await UploadAndDeleteFileAsync(fi);