diff --git a/Qwilight/Assets/Language.json b/Qwilight/Assets/Language.json index a3fca12..21e2ec6 100644 --- a/Qwilight/Assets/Language.json +++ b/Qwilight/Assets/Language.json @@ -2655,10 +2655,6 @@ "ko-KR": "아직 서로 친구가 아님", "en-US": "We're not friends yet." }, - "NotValidLevelContents": { - "ko-KR": "올바르지 않은 난이도 테이블입니다. ({0})", - "en-US": "Invalid difficulty table. ({0})" - }, "NotValidNoteFile": { "ko-KR": "노트 파일을 먼저 선택하세요", "en-US": "Please select a chart first" diff --git a/Qwilight/System/LanguageSystem/LanguageSystem.g.cs b/Qwilight/System/LanguageSystem/LanguageSystem.g.cs index 908d645..b8af8bc 100644 --- a/Qwilight/System/LanguageSystem/LanguageSystem.g.cs +++ b/Qwilight/System/LanguageSystem/LanguageSystem.g.cs @@ -666,7 +666,6 @@ public string NotSupportedFileContents { get; set; } public string NotTubeText { get; set; } public string NotUbuntuSituationContents { get; set; } - public string NotValidLevelContents { get; set; } public string NotValidNoteFile { get; set; } public string NotVESAText { get; set; } public string NotVibrationModeText { get; set; } diff --git a/Qwilight/System/LevelSystem.cs b/Qwilight/System/LevelSystem.cs index 278e7d3..f79af27 100644 --- a/Qwilight/System/LevelSystem.cs +++ b/Qwilight/System/LevelSystem.cs @@ -3,6 +3,7 @@ using Qwilight.UIComponent; using Qwilight.Utilities; using Qwilight.ViewModel; +using SharpCompress.Common; using System.Buffers; using System.Collections.ObjectModel; using System.IO; @@ -106,98 +107,111 @@ public async ValueTask GetWww(string www) { - using var s = await TwilightSystem.Instance.GetWwwParallel(www); - using var sr = new StreamReader(s); - return await (www.IsTailCaselsss(".json") ? GetJSON(s, www) : GetHTML(await sr.ReadToEndAsync(), www)); + return await GetLevelNotifyItem(async levelNotifyItem => + { + using var s = await TwilightSystem.Instance.GetWwwParallel(www); + using var sr = new StreamReader(s); + return await (www.IsTailCaselsss(".json") ? GetJSON(levelNotifyItem, s, www) : GetHTML(levelNotifyItem, await sr.ReadToEndAsync(), www)); + }); } - public async ValueTask GetHTML(string text, string www) + public async ValueTask GetLevelNotifyItem(Func> onNotifyItem) { + var levelNotifyItem = new NotifyItem + { + Text = LanguageSystem.Instance.SavingLevelContents, + Variety = NotifySystem.NotifyVariety.Handling, + OnStop = wipeTotal => false + }; try { - var levelCompiler = new HtmlDocument(); - levelCompiler.LoadHtml(text); - using var s = await TwilightSystem.Instance.GetWwwParallel(WebUtility.HtmlDecode(ModifyDataValue(levelCompiler.CreateNavigator().SelectSingleNode("/html/head/meta[@name='bmstable']/@content")?.ToString() - ?? levelCompiler.CreateNavigator().SelectSingleNode("/html/body/meta[@name='bmstable']/@content")?.ToString() - ?? levelCompiler.CreateNavigator().SelectSingleNode("/html/head/body/meta[@name='bmstable']/@content")?.ToString(), www))); - return await GetJSON(s, www); + UIHandler.Instance.HandleParallel(() => ViewModels.Instance.NotifyValue.HandlingNotifyItemCollection.Insert(0, levelNotifyItem)); + NotifySystem.Instance.Notify(NotifySystem.NotifyVariety.Info, NotifySystem.NotifyConfigure.NotSave, levelNotifyItem.Text, false, null, null, NotifySystem.SaveLevelID); + return await onNotifyItem(levelNotifyItem); + } + catch (OperationCanceledException) + { } catch (Exception e) { - NotifySystem.Instance.Notify(NotifySystem.NotifyVariety.Warning, NotifySystem.NotifyConfigure.Default, string.Format(LanguageSystem.Instance.NotValidLevelContents, e.Message), false, null, null, NotifySystem.SaveLevelID); + levelNotifyItem.Variety = NotifySystem.NotifyVariety.Fault; + levelNotifyItem.Text += $" ({e.Message})"; + NotifySystem.Instance.Notify(levelNotifyItem.Variety, NotifySystem.NotifyConfigure.Default, levelNotifyItem.Text, false, null, null, NotifySystem.SaveLevelID); } return false; } - public async ValueTask GetJSON(Stream s, string www) + public async ValueTask GetHTML(NotifyItem levelNotifyItem, string text, string www) { - var data = ArrayPool.Shared.Rent(QwilightComponent.SendUnit); - try + var levelCompiler = new HtmlDocument(); + levelCompiler.LoadHtml(text); + using var s = await TwilightSystem.Instance.GetWwwParallel(WebUtility.HtmlDecode(ModifyDataValue(levelCompiler.CreateNavigator().SelectSingleNode("/html/head/meta[@name='bmstable']/@content")?.ToString() + ?? levelCompiler.CreateNavigator().SelectSingleNode("/html/body/meta[@name='bmstable']/@content")?.ToString() + ?? levelCompiler.CreateNavigator().SelectSingleNode("/html/head/body/meta[@name='bmstable']/@content")?.ToString(), www))); + return await GetJSON(levelNotifyItem, s, www); + } + + async ValueTask GetJSON(NotifyItem levelNotifyItem, Stream s, string www) + { + var levelTable = await Utility.GetJSON(s); + if (levelTable.HasValue) { - var levelTable = await Utility.GetJSON(s); - if (levelTable.HasValue) + var levelTableValue = levelTable.Value; + var target = ModifyDataValue(levelTableValue.data_url, www); + var levelTableFileName = levelTableValue.name; + foreach (var targetFileName in Path.GetInvalidFileNameChars()) { - var levelTableValue = levelTable.Value; - var levelNotifyItem = new NotifyItem + levelTableFileName = levelTableFileName.Replace(targetFileName.ToString(), string.Empty); + } + using (var wwwClient = new HttpClient()) + { + wwwClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0"); + using (var hrm = await wwwClient.GetAsync(target, HttpCompletionOption.ResponseHeadersRead)) { - Text = LanguageSystem.Instance.SavingLevelContents, - Variety = NotifySystem.NotifyVariety.Handling, - OnStop = wipeTotal => false - }; - UIHandler.Instance.HandleParallel(() => ViewModels.Instance.NotifyValue.HandlingNotifyItemCollection.Insert(0, levelNotifyItem)); - NotifySystem.Instance.Notify(NotifySystem.NotifyVariety.Info, NotifySystem.NotifyConfigure.NotSave, levelNotifyItem.Text, false, null, null, NotifySystem.SaveLevelID); - var target = ModifyDataValue(levelTableValue.data_url, www); - var levelTableFileName = levelTableValue.name; - foreach (var targetFileName in Path.GetInvalidFileNameChars()) - { - levelTableFileName = levelTableFileName.Replace(targetFileName.ToString(), string.Empty); + levelNotifyItem.MaxStatus = hrm.Content.Headers.ContentLength ?? 0L; } - using (var wwwClient = new HttpClient()) + using (var fs = File.Open(Path.Combine(EntryPath, $"{levelTableFileName}.json"), FileMode.Create)) + using (var ws = await wwwClient.GetStreamAsync(target)) { - wwwClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0"); - using (var hrm = await wwwClient.GetAsync(target, HttpCompletionOption.ResponseHeadersRead)) + var length = 0; + var data = ArrayPool.Shared.Rent(QwilightComponent.SendUnit); + try { - levelNotifyItem.MaxStatus = hrm.Content.Headers.ContentLength ?? 0L; - } - using (var fs = File.Open(Path.Combine(EntryPath, $"{levelTableFileName}.json"), FileMode.Create)) - using (var ws = await wwwClient.GetStreamAsync(target)) - { - var length = 0; while ((length = await ws.ReadAsync(data.AsMemory(0, data.Length))) > 0) { + if (levelNotifyItem.IsStopped) + { + throw new OperationCanceledException(); + } await fs.WriteAsync(data.AsMemory(0, length)); levelNotifyItem.Status += length; } } - } - using (var fs = File.Open(Path.Combine(EntryPath, $"#{levelTableFileName}.json"), FileMode.Create)) - { - s.Position = 0; - await s.CopyToAsync(fs); - } - levelNotifyItem.Variety = NotifySystem.NotifyVariety.Closed; - levelNotifyItem.Text = LanguageSystem.Instance.SavedLevelContents; - levelNotifyItem.OnStop = wipeTotal => true; - NotifySystem.Instance.Notify(NotifySystem.NotifyVariety.Info, NotifySystem.NotifyConfigure.NotSave, LanguageSystem.Instance.SavedLevelContents, false, null, null, NotifySystem.SaveLevelID); - Configure.Instance.LevelTargetMap[levelTableFileName] = www; - LoadLevelFiles(); - if (Configure.Instance.LastWantLevelName != levelTableFileName) - { - Configure.Instance.LastWantLevelName = levelTableFileName; - } - else - { - return true; + finally + { + ArrayPool.Shared.Return(data); + } } } - } - catch (Exception e) - { - NotifySystem.Instance.Notify(NotifySystem.NotifyVariety.Warning, NotifySystem.NotifyConfigure.Default, string.Format(LanguageSystem.Instance.NotValidLevelContents, e.Message), false, null, null, NotifySystem.SaveLevelID); - } - finally - { - ArrayPool.Shared.Return(data); + using (var fs = File.Open(Path.Combine(EntryPath, $"#{levelTableFileName}.json"), FileMode.Create)) + { + s.Position = 0; + await s.CopyToAsync(fs); + } + levelNotifyItem.Variety = NotifySystem.NotifyVariety.Closed; + levelNotifyItem.Text = LanguageSystem.Instance.SavedLevelContents; + levelNotifyItem.OnStop = wipeTotal => true; + NotifySystem.Instance.Notify(NotifySystem.NotifyVariety.Info, NotifySystem.NotifyConfigure.NotSave, LanguageSystem.Instance.SavedLevelContents, false, null, null, NotifySystem.SaveLevelID); + Configure.Instance.LevelTargetMap[levelTableFileName] = www; + LoadLevelFiles(); + if (Configure.Instance.LastWantLevelName != levelTableFileName) + { + Configure.Instance.LastWantLevelName = levelTableFileName; + } + else + { + return true; + } } return false; } diff --git a/Qwilight/ViewModel/LevelViewModel.cs b/Qwilight/ViewModel/LevelViewModel.cs index 6690679..875fed9 100644 --- a/Qwilight/ViewModel/LevelViewModel.cs +++ b/Qwilight/ViewModel/LevelViewModel.cs @@ -95,10 +95,13 @@ { Filters = [".htm", ".html"] }).Response; - if (!string.IsNullOrEmpty(filePath) && await LevelSystem.Instance.GetHTML(await File.ReadAllTextAsync(filePath), string.Empty)) + if (!string.IsNullOrEmpty(filePath)) { - LevelSystem.Instance.Load(true); - SetLevelItemCollection(); + if (await LevelSystem.Instance.GetLevelNotifyItem(async levelNotifyItem => await LevelSystem.Instance.GetHTML(levelNotifyItem, await File.ReadAllTextAsync(filePath), string.Empty))) + { + LevelSystem.Instance.Load(true); + SetLevelItemCollection(); + } } } diff --git a/Qwilight/ViewModel/MainViewModel.cs b/Qwilight/ViewModel/MainViewModel.cs index 13c143c..ebe49b4 100644 --- a/Qwilight/ViewModel/MainViewModel.cs +++ b/Qwilight/ViewModel/MainViewModel.cs @@ -3261,9 +3261,9 @@ var taehuiQwilightDate = await TwilightSystem.Instance.GetWwwParallel($"{QwilightComponent.TaehuiNetFE}/qwilight/qwilight.json"); if (taehuiQwilightDate.HasValue) { - var taehuiQwilightValue = taehuiQwilightDate.Value; - var date = Version.Parse(taehuiQwilightValue.date); - if (QwilightComponent.Date < date || QwilightComponent.HashText != taehuiQwilightValue.hash) + var taehuiQwilightDateValue = taehuiQwilightDate.Value; + var date = Version.Parse(taehuiQwilightDateValue.date); + if (QwilightComponent.Date < date || QwilightComponent.HashText != taehuiQwilightDateValue.hash) { await SaveQwilight(); } @@ -3281,53 +3281,60 @@ async ValueTask SaveQwilight() { - var data = ArrayPool.Shared.Rent(QwilightComponent.SendUnit); - try + UIHandler.Instance.HandleParallel(() => ViewModels.Instance.NotifyValue.HandlingNotifyItemCollection.Insert(0, qwilightNotifyItem)); + NotifySystem.Instance.Notify(NotifySystem.NotifyVariety.Info, NotifySystem.NotifyConfigure.NotSave, qwilightNotifyItem.Text, false, null, null, NotifySystem.SaveQwilightID); + var title = taehuiQwilightDateValue.title; + var tmpFileName = Path.GetTempFileName(); + var target = $"{QwilightComponent.TaehuiNetFE}/qwilight/{title}"; + using (var wwwClient = new HttpClient()) { - UIHandler.Instance.HandleParallel(() => ViewModels.Instance.NotifyValue.HandlingNotifyItemCollection.Insert(0, qwilightNotifyItem)); - NotifySystem.Instance.Notify(NotifySystem.NotifyVariety.Info, NotifySystem.NotifyConfigure.NotSave, qwilightNotifyItem.Text, false, null, null, NotifySystem.SaveQwilightID); - var title = taehuiQwilightValue.title; - var tmpFileName = Path.GetTempFileName(); - var target = $"{QwilightComponent.TaehuiNetFE}/qwilight/{title}"; - using (var wwwClient = new HttpClient()) + using (var hrm = await wwwClient.GetAsync(target, HttpCompletionOption.ResponseHeadersRead)) { - using (var hrm = await wwwClient.GetAsync(target, HttpCompletionOption.ResponseHeadersRead)) + qwilightNotifyItem.MaxStatus = hrm.Content.Headers.ContentLength ?? 0L; + } + using (var fs = File.OpenWrite(tmpFileName)) + using (var ws = await wwwClient.GetStreamAsync(target)) + { + var length = 0; + var data = ArrayPool.Shared.Rent(QwilightComponent.SendUnit); + try { - qwilightNotifyItem.MaxStatus = hrm.Content.Headers.ContentLength ?? 0L; - } - using (var fs = File.OpenWrite(tmpFileName)) - using (var ws = await wwwClient.GetStreamAsync(target)) - { - var length = 0; while ((length = await ws.ReadAsync(data.AsMemory(0, data.Length))) > 0) { + if (qwilightNotifyItem.IsStopped) + { + throw new OperationCanceledException(); + } await fs.WriteAsync(data.AsMemory(0, length)); qwilightNotifyItem.Status += length; } } - } - qwilightNotifyItem.Variety = NotifySystem.NotifyVariety.Closed; - qwilightNotifyItem.Text = LanguageSystem.Instance.SavedQwilightContents; - qwilightNotifyItem.OnStop = wipeTotal => - { - if (!wipeTotal) + finally { - Utility.WipeFile(_qwilightFileName); + ArrayPool.Shared.Return(data); } - return true; - }; - NotifySystem.Instance.Notify(NotifySystem.NotifyVariety.Info, NotifySystem.NotifyConfigure.NotSave, qwilightNotifyItem.Text); - var qwilightFileName = Path.ChangeExtension(tmpFileName, Path.GetExtension(title)); - Utility.MoveFile(tmpFileName, qwilightFileName); - _qwilightFileName = qwilightFileName; + } } - finally + qwilightNotifyItem.Variety = NotifySystem.NotifyVariety.Closed; + qwilightNotifyItem.Text = LanguageSystem.Instance.SavedQwilightContents; + qwilightNotifyItem.OnStop = wipeTotal => { - ArrayPool.Shared.Return(data); - } + if (!wipeTotal) + { + Utility.WipeFile(_qwilightFileName); + } + return true; + }; + NotifySystem.Instance.Notify(NotifySystem.NotifyVariety.Info, NotifySystem.NotifyConfigure.NotSave, qwilightNotifyItem.Text); + var qwilightFileName = Path.ChangeExtension(tmpFileName, Path.GetExtension(title)); + Utility.MoveFile(tmpFileName, qwilightFileName); + _qwilightFileName = qwilightFileName; } } } + catch (OperationCanceledException) + { + } catch (Exception e) { if (!isSilent)