From 928a1538ea8cf7674812ca40cd2dba9da159f2a5 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Sat, 26 Oct 2024 00:25:39 +1100 Subject: [PATCH] Allow the user to control how metadata is searched (#448) --- gaseous-server/Classes/Config.cs | 49 +++++--- gaseous-server/Classes/ImportGames.cs | 16 ++- .../Controllers/V1.0/SystemController.cs | 10 +- gaseous-server/Program.cs | 8 ++ .../wwwroot/pages/settings/settings.html | 115 ++++++++++++++---- 5 files changed, 155 insertions(+), 43 deletions(-) diff --git a/gaseous-server/Classes/Config.cs b/gaseous-server/Classes/Config.cs index be3fe93..5be7069 100644 --- a/gaseous-server/Classes/Config.cs +++ b/gaseous-server/Classes/Config.cs @@ -361,25 +361,38 @@ namespace gaseous_server.Classes { sql = "REPLACE INTO Settings (Setting, ValueType, Value, ValueDate) VALUES (@SettingName, @ValueType, @Value, @ValueDate)"; Type type = typeof(T); - if (type.ToString() == "System.DateTime") + + switch (type.ToString()) { - dbDict = new Dictionary - { - { "SettingName", SettingName }, - { "ValueType", 1 }, - { "Value", null }, - { "ValueDate", Value } - }; - } - else - { - dbDict = new Dictionary - { - { "SettingName", SettingName }, - { "ValueType", 0 }, - { "Value", Value }, - { "ValueDate", null } - }; + case "System.DateTime": + dbDict = new Dictionary + { + { "SettingName", SettingName }, + { "ValueType", 1 }, + { "Value", null }, + { "ValueDate", Value } + }; + break; + + case "System.Collections.Generic.List`1[gaseous_server.Classes.Metadata.Games+SearchType]": + dbDict = new Dictionary + { + { "SettingName", SettingName }, + { "ValueType", 2 }, + { "Value", JsonConvert.SerializeObject(Value) }, + { "ValueDate", null } + }; + break; + + default: + dbDict = new Dictionary + { + { "SettingName", SettingName }, + { "ValueType", 0 }, + { "Value", Value }, + { "ValueDate", null } + }; + break; } } else diff --git a/gaseous-server/Classes/ImportGames.cs b/gaseous-server/Classes/ImportGames.cs index de338c9..01c5759 100644 --- a/gaseous-server/Classes/ImportGames.cs +++ b/gaseous-server/Classes/ImportGames.cs @@ -181,7 +181,13 @@ namespace gaseous_server.Classes Logging.Log(Logging.LogType.Information, "Import Game", " Searching for title: " + SearchCandidate); - foreach (Metadata.Games.SearchType searchType in Enum.GetValues(typeof(Metadata.Games.SearchType))) + List allowedSearchTypes = Config.ReadSetting>("DefaultSearchMethods", new List() { + Games.SearchType.where, + Games.SearchType.wherefuzzy, + Games.SearchType.search, + Games.SearchType.searchNoPlatform + }); + foreach (Metadata.Games.SearchType searchType in allowedSearchTypes) { Logging.Log(Logging.LogType.Information, "Import Game", " Search type: " + searchType.ToString()); IGDB.Models.Game[] games = Metadata.Games.SearchForGame(SearchCandidate, PlatformId, searchType); @@ -239,7 +245,13 @@ namespace gaseous_server.Classes foreach (string SearchCandidate in SearchCandidates) { - foreach (Metadata.Games.SearchType searchType in Enum.GetValues(typeof(Metadata.Games.SearchType))) + List allowedSearchTypes = Config.ReadSetting>("DefaultSearchMethods", new List() { + Games.SearchType.where, + Games.SearchType.wherefuzzy, + Games.SearchType.search, + Games.SearchType.searchNoPlatform + }); + foreach (Metadata.Games.SearchType searchType in allowedSearchTypes) { if ((PlatformId == 0 && searchType == SearchType.searchNoPlatform) || (PlatformId != 0 && searchType != SearchType.searchNoPlatform)) { diff --git a/gaseous-server/Controllers/V1.0/SystemController.cs b/gaseous-server/Controllers/V1.0/SystemController.cs index 10eb213..5abc6f6 100644 --- a/gaseous-server/Controllers/V1.0/SystemController.cs +++ b/gaseous-server/Controllers/V1.0/SystemController.cs @@ -260,7 +260,13 @@ namespace gaseous_server.Controllers { AlwaysLogToDisk = Config.LoggingConfiguration.AlwaysLogToDisk, MinimumLogRetentionPeriod = Config.LoggingConfiguration.LogRetention, - EmulatorDebugMode = Boolean.Parse(Config.ReadSetting("emulatorDebugMode", false.ToString())) + EmulatorDebugMode = Boolean.Parse(Config.ReadSetting("emulatorDebugMode", false.ToString())), + SearchTypes = Config.ReadSetting>("DefaultSearchMethods", new List() { + Games.SearchType.where, + Games.SearchType.wherefuzzy, + Games.SearchType.search, + Games.SearchType.searchNoPlatform + }) }; return Ok(systemSettingsModel); @@ -279,6 +285,7 @@ namespace gaseous_server.Controllers Config.LoggingConfiguration.AlwaysLogToDisk = model.AlwaysLogToDisk; Config.LoggingConfiguration.LogRetention = model.MinimumLogRetentionPeriod; Config.SetSetting("emulatorDebugMode", model.EmulatorDebugMode.ToString()); + Config.SetSetting>("DefaultSearchMethods", model.SearchTypes); Config.UpdateConfig(); } @@ -719,5 +726,6 @@ namespace gaseous_server.Controllers public bool AlwaysLogToDisk { get; set; } public int MinimumLogRetentionPeriod { get; set; } public bool EmulatorDebugMode { get; set; } + public List SearchTypes { get; set; } } } \ No newline at end of file diff --git a/gaseous-server/Program.cs b/gaseous-server/Program.cs index b623528..4c8f5b8 100644 --- a/gaseous-server/Program.cs +++ b/gaseous-server/Program.cs @@ -46,6 +46,14 @@ AgeRatings.PopulateAgeMap(); // load app settings Config.InitSettings(); +// set default search settings +Config.SetSetting>("DefaultSearchMethods", new List() { + Games.SearchType.where, + Games.SearchType.wherefuzzy, + Games.SearchType.search, + Games.SearchType.searchNoPlatform +}); + // disable hasheous Config.MetadataConfiguration.SignatureSource = HasheousClient.Models.MetadataModel.SignatureSources.LocalOnly; diff --git a/gaseous-server/wwwroot/pages/settings/settings.html b/gaseous-server/wwwroot/pages/settings/settings.html index 93e6a06..0d144c2 100644 --- a/gaseous-server/wwwroot/pages/settings/settings.html +++ b/gaseous-server/wwwroot/pages/settings/settings.html @@ -6,15 +6,17 @@
-
+

Advanced Settings

Warning Do not modify the below settings unless you know what you're doing.

Background Task Timers

- +
-
+

System Settings

@@ -26,13 +28,15 @@ Write logs @@ -46,6 +50,58 @@ + + + + + + + + + + + + + + + + @@ -95,9 +151,9 @@ } newTable.appendChild(createTableRow( - false, - [ - result[i].name, + false, + [ + result[i].name, result[i].path, platformName, defaultLibrary, @@ -115,14 +171,14 @@ ajaxCall( '/api/v1/System/Settings/BackgroundTasks/Configuration', 'GET', - function(result) { + function (result) { var targetTable = document.getElementById('settings_tasktimers'); targetTable.innerHTML = ''; for (const [key, value] of Object.entries(result)) { var newTableRowBody = document.createElement('tbody'); newTableRowBody.className = 'romrow'; - + var enabledString = ""; if (value.enabled == true) { enabledString = 'checked="checked"'; @@ -171,7 +227,7 @@ daySelector.multiple = 'multiple'; daySelector.setAttribute('data-default', value.defaultAllowedDays.join(",")); daySelector.style.width = '95%'; - var days = [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ]; + var days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; for (var d = 0; d < days.length; d++) { var dayOpt = document.createElement('option'); dayOpt.value = days[d]; @@ -312,7 +368,7 @@ var taskName = timerValues[i].getAttribute('data-name'); var taskEnabled = document.getElementById('settings_enabled_' + taskName).checked; var taskIntervalObj = document.getElementById('settings_tasktimers_' + taskName); - var taskInterval = function() { if (taskIntervalObj.value) { return taskIntervalObj.value; } else { return taskIntervalObj.getAttribute('placeholder'); } }; + var taskInterval = function () { if (taskIntervalObj.value) { return taskIntervalObj.value; } else { return taskIntervalObj.getAttribute('placeholder'); } }; var taskDaysRaw = $('#settings_alloweddays_' + taskName).select2('data'); var taskDays = []; if (taskDaysRaw.length > 0) { @@ -327,10 +383,10 @@ var taskEndHourObj = document.getElementById('settings_tasktimers_' + taskName + '_End_Hour'); var taskEndMinuteObj = document.getElementById('settings_tasktimers_' + taskName + '_End_Minute'); - var taskStartHour = function() { if (taskStartHourObj.value) { return taskStartHourObj.value; } else { return taskStartHourObj.getAttribute('placeholder'); } }; - var taskStartMinute = function() { if (taskStartMinuteObj.value) { return taskStartMinuteObj.value; } else { return taskStartMinuteObj.getAttribute('placeholder'); } }; - var taskEndHour = function() { if (taskEndHourObj.value) { return taskEndHourObj.value; } else { return taskEndHourObj.getAttribute('placeholder'); } }; - var taskEndMinute = function() { if (taskEndMinuteObj.value) { return taskEndMinuteObj.value; } else { return taskEndMinuteObj.getAttribute('placeholder'); } }; + var taskStartHour = function () { if (taskStartHourObj.value) { return taskStartHourObj.value; } else { return taskStartHourObj.getAttribute('placeholder'); } }; + var taskStartMinute = function () { if (taskStartMinuteObj.value) { return taskStartMinuteObj.value; } else { return taskStartMinuteObj.getAttribute('placeholder'); } }; + var taskEndHour = function () { if (taskEndHourObj.value) { return taskEndHourObj.value; } else { return taskEndHourObj.getAttribute('placeholder'); } }; + var taskEndMinute = function () { if (taskEndMinuteObj.value) { return taskEndMinuteObj.value; } else { return taskEndMinuteObj.getAttribute('placeholder'); } }; model.push( { @@ -349,10 +405,10 @@ ajaxCall( '/api/v1/System/Settings/BackgroundTasks/Configuration', 'POST', - function(result) { + function (result) { getBackgroundTaskTimers(); }, - function(error) { + function (error) { getBackgroundTaskTimers(); }, JSON.stringify(model) @@ -393,7 +449,7 @@ ajaxCall( '/api/v1/System/Settings/System', 'GET', - function(result) { + function (result) { var optionToSelect = 'settings_logs_write_db'; if (result.alwaysLogToDisk == true) { optionToSelect = 'settings_logs_write_fs'; @@ -403,6 +459,11 @@ document.getElementById('settings_logs_retention').value = result.minimumLogRetentionPeriod; document.getElementById('settings_emulator_debug').checked = result.emulatorDebugMode; + + for (let i = 0; i < result.searchTypes.length; i++) { + const element = result.searchTypes[i]; + document.getElementById('settings_metadata_search_' + element).checked = true; + } } ); } @@ -421,19 +482,29 @@ retentionValue = 7; } + let searchTypes = []; + let searchTypeElements = document.getElementsByName('settings_metadata_search'); + for (let i = 0; i < searchTypeElements.length; i++) { + const element = searchTypeElements[i]; + if (element.checked) { + searchTypes.push(element.id.replace('settings_metadata_search_', '')); + } + } + var model = { "alwaysLogToDisk": alwaysLogToDisk, "minimumLogRetentionPeriod": retentionValue, - "emulatorDebugMode": document.getElementById('settings_emulator_debug').checked + "emulatorDebugMode": document.getElementById('settings_emulator_debug').checked, + "searchTypes": searchTypes }; ajaxCall( '/api/v1/System/Settings/System', 'POST', - function(result) { + function (result) { getSystemSettings(); }, - function(error) { + function (error) { getSystemSettings(); }, JSON.stringify(model)
- +
- +
+ Allowed metadata search modes: + + +
  + +
  + +
  + +
Emulator