From eee88b37a100c9e4f2eeeaeb6a5c728390762d4e Mon Sep 17 00:00:00 2001 From: OpportunityLiu Date: Sat, 2 Nov 2024 15:07:22 +0800 Subject: [PATCH] fix: lost selection settings --- EhTagClient/EhTagClient.csproj | 4 +- .../EhTagTranslatorClient.csproj | 4 +- EhWikiClient/EhWikiClient.csproj | 6 +- ExClient/ExClient.csproj | 8 +- ExClient/Settings/SettingCollection.cs | 198 +++++++----------- ExViewer/ExViewer.csproj | 10 +- 6 files changed, 93 insertions(+), 137 deletions(-) diff --git a/EhTagClient/EhTagClient.csproj b/EhTagClient/EhTagClient.csproj index 44a4f348..0020e9c9 100644 --- a/EhTagClient/EhTagClient.csproj +++ b/EhTagClient/EhTagClient.csproj @@ -111,10 +111,10 @@ - 3.1.30 + 3.1.32 - 3.1.30 + 3.1.32 runtime; build; native; contentfiles; analyzers all diff --git a/EhTagTranslatorClient/EhTagTranslatorClient.csproj b/EhTagTranslatorClient/EhTagTranslatorClient.csproj index 2260c1ca..3e6e5f07 100644 --- a/EhTagTranslatorClient/EhTagTranslatorClient.csproj +++ b/EhTagTranslatorClient/EhTagTranslatorClient.csproj @@ -111,10 +111,10 @@ - 3.1.30 + 3.1.32 - 3.1.30 + 3.1.32 runtime; build; native; contentfiles; analyzers all diff --git a/EhWikiClient/EhWikiClient.csproj b/EhWikiClient/EhWikiClient.csproj index 3f58a92c..c1126749 100644 --- a/EhWikiClient/EhWikiClient.csproj +++ b/EhWikiClient/EhWikiClient.csproj @@ -114,10 +114,10 @@ - 3.1.30 + 3.1.32 - 3.1.30 + 3.1.32 runtime; build; native; contentfiles; analyzers all @@ -125,7 +125,7 @@ 6.2.14 - 13.0.1 + 13.0.3 1.3.19 diff --git a/ExClient/ExClient.csproj b/ExClient/ExClient.csproj index 37af45da..8c0705fa 100644 --- a/ExClient/ExClient.csproj +++ b/ExClient/ExClient.csproj @@ -251,13 +251,13 @@ - 1.11.46 + 1.11.70 - 3.1.30 + 3.1.32 - 3.1.30 + 3.1.32 runtime; build; native; contentfiles; analyzers all @@ -265,7 +265,7 @@ 6.2.14 - 13.0.1 + 13.0.3 1.3.19 diff --git a/ExClient/Settings/SettingCollection.cs b/ExClient/Settings/SettingCollection.cs index 0946daf2..0b5fb1e1 100644 --- a/ExClient/Settings/SettingCollection.cs +++ b/ExClient/Settings/SettingCollection.cs @@ -12,10 +12,8 @@ using System.Threading; using System.Threading.Tasks; -namespace ExClient.Settings -{ - public enum ImageSize - { +namespace ExClient.Settings { + public enum ImageSize { Auto = 0, H780 = 1, H980 = 2, @@ -24,31 +22,26 @@ public enum ImageSize H2400 = 5, } - public enum CommentsOrder - { + public enum CommentsOrder { ByTimeAscending = 0, ByTimeDecending = 1, ByScore = 2, } - public enum FavoritesOrder - { + public enum FavoritesOrder { ByLastUpdatedTime = 0, ByFavoritedTime = 1, } - public sealed class SettingCollection : ObservableObject - { + public sealed class SettingCollection : ObservableObject { private static readonly Uri configUriRaletive = new Uri("/uconfig.php", UriKind.Relative); private readonly Uri configUri; private readonly DomainProvider owner; - internal SettingCollection(DomainProvider domain) - { + internal SettingCollection(DomainProvider domain) { owner = domain; configUri = new Uri(domain.RootUri, configUriRaletive); - foreach (var item in items.Values) - { + foreach (var item in items.Values) { item.Owner = this; } loadCache(); @@ -61,124 +54,111 @@ internal SettingCollection(DomainProvider domain) private const string CACHE_NAME = "SettingsCache"; - internal void StoreCache() - { + internal void StoreCache() { var storage = Windows.Storage.ApplicationData.Current.LocalSettings.CreateContainer("ExClient", Windows.Storage.ApplicationDataCreateDisposition.Always); storage.Values[owner.Type + CACHE_NAME] = JsonConvert.SerializeObject(_Settings); } - private void loadCache() - { + private void loadCache() { var storage = Windows.Storage.ApplicationData.Current.LocalSettings.CreateContainer("ExClient", Windows.Storage.ApplicationDataCreateDisposition.Always); storage.Values.TryGetValue(owner.Type + CACHE_NAME, out var r); var value = r + ""; _Settings.Clear(); - if (string.IsNullOrEmpty(value)) - { + if (string.IsNullOrEmpty(value)) { return; } JsonConvert.PopulateObject(value, _Settings); } - private void updateSettingsDic(HtmlDocument doc) - { + private void updateSettingsDic(HtmlDocument doc) { + // Ill formed HTML, can not get inner form var outer = doc.GetElementbyId("outer"); if (outer is null) return; _Settings.Clear(); - foreach (var item in outer.Descendants("input").Concat(outer.Descendants("textarea"))) - { + foreach (var item in outer.Descendants("select")) { var name = item.GetAttribute("name", default(string)); - if (name is null || name.StartsWith("profile")) - { + if (name is null || name.StartsWith("profile_")) continue; + + var selected = item.SelectSingleNode("./option[@selected]"); + if (selected is not null) { + _Settings[name] = selected.GetAttribute("value", ""); } + } + foreach (var item in outer.Descendants("input").Concat(outer.Descendants("textarea"))) { + var name = item.GetAttribute("name", default(string)); + if (name is null || name.StartsWith("profile_")) + continue; - switch (item.GetAttribute("type", default(string))) - { - case "radio": - if (item.GetAttribute("checked", "") == "checked") - { - _Settings[name] = item.GetAttribute("value", ""); - } + switch (item.GetAttribute("type", default(string))) { + case "radio": + if (item.GetAttribute("checked", "") == "checked") { + _Settings[name] = item.GetAttribute("value", "on"); + } - break; - case "checkbox": - if (item.GetAttribute("checked", "") == "checked") - { - _Settings[name] = item.GetAttribute("value", "on"); - } + break; + case "checkbox": + if (item.GetAttribute("checked", "") == "checked") { + _Settings[name] = item.GetAttribute("value", "on"); + } - break; - //case "text": - //case "hidden": - //case "submit": - //textarea - default: - _Settings[name] = item.GetAttribute("value", item.GetInnerText()); - break; + break; + //case "text": + //case "hidden": + //case "submit": + //textarea + default: + _Settings[name] = item.GetAttribute("value", item.GetInnerText()); + break; } } } - public async Task FetchAsync(CancellationToken token = default) - { + public async Task FetchAsync(CancellationToken token = default) { Client.Current.CheckLogOn(); - try - { + try { var getDoc = Client.Current.HttpClient.GetDocumentAsync(configUri); token.Register(getDoc.Cancel); var doc = await getDoc; updateSettingsDic(doc); - } - finally - { + } finally { _LoadSettingsDic(); } } - private void _LoadSettingsDic() - { - foreach (var item in items.Values) - { + private void _LoadSettingsDic() { + foreach (var item in items.Values) { item.DataChanged(_Settings); } StoreCache(); OnPropertyReset(); } - public async Task SendAsync(CancellationToken token = default) - { - try - { + public async Task SendAsync(CancellationToken token = default) { + try { if (_Settings.Count == 0) await FetchAsync(); var postDic = new Dictionary(_Settings); - foreach (var item in items.Values) - { + foreach (var item in items.Values) { item.ApplyChanges(postDic); } var isSame = true; - if (postDic.Count == _Settings.Count) - { - foreach (var item in postDic) - { + if (postDic.Count == _Settings.Count) { + foreach (var item in postDic) { if (_Settings.TryGetValue(item.Key, out var ov) && ov == item.Value) continue; - else - { + else { isSame = false; break; } } - } - else + } else isSame = false; - if (!isSame) - { + if (!isSame) { var postData = Client.Current.HttpClient.PostAsync(configUri, postDic); token.Register(postData.Cancel); var r = await postData; @@ -186,15 +166,12 @@ public async Task SendAsync(CancellationToken token = default) doc.LoadHtml(await r.Content.ReadAsStringAsync()); updateSettingsDic(doc); } - } - finally - { + } finally { _LoadSettingsDic(); } } - private readonly Dictionary items = new Dictionary - { + private readonly Dictionary items = new Dictionary { ["Default"] = new DefaultSettingProvider(), [nameof(ExcludedLanguages)] = new ExcludedLanguagesSettingProvider(), [nameof(ExcludedUploaders)] = new ExcludedUploadersSettingProvider(), @@ -202,68 +179,55 @@ public async Task SendAsync(CancellationToken token = default) [nameof(FavoriteCategoryNames)] = new FavoriteCategoryNamesSettingProvider(), }; - private SettingProvider _GetProvider([System.Runtime.CompilerServices.CallerMemberName] string key = null) - { + private SettingProvider _GetProvider([System.Runtime.CompilerServices.CallerMemberName] string key = null) { return items[key]; } public ExcludedLanguagesSettingProvider ExcludedLanguages => (ExcludedLanguagesSettingProvider)_GetProvider(); public ExcludedUploadersSettingProvider ExcludedUploaders => (ExcludedUploadersSettingProvider)_GetProvider(); - public Tagging.Namespace ExcludedTagNamespaces - { + public Tagging.Namespace ExcludedTagNamespaces { get => ((ExcludedTagNamespacesSettingProvider)_GetProvider()).Value; - set - { + set { ((ExcludedTagNamespacesSettingProvider)_GetProvider()).Value = value; OnPropertyChanged(); } } - public ImageSize ResampledImageSize - { + public ImageSize ResampledImageSize { get => ((DefaultSettingProvider)_GetProvider("Default")).ResampledImageSize; - set - { + set { ((DefaultSettingProvider)_GetProvider("Default")).ResampledImageSize = value; OnPropertyChanged(); } } - public CommentsOrder CommentsOrder - { + public CommentsOrder CommentsOrder { get => ((DefaultSettingProvider)_GetProvider("Default")).CommentsOrder; - set - { + set { ((DefaultSettingProvider)_GetProvider("Default")).CommentsOrder = value; OnPropertyChanged(); } } - public FavoritesOrder FavoritesOrder - { + public FavoritesOrder FavoritesOrder { get => ((DefaultSettingProvider)_GetProvider("Default")).FavoritesOrder; - set - { + set { ((DefaultSettingProvider)_GetProvider("Default")).FavoritesOrder = value; OnPropertyChanged(); } } - public int TagFilteringThreshold - { + public int TagFilteringThreshold { get => ((DefaultSettingProvider)_GetProvider("Default")).TagFilteringThreshold; - set - { + set { ((DefaultSettingProvider)_GetProvider("Default")).TagFilteringThreshold = value; OnPropertyChanged(); } } - public int TagWatchingThreshold - { + public int TagWatchingThreshold { get => ((DefaultSettingProvider)_GetProvider("Default")).TagWatchingThreshold; - set - { + set { ((DefaultSettingProvider)_GetProvider("Default")).TagWatchingThreshold = value; OnPropertyChanged(); } @@ -271,10 +235,8 @@ public int TagWatchingThreshold public FavoriteCategoryNamesSettingProvider FavoriteCategoryNames => (FavoriteCategoryNamesSettingProvider)_GetProvider(); - private sealed class DefaultSettingProvider : SettingProvider - { - internal override void ApplyChanges(Dictionary settings) - { + private sealed class DefaultSettingProvider : SettingProvider { + internal override void ApplyChanges(Dictionary settings) { // Original Images - Nope (Use local setting instead) settings["oi"] = "0"; // Always use the Multi-Page Viewer - Nope @@ -290,11 +252,9 @@ internal override void ApplyChanges(Dictionary settings) settings["ft"] = _Ft.ToString(); } - internal override void DataChanged(Dictionary settings) - { + internal override void DataChanged(Dictionary settings) { void setEnum(ref T field, string key, T def) - where T : struct, Enum - { + where T : struct, Enum { if (!settings.TryGetValue(key, out var value) || !Enum.TryParse(value, true, out field)) field = def; @@ -303,8 +263,7 @@ void setEnum(ref T field, string key, T def) setEnum(ref CommentsOrder, "cs", CommentsOrder.ByTimeAscending); setEnum(ref FavoritesOrder, "fs", FavoritesOrder.ByLastUpdatedTime); - void setInt(ref int field, string key, int def) - { + void setInt(ref int field, string key, int def) { if (!settings.TryGetValue(key, out var value) || !int.TryParse(value, out field)) field = def; @@ -312,8 +271,7 @@ void setInt(ref int field, string key, int def) setInt(ref _Ft, "ft", 0); setInt(ref _Wt, "wt", 0); } - private static int _Clamp(int value, int v1, int v2) - { + private static int _Clamp(int value, int v1, int v2) { if (value < v1) return v1; if (value > v2) @@ -328,14 +286,12 @@ private static int _Clamp(int value, int v1, int v2) public FavoritesOrder FavoritesOrder; private int _Ft, _Wt; - public int TagFilteringThreshold - { + public int TagFilteringThreshold { get => _Ft; set => _Ft = _Clamp(value, -9999, 0); } - public int TagWatchingThreshold - { + public int TagWatchingThreshold { get => _Wt; set => _Wt = _Clamp(value, 0, 9999); } diff --git a/ExViewer/ExViewer.csproj b/ExViewer/ExViewer.csproj index c6298bdb..8c5365a7 100644 --- a/ExViewer/ExViewer.csproj +++ b/ExViewer/ExViewer.csproj @@ -735,7 +735,7 @@ - 1.11.46 + 1.11.70 4.5.3 @@ -744,10 +744,10 @@ 4.5.3 - 3.1.30 + 3.1.32 - 3.1.30 + 3.1.32 runtime; build; native; contentfiles; analyzers all @@ -758,7 +758,7 @@ 4.0.0 - 2.8.1 + 2.8.6 1.3.19 @@ -779,7 +779,7 @@ 4.5.0 - 0.16.8 + 0.16.9