From f881459c0b6c73670275d4f880304e03cc33e854 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Wed, 1 May 2024 15:28:31 +1000 Subject: [PATCH 1/8] Merge 1.7.0 branch into main (#350) From eda171efa19bec4563165febc682ffc221b4b530 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Sat, 18 May 2024 15:05:25 +1000 Subject: [PATCH 2/8] Integrate new Hasheous client (#354) The new Hasheous client has been integrated into Gaseous to take advantage of the new updates to Hasheous that bring improved matching and community contributions. --- .gitignore | 2 + .vscode/launch.json | 3 +- Gaseous.sln | 20 +- gaseous-server/Classes/Common.cs | 152 ++++-- gaseous-server/Classes/Config.cs | 41 +- gaseous-server/Classes/DatabaseMigration.cs | 108 +++- gaseous-server/Classes/FileSignature.cs | 120 +++-- gaseous-server/Classes/ImportGames.cs | 215 ++++---- gaseous-server/Classes/Metadata/Games.cs | 37 +- gaseous-server/Classes/Metadata/Platforms.cs | 38 +- gaseous-server/Classes/Roms.cs | 169 ++++-- .../Classes/SignatureIngestors/XML.cs | 506 ++++++++++++------ gaseous-server/Classes/SignatureManagement.cs | 48 +- .../Controllers/V1.0/SystemController.cs | 75 ++- gaseous-server/Models/Signatures_Games.cs | 233 +++++++- gaseous-server/ProcessQueue.cs | 34 +- gaseous-server/Program.cs | 11 +- gaseous-server/Support/Country.txt | 73 +++ .../Support/Database/MySQL/gaseous-1022.sql | 40 ++ gaseous-server/Support/Language.txt | 47 ++ gaseous-server/gaseous-server.csproj | 28 +- .../wwwroot/pages/dialogs/librarynew.html | 8 +- .../wwwroot/pages/dialogs/rominfo.html | 69 ++- gaseous-server/wwwroot/pages/settings.html | 30 +- .../wwwroot/pages/settings/libraries.html | 63 +++ .../wwwroot/pages/settings/services.html | 290 ++++++++++ .../wwwroot/pages/settings/settings.html | 457 ++++------------ .../wwwroot/pages/settings/system.html | 10 +- gaseous-server/wwwroot/styles/style.css | 259 ++++++--- 29 files changed, 2169 insertions(+), 1017 deletions(-) create mode 100644 gaseous-server/Support/Country.txt create mode 100644 gaseous-server/Support/Database/MySQL/gaseous-1022.sql create mode 100644 gaseous-server/Support/Language.txt create mode 100644 gaseous-server/wwwroot/pages/settings/libraries.html create mode 100644 gaseous-server/wwwroot/pages/settings/services.html diff --git a/.gitignore b/.gitignore index c608dca..b849cf0 100644 --- a/.gitignore +++ b/.gitignore @@ -405,3 +405,5 @@ ASALocalRun/ .localhistory/ gaseous-server/.DS_Store gaseous-server/wwwroot/emulators/EmulatorJS +.devcontainer/.env +.mono/ \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index 82476c1..4ec8f9b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -24,7 +24,8 @@ }, "sourceFileMap": { "/Views": "${workspaceFolder}/Views" - } + }, + "enableStepFiltering": false }, { "name": ".NET Core Attach", diff --git a/Gaseous.sln b/Gaseous.sln index 8b88e80..9eca1ea 100644 --- a/Gaseous.sln +++ b/Gaseous.sln @@ -1,4 +1,4 @@ - + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 25.0.1704.4 @@ -27,30 +27,18 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {08699C93-15CD-4E39-9053-D3C8056CE938}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {08699C93-15CD-4E39-9053-D3C8056CE938}.Debug|Any CPU.Build.0 = Debug|Any CPU - {08699C93-15CD-4E39-9053-D3C8056CE938}.Release|Any CPU.ActiveCfg = Release|Any CPU - {08699C93-15CD-4E39-9053-D3C8056CE938}.Release|Any CPU.Build.0 = Release|Any CPU - {FFCEC386-033F-4772-A45B-D33579F2E5EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FFCEC386-033F-4772-A45B-D33579F2E5EE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FFCEC386-033F-4772-A45B-D33579F2E5EE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FFCEC386-033F-4772-A45B-D33579F2E5EE}.Release|Any CPU.Build.0 = Release|Any CPU {A01D2EFF-C82E-473B-84D7-7C25E736F5D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A01D2EFF-C82E-473B-84D7-7C25E736F5D2}.Debug|Any CPU.Build.0 = Debug|Any CPU {A01D2EFF-C82E-473B-84D7-7C25E736F5D2}.Release|Any CPU.ActiveCfg = Release|Any CPU {A01D2EFF-C82E-473B-84D7-7C25E736F5D2}.Release|Any CPU.Build.0 = Release|Any CPU - {B07A4655-A003-416B-A790-ADAA5B548E1A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B07A4655-A003-416B-A790-ADAA5B548E1A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B07A4655-A003-416B-A790-ADAA5B548E1A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B07A4655-A003-416B-A790-ADAA5B548E1A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {979BF092-AFBC-4F19-B55F-32E73959BD1A} - EndGlobalSection GlobalSection(NestedProjects) = preSolution {F1A847C7-57BC-4DA9-8F83-CD060A7F5122} = {17FA6F12-8532-420C-9489-CB8FDE42137C} EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {979BF092-AFBC-4F19-B55F-32E73959BD1A} + EndGlobalSection EndGlobal diff --git a/gaseous-server/Classes/Common.cs b/gaseous-server/Classes/Common.cs index 7ecc320..4df3f74 100644 --- a/gaseous-server/Classes/Common.cs +++ b/gaseous-server/Classes/Common.cs @@ -1,5 +1,6 @@ using System.Collections.Concurrent; using System.ComponentModel; +using System.Data; using System.IO.Compression; using System.Reflection; using System.Security.Cryptography; @@ -19,7 +20,8 @@ namespace gaseous_server.Classes if (ObjectToCheck == null || ObjectToCheck == System.DBNull.Value) { return IfNullValue; - } else + } + else { return ObjectToCheck; } @@ -27,10 +29,10 @@ namespace gaseous_server.Classes static public DateTime ConvertUnixToDateTime(double UnixTimeStamp) { - DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); - dateTime = dateTime.AddSeconds(UnixTimeStamp).ToLocalTime(); - return dateTime; - } + DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); + dateTime = dateTime.AddSeconds(UnixTimeStamp).ToLocalTime(); + return dateTime; + } public class hashObject { @@ -41,21 +43,21 @@ namespace gaseous_server.Classes public hashObject(string FileName) { - var xmlStream = File.OpenRead(FileName); + var xmlStream = File.OpenRead(FileName); - var md5 = MD5.Create(); - byte[] md5HashByte = md5.ComputeHash(xmlStream); - string md5Hash = BitConverter.ToString(md5HashByte).Replace("-", "").ToLowerInvariant(); + var md5 = MD5.Create(); + byte[] md5HashByte = md5.ComputeHash(xmlStream); + string md5Hash = BitConverter.ToString(md5HashByte).Replace("-", "").ToLowerInvariant(); _md5hash = md5Hash; - var sha1 = SHA1.Create(); + var sha1 = SHA1.Create(); xmlStream.Position = 0; - byte[] sha1HashByte = sha1.ComputeHash(xmlStream); - string sha1Hash = BitConverter.ToString(sha1HashByte).Replace("-", "").ToLowerInvariant(); + byte[] sha1HashByte = sha1.ComputeHash(xmlStream); + string sha1Hash = BitConverter.ToString(sha1HashByte).Replace("-", "").ToLowerInvariant(); _sha1hash = sha1Hash; xmlStream.Close(); - } + } string _md5hash = ""; string _sha1hash = ""; @@ -85,29 +87,29 @@ namespace gaseous_server.Classes } } - public static long DirSize(DirectoryInfo d) - { - long size = 0; - // Add file sizes. - FileInfo[] fis = d.GetFiles(); - foreach (FileInfo fi in fis) - { - size += fi.Length; - } - // Add subdirectory sizes. - DirectoryInfo[] dis = d.GetDirectories(); - foreach (DirectoryInfo di in dis) - { - size += DirSize(di); - } - return size; - } + public static long DirSize(DirectoryInfo d) + { + long size = 0; + // Add file sizes. + FileInfo[] fis = d.GetFiles(); + foreach (FileInfo fi in fis) + { + size += fi.Length; + } + // Add subdirectory sizes. + DirectoryInfo[] dis = d.GetDirectories(); + foreach (DirectoryInfo di in dis) + { + size += DirSize(di); + } + return size; + } public static string[] SkippableFiles = { ".DS_STORE", "desktop.ini" }; - + public static string NormalizePath(string path) { return Path.GetFullPath(new Uri(path).LocalPath) @@ -155,30 +157,74 @@ namespace gaseous_server.Classes return defaultValue; } } - } + + public static int GetLookupByCode(LookupTypes LookupType, string Code) + { + Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); + string sql = "SELECT Id FROM " + LookupType.ToString() + " WHERE Code = @code"; + Dictionary dbDict = new Dictionary{ + { "code", Code } + }; + + DataTable data = db.ExecuteCMD(sql, dbDict); + if (data.Rows.Count == 0) + { + return -1; + } + else + { + return (int)data.Rows[0]["Id"]; + } + } + + public static int GetLookupByValue(LookupTypes LookupType, string Value) + { + Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); + string sql = "SELECT Id FROM " + LookupType.ToString() + " WHERE Value = @value"; + Dictionary dbDict = new Dictionary{ + { "value", Value } + }; + + DataTable data = db.ExecuteCMD(sql, dbDict); + if (data.Rows.Count == 0) + { + return -1; + } + else + { + return (int)data.Rows[0]["Id"]; + } + } + + public enum LookupTypes + { + Country, + Language + } + } /// - /// Provides a way to set contextual data that flows with the call and - /// async context of a test or invocation. - /// - public static class CallContext - { - static ConcurrentDictionary> state = new ConcurrentDictionary>(); + /// Provides a way to set contextual data that flows with the call and + /// async context of a test or invocation. + /// + public static class CallContext + { + static ConcurrentDictionary> state = new ConcurrentDictionary>(); - /// - /// Stores a given object and associates it with the specified name. - /// - /// The name with which to associate the new item in the call context. - /// The object to store in the call context. - public static void SetData(string name, object data) => - state.GetOrAdd(name, _ => new AsyncLocal()).Value = data; + /// + /// Stores a given object and associates it with the specified name. + /// + /// The name with which to associate the new item in the call context. + /// The object to store in the call context. + public static void SetData(string name, object data) => + state.GetOrAdd(name, _ => new AsyncLocal()).Value = data; - /// - /// Retrieves an object with the specified name from the . - /// - /// The name of the item in the call context. - /// The object in the call context associated with the specified name, or if not found. - public static object GetData(string name) => - state.TryGetValue(name, out AsyncLocal data) ? data.Value : null; - } + /// + /// Retrieves an object with the specified name from the . + /// + /// The name of the item in the call context. + /// The object in the call context associated with the specified name, or if not found. + public static object GetData(string name) => + state.TryGetValue(name, out AsyncLocal data) ? data.Value : null; + } } \ No newline at end of file diff --git a/gaseous-server/Classes/Config.cs b/gaseous-server/Classes/Config.cs index 26f9963..9ce5cca 100644 --- a/gaseous-server/Classes/Config.cs +++ b/gaseous-server/Classes/Config.cs @@ -80,7 +80,8 @@ namespace gaseous_server.Classes get { string logPath = Path.Combine(ConfigurationPath, "Logs"); - if (!Directory.Exists(logPath)) { + if (!Directory.Exists(logPath)) + { Directory.CreateDirectory(logPath); } return logPath; @@ -92,7 +93,7 @@ namespace gaseous_server.Classes get { string logFileExtension = "txt"; - + string logPathName = Path.Combine(LogPath, "Server Log " + DateTime.Now.ToUniversalTime().ToString("yyyyMMdd") + "." + logFileExtension); return logPathName; } @@ -131,7 +132,7 @@ namespace gaseous_server.Classes _config.DatabaseConfiguration.DatabaseName = (string)Common.GetEnvVar("dbname", _config.DatabaseConfiguration.DatabaseName); _config.DatabaseConfiguration.Port = int.Parse((string)Common.GetEnvVar("dbport", _config.DatabaseConfiguration.Port.ToString())); _config.MetadataConfiguration.MetadataSource = (HasheousClient.Models.MetadataModel.MetadataSources)Enum.Parse(typeof(HasheousClient.Models.MetadataModel.MetadataSources), (string)Common.GetEnvVar("metadatasource", _config.MetadataConfiguration.MetadataSource.ToString())); - _config.MetadataConfiguration.SignatureSource = (HasheousClient.Models.MetadataModel.SignatureSources)Enum.Parse(typeof(HasheousClient.Models.MetadataModel.SignatureSources), (string)Common.GetEnvVar("signaturesource", _config.MetadataConfiguration.SignatureSource.ToString()));; + _config.MetadataConfiguration.SignatureSource = (HasheousClient.Models.MetadataModel.SignatureSources)Enum.Parse(typeof(HasheousClient.Models.MetadataModel.SignatureSources), (string)Common.GetEnvVar("signaturesource", _config.MetadataConfiguration.SignatureSource.ToString())); ; _config.MetadataConfiguration.MaxLibraryScanWorkers = int.Parse((string)Common.GetEnvVar("maxlibraryscanworkers", _config.MetadataConfiguration.MaxLibraryScanWorkers.ToString())); _config.MetadataConfiguration.HasheousHost = (string)Common.GetEnvVar("hasheoushost", _config.MetadataConfiguration.HasheousHost); _config.IGDBConfiguration.ClientId = (string)Common.GetEnvVar("igdbclientid", _config.IGDBConfiguration.ClientId); @@ -205,9 +206,9 @@ namespace gaseous_server.Classes { AppSettings.Remove(SettingName); } - + Logging.Log(Logging.LogType.Information, "Load Settings", "Loading setting " + SettingName + " from database"); - + try { if (Database.schema_version >= 1016) @@ -275,7 +276,7 @@ namespace gaseous_server.Classes if (Database.schema_version >= 1016) { sql = "SELECT Value, ValueDate FROM Settings WHERE Setting = @SettingName"; - + dbResponse = db.ExecuteCMD(sql, dbDict); Type type = typeof(T); if (dbResponse.Rows.Count == 0) @@ -301,7 +302,7 @@ namespace gaseous_server.Classes else { sql = "SELECT Value FROM Settings WHERE Setting = @SettingName"; - + dbResponse = db.ExecuteCMD(sql, dbDict); Type type = typeof(T); if (dbResponse.Rows.Count == 0) @@ -355,7 +356,7 @@ namespace gaseous_server.Classes Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); string sql; Dictionary dbDict; - + if (Database.schema_version >= 1016) { sql = "REPLACE INTO Settings (Setting, ValueType, Value, ValueDate) VALUES (@SettingName, @ValueType, @Value, @ValueDate)"; @@ -427,7 +428,8 @@ namespace gaseous_server.Classes public class Database { - private static string _DefaultHostName { + private static string _DefaultHostName + { get { if (!String.IsNullOrEmpty(Environment.GetEnvironmentVariable("dbhost"))) @@ -643,7 +645,7 @@ namespace gaseous_server.Classes return MetadataPath; } - public string LibrarySignatureImportDirectory + public string LibrarySignaturesDirectory { get { @@ -651,6 +653,14 @@ namespace gaseous_server.Classes } } + public string LibrarySignaturesProcessedDirectory + { + get + { + return Path.Combine(LibraryRootDirectory, "Signatures - Processed"); + } + } + public void InitLibrary() { if (!Directory.Exists(LibraryRootDirectory)) { Directory.CreateDirectory(LibraryRootDirectory); } @@ -660,7 +670,8 @@ namespace gaseous_server.Classes if (!Directory.Exists(LibraryMetadataDirectory)) { Directory.CreateDirectory(LibraryMetadataDirectory); } if (!Directory.Exists(LibraryTempDirectory)) { Directory.CreateDirectory(LibraryTempDirectory); } if (!Directory.Exists(LibraryCollectionsDirectory)) { Directory.CreateDirectory(LibraryCollectionsDirectory); } - if (!Directory.Exists(LibrarySignatureImportDirectory)) { Directory.CreateDirectory(LibrarySignatureImportDirectory); } + if (!Directory.Exists(LibrarySignaturesDirectory)) { Directory.CreateDirectory(LibrarySignaturesDirectory); } + if (!Directory.Exists(LibrarySignaturesProcessedDirectory)) { Directory.CreateDirectory(LibrarySignaturesProcessedDirectory); } } } @@ -696,6 +707,10 @@ namespace gaseous_server.Classes } } + private static bool _HasheousSubmitFixes { get; set; } = false; + + private static string _HasheousAPIKey { get; set; } = ""; + private static int _MaxLibraryScanWorkers { get @@ -730,6 +745,10 @@ namespace gaseous_server.Classes public HasheousClient.Models.MetadataModel.SignatureSources SignatureSource = _SignatureSource; + public bool HasheousSubmitFixes = _HasheousSubmitFixes; + + public string HasheousAPIKey = _HasheousAPIKey; + public int MaxLibraryScanWorkers = _MaxLibraryScanWorkers; public string HasheousHost = _HasheousHost; diff --git a/gaseous-server/Classes/DatabaseMigration.cs b/gaseous-server/Classes/DatabaseMigration.cs index c9e65de..b701076 100644 --- a/gaseous-server/Classes/DatabaseMigration.cs +++ b/gaseous-server/Classes/DatabaseMigration.cs @@ -1,14 +1,17 @@ using System; using System.Data; using System.Reflection; +using gaseous_server.Classes.Metadata; +using gaseous_server.Models; +using IGDB.Models; namespace gaseous_server.Classes { - public static class DatabaseMigration - { + public static class DatabaseMigration + { public static List BackgroundUpgradeTargetSchemaVersions = new List(); - public static void PreUpgradeScript(int TargetSchemaVersion, Database.databaseType? DatabaseType) + public static void PreUpgradeScript(int TargetSchemaVersion, Database.databaseType? DatabaseType) { // load resources var assembly = Assembly.GetExecutingAssembly(); @@ -20,14 +23,14 @@ namespace gaseous_server.Classes Logging.Log(Logging.LogType.Information, "Database", "Checking for pre-upgrade for schema version " + TargetSchemaVersion); - switch(DatabaseType) + switch (DatabaseType) { case Database.databaseType.MySql: switch (TargetSchemaVersion) { case 1005: Logging.Log(Logging.LogType.Information, "Database", "Running pre-upgrade for schema version " + TargetSchemaVersion); - + // there was a mistake at dbschema version 1004-1005 // the first preview release of v1.7 reused dbschema version 1004 // if table "Relation_Game_AgeRatings" exists - then we need to apply the gaseous-fix-1005.sql script before applying the standard 1005 script @@ -62,14 +65,16 @@ namespace gaseous_server.Classes } } - public static void PostUpgradeScript(int TargetSchemaVersion, Database.databaseType? DatabaseType) + public static void PostUpgradeScript(int TargetSchemaVersion, Database.databaseType? DatabaseType) { + var assembly = Assembly.GetExecutingAssembly(); + Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); string sql = ""; Dictionary dbDict = new Dictionary(); DataTable data; - switch(DatabaseType) + switch (DatabaseType) { case Database.databaseType.MySql: switch (TargetSchemaVersion) @@ -78,7 +83,7 @@ namespace gaseous_server.Classes // this is a safe background task BackgroundUpgradeTargetSchemaVersions.Add(1002); break; - + case 1004: // needs to run on start up @@ -103,6 +108,51 @@ namespace gaseous_server.Classes sql = "DELETE FROM Settings WHERE Setting LIKE 'LastRun_%';"; db.ExecuteNonQuery(sql); break; + + case 1022: + // load country list + Logging.Log(Logging.LogType.Information, "Database Upgrade", "Adding country look up table contents"); + + string countryResourceName = "gaseous_server.Support.Country.txt"; + using (Stream stream = assembly.GetManifestResourceStream(countryResourceName)) + using (StreamReader reader = new StreamReader(stream)) + { + do + { + string[] line = reader.ReadLine().Split("|"); + + sql = "INSERT INTO Country (Code, Value) VALUES (@code, @value);"; + dbDict = new Dictionary{ + { "code", line[0] }, + { "value", line[1] } + }; + db.ExecuteNonQuery(sql, dbDict); + } while (reader.EndOfStream == false); + } + + // load language list + Logging.Log(Logging.LogType.Information, "Database Upgrade", "Adding language look up table contents"); + + string languageResourceName = "gaseous_server.Support.Language.txt"; + using (Stream stream = assembly.GetManifestResourceStream(languageResourceName)) + using (StreamReader reader = new StreamReader(stream)) + { + do + { + string[] line = reader.ReadLine().Split("|"); + + sql = "INSERT INTO Language (Code, Value) VALUES (@code, @value);"; + dbDict = new Dictionary{ + { "code", line[0] }, + { "value", line[1] } + }; + db.ExecuteNonQuery(sql, dbDict); + } while (reader.EndOfStream == false); + } + + // this is a safe background task + BackgroundUpgradeTargetSchemaVersions.Add(1022); + break; } break; } @@ -117,11 +167,16 @@ namespace gaseous_server.Classes case 1002: MySql_1002_MigrateMetadataVersion(); break; + + case 1022: + MySql_1022_MigrateMetadataVersion(); + break; } } } - public static void MySql_1002_MigrateMetadataVersion() { + public static void MySql_1002_MigrateMetadataVersion() + { Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); string sql = ""; Dictionary dbDict = new Dictionary(); @@ -134,7 +189,7 @@ namespace gaseous_server.Classes Logging.Log(Logging.LogType.Information, "Signature Ingestor - Database Update", "Updating " + data.Rows.Count + " database entries"); int Counter = 0; int LastCounterCheck = 0; - foreach (DataRow row in data.Rows) + foreach (DataRow row in data.Rows) { List Flags = Newtonsoft.Json.JsonConvert.DeserializeObject>((string)Common.ReturnValueIfNull(row["flags"], "[]")); List> Attributes = new List>(); @@ -207,7 +262,7 @@ namespace gaseous_server.Classes dbDict.Add("id", (int)row["Id"]); db.ExecuteCMD(updateSQL, dbDict); - if ((Counter - LastCounterCheck) > 10) + if ((Counter - LastCounterCheck) > 10) { LastCounterCheck = Counter; Logging.Log(Logging.LogType.Information, "Signature Ingestor - Database Update", "Updating " + Counter + " / " + data.Rows.Count + " database entries"); @@ -216,5 +271,36 @@ namespace gaseous_server.Classes } } } + + public static void MySql_1022_MigrateMetadataVersion() + { + FileSignature fileSignature = new FileSignature(); + + Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); + string sql = "SELECT * FROM Games_Roms WHERE RomDataVersion = 1;"; + DataTable data = db.ExecuteCMD(sql); + foreach (DataRow row in data.Rows) + { + Logging.Log(Logging.LogType.Information, "Database Migration", "Updating ROM table for ROM: " + (string)row["Name"]); + + GameLibrary.LibraryItem library = GameLibrary.GetLibrary((int)row["LibraryId"]); + Common.hashObject hash = new Common.hashObject() + { + md5hash = (string)row["MD5"], + sha1hash = (string)row["SHA1"] + }; + Signatures_Games signature = fileSignature.GetFileSignature( + library, + hash, + new FileInfo((string)row["Path"]), + (string)row["Path"] + ); + + Platform platform = Platforms.GetPlatform((long)row["PlatformId"], false); + Game game = Games.GetGame((long)row["GameId"], false, false, false); + + ImportGame.StoreROM(library, hash, game, platform, signature, (string)row["Path"], (long)row["Id"]); + } + } } } \ No newline at end of file diff --git a/gaseous-server/Classes/FileSignature.cs b/gaseous-server/Classes/FileSignature.cs index 9478d89..c27e9de 100644 --- a/gaseous-server/Classes/FileSignature.cs +++ b/gaseous-server/Classes/FileSignature.cs @@ -1,6 +1,8 @@ using System.Collections.Concurrent; using System.IO.Compression; +using gaseous_server.Classes.Metadata; using HasheousClient.Models; +using Microsoft.CodeAnalysis.CSharp.Syntax; using NuGet.Common; using SevenZip; using SharpCompress.Archives; @@ -31,7 +33,7 @@ namespace gaseous_server.Classes if (!Directory.Exists(ExtractPath)) { Directory.CreateDirectory(ExtractPath); } try { - switch(ImportedFileExtension) + switch (ImportedFileExtension) { case ".zip": Logging.Log(Logging.LogType.Information, "Get Signature", "Decompressing using zip"); @@ -105,31 +107,24 @@ namespace gaseous_server.Classes } break; } - + Logging.Log(Logging.LogType.Information, "Get Signature", "Processing decompressed files for signature matches"); // loop through contents until we find the first signature match List archiveFiles = new List(); bool signatureFound = false; + bool signatureSelectorAlreadyApplied = false; foreach (string file in Directory.GetFiles(ExtractPath, "*.*", SearchOption.AllDirectories)) { + bool signatureSelector = false; if (File.Exists(file)) { FileInfo zfi = new FileInfo(file); Common.hashObject zhash = new Common.hashObject(file); - + Logging.Log(Logging.LogType.Information, "Get Signature", "Checking signature of decompressed file " + file); if (zfi != null) { - ArchiveData archiveData = new ArchiveData{ - FileName = Path.GetFileName(file), - FilePath = zfi.Directory.FullName.Replace(ExtractPath, ""), - Size = zfi.Length, - MD5 = hash.md5hash, - SHA1 = hash.sha1hash - }; - archiveFiles.Add(archiveData); - if (signatureFound == false) { gaseous_server.Models.Signatures_Games zDiscoveredSignature = _GetFileSignature(zhash, zfi.Name, zfi.Extension, zfi.Length, file, true); @@ -138,7 +133,7 @@ namespace gaseous_server.Classes if (zDiscoveredSignature.Score > discoveredSignature.Score) { if ( - zDiscoveredSignature.Rom.SignatureSource == gaseous_server.Models.Signatures_Games.RomItem.SignatureSourceType.MAMEArcade || + zDiscoveredSignature.Rom.SignatureSource == gaseous_server.Models.Signatures_Games.RomItem.SignatureSourceType.MAMEArcade || zDiscoveredSignature.Rom.SignatureSource == gaseous_server.Models.Signatures_Games.RomItem.SignatureSourceType.MAMEMess ) { @@ -151,15 +146,37 @@ namespace gaseous_server.Classes discoveredSignature = zDiscoveredSignature; signatureFound = true; + + if (signatureSelectorAlreadyApplied == false) + { + signatureSelector = true; + signatureSelectorAlreadyApplied = true; + } } } + + ArchiveData archiveData = new ArchiveData + { + FileName = Path.GetFileName(file), + FilePath = zfi.Directory.FullName.Replace(ExtractPath, ""), + Size = zfi.Length, + MD5 = zhash.md5hash, + SHA1 = zhash.sha1hash, + isSignatureSelector = signatureSelector + }; + archiveFiles.Add(archiveData); } } } - discoveredSignature.Rom.Attributes.Add(new KeyValuePair( + if (discoveredSignature.Rom.Attributes == null) + { + discoveredSignature.Rom.Attributes = new Dictionary(); + } + + discoveredSignature.Rom.Attributes.Add( "ZipContents", Newtonsoft.Json.JsonConvert.SerializeObject(archiveFiles) - )); + ); } catch (Exception ex) { @@ -195,7 +212,7 @@ namespace gaseous_server.Classes { // signature retrieved from Hasheous Logging.Log(Logging.LogType.Information, "Import Game", "Signature retrieved from Hasheous for game: " + dbSignature.Game.Name); - + discoveredSignature = dbSignature; } else @@ -203,7 +220,7 @@ namespace gaseous_server.Classes // construct a signature from file data dbSignature = _GetFileSignatureFromFileData(hash, ImageName, ImageExtension, ImageSize, GameFileImportPath); Logging.Log(Logging.LogType.Information, "Import Game", "Signature generated from provided file for game: " + dbSignature.Game.Name); - + discoveredSignature = dbSignature; } } @@ -216,8 +233,8 @@ namespace gaseous_server.Classes return discoveredSignature; } - private gaseous_server.Models.Signatures_Games? _GetFileSignatureFromDatabase(Common.hashObject hash, string ImageName, string ImageExtension, long ImageSize, string GameFileImportPath) - { + private gaseous_server.Models.Signatures_Games? _GetFileSignatureFromDatabase(Common.hashObject hash, string ImageName, string ImageExtension, long ImageSize, string GameFileImportPath) + { Logging.Log(Logging.LogType.Information, "Get Signature", "Checking local database for MD5: " + hash.md5hash); // check 1: do we have a signature for it? @@ -264,29 +281,67 @@ namespace gaseous_server.Classes if (Config.MetadataConfiguration.SignatureSource == HasheousClient.Models.MetadataModel.SignatureSources.Hasheous) { HasheousClient.Hasheous hasheous = new HasheousClient.Hasheous(); - SignatureLookupItem? HasheousResult = hasheous.RetrieveFromHasheousAsync(new HashLookupModel{ - MD5 = hash.md5hash, - SHA1 = hash.sha1hash - }); + Console.WriteLine(HasheousClient.WebApp.HttpHelper.BaseUri); + LookupItemModel? HasheousResult = null; + try + { + HasheousResult = hasheous.RetrieveFromHasheous(new HashLookupModel + { + MD5 = hash.md5hash, + SHA1 = hash.sha1hash + }); + } + catch (Exception ex) + { + Logging.Log(Logging.LogType.Warning, "Import Game", "An error occurred while importing " + ImageName, ex); + return null; + } if (HasheousResult != null) { if (HasheousResult.Signature != null) { gaseous_server.Models.Signatures_Games signature = new Models.Signatures_Games(); - signature.Game = HasheousResult.Signature.Game; - signature.Rom = HasheousResult.Signature.Rom; - - if (HasheousResult.MetadataResults != null) + string gameJson = Newtonsoft.Json.JsonConvert.SerializeObject(HasheousResult.Signature.Game); + string romJson = Newtonsoft.Json.JsonConvert.SerializeObject(HasheousResult.Signature.Rom); + signature.Game = Newtonsoft.Json.JsonConvert.DeserializeObject(gameJson); + signature.Rom = Newtonsoft.Json.JsonConvert.DeserializeObject(romJson); + + // get platform metadata + if (HasheousResult.Platform != null) { - if (HasheousResult.MetadataResults.Count > 0) + if (HasheousResult.Platform.metadata.Count > 0) { - foreach (SignatureLookupItem.MetadataResult metadataResult in HasheousResult.MetadataResults) + foreach (HasheousClient.Models.MetadataItem metadataResult in HasheousResult.Platform.metadata) { - if (metadataResult.Source == MetadataModel.MetadataSources.IGDB) + if (metadataResult.Id.Length > 0) { - signature.Flags.IGDBPlatformId = (long)metadataResult.PlatformId; - signature.Flags.IGDBGameId = (long)metadataResult.GameId; + switch (metadataResult.Source) + { + case HasheousClient.Models.MetadataSources.IGDB: + signature.Flags.IGDBPlatformId = (long)Platforms.GetPlatform(metadataResult.Id, false).Id; + break; + } + } + } + } + } + + // get game metadata + if (HasheousResult.Metadata != null) + { + if (HasheousResult.Metadata.Count > 0) + { + foreach (HasheousClient.Models.MetadataItem metadataResult in HasheousResult.Metadata) + { + if (metadataResult.Id.Length > 0) + { + switch (metadataResult.Source) + { + case HasheousClient.Models.MetadataSources.IGDB: + signature.Flags.IGDBGameId = (long)Games.GetGame(metadataResult.Id, false, false, false).Id; + break; + } } } } @@ -368,6 +423,7 @@ namespace gaseous_server.Classes public long Size { get; set; } public string MD5 { get; set; } public string SHA1 { get; set; } + public bool isSignatureSelector { get; set; } = false; } } } \ No newline at end of file diff --git a/gaseous-server/Classes/ImportGames.cs b/gaseous-server/Classes/ImportGames.cs index d8d9701..e4a1267 100644 --- a/gaseous-server/Classes/ImportGames.cs +++ b/gaseous-server/Classes/ImportGames.cs @@ -16,48 +16,49 @@ using HasheousClient.Models; namespace gaseous_server.Classes { - public class ImportGame : QueueItemStatus - { + public class ImportGame : QueueItemStatus + { public void ProcessDirectory(string ImportPath) { if (Directory.Exists(ImportPath)) - { - string[] importContents = Directory.GetFiles(ImportPath, "*.*", SearchOption.AllDirectories); + { + string[] importContents = Directory.GetFiles(ImportPath, "*.*", SearchOption.AllDirectories); Logging.Log(Logging.LogType.Information, "Import Games", "Found " + importContents.Length + " files to process in import directory: " + ImportPath); - // import files first + // import files first int importCount = 1; - foreach (string importContent in importContents) { + foreach (string importContent in importContents) + { SetStatus(importCount, importContents.Length, "Importing file: " + importContent); - ImportGameFile(importContent, null); + ImportGameFile(importContent, null); importCount += 1; - } + } ClearStatus(); DeleteOrphanedDirectories(ImportPath); } - else - { - Logging.Log(Logging.LogType.Critical, "Import Games", "The import directory " + ImportPath + " does not exist."); - throw new DirectoryNotFoundException("Invalid path: " + ImportPath); - } + else + { + Logging.Log(Logging.LogType.Critical, "Import Games", "The import directory " + ImportPath + " does not exist."); + throw new DirectoryNotFoundException("Invalid path: " + ImportPath); + } } public void ImportGameFile(string GameFileImportPath, IGDB.Models.Platform? OverridePlatform) - { + { Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); - string sql = ""; - Dictionary dbDict = new Dictionary(); + string sql = ""; + Dictionary dbDict = new Dictionary(); if (Common.SkippableFiles.Contains(Path.GetFileName(GameFileImportPath), StringComparer.OrdinalIgnoreCase)) - { + { Logging.Log(Logging.LogType.Debug, "Import Game", "Skipping item " + GameFileImportPath); } - else - { + else + { FileInfo fi = new FileInfo(GameFileImportPath); Common.hashObject hash = new Common.hashObject(GameFileImportPath); @@ -87,7 +88,7 @@ namespace gaseous_server.Classes } File.Move(GameFileImportPath, targetPathWithFileName, true); } - + // import source was the upload directory if (GameFileImportPath.StartsWith(Config.LibraryConfiguration.LibraryUploadDirectory)) { @@ -146,8 +147,8 @@ namespace gaseous_server.Classes } } } - } - } + } + } public static IGDB.Models.Game SearchForGame(gaseous_server.Models.Signatures_Games Signature, long PlatformId, bool FullDownload) { @@ -173,7 +174,7 @@ namespace gaseous_server.Classes string GameName = Signature.Game.Name; List SearchCandidates = GetSearchCandidates(GameName); - + foreach (string SearchCandidate in SearchCandidates) { bool GameFound = false; @@ -197,8 +198,10 @@ namespace gaseous_server.Classes Logging.Log(Logging.LogType.Information, "Import Game", " " + games.Length + " search results found"); // quite likely we've found sequels and alternate types - foreach (Game game in games) { - if (game.Name == SearchCandidate) { + foreach (Game game in games) + { + if (game.Name == SearchCandidate) + { // found game title matches the search candidate determinedGame = Metadata.Games.GetGame((long)games[0].Id, false, false, false); Logging.Log(Logging.LogType.Information, "Import Game", "Found exact match!"); @@ -273,7 +276,8 @@ namespace gaseous_server.Classes // assumption: no games have () in their titles so we'll remove them int idx = GameName.IndexOf('('); - if (idx >= 0) { + if (idx >= 0) + { GameName = GameName.Substring(0, idx); } @@ -304,10 +308,11 @@ namespace gaseous_server.Classes if (UpdateId == 0) { - sql = "INSERT INTO Games_Roms (PlatformId, GameId, Name, Size, CRC, MD5, SHA1, DevelopmentStatus, Attributes, RomType, RomTypeMedia, MediaLabel, Path, MetadataSource, MetadataGameName, MetadataVersion, LibraryId) VALUES (@platformid, @gameid, @name, @size, @crc, @md5, @sha1, @developmentstatus, @Attributes, @romtype, @romtypemedia, @medialabel, @path, @metadatasource, @metadatagamename, @metadataversion, @libraryid); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; - } else + sql = "INSERT INTO Games_Roms (PlatformId, GameId, Name, Size, CRC, MD5, SHA1, DevelopmentStatus, Attributes, RomType, RomTypeMedia, MediaLabel, Path, MetadataSource, MetadataGameName, MetadataVersion, LibraryId, RomDataVersion) VALUES (@platformid, @gameid, @name, @size, @crc, @md5, @sha1, @developmentstatus, @Attributes, @romtype, @romtypemedia, @medialabel, @path, @metadatasource, @metadatagamename, @metadataversion, @libraryid, @romdataversion); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; + } + else { - sql = "UPDATE Games_Roms SET PlatformId=@platformid, GameId=@gameid, Name=@name, Size=@size, DevelopmentStatus=@developmentstatus, Attributes=@Attributes, RomType=@romtype, RomTypeMedia=@romtypemedia, MediaLabel=@medialabel, MetadataSource=@metadatasource, MetadataGameName=@metadatagamename, MetadataVersion=@metadataversion WHERE Id=@id;"; + sql = "UPDATE Games_Roms SET PlatformId=@platformid, GameId=@gameid, Name=@name, Size=@size, DevelopmentStatus=@developmentstatus, Attributes=@Attributes, RomType=@romtype, RomTypeMedia=@romtypemedia, MediaLabel=@medialabel, MetadataSource=@metadatasource, MetadataGameName=@metadatagamename, MetadataVersion=@metadataversion, RomDataVersion=@romdataversion WHERE Id=@id;"; dbDict.Add("id", UpdateId); } dbDict.Add("platformid", Common.ReturnValueIfNull(determinedPlatform.Id, 0)); @@ -322,6 +327,7 @@ namespace gaseous_server.Classes dbDict.Add("metadatagamename", discoveredSignature.Game.Name); dbDict.Add("metadataversion", 2); dbDict.Add("libraryid", library.Id); + dbDict.Add("romdataversion", 2); if (discoveredSignature.Rom.Attributes != null) { @@ -348,7 +354,8 @@ namespace gaseous_server.Classes if (UpdateId == 0) { romId = (long)romInsert.Rows[0][0]; - } else + } + else { romId = UpdateId; } @@ -362,73 +369,73 @@ namespace gaseous_server.Classes return romId; } - public static string ComputeROMPath(long RomId) - { - Classes.Roms.GameRomItem rom = Classes.Roms.GetRom(RomId); - - // get metadata - IGDB.Models.Platform platform = gaseous_server.Classes.Metadata.Platforms.GetPlatform(rom.PlatformId); - IGDB.Models.Game game = gaseous_server.Classes.Metadata.Games.GetGame(rom.GameId, false, false, false); - - // build path - string platformSlug = "Unknown Platform"; - if (platform != null) - { - platformSlug = platform.Slug; - } - string gameSlug = "Unknown Title"; - if (game != null) - { - gameSlug = game.Slug; - } - string DestinationPath = Path.Combine(GameLibrary.GetDefaultLibrary.Path, gameSlug, platformSlug); - if (!Directory.Exists(DestinationPath)) - { - Directory.CreateDirectory(DestinationPath); - } - - string DestinationPathName = Path.Combine(DestinationPath, rom.Name); - - return DestinationPathName; - } - - public static bool MoveGameFile(long RomId) - { + public static string ComputeROMPath(long RomId) + { Classes.Roms.GameRomItem rom = Classes.Roms.GetRom(RomId); - string romPath = rom.Path; + + // get metadata + IGDB.Models.Platform platform = gaseous_server.Classes.Metadata.Platforms.GetPlatform(rom.PlatformId); + IGDB.Models.Game game = gaseous_server.Classes.Metadata.Games.GetGame(rom.GameId, false, false, false); + + // build path + string platformSlug = "Unknown Platform"; + if (platform != null) + { + platformSlug = platform.Slug; + } + string gameSlug = "Unknown Title"; + if (game != null) + { + gameSlug = game.Slug; + } + string DestinationPath = Path.Combine(GameLibrary.GetDefaultLibrary.Path, gameSlug, platformSlug); + if (!Directory.Exists(DestinationPath)) + { + Directory.CreateDirectory(DestinationPath); + } + + string DestinationPathName = Path.Combine(DestinationPath, rom.Name); + + return DestinationPathName; + } + + public static bool MoveGameFile(long RomId) + { + Classes.Roms.GameRomItem rom = Classes.Roms.GetRom(RomId); + string romPath = rom.Path; if (File.Exists(romPath)) { string DestinationPath = ComputeROMPath(RomId); - if (romPath == DestinationPath) - { - Logging.Log(Logging.LogType.Debug, "Move Game ROM", "Destination path is the same as the current path - aborting"); + if (romPath == DestinationPath) + { + Logging.Log(Logging.LogType.Debug, "Move Game ROM", "Destination path is the same as the current path - aborting"); return true; - } - else - { - Logging.Log(Logging.LogType.Information, "Move Game ROM", "Moving " + romPath + " to " + DestinationPath); - if (File.Exists(DestinationPath)) - { - Logging.Log(Logging.LogType.Information, "Move Game ROM", "A file with the same name exists at the destination - aborting"); + } + else + { + Logging.Log(Logging.LogType.Information, "Move Game ROM", "Moving " + romPath + " to " + DestinationPath); + if (File.Exists(DestinationPath)) + { + Logging.Log(Logging.LogType.Information, "Move Game ROM", "A file with the same name exists at the destination - aborting"); return false; - } - else - { - File.Move(romPath, DestinationPath); + } + else + { + File.Move(romPath, DestinationPath); - // update the db - Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); - string sql = "UPDATE Games_Roms SET Path=@path WHERE Id=@id"; - Dictionary dbDict = new Dictionary(); - dbDict.Add("id", RomId); - dbDict.Add("path", DestinationPath); - db.ExecuteCMD(sql, dbDict); + // update the db + Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); + string sql = "UPDATE Games_Roms SET Path=@path WHERE Id=@id"; + Dictionary dbDict = new Dictionary(); + dbDict.Add("id", RomId); + dbDict.Add("path", DestinationPath); + db.ExecuteCMD(sql, dbDict); return true; - } - } + } + } } else { @@ -437,8 +444,8 @@ namespace gaseous_server.Classes } } - public void OrganiseLibrary() - { + public void OrganiseLibrary() + { Logging.Log(Logging.LogType.Information, "Organise Library", "Starting default library organisation"); GameLibrary.LibraryItem library = GameLibrary.GetDefaultLibrary; @@ -451,19 +458,19 @@ namespace gaseous_server.Classes DataTable romDT = db.ExecuteCMD(sql, dbDict); if (romDT.Rows.Count > 0) - { - for (int i = 0; i < romDT.Rows.Count; i++) - { + { + for (int i = 0; i < romDT.Rows.Count; i++) + { SetStatus(i, romDT.Rows.Count, "Processing file " + romDT.Rows[i]["name"]); - Logging.Log(Logging.LogType.Information, "Organise Library", "(" + i + "/" + romDT.Rows.Count + ") Processing ROM " + romDT.Rows[i]["name"]); + Logging.Log(Logging.LogType.Information, "Organise Library", "(" + i + "/" + romDT.Rows.Count + ") Processing ROM " + romDT.Rows[i]["name"]); long RomId = (long)romDT.Rows[i]["id"]; - MoveGameFile(RomId); - } - } + MoveGameFile(RomId); + } + } ClearStatus(); - // clean up empty directories - DeleteOrphanedDirectories(GameLibrary.GetDefaultLibrary.Path); + // clean up empty directories + DeleteOrphanedDirectories(GameLibrary.GetDefaultLibrary.Path); Logging.Log(Logging.LogType.Information, "Organise Library", "Finsihed default library organisation"); } @@ -476,7 +483,7 @@ namespace gaseous_server.Classes string[] files = Directory.GetFiles(directory); string[] directories = Directory.GetDirectories(directory); - + if (files.Length == 0 && directories.Length == 0) { @@ -563,7 +570,7 @@ namespace gaseous_server.Classes public void LibrarySpecificScan(GameLibrary.LibraryItem library) { - + Logging.Log(Logging.LogType.Information, "Library Scan", "Starting scan of library: " + library.Name); Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); @@ -632,7 +639,7 @@ namespace gaseous_server.Classes { // file is not in database - process it Logging.Log(Logging.LogType.Information, "Library Scan", "Orphaned file found in library: " + LibraryFile); - + Common.hashObject hash = new Common.hashObject(LibraryFile); FileInfo fi = new FileInfo(LibraryFile); @@ -644,8 +651,8 @@ namespace gaseous_server.Classes // get discovered platform long PlatformId; IGDB.Models.Platform determinedPlatform; - - if (sig.Flags.IGDBPlatformId == null || sig.Flags.IGDBPlatformId == 0 ) + + if (sig.Flags.IGDBPlatformId == null || sig.Flags.IGDBPlatformId == 0) { // no platform discovered in the signature PlatformId = library.DefaultPlatformId; @@ -770,8 +777,8 @@ namespace gaseous_server.Classes // get discovered platform long PlatformId; IGDB.Models.Platform determinedPlatform; - - if (sig.Flags.IGDBPlatformId == null || sig.Flags.IGDBPlatformId == 0 ) + + if (sig.Flags.IGDBPlatformId == null || sig.Flags.IGDBPlatformId == 0) { // no platform discovered in the signature PlatformId = library.DefaultPlatformId; diff --git a/gaseous-server/Classes/Metadata/Games.cs b/gaseous-server/Classes/Metadata/Games.cs index 18e4e2b..e524907 100644 --- a/gaseous-server/Classes/Metadata/Games.cs +++ b/gaseous-server/Classes/Metadata/Games.cs @@ -5,8 +5,8 @@ using IGDB.Models; namespace gaseous_server.Classes.Metadata { - public class Games - { + public class Games + { const string fieldList = "fields age_ratings,aggregated_rating,aggregated_rating_count,alternative_names,artworks,bundles,category,checksum,collection,collections,cover,created_at,dlcs,expanded_games,expansions,external_games,first_release_date,follows,forks,franchise,franchises,game_engines,game_localizations,game_modes,genres,hypes,involved_companies,keywords,language_supports,multiplayer_modes,name,parent_game,platforms,player_perspectives,ports,rating,rating_count,release_dates,remakes,remasters,screenshots,similar_games,slug,standalone_expansions,status,storyline,summary,tags,themes,total_rating,total_rating_count,updated_at,url,version_parent,version_title,videos,websites;"; public Games() @@ -15,9 +15,9 @@ namespace gaseous_server.Classes.Metadata } public class InvalidGameId : Exception - { + { public InvalidGameId(long Id) : base("Unable to find Game by id " + Id) - {} + { } } public static Game? GetGame(long Id, bool getAllMetadata, bool followSubGames, bool forceRefresh) @@ -78,15 +78,17 @@ namespace gaseous_server.Classes.Metadata if (cacheStatus == Storage.CacheStatus.Current) { cacheStatus = Storage.CacheStatus.Expired; } } - // set up where clause string WhereClause = ""; + string searchField = ""; switch (searchUsing) { case SearchUsing.id: WhereClause = "where id = " + searchValue; + searchField = "id"; break; case SearchUsing.slug: - WhereClause = "where slug = " + searchValue; + WhereClause = "where slug = \"" + searchValue + "\""; + searchField = "slug"; break; default: throw new Exception("Invalid search type"); @@ -110,11 +112,11 @@ namespace gaseous_server.Classes.Metadata catch (Exception ex) { Logging.Log(Logging.LogType.Warning, "Metadata: " + returnValue.GetType().Name, "An error occurred while connecting to IGDB. WhereClause: " + WhereClause, ex); - returnValue = Storage.GetCacheValue(returnValue, "id", (long)searchValue); + returnValue = Storage.GetCacheValue(returnValue, searchField, searchValue); } return returnValue; case Storage.CacheStatus.Current: - returnValue = Storage.GetCacheValue(returnValue, "id", (long)searchValue); + returnValue = Storage.GetCacheValue(returnValue, searchField, searchValue); UpdateSubClasses(returnValue, false, false, false); return returnValue; default: @@ -285,7 +287,7 @@ namespace gaseous_server.Classes.Metadata { try { - Screenshot GameScreenshot = Screenshots.GetScreenshot(ScreenshotId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(Game), forceRefresh); + Screenshot GameScreenshot = Screenshots.GetScreenshot(ScreenshotId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(Game), forceRefresh); } catch (Exception ex) { @@ -347,7 +349,7 @@ namespace gaseous_server.Classes.Metadata // get missing metadata from parent if this is a port if (result.Category == Category.Port) - { + { if (result.Summary == null) { if (result.ParentGame != null) @@ -364,7 +366,7 @@ namespace gaseous_server.Classes.Metadata return result; } - + public static void AssignAllGamesToPlatformIdZero() { Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); @@ -428,7 +430,7 @@ namespace gaseous_server.Classes.Metadata } string sql = "SELECT Game.Id, Game.`Name`, Game.Slug, Relation_Game_Platforms.PlatformsId AS PlatformsId, Game.Summary FROM gaseous.Game JOIN Relation_Game_Platforms ON Game.Id = Relation_Game_Platforms.GameId WHERE " + whereClause + ";"; - + // get Game metadata Game[]? results = new Game[0]; @@ -439,7 +441,8 @@ namespace gaseous_server.Classes.Metadata DataTable data = db.ExecuteCMD(sql, dbDict); foreach (DataRow row in data.Rows) { - Game game = new Game{ + Game game = new Game + { Id = (long)row["Id"], Name = (string)Common.ReturnValueIfNull(row["Name"], ""), Slug = (string)Common.ReturnValueIfNull(row["Slug"], ""), @@ -476,12 +479,12 @@ namespace gaseous_server.Classes.Metadata searchBody = "where platforms = (" + PlatformId + ") & name ~ \"" + SearchString + "\";"; break; } - + // check search cache Game[]? games = Communications.GetSearchCache(searchFields, searchBody); if (games == null) - { + { // cache miss // get Game metadata Communications comms = new Communications(); @@ -513,7 +516,7 @@ namespace gaseous_server.Classes.Metadata foreach (DataRow row in data.Rows) { KeyValuePair valuePair = new KeyValuePair((long)row["PlatformId"], (string)row["Name"]); - platforms.Add(valuePair); + platforms.Add(valuePair); } return platforms; @@ -533,7 +536,7 @@ namespace gaseous_server.Classes.Metadata { } - + public MinimalGameItem(Game gameObject) { this.Id = gameObject.Id; diff --git a/gaseous-server/Classes/Metadata/Platforms.cs b/gaseous-server/Classes/Metadata/Platforms.cs index 531d771..2ab8ebd 100644 --- a/gaseous-server/Classes/Metadata/Platforms.cs +++ b/gaseous-server/Classes/Metadata/Platforms.cs @@ -7,16 +7,16 @@ using IGDB.Models; namespace gaseous_server.Classes.Metadata { public class Platforms - { + { const string fieldList = "fields abbreviation,alternative_name,category,checksum,created_at,generation,name,platform_family,platform_logo,slug,summary,updated_at,url,versions,websites;"; public Platforms() - { + { - } + } public static Platform? GetPlatform(long Id, bool forceRefresh = false) - { + { if (Id == 0) { Platform returnValue = new Platform(); @@ -44,7 +44,7 @@ namespace gaseous_server.Classes.Metadata Task RetVal = _GetPlatform(SearchUsing.id, Id, forceRefresh); return RetVal.Result; } - catch(Exception ex) + catch (Exception ex) { Logging.Log(Logging.LogType.Warning, "Metadata", "An error occurred fetching Platform Id " + Id, ex); return null; @@ -52,14 +52,14 @@ namespace gaseous_server.Classes.Metadata } } - public static Platform GetPlatform(string Slug, bool forceRefresh = false) - { - Task RetVal = _GetPlatform(SearchUsing.slug, Slug, forceRefresh); - return RetVal.Result; - } + public static Platform GetPlatform(string Slug, bool forceRefresh = false) + { + Task RetVal = _GetPlatform(SearchUsing.slug, Slug, forceRefresh); + return RetVal.Result; + } - private static async Task _GetPlatform(SearchUsing searchUsing, object searchValue, bool forceRefresh) - { + private static async Task _GetPlatform(SearchUsing searchUsing, object searchValue, bool forceRefresh) + { // check database first Storage.CacheStatus? cacheStatus = new Storage.CacheStatus(); if (searchUsing == SearchUsing.id) @@ -78,13 +78,16 @@ namespace gaseous_server.Classes.Metadata // set up where clause string WhereClause = ""; + string searchField = ""; switch (searchUsing) { case SearchUsing.id: WhereClause = "where id = " + searchValue; + searchField = "id"; break; case SearchUsing.slug: - WhereClause = "where slug = " + searchValue; + WhereClause = "where slug = \"" + searchValue + "\""; + searchField = "slug"; break; default: throw new Exception("Invalid search type"); @@ -111,10 +114,10 @@ namespace gaseous_server.Classes.Metadata catch (Exception ex) { Logging.Log(Logging.LogType.Warning, "Metadata: " + returnValue.GetType().Name, "An error occurred while connecting to IGDB. WhereClause: " + WhereClause, ex); - return Storage.GetCacheValue(returnValue, "id", (long)searchValue); + return Storage.GetCacheValue(returnValue, searchField, searchValue); } case Storage.CacheStatus.Current: - return Storage.GetCacheValue(returnValue, "id", (long)searchValue); + return Storage.GetCacheValue(returnValue, searchField, searchValue); default: throw new Exception("How did you get here?"); } @@ -158,11 +161,12 @@ namespace gaseous_server.Classes.Metadata { Logging.Log(Logging.LogType.Information, "Platform Map", "Importing " + platform.Name + " from predefined data."); // doesn't exist - add it - item = new Models.PlatformMapping.PlatformMapItem{ + item = new Models.PlatformMapping.PlatformMapItem + { IGDBId = (long)platform.Id, IGDBName = platform.Name, IGDBSlug = platform.Slug, - AlternateNames = new List{ platform.AlternativeName } + AlternateNames = new List { platform.AlternativeName } }; Models.PlatformMapping.WritePlatformMap(item, false, true); } diff --git a/gaseous-server/Classes/Roms.cs b/gaseous-server/Classes/Roms.cs index 81ddfd4..904b14c 100644 --- a/gaseous-server/Classes/Roms.cs +++ b/gaseous-server/Classes/Roms.cs @@ -4,29 +4,32 @@ using gaseous_signature_parser.models.RomSignatureObject; using static gaseous_server.Classes.RomMediaGroup; using gaseous_server.Classes.Metadata; using IGDB.Models; +using static HasheousClient.Models.FixMatchModel; +using NuGet.Protocol.Core.Types; +using static gaseous_server.Classes.FileSignature; namespace gaseous_server.Classes { public class Roms { public class InvalidRomId : Exception - { - public InvalidRomId(long Id) : base("Unable to find ROM by id " + Id) - {} - } + { + public InvalidRomId(long Id) : base("Unable to find ROM by id " + Id) + { } + } public static GameRomObject GetRoms(long GameId, long PlatformId = -1, string NameSearch = "", int pageNumber = 0, int pageSize = 0, string userid = "") { GameRomObject GameRoms = new GameRomObject(); - Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); - string sql = ""; + Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); + string sql = ""; string sqlCount = ""; string sqlPlatform = ""; Dictionary dbDict = new Dictionary(); - dbDict.Add("id", GameId); + dbDict.Add("id", GameId); dbDict.Add("userid", userid); - + string NameSearchWhere = ""; if (NameSearch.Length > 0) { @@ -37,13 +40,16 @@ namespace gaseous_server.Classes // platform query sqlPlatform = "SELECT DISTINCT Games_Roms.PlatformId, Platform.`Name` FROM Games_Roms LEFT JOIN Platform ON Games_Roms.PlatformId = Platform.Id WHERE GameId = @id ORDER BY Platform.`Name`;"; - if (PlatformId == -1) { + if (PlatformId == -1) + { // data query sql = "SELECT DISTINCT Games_Roms.*, Platform.`Name` AS platformname, GameState.RomId AS SavedStateRomId FROM Games_Roms LEFT JOIN Platform ON Games_Roms.PlatformId = Platform.Id LEFT JOIN GameState ON (Games_Roms.Id = GameState.RomId AND GameState.UserId = @userid AND GameState.IsMediaGroup = 0) WHERE Games_Roms.GameId = @id" + NameSearchWhere + " ORDER BY Platform.`Name`, Games_Roms.`Name` LIMIT 1000;"; - + // count query sqlCount = "SELECT COUNT(Games_Roms.Id) AS RomCount FROM Games_Roms WHERE Games_Roms.GameId = @id" + NameSearchWhere + ";"; - } else { + } + else + { // data query sql = "SELECT DISTINCT Games_Roms.*, Platform.`Name` AS platformname, GameState.RomId AS SavedStateRomId FROM Games_Roms LEFT JOIN Platform ON Games_Roms.PlatformId = Platform.Id LEFT JOIN GameState ON (Games_Roms.Id = GameState.RomId AND GameState.UserId = @userid AND GameState.IsMediaGroup = 0) WHERE Games_Roms.GameId = @id AND Games_Roms.PlatformId = @platformid" + NameSearchWhere + " ORDER BY Platform.`Name`, Games_Roms.`Name` LIMIT 1000;"; @@ -52,12 +58,12 @@ namespace gaseous_server.Classes dbDict.Add("platformid", PlatformId); } - DataTable romDT = db.ExecuteCMD(sql, dbDict); + DataTable romDT = db.ExecuteCMD(sql, dbDict); Dictionary rowCount = db.ExecuteCMDDict(sqlCount, dbDict)[0]; DataTable platformDT = db.ExecuteCMD(sqlPlatform, dbDict); - if (romDT.Rows.Count > 0) - { + if (romDT.Rows.Count > 0) + { // set count of roms GameRoms.Count = int.Parse((string)rowCount["RomCount"]); @@ -73,12 +79,12 @@ namespace gaseous_server.Classes } return GameRoms; - } - else - { - throw new Games.InvalidGameId(GameId); - } - } + } + else + { + throw new Games.InvalidGameId(GameId); + } + } public static GameRomItem GetRom(long RomId) { @@ -108,18 +114,65 @@ namespace gaseous_server.Classes // ensure metadata for gameid is present IGDB.Models.Game game = Classes.Metadata.Games.GetGame(GameId, false, false, false); - Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); - string sql = "UPDATE Games_Roms SET PlatformId=@platformid, GameId=@gameid WHERE Id = @id"; - Dictionary dbDict = new Dictionary(); - dbDict.Add("id", RomId); + Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); + string sql = "UPDATE Games_Roms SET PlatformId=@platformid, GameId=@gameid WHERE Id = @id"; + Dictionary dbDict = new Dictionary(); + dbDict.Add("id", RomId); dbDict.Add("platformid", PlatformId); dbDict.Add("gameid", GameId); db.ExecuteCMD(sql, dbDict); GameRomItem rom = GetRom(RomId); + // send update to Hasheous if enabled + if (PlatformId != 0 && GameId != 0) + { + if (Config.MetadataConfiguration.HasheousSubmitFixes == true) + { + if ( + Config.MetadataConfiguration.SignatureSource == HasheousClient.Models.MetadataModel.SignatureSources.Hasheous && + ( + Config.MetadataConfiguration.HasheousAPIKey != null && + Config.MetadataConfiguration.HasheousAPIKey != "") + ) + { + try + { + // find signature used for identifing the rom + string md5String = rom.Md5; + string sha1String = rom.Sha1; + if (rom.Attributes.ContainsKey("ZipContents")) + { + bool selectorFound = false; + List archiveDataValues = Newtonsoft.Json.JsonConvert.DeserializeObject>(rom.Attributes["ZipContents"].ToString()); + foreach (ArchiveData archiveData in archiveDataValues) + { + if (archiveData.isSignatureSelector == true) + { + md5String = archiveData.MD5; + sha1String = archiveData.SHA1; + selectorFound = true; + break; + } + } + } + + HasheousClient.WebApp.HttpHelper.AddHeader("X-API-Key", Config.MetadataConfiguration.HasheousAPIKey); + HasheousClient.Hasheous hasheousClient = new HasheousClient.Hasheous(); + List metadataMatchList = new List(); + metadataMatchList.Add(new MetadataMatch(HasheousClient.Models.MetadataSources.IGDB, platform.Slug, game.Slug)); + hasheousClient.FixMatch(new HasheousClient.Models.FixMatchModel(md5String, sha1String, metadataMatchList)); + } + catch (Exception ex) + { + Logging.Log(Logging.LogType.Critical, "Fix Match", "An error occurred while sending a fixed match to Hasheous.", ex); + } + } + } + } + return rom; - } + } public static void DeleteRom(long RomId) { @@ -137,7 +190,7 @@ namespace gaseous_server.Classes dbDict.Add("id", RomId); db.ExecuteCMD(sql, dbDict); } - } + } private static GameRomItem BuildRom(DataRow romDR) { @@ -150,28 +203,44 @@ namespace gaseous_server.Classes } } + Dictionary romAttributes = new Dictionary(); + if (romDR["attributes"] != DBNull.Value) + { + try + { + if ((string)romDR["attributes"] != "[ ]") + { + romAttributes = Newtonsoft.Json.JsonConvert.DeserializeObject>((string)romDR["attributes"]); + } + } + catch (Exception ex) + { + Logging.Log(Logging.LogType.Warning, "Roms", "Error parsing rom attributes: " + ex.Message); + } + } + GameRomItem romItem = new GameRomItem - { - Id = (long)romDR["id"], - PlatformId = (long)romDR["platformid"], + { + Id = (long)romDR["id"], + PlatformId = (long)romDR["platformid"], Platform = (string)romDR["platformname"], - GameId = (long)romDR["gameid"], - Name = (string)romDR["name"], - Size = (long)romDR["size"], - Crc = ((string)romDR["crc"]).ToLower(), - Md5 = ((string)romDR["md5"]).ToLower(), - Sha1 = ((string)romDR["sha1"]).ToLower(), - DevelopmentStatus = (string)romDR["developmentstatus"], - Attributes = Newtonsoft.Json.JsonConvert.DeserializeObject>>((string)Common.ReturnValueIfNull(romDR["attributes"], "[ ]")), - RomType = (HasheousClient.Models.LookupResponseModel.RomItem.RomTypes)(int)romDR["romtype"], - RomTypeMedia = (string)romDR["romtypemedia"], - MediaLabel = (string)romDR["medialabel"], - Path = (string)romDR["path"], + GameId = (long)romDR["gameid"], + Name = (string)romDR["name"], + Size = (long)romDR["size"], + Crc = ((string)romDR["crc"]).ToLower(), + Md5 = ((string)romDR["md5"]).ToLower(), + Sha1 = ((string)romDR["sha1"]).ToLower(), + DevelopmentStatus = (string)romDR["developmentstatus"], + Attributes = romAttributes, + RomType = (HasheousClient.Models.SignatureModel.RomItem.RomTypes)(int)romDR["romtype"], + RomTypeMedia = (string)romDR["romtypemedia"], + MediaLabel = (string)romDR["medialabel"], + Path = (string)romDR["path"], SignatureSource = (gaseous_server.Models.Signatures_Games.RomItem.SignatureSourceType)(Int32)romDR["metadatasource"], SignatureSourceGameTitle = (string)Common.ReturnValueIfNull(romDR["MetadataGameName"], ""), HasSaveStates = hasSaveStates, Library = GameLibrary.GetLibrary((int)romDR["LibraryId"]) - }; + }; // check for a web emulator and update the romItem foreach (Models.PlatformMapping.PlatformMapItem platformMapping in Models.PlatformMapping.PlatformMap) @@ -185,8 +254,8 @@ namespace gaseous_server.Classes } } - return romItem; - } + return romItem; + } public class GameRomObject { @@ -194,17 +263,17 @@ namespace gaseous_server.Classes public int Count { get; set; } } - public class GameRomItem : HasheousClient.Models.LookupResponseModel.RomItem + public class GameRomItem : HasheousClient.Models.SignatureModel.RomItem { public long PlatformId { get; set; } public string Platform { get; set; } - public Models.PlatformMapping.PlatformMapItem.WebEmulatorItem? Emulator { get; set; } - public long GameId { get; set; } + public Models.PlatformMapping.PlatformMapItem.WebEmulatorItem? Emulator { get; set; } + public long GameId { get; set; } public string? Path { get; set; } - public string? SignatureSourceGameTitle { get; set;} + public string? SignatureSourceGameTitle { get; set; } public bool HasSaveStates { get; set; } = false; public GameLibrary.LibraryItem Library { get; set; } - } - } + } + } } diff --git a/gaseous-server/Classes/SignatureIngestors/XML.cs b/gaseous-server/Classes/SignatureIngestors/XML.cs index eda4fdc..ff5ee6f 100644 --- a/gaseous-server/Classes/SignatureIngestors/XML.cs +++ b/gaseous-server/Classes/SignatureIngestors/XML.cs @@ -8,21 +8,49 @@ namespace gaseous_server.SignatureIngestors.XML { public class XMLIngestor : QueueItemStatus { - public void Import(string SearchPath, gaseous_signature_parser.parser.SignatureParser XMLType) + public void Import(string SearchPath, string ProcessedDirectory, gaseous_signature_parser.parser.SignatureParser XMLType) { // connect to database Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); + string? XMLDBSearchPath = null; + string? XMLDBProcessedDirectory = null; + if (XMLType == gaseous_signature_parser.parser.SignatureParser.NoIntro) + { + XMLDBSearchPath = Path.Combine(SearchPath, "DB"); + XMLDBProcessedDirectory = Path.Combine(ProcessedDirectory, "DB"); + SearchPath = Path.Combine(SearchPath, "DAT"); + ProcessedDirectory = Path.Combine(ProcessedDirectory, "DAT"); + } + // process provided files - Logging.Log(Logging.LogType.Information, "Signature Ingestor - XML", "Importing from " + SearchPath); if (!Directory.Exists(SearchPath)) { Directory.CreateDirectory(SearchPath); } + if (!Directory.Exists(ProcessedDirectory)) + { + Directory.CreateDirectory(ProcessedDirectory); + } string[] PathContents = Directory.GetFiles(SearchPath); Array.Sort(PathContents); + string[]? DBPathContents = null; + if (XMLDBSearchPath != null) + { + if (!Directory.Exists(XMLDBSearchPath)) + { + Directory.CreateDirectory(XMLDBSearchPath); + } + if (!Directory.Exists(XMLDBProcessedDirectory)) + { + Directory.CreateDirectory(XMLDBProcessedDirectory); + } + + DBPathContents = Directory.GetFiles(XMLDBSearchPath); + } + string sql = ""; Dictionary dbDict = new Dictionary(); System.Data.DataTable sigDB; @@ -33,226 +61,380 @@ namespace gaseous_server.SignatureIngestors.XML SetStatus(i + 1, PathContents.Length, "Processing signature file: " + XMLFile); - if (Common.SkippableFiles.Contains(Path.GetFileName(XMLFile), StringComparer.OrdinalIgnoreCase)) - { - Logging.Log(Logging.LogType.Information, "Signature Ingestor - XML", "Skipping file: " + XMLFile); - } - else - { - // check xml file md5 - Common.hashObject hashObject = new Common.hashObject(XMLFile); - sql = "SELECT * FROM Signatures_Sources WHERE SourceMD5=@sourcemd5"; - dbDict = new Dictionary(); - dbDict.Add("sourcemd5", hashObject.md5hash); - sigDB = db.ExecuteCMD(sql, dbDict); + Logging.Log(Logging.LogType.Information, "Signature Ingest", "(" + (i + 1) + " / " + PathContents.Length + ") Processing " + XMLType.ToString() + " DAT file: " + XMLFile); - if (sigDB.Rows.Count == 0) + string? DBFile = null; + if (XMLDBSearchPath != null) + { + switch (XMLType) { - try - { - Logging.Log(Logging.LogType.Information, "Signature Ingestor - XML", "Importing file: " + XMLFile); - - // start parsing file - gaseous_signature_parser.parser Parser = new gaseous_signature_parser.parser(); - RomSignatureObject Object = Parser.ParseSignatureDAT(XMLFile, XMLType); - - // store in database - string[] flipNameAndDescription = { - "MAMEArcade", - "MAMEMess" - }; - - // store source object - bool processGames = false; - if (Object.SourceMd5 != null) + case gaseous_signature_parser.parser.SignatureParser.NoIntro: + for (UInt16 x = 0; x < DBPathContents.Length; x++) { - sql = "SELECT * FROM Signatures_Sources WHERE SourceMD5=@sourcemd5"; - dbDict = new Dictionary(); - string sourceUriStr = ""; - if (Object.Url != null) + string tempDBFileName = Path.GetFileNameWithoutExtension(DBPathContents[x].Replace(" (DB Export)", "")); + if (tempDBFileName == Path.GetFileNameWithoutExtension(XMLFile)) { - sourceUriStr = Object.Url.ToString(); + DBFile = DBPathContents[x]; + Logging.Log(Logging.LogType.Information, "Signature Ingest", "Using DB file: " + DBFile); + break; } - dbDict.Add("name", Common.ReturnValueIfNull(Object.Name, "")); - dbDict.Add("description", Common.ReturnValueIfNull(Object.Description, "")); - dbDict.Add("category", Common.ReturnValueIfNull(Object.Category, "")); - dbDict.Add("version", Common.ReturnValueIfNull(Object.Version, "")); - dbDict.Add("author", Common.ReturnValueIfNull(Object.Author, "")); - dbDict.Add("email", Common.ReturnValueIfNull(Object.Email, "")); - dbDict.Add("homepage", Common.ReturnValueIfNull(Object.Homepage, "")); - dbDict.Add("uri", sourceUriStr); - dbDict.Add("sourcetype", Common.ReturnValueIfNull(Object.SourceType, "")); - dbDict.Add("sourcemd5", Object.SourceMd5); - dbDict.Add("sourcesha1", Object.SourceSHA1); + } + break; + } + } + + // check xml file md5 + Common.hashObject hashObject = new Common.hashObject(XMLFile); + sql = "SELECT * FROM Signatures_Sources WHERE SourceMD5=@sourcemd5"; + dbDict = new Dictionary(); + dbDict.Add("sourcemd5", hashObject.md5hash); + sigDB = db.ExecuteCMD(sql, dbDict); + + if (sigDB.Rows.Count == 0) + { + try + { + // start parsing file + gaseous_signature_parser.parser Parser = new gaseous_signature_parser.parser(); + RomSignatureObject Object = Parser.ParseSignatureDAT(XMLFile, DBFile, XMLType); + + // store in database + string[] flipNameAndDescription = { + "MAMEArcade", + "MAMEMess" + }; + + // store source object + bool processGames = false; + if (Object.SourceMd5 != null) + { + int sourceId = 0; + + sql = "SELECT * FROM Signatures_Sources WHERE `SourceMD5`=@sourcemd5"; + dbDict = new Dictionary + { + { "name", Common.ReturnValueIfNull(Object.Name, "") }, + { "description", Common.ReturnValueIfNull(Object.Description, "") }, + { "category", Common.ReturnValueIfNull(Object.Category, "") }, + { "version", Common.ReturnValueIfNull(Object.Version, "") }, + { "author", Common.ReturnValueIfNull(Object.Author, "") }, + { "email", Common.ReturnValueIfNull(Object.Email, "") }, + { "homepage", Common.ReturnValueIfNull(Object.Homepage, "") } + }; + if (Object.Url == null) + { + dbDict.Add("uri", ""); + } + else + { + dbDict.Add("uri", Common.ReturnValueIfNull(Object.Url.ToString(), "")); + } + dbDict.Add("sourcetype", Common.ReturnValueIfNull(Object.SourceType, "")); + dbDict.Add("sourcemd5", Object.SourceMd5); + dbDict.Add("sourcesha1", Object.SourceSHA1); + + sigDB = db.ExecuteCMD(sql, dbDict); + if (sigDB.Rows.Count == 0) + { + // entry not present, insert it + sql = "INSERT INTO Signatures_Sources (`Name`, `Description`, `Category`, `Version`, `Author`, `Email`, `Homepage`, `Url`, `SourceType`, `SourceMD5`, `SourceSHA1`) VALUES (@name, @description, @category, @version, @author, @email, @homepage, @uri, @sourcetype, @sourcemd5, @sourcesha1); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; sigDB = db.ExecuteCMD(sql, dbDict); - if (sigDB.Rows.Count == 0) + + sourceId = Convert.ToInt32(sigDB.Rows[0][0]); + + processGames = true; + } + + if (processGames == true) + { + for (int x = 0; x < Object.Games.Count; ++x) { - // entry not present, insert it - sql = "INSERT INTO Signatures_Sources (Name, Description, Category, Version, Author, Email, Homepage, Url, SourceType, SourceMD5, SourceSHA1) VALUES (@name, @description, @category, @version, @author, @email, @homepage, @uri, @sourcetype, @sourcemd5, @sourcesha1)"; + RomSignatureObject.Game gameObject = Object.Games[x]; - db.ExecuteCMD(sql, dbDict); - - processGames = true; - } - - if (processGames == true) - { - for (int x = 0; x < Object.Games.Count; ++x) + // set up game dictionary + dbDict = new Dictionary(); + if (flipNameAndDescription.Contains(Object.SourceType)) { - RomSignatureObject.Game gameObject = Object.Games[x]; + dbDict.Add("name", Common.ReturnValueIfNull(gameObject.Description, "")); + dbDict.Add("description", Common.ReturnValueIfNull(gameObject.Name, "")); + } + else + { + dbDict.Add("name", Common.ReturnValueIfNull(gameObject.Name, "")); + dbDict.Add("description", Common.ReturnValueIfNull(gameObject.Description, "")); + } + dbDict.Add("year", Common.ReturnValueIfNull(gameObject.Year, "")); + dbDict.Add("publisher", Common.ReturnValueIfNull(gameObject.Publisher, "")); + dbDict.Add("demo", (int)gameObject.Demo); + dbDict.Add("system", Common.ReturnValueIfNull(gameObject.System, "")); + dbDict.Add("platform", Common.ReturnValueIfNull(gameObject.System, "")); + dbDict.Add("systemvariant", Common.ReturnValueIfNull(gameObject.SystemVariant, "")); + dbDict.Add("video", Common.ReturnValueIfNull(gameObject.Video, "")); - // set up game dictionary - dbDict = new Dictionary(); - if (flipNameAndDescription.Contains(Object.SourceType)) + List gameCountries = new List(); + if ( + gameObject.Country != null && + gameObject.Country != "Unknown" + ) + { + string[] countries = gameObject.Country.Split(","); + foreach (string country in countries) { - dbDict.Add("name", Common.ReturnValueIfNull(gameObject.Description, "")); - dbDict.Add("description", Common.ReturnValueIfNull(gameObject.Name, "")); - } - else - { - dbDict.Add("name", Common.ReturnValueIfNull(gameObject.Name, "")); - dbDict.Add("description", Common.ReturnValueIfNull(gameObject.Description, "")); - } - dbDict.Add("year", Common.ReturnValueIfNull(gameObject.Year, "")); - dbDict.Add("publisher", Common.ReturnValueIfNull(gameObject.Publisher, "")); - dbDict.Add("demo", (int)gameObject.Demo); - dbDict.Add("system", Common.ReturnValueIfNull(gameObject.System, "")); - dbDict.Add("platform", Common.ReturnValueIfNull(gameObject.System, "")); - dbDict.Add("systemvariant", Common.ReturnValueIfNull(gameObject.SystemVariant, "")); - dbDict.Add("video", Common.ReturnValueIfNull(gameObject.Video, "")); - dbDict.Add("country", Common.ReturnValueIfNull(gameObject.Country, "")); - dbDict.Add("language", Common.ReturnValueIfNull(gameObject.Language, "")); - dbDict.Add("copyright", Common.ReturnValueIfNull(gameObject.Copyright, "")); - - // store platform - int gameSystem = 0; - if (gameObject.System != null) - { - sql = "SELECT Id FROM Signatures_Platforms WHERE Platform=@platform"; - - sigDB = db.ExecuteCMD(sql, dbDict); - if (sigDB.Rows.Count == 0) + int countryId = -1; + countryId = Common.GetLookupByCode(Common.LookupTypes.Country, (string)Common.ReturnValueIfNull(country.Trim(), "")); + if (countryId == -1) { - // entry not present, insert it - sql = "INSERT INTO Signatures_Platforms (Platform) VALUES (@platform); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; - sigDB = db.ExecuteCMD(sql, dbDict); + countryId = Common.GetLookupByValue(Common.LookupTypes.Country, (string)Common.ReturnValueIfNull(country.Trim(), "")); - gameSystem = Convert.ToInt32(sigDB.Rows[0][0]); + if (countryId == -1) + { + Logging.Log(Logging.LogType.Warning, "Signature Ingest", "Unable to locate country id for " + country.Trim()); + sql = "INSERT INTO Country (`Code`, `Value`) VALUES (@code, @name); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; + Dictionary countryDict = new Dictionary{ + { "code", country.Trim() }, + { "name", country.Trim() } + }; + countryId = int.Parse(db.ExecuteCMD(sql, countryDict).Rows[0][0].ToString()); + } } - else + + if (countryId > 0) { - gameSystem = (int)sigDB.Rows[0][0]; + gameCountries.Add(countryId); } } - dbDict.Add("systemid", gameSystem); + } - // store publisher - int gamePublisher = 0; - if (gameObject.Publisher != null) + List gameLanguages = new List(); + if ( + gameObject.Language != null && + gameObject.Language != "nolang" + ) + { + string[] languages = gameObject.Language.Split(","); + foreach (string language in languages) { - sql = "SELECT * FROM Signatures_Publishers WHERE Publisher=@publisher"; + int languageId = -1; + languageId = Common.GetLookupByCode(Common.LookupTypes.Language, (string)Common.ReturnValueIfNull(language.Trim(), "")); + if (languageId == -1) + { + languageId = Common.GetLookupByValue(Common.LookupTypes.Language, (string)Common.ReturnValueIfNull(language.Trim(), "")); - sigDB = db.ExecuteCMD(sql, dbDict); - if (sigDB.Rows.Count == 0) - { - // entry not present, insert it - sql = "INSERT INTO Signatures_Publishers (Publisher) VALUES (@publisher); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; - sigDB = db.ExecuteCMD(sql, dbDict); - gamePublisher = Convert.ToInt32(sigDB.Rows[0][0]); + if (languageId == -1) + { + Logging.Log(Logging.LogType.Warning, "Signature Ingest", "Unable to locate language id for " + language.Trim()); + sql = "INSERT INTO Language (`Code`, `Value`) VALUES (@code, @name); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; + Dictionary langDict = new Dictionary{ + { "code", language.Trim() }, + { "name", language.Trim() } + }; + languageId = int.Parse(db.ExecuteCMD(sql, langDict).Rows[0][0].ToString()); + } } - else + + if (languageId > 0) { - gamePublisher = (int)sigDB.Rows[0][0]; + gameLanguages.Add(languageId); } } - dbDict.Add("publisherid", gamePublisher); + } - // store game - int gameId = 0; - sql = "SELECT * FROM Signatures_Games WHERE Name=@name AND Year=@year AND Publisherid=@publisher AND Systemid=@systemid AND Country=@country AND Language=@language"; + dbDict.Add("copyright", Common.ReturnValueIfNull(gameObject.Copyright, "")); + + // store platform + int gameSystem = 0; + if (gameObject.System != null) + { + sql = "SELECT `Id` FROM Signatures_Platforms WHERE `Platform`=@platform"; sigDB = db.ExecuteCMD(sql, dbDict); if (sigDB.Rows.Count == 0) { // entry not present, insert it - sql = "INSERT INTO Signatures_Games " + - "(Name, Description, Year, PublisherId, Demo, SystemId, SystemVariant, Video, Country, Language, Copyright) VALUES " + - "(@name, @description, @year, @publisherid, @demo, @systemid, @systemvariant, @video, @country, @language, @copyright); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; + sql = "INSERT INTO Signatures_Platforms (`Platform`) VALUES (@platform); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; sigDB = db.ExecuteCMD(sql, dbDict); - gameId = Convert.ToInt32(sigDB.Rows[0][0]); + gameSystem = Convert.ToInt32(sigDB.Rows[0][0]); } else { - gameId = (int)sigDB.Rows[0][0]; + gameSystem = (int)sigDB.Rows[0][0]; } + } + dbDict.Add("systemid", gameSystem); - // store rom - foreach (RomSignatureObject.Game.Rom romObject in gameObject.Roms) + // store publisher + int gamePublisher = 0; + if (gameObject.Publisher != null) + { + sql = "SELECT * FROM Signatures_Publishers WHERE `Publisher`=@publisher"; + + sigDB = db.ExecuteCMD(sql, dbDict); + if (sigDB.Rows.Count == 0) { - if (romObject.Md5 != null || romObject.Sha1 != null) + // entry not present, insert it + sql = "INSERT INTO Signatures_Publishers (`Publisher`) VALUES (@publisher); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; + sigDB = db.ExecuteCMD(sql, dbDict); + gamePublisher = Convert.ToInt32(sigDB.Rows[0][0]); + } + else + { + gamePublisher = (int)sigDB.Rows[0][0]; + } + } + dbDict.Add("publisherid", gamePublisher); + + // store game + long gameId = 0; + sql = "SELECT * FROM Signatures_Games WHERE `Name`=@name AND `Year`=@year AND `PublisherId`=@publisherid AND `SystemId`=@systemid"; + + sigDB = db.ExecuteCMD(sql, dbDict); + if (sigDB.Rows.Count == 0) + { + // entry not present, insert it + sql = "INSERT INTO Signatures_Games " + + "(`Name`, `Description`, `Year`, `PublisherId`, `Demo`, `SystemId`, `SystemVariant`, `Video`, `Copyright`) VALUES " + + "(@name, @description, @year, @publisherid, @demo, @systemid, @systemvariant, @video, @copyright); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; + sigDB = db.ExecuteCMD(sql, dbDict); + + gameId = Convert.ToInt32(sigDB.Rows[0][0]); + } + else + { + gameId = (int)sigDB.Rows[0][0]; + } + + // insert countries + foreach (int gameCountry in gameCountries) + { + try + { + sql = "SELECT * FROM Signatures_Games_Countries WHERE GameId = @gameid AND CountryId = @Countryid"; + Dictionary countryDict = new Dictionary{ + { "gameid", gameId }, + { "Countryid", gameCountry } + }; + if (db.ExecuteCMD(sql, countryDict).Rows.Count == 0) { - int romId = 0; - sql = "SELECT * FROM Signatures_Roms WHERE GameId=@gameid AND MD5=@md5"; - dbDict = new Dictionary(); - dbDict.Add("gameid", gameId); - dbDict.Add("name", Common.ReturnValueIfNull(romObject.Name, "")); - dbDict.Add("size", Common.ReturnValueIfNull(romObject.Size, "")); - dbDict.Add("crc", Common.ReturnValueIfNull(romObject.Crc, "").ToString().ToLower()); - dbDict.Add("md5", Common.ReturnValueIfNull(romObject.Md5, "").ToString().ToLower()); - dbDict.Add("sha1", Common.ReturnValueIfNull(romObject.Sha1, "").ToString().ToLower()); - dbDict.Add("developmentstatus", Common.ReturnValueIfNull(romObject.DevelopmentStatus, "")); + sql = "INSERT INTO Signatures_Games_Countries (GameId, CountryId) VALUES (@gameid, @Countryid)"; + db.ExecuteCMD(sql, countryDict); + } + } + catch + { + Console.WriteLine("Game id: " + gameId + " with Country " + gameCountry); + } + } - if (romObject.Attributes != null) + // insert languages + foreach (int gameLanguage in gameLanguages) + { + try + { + sql = "SELECT * FROM Signatures_Games_Languages WHERE GameId = @gameid AND LanguageId = @languageid"; + Dictionary langDict = new Dictionary{ + { "gameid", gameId }, + { "languageid", gameLanguage } + }; + if (db.ExecuteCMD(sql, langDict).Rows.Count == 0) + { + sql = "INSERT INTO Signatures_Games_Languages (GameId, LanguageId) VALUES (@gameid, @languageid)"; + db.ExecuteCMD(sql, langDict); + } + } + catch + { + Console.WriteLine("Game id: " + gameId + " with language " + gameLanguage); + } + } + + // store rom + foreach (RomSignatureObject.Game.Rom romObject in gameObject.Roms) + { + if (romObject.Md5 != null || romObject.Sha1 != null) + { + long romId = 0; + sql = "SELECT * FROM Signatures_Roms WHERE `GameId`=@gameid AND (`MD5`=@md5 OR `SHA1`=@sha1)"; + dbDict = new Dictionary(); + dbDict.Add("gameid", gameId); + dbDict.Add("name", Common.ReturnValueIfNull(romObject.Name, "")); + dbDict.Add("size", Common.ReturnValueIfNull(romObject.Size, "")); + dbDict.Add("crc", Common.ReturnValueIfNull(romObject.Crc, "").ToString().ToLower()); + dbDict.Add("md5", Common.ReturnValueIfNull(romObject.Md5, "").ToString().ToLower()); + dbDict.Add("sha1", Common.ReturnValueIfNull(romObject.Sha1, "").ToString().ToLower()); + dbDict.Add("developmentstatus", Common.ReturnValueIfNull(romObject.DevelopmentStatus, "")); + + if (romObject.Attributes != null) + { + if (romObject.Attributes.Count > 0) { - if (romObject.Attributes.Count > 0) - { - dbDict.Add("attributes", Newtonsoft.Json.JsonConvert.SerializeObject(romObject.Attributes)); - } - else - { - dbDict.Add("attributes", "[ ]"); - } + dbDict.Add("attributes", Newtonsoft.Json.JsonConvert.SerializeObject(romObject.Attributes)); } else { - dbDict.Add("attributes", "[ ]"); + dbDict.Add("attributes", ""); } - dbDict.Add("romtype", (int)romObject.RomType); - dbDict.Add("romtypemedia", Common.ReturnValueIfNull(romObject.RomTypeMedia, "")); - dbDict.Add("medialabel", Common.ReturnValueIfNull(romObject.MediaLabel, "")); - dbDict.Add("metadatasource", romObject.SignatureSource); - dbDict.Add("ingestorversion", 2); + } + else + { + dbDict.Add("attributes", ""); + } + dbDict.Add("romtype", (int)romObject.RomType); + dbDict.Add("romtypemedia", Common.ReturnValueIfNull(romObject.RomTypeMedia, "")); + dbDict.Add("medialabel", Common.ReturnValueIfNull(romObject.MediaLabel, "")); + dbDict.Add("metadatasource", romObject.SignatureSource); + dbDict.Add("ingestorversion", 2); + sigDB = db.ExecuteCMD(sql, dbDict); + if (sigDB.Rows.Count == 0) + { + // entry not present, insert it + sql = "INSERT INTO Signatures_Roms (`GameId`, `Name`, `Size`, `CRC`, `MD5`, `SHA1`, `DevelopmentStatus`, `Attributes`, `RomType`, `RomTypeMedia`, `MediaLabel`, `MetadataSource`, `IngestorVersion`) VALUES (@gameid, @name, @size, @crc, @md5, @sha1, @developmentstatus, @attributes, @romtype, @romtypemedia, @medialabel, @metadatasource, @ingestorversion); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; sigDB = db.ExecuteCMD(sql, dbDict); - if (sigDB.Rows.Count == 0) - { - // entry not present, insert it - sql = "INSERT INTO Signatures_Roms (GameId, Name, Size, CRC, MD5, SHA1, DevelopmentStatus, Attributes, RomType, RomTypeMedia, MediaLabel, MetadataSource, IngestorVersion) VALUES (@gameid, @name, @size, @crc, @md5, @sha1, @developmentstatus, @attributes, @romtype, @romtypemedia, @medialabel, @metadatasource, @ingestorversion); SELECT CAST(LAST_INSERT_ID() AS SIGNED);"; - sigDB = db.ExecuteCMD(sql, dbDict); + romId = Convert.ToInt32(sigDB.Rows[0][0]); + } + else + { + romId = (int)sigDB.Rows[0][0]; + } - romId = Convert.ToInt32(sigDB.Rows[0][0]); - } - else - { - romId = (int)sigDB.Rows[0][0]; - } + // map the rom to the source + sql = "SELECT * FROM Signatures_RomToSource WHERE SourceId=@sourceid AND RomId=@romid;"; + dbDict.Add("romid", romId); + dbDict.Add("sourceId", sourceId); + + sigDB = db.ExecuteCMD(sql, dbDict); + if (sigDB.Rows.Count == 0) + { + sql = "INSERT INTO Signatures_RomToSource (`SourceId`, `RomId`) VALUES (@sourceid, @romid);"; + db.ExecuteCMD(sql, dbDict); } } } } } } - catch (Exception ex) + + File.Move(XMLFile, Path.Combine(ProcessedDirectory, Path.GetFileName(XMLFile))); + if (DBFile != null) { - Logging.Log(Logging.LogType.Warning, "Signature Ingestor - XML", "Invalid import file: " + XMLFile, ex); + File.Move(DBFile, Path.Combine(XMLDBProcessedDirectory, Path.GetFileName(DBFile))); } } - else + catch (Exception ex) { - Logging.Log(Logging.LogType.Debug, "Signature Ingestor - XML", "Rejecting already imported file: " + XMLFile); + Logging.Log(Logging.LogType.Warning, "Signature Ingest", "Error ingesting " + XMLType.ToString() + " file: " + XMLFile, ex); + } + } + else + { + Logging.Log(Logging.LogType.Information, "Signature Ingest", "Rejecting already imported " + XMLType.ToString() + " file: " + XMLFile); + File.Move(XMLFile, Path.Combine(ProcessedDirectory, Path.GetFileName(XMLFile))); + if (DBFile != null) + { + File.Move(DBFile, Path.Combine(XMLDBProcessedDirectory, Path.GetFileName(DBFile))); } } } diff --git a/gaseous-server/Classes/SignatureManagement.cs b/gaseous-server/Classes/SignatureManagement.cs index 2ef5cde..cad5ebc 100644 --- a/gaseous-server/Classes/SignatureManagement.cs +++ b/gaseous-server/Classes/SignatureManagement.cs @@ -1,5 +1,6 @@ using System.Data; using gaseous_signature_parser.models.RomSignatureObject; +using static gaseous_server.Classes.Common; namespace gaseous_server.Classes { @@ -10,7 +11,8 @@ namespace gaseous_server.Classes if (md5.Length > 0) { return _GetSignature("Signatures_Roms.md5 = @searchstring", md5); - } else + } + else { return _GetSignature("Signatures_Roms.sha1 = @searchstring", sha1); } @@ -21,7 +23,8 @@ namespace gaseous_server.Classes if (TosecName.Length > 0) { return _GetSignature("Signatures_Roms.name = @searchstring", TosecName); - } else + } + else { return null; } @@ -44,7 +47,7 @@ namespace gaseous_server.Classes { Game = new gaseous_server.Models.Signatures_Games.GameItem { - Id = (Int32)sigDbRow["Id"], + Id = (long)(int)sigDbRow["Id"], Name = (string)sigDbRow["Name"], Description = (string)sigDbRow["Description"], Year = (string)sigDbRow["Year"], @@ -53,20 +56,20 @@ namespace gaseous_server.Classes System = (string)sigDbRow["Platform"], SystemVariant = (string)sigDbRow["SystemVariant"], Video = (string)sigDbRow["Video"], - Country = (string)sigDbRow["Country"], - Language = (string)sigDbRow["Language"], + Countries = new Dictionary(GetLookup(LookupTypes.Country, (long)(int)sigDbRow["Id"])), + Languages = new Dictionary(GetLookup(LookupTypes.Language, (long)(int)sigDbRow["Id"])), Copyright = (string)sigDbRow["Copyright"] }, Rom = new gaseous_server.Models.Signatures_Games.RomItem { - Id = (Int32)sigDbRow["romid"], + Id = (long)(int)sigDbRow["romid"], Name = (string)sigDbRow["romname"], Size = (Int64)sigDbRow["Size"], Crc = (string)sigDbRow["CRC"], Md5 = ((string)sigDbRow["MD5"]).ToLower(), Sha1 = ((string)sigDbRow["SHA1"]).ToLower(), DevelopmentStatus = (string)sigDbRow["DevelopmentStatus"], - Attributes = Newtonsoft.Json.JsonConvert.DeserializeObject>>((string)Common.ReturnValueIfNull(sigDbRow["Attributes"], "[]")), + Attributes = Newtonsoft.Json.JsonConvert.DeserializeObject>((string)Common.ReturnValueIfNull(sigDbRow["Attributes"], "[]")), RomType = (gaseous_server.Models.Signatures_Games.RomItem.RomTypes)(int)sigDbRow["RomType"], RomTypeMedia = (string)sigDbRow["RomTypeMedia"], MediaLabel = (string)sigDbRow["MediaLabel"], @@ -77,5 +80,36 @@ namespace gaseous_server.Classes } return GamesList; } + + public Dictionary GetLookup(LookupTypes LookupType, long GameId) + { + string tableName = ""; + switch (LookupType) + { + case LookupTypes.Country: + tableName = "Countries"; + break; + + case LookupTypes.Language: + tableName = "Languages"; + break; + + } + + Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); + string sql = "SELECT " + LookupType.ToString() + ".Code, " + LookupType.ToString() + ".Value FROM Signatures_Games_" + tableName + " JOIN " + LookupType.ToString() + " ON Signatures_Games_" + tableName + "." + LookupType.ToString() + "Id = " + LookupType.ToString() + ".Id WHERE Signatures_Games_" + tableName + ".GameId = @id;"; + Dictionary dbDict = new Dictionary{ + { "id", GameId } + }; + DataTable data = db.ExecuteCMD(sql, dbDict); + + Dictionary returnDict = new Dictionary(); + foreach (DataRow row in data.Rows) + { + returnDict.Add((string)row["Code"], (string)row["Value"]); + } + + return returnDict; + } } } \ No newline at end of file diff --git a/gaseous-server/Controllers/V1.0/SystemController.cs b/gaseous-server/Controllers/V1.0/SystemController.cs index e7d95cf..2aced21 100644 --- a/gaseous-server/Controllers/V1.0/SystemController.cs +++ b/gaseous-server/Controllers/V1.0/SystemController.cs @@ -70,7 +70,8 @@ namespace gaseous_server.Controllers [HttpGet] [Route("Version")] [ProducesResponseType(StatusCodes.Status200OK)] - public Version GetSystemVersion() { + public Version GetSystemVersion() + { return Assembly.GetExecutingAssembly().GetName().Version; } @@ -80,18 +81,19 @@ namespace gaseous_server.Controllers [Route("VersionFile")] [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK)] - public FileContentResult GetSystemVersionAsFile() { + public FileContentResult GetSystemVersionAsFile() + { Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); // get age ratings dictionary Dictionary ClassificationBoardsStrings = new Dictionary(); - foreach(IGDB.Models.AgeRatingCategory ageRatingCategory in Enum.GetValues(typeof(IGDB.Models.AgeRatingCategory)) ) + foreach (IGDB.Models.AgeRatingCategory ageRatingCategory in Enum.GetValues(typeof(IGDB.Models.AgeRatingCategory))) { ClassificationBoardsStrings.Add((int)ageRatingCategory, ageRatingCategory.ToString()); } Dictionary AgeRatingsStrings = new Dictionary(); - foreach(IGDB.Models.AgeRatingTitle ageRatingTitle in Enum.GetValues(typeof(IGDB.Models.AgeRatingTitle)) ) + foreach (IGDB.Models.AgeRatingTitle ageRatingTitle in Enum.GetValues(typeof(IGDB.Models.AgeRatingTitle))) { AgeRatingsStrings.Add((int)ageRatingTitle, ageRatingTitle.ToString()); } @@ -99,13 +101,16 @@ namespace gaseous_server.Controllers string ver = "var AppVersion = \"" + Assembly.GetExecutingAssembly().GetName().Version.ToString() + "\";" + Environment.NewLine + "var DBSchemaVersion = \"" + db.GetDatabaseSchemaVersion() + "\";" + Environment.NewLine + "var FirstRunStatus = " + Config.ReadSetting("FirstRunStatus", "0") + ";" + Environment.NewLine + - "var AgeRatingBoardsStrings = " + JsonSerializer.Serialize(ClassificationBoardsStrings, new JsonSerializerOptions{ + "var AgeRatingBoardsStrings = " + JsonSerializer.Serialize(ClassificationBoardsStrings, new JsonSerializerOptions + { WriteIndented = true }) + ";" + Environment.NewLine + - "var AgeRatingStrings = " + JsonSerializer.Serialize(AgeRatingsStrings, new JsonSerializerOptions{ + "var AgeRatingStrings = " + JsonSerializer.Serialize(AgeRatingsStrings, new JsonSerializerOptions + { WriteIndented = true }) + ";" + Environment.NewLine + - "var AgeRatingGroups = " + JsonSerializer.Serialize(AgeGroups.AgeGroupingsFlat, new JsonSerializerOptions{ + "var AgeRatingGroups = " + JsonSerializer.Serialize(AgeGroups.AgeGroupingsFlat, new JsonSerializerOptions + { WriteIndented = true }) + ";" + Environment.NewLine + "var emulatorDebugMode = " + Config.ReadSetting("emulatorDebugMode", false.ToString()).ToLower() + ";"; @@ -159,7 +164,7 @@ namespace gaseous_server.Controllers { // update task enabled Logging.Log(Logging.LogType.Information, "Update Background Task", "Updating task " + TaskConfiguration.Task + " with enabled value " + TaskConfiguration.Enabled.ToString()); - + Config.SetSetting("Enabled_" + TaskConfiguration.Task, TaskConfiguration.Enabled.ToString()); // update existing process @@ -170,12 +175,12 @@ namespace gaseous_server.Controllers item.Enabled(Boolean.Parse(TaskConfiguration.Enabled.ToString())); } } - + // update task interval if (TaskConfiguration.Interval >= taskItem.MinimumAllowedInterval) { Logging.Log(Logging.LogType.Information, "Update Background Task", "Updating task " + TaskConfiguration.Task + " with new interval " + TaskConfiguration.Interval); - + Config.SetSetting("Interval_" + TaskConfiguration.Task, TaskConfiguration.Interval.ToString()); // update existing process @@ -194,7 +199,7 @@ namespace gaseous_server.Controllers // update task weekdays Logging.Log(Logging.LogType.Information, "Update Background Task", "Updating task " + TaskConfiguration.Task + " with new weekdays " + String.Join(", ", TaskConfiguration.AllowedDays)); - + Config.SetSetting("AllowedDays_" + TaskConfiguration.Task, Newtonsoft.Json.JsonConvert.SerializeObject(TaskConfiguration.AllowedDays)); // update existing process @@ -208,7 +213,7 @@ namespace gaseous_server.Controllers // update task hours Logging.Log(Logging.LogType.Information, "Update Background Task", "Updating task " + TaskConfiguration.Task + " with new hours " + TaskConfiguration.AllowedStartHours + ":" + TaskConfiguration.AllowedStartMinutes.ToString("00") + " to " + TaskConfiguration.AllowedEndHours + ":" + TaskConfiguration.AllowedEndMinutes.ToString("00")); - + Config.SetSetting("AllowedStartHours_" + TaskConfiguration.Task, TaskConfiguration.AllowedStartHours.ToString()); Config.SetSetting("AllowedStartMinutes_" + TaskConfiguration.Task, TaskConfiguration.AllowedStartMinutes.ToString()); Config.SetSetting("AllowedEndHours_" + TaskConfiguration.Task, TaskConfiguration.AllowedEndHours.ToString()); @@ -225,7 +230,7 @@ namespace gaseous_server.Controllers item.AllowedEndMinutes = TaskConfiguration.AllowedEndMinutes; } } - + } else { @@ -251,10 +256,18 @@ namespace gaseous_server.Controllers [ProducesResponseType(StatusCodes.Status200OK)] public ActionResult GetSystemSettings() { - SystemSettingsModel systemSettingsModel = new SystemSettingsModel{ + SystemSettingsModel systemSettingsModel = new SystemSettingsModel + { AlwaysLogToDisk = Config.LoggingConfiguration.AlwaysLogToDisk, MinimumLogRetentionPeriod = Config.LoggingConfiguration.LogRetention, - EmulatorDebugMode = Boolean.Parse(Config.ReadSetting("emulatorDebugMode", false.ToString())) + EmulatorDebugMode = Boolean.Parse(Config.ReadSetting("emulatorDebugMode", false.ToString())), + SignatureSource = new SystemSettingsModel.SignatureSourceItem() + { + Source = Config.MetadataConfiguration.SignatureSource, + HasheousHost = Config.MetadataConfiguration.HasheousHost, + HasheousSubmitFixes = (bool)Config.MetadataConfiguration.HasheousSubmitFixes, + HasheousAPIKey = Config.MetadataConfiguration.HasheousAPIKey + } }; return Ok(systemSettingsModel); @@ -273,6 +286,10 @@ namespace gaseous_server.Controllers Config.LoggingConfiguration.AlwaysLogToDisk = model.AlwaysLogToDisk; Config.LoggingConfiguration.LogRetention = model.MinimumLogRetentionPeriod; Config.SetSetting("emulatorDebugMode", model.EmulatorDebugMode.ToString()); + Config.MetadataConfiguration.SignatureSource = model.SignatureSource.Source; + Config.MetadataConfiguration.HasheousHost = model.SignatureSource.HasheousHost; + Config.MetadataConfiguration.HasheousAPIKey = model.SignatureSource.HasheousAPIKey; + Config.MetadataConfiguration.HasheousSubmitFixes = model.SignatureSource.HasheousSubmitFixes; Config.UpdateConfig(); } @@ -281,7 +298,8 @@ namespace gaseous_server.Controllers private SystemInfo.PathItem GetDisk(string Path) { - SystemInfo.PathItem pathItem = new SystemInfo.PathItem { + SystemInfo.PathItem pathItem = new SystemInfo.PathItem + { LibraryPath = Path, SpaceUsed = Common.DirSize(new DirectoryInfo(Path)), SpaceAvailable = new DriveInfo(Path).AvailableFreeSpace, @@ -293,11 +311,12 @@ namespace gaseous_server.Controllers public class SystemInfo { - public Version ApplicationVersion { + public Version ApplicationVersion + { get - { - return Assembly.GetExecutingAssembly().GetName().Version; - } + { + return Assembly.GetExecutingAssembly().GetName().Version; + } } public List? Paths { get; set; } public long DatabaseSize { get; set; } @@ -352,7 +371,7 @@ namespace gaseous_server.Controllers this.DefaultAllowedEndHours = 23; this.DefaultAllowedEndMinutes = 59; break; - + case ProcessQueue.QueueItemType.TitleIngestor: this._UserManageable = true; this.DefaultInterval = 1; @@ -589,7 +608,8 @@ namespace gaseous_server.Controllers } private bool _UserManageable; public bool UserManageable => _UserManageable; - public int Interval { + public int Interval + { get { return int.Parse(Config.ReadSetting("Interval_" + Task, DefaultInterval.ToString())); @@ -642,7 +662,7 @@ namespace gaseous_server.Controllers public List Blocks { get - { + { if (_Blocks.Contains(ProcessQueue.QueueItemType.All)) { List blockList = new List(); @@ -710,5 +730,14 @@ namespace gaseous_server.Controllers public bool AlwaysLogToDisk { get; set; } public int MinimumLogRetentionPeriod { get; set; } public bool EmulatorDebugMode { get; set; } + public SignatureSourceItem SignatureSource { get; set; } + + public class SignatureSourceItem + { + public HasheousClient.Models.MetadataModel.SignatureSources Source { get; set; } + public string HasheousHost { get; set; } + public string HasheousAPIKey { get; set; } + public bool HasheousSubmitFixes { get; set; } + } } } \ No newline at end of file diff --git a/gaseous-server/Models/Signatures_Games.cs b/gaseous-server/Models/Signatures_Games.cs index b2fe9b7..cc389cc 100644 --- a/gaseous-server/Models/Signatures_Games.cs +++ b/gaseous-server/Models/Signatures_Games.cs @@ -4,12 +4,36 @@ using gaseous_signature_parser.models.RomSignatureObject; namespace gaseous_server.Models { - public class Signatures_Games : HasheousClient.Models.LookupResponseModel + public class Signatures_Games : HasheousClient.Models.SignatureModel { public Signatures_Games() { } + [JsonIgnore] + public int Score + { + get + { + int _score = 0; + + if (Game != null) + { + _score = _score + Game.Score; + } + + if (Rom != null) + { + _score = _score + Rom.Score; + } + + return _score; + } + } + + public GameItem Game = new GameItem(); + public RomItem Rom = new RomItem(); + public SignatureFlags Flags = new SignatureFlags(); public class SignatureFlags @@ -18,6 +42,213 @@ namespace gaseous_server.Models public string IGDBPlatformName { get; set; } public long IGDBGameId { get; set; } } + + public class GameItem : HasheousClient.Models.SignatureModel.GameItem + { + public GameItem() + { + + } + + [JsonIgnore] + public int Score + { + get + { + // calculate a score based on the availablility of data + int _score = 0; + var properties = this.GetType().GetProperties(); + foreach (var prop in properties) + { + if (prop.GetGetMethod() != null) + { + switch (prop.Name.ToLower()) + { + case "id": + case "score": + break; + case "name": + case "year": + case "publisher": + case "system": + if (prop.PropertyType == typeof(string)) + { + if (prop.GetValue(this) != null) + { + string propVal = prop.GetValue(this).ToString(); + if (propVal.Length > 0) + { + _score = _score + 10; + } + } + } + break; + default: + if (prop.PropertyType == typeof(string)) + { + if (prop.GetValue(this) != null) + { + string propVal = prop.GetValue(this).ToString(); + if (propVal.Length > 0) + { + _score = _score + 1; + } + } + } + break; + } + } + } + + return _score; + } + } + } + + public class RomItem : HasheousClient.Models.SignatureModel.RomItem + { + [JsonIgnore] + public int Score + { + get + { + // calculate a score based on the availablility of data + int _score = 0; + var properties = this.GetType().GetProperties(); + foreach (var prop in properties) + { + if (prop.GetGetMethod() != null) + { + switch (prop.Name.ToLower()) + { + case "name": + case "size": + case "crc": + case "developmentstatus": + case "flags": + case "attributes": + case "romtypemedia": + case "medialabel": + if (prop.PropertyType == typeof(string) || prop.PropertyType == typeof(Int64) || prop.PropertyType == typeof(List)) + { + if (prop.GetValue(this) != null) + { + string propVal = prop.GetValue(this).ToString(); + if (propVal.Length > 0) + { + _score = _score + 10; + } + } + } + break; + default: + if (prop.PropertyType == typeof(string)) + { + if (prop.GetValue(this) != null) + { + string propVal = prop.GetValue(this).ToString(); + if (propVal.Length > 0) + { + _score = _score + 1; + } + } + } + break; + } + } + } + + return _score; + } + } + + public class MediaType + { + public MediaType(SignatureSourceType Source, string MediaTypeString) + { + switch (Source) + { + case RomItem.SignatureSourceType.TOSEC: + string[] typeString = MediaTypeString.Split(" "); + + string inType = ""; + foreach (string typeStringVal in typeString) + { + if (inType == "") + { + switch (typeStringVal.ToLower()) + { + case "disk": + Media = RomItem.RomTypes.Disk; + + inType = typeStringVal; + break; + case "disc": + Media = RomItem.RomTypes.Disc; + + inType = typeStringVal; + break; + case "file": + Media = RomItem.RomTypes.File; + + inType = typeStringVal; + break; + case "part": + Media = RomItem.RomTypes.Part; + + inType = typeStringVal; + break; + case "tape": + Media = RomItem.RomTypes.Tape; + + inType = typeStringVal; + break; + case "of": + inType = typeStringVal; + break; + case "side": + inType = typeStringVal; + break; + } + } + else { + switch (inType.ToLower()) + { + case "disk": + case "disc": + case "file": + case "part": + case "tape": + Number = int.Parse(typeStringVal); + break; + case "of": + Count = int.Parse(typeStringVal); + break; + case "side": + Side = typeStringVal; + break; + } + inType = ""; + } + } + + break; + + default: + break; + + } + } + + public RomItem.RomTypes? Media { get; set; } + + public int? Number { get; set; } + + public int? Count { get; set; } + + public string? Side { get; set; } + } + } } } diff --git a/gaseous-server/ProcessQueue.cs b/gaseous-server/ProcessQueue.cs index 8b0f0d9..07dd941 100644 --- a/gaseous-server/ProcessQueue.cs +++ b/gaseous-server/ProcessQueue.cs @@ -245,15 +245,33 @@ namespace gaseous_server CallingQueueItem = this }; - Logging.Log(Logging.LogType.Debug, "Signature Import", "Processing TOSEC files"); - tIngest.Import(Path.Combine(Config.LibraryConfiguration.LibrarySignatureImportDirectory, "TOSEC"), gaseous_signature_parser.parser.SignatureParser.TOSEC); - - Logging.Log(Logging.LogType.Debug, "Signature Import", "Processing MAME Arcade files"); - tIngest.Import(Path.Combine(Config.LibraryConfiguration.LibrarySignatureImportDirectory, "MAME Arcade"), gaseous_signature_parser.parser.SignatureParser.MAMEArcade); + foreach (int i in Enum.GetValues(typeof(gaseous_signature_parser.parser.SignatureParser))) + { + gaseous_signature_parser.parser.SignatureParser parserType = (gaseous_signature_parser.parser.SignatureParser)i; + if ( + parserType != gaseous_signature_parser.parser.SignatureParser.Auto && + parserType != gaseous_signature_parser.parser.SignatureParser.Unknown + ) + { + Logging.Log(Logging.LogType.Debug, "Signature Import", "Processing " + parserType + " files"); + + string SignaturePath = Path.Combine(Config.LibraryConfiguration.LibrarySignaturesDirectory, parserType.ToString()); + string SignatureProcessedPath = Path.Combine(Config.LibraryConfiguration.LibrarySignaturesProcessedDirectory, parserType.ToString()); + + if (!Directory.Exists(SignaturePath)) + { + Directory.CreateDirectory(SignaturePath); + } + + if (!Directory.Exists(SignatureProcessedPath)) + { + Directory.CreateDirectory(SignatureProcessedPath); + } + + tIngest.Import(SignaturePath, SignatureProcessedPath, parserType); + } + } - Logging.Log(Logging.LogType.Debug, "Signature Import", "Processing MAME MESS files"); - tIngest.Import(Path.Combine(Config.LibraryConfiguration.LibrarySignatureImportDirectory, "MAME MESS"), gaseous_signature_parser.parser.SignatureParser.MAMEMess); - _SaveLastRunTime = true; break; diff --git a/gaseous-server/Program.cs b/gaseous-server/Program.cs index 02db4a2..15a759e 100644 --- a/gaseous-server/Program.cs +++ b/gaseous-server/Program.cs @@ -64,6 +64,7 @@ if (Directory.Exists(Config.LibraryConfiguration.LibraryUploadDirectory)) // kick off any delayed upgrade tasks // run 1002 background updates in the background on every start DatabaseMigration.BackgroundUpgradeTargetSchemaVersions.Add(1002); +DatabaseMigration.BackgroundUpgradeTargetSchemaVersions.Add(1022); // start the task ProcessQueue.QueueItem queueItem = new ProcessQueue.QueueItem( ProcessQueue.QueueItemType.BackgroundDatabaseUpgrade, @@ -273,7 +274,7 @@ using (var scope = app.Services.CreateScope()) { var roleManager = scope.ServiceProvider.GetRequiredService(); var roles = new[] { "Admin", "Gamer", "Player" }; - + foreach (var role in roles) { if (await roleManager.FindByNameAsync(role, CancellationToken.None) == null) @@ -303,11 +304,11 @@ app.Use(async (context, next) => string correlationId = Guid.NewGuid().ToString(); CallContext.SetData("CorrelationId", correlationId); CallContext.SetData("CallingProcess", context.Request.Method + ": " + context.Request.Path); - + string userIdentity; try { - userIdentity = context.User.Claims.Where(x=>x.Type==System.Security.Claims.ClaimTypes.NameIdentifier).FirstOrDefault().Value; + userIdentity = context.User.Claims.Where(x => x.Type == System.Security.Claims.ClaimTypes.NameIdentifier).FirstOrDefault().Value; } catch { @@ -329,7 +330,7 @@ app.Use(async (context, next) => // - the server will not start while the RecoverAccount.txt file exists string PasswordRecoveryFile = Path.Combine(Config.LibraryConfiguration.LibraryRootDirectory, "RecoverAccount.txt"); if (!String.IsNullOrEmpty(Environment.GetEnvironmentVariable("recoveraccount"))) -{ +{ if (File.Exists(PasswordRecoveryFile)) { // password has already been set - do nothing and just exit @@ -345,7 +346,7 @@ if (!String.IsNullOrEmpty(Environment.GetEnvironmentVariable("recoveraccount"))) string password = new string(Enumerable.Repeat(chars, length).Select(s => s[random.Next(s.Length)]).ToArray()); File.WriteAllText(PasswordRecoveryFile, password); - + // reset the password using (var scope = app.Services.CreateScope()) { diff --git a/gaseous-server/Support/Country.txt b/gaseous-server/Support/Country.txt new file mode 100644 index 0000000..5ee02a3 --- /dev/null +++ b/gaseous-server/Support/Country.txt @@ -0,0 +1,73 @@ +AE|United Arab Emirates +AL|Albania +AS|Asia +AT|Austria +AU|Australia +BA|Bosnia and Herzegovina +BE|Belgium +BG|Bulgaria +BR|Brazil +CA|Canada +CH|Switzerland +CL|Chile +CN|China +CS|Serbia and Montenegro +CY|Cyprus +CZ|Czech Republic +DE|Germany +DK|Denmark +EE|Estonia +EG|Egypt +ES|Spain +EU|Europe +FI|Finland +FR|France +GB|United Kingdom +GR|Greece +HK|Hong Kong +HR|Croatia +HU|Hungary +ID|Indonesia +IE|Ireland +IL|Israel +IN|India +IR|Iran +IS|Iceland +IT|Italy +JO|Jordan +JP|Japan +KR|Korea +KR|South Korea +LT|Lithuania +LU|Luxembourg +LV|Latvia +MN|Mongolia +MX|Mexico +MY|Malaysia +NL|Netherlands +NO|Norway +NP|Nepal +NZ|New Zealand +OM|Oman +PE|Peru +PH|Philippines +PL|Poland +PT|Portugal +QA|Qatar +RO|Romania +RU|Russia +SE|Sweden +SG|Singapore +SI|Slovenia +SK|Slovakia +TH|Thailand +TR|Turkey +TW|Taiwan +US|United States +USA|United States +VN|Vietnam +YU|Yugoslavia +ZA|South Africa +World|World +Europe|Europe +Asia|Asia diff --git a/gaseous-server/Support/Database/MySQL/gaseous-1022.sql b/gaseous-server/Support/Database/MySQL/gaseous-1022.sql new file mode 100644 index 0000000..b089e9c --- /dev/null +++ b/gaseous-server/Support/Database/MySQL/gaseous-1022.sql @@ -0,0 +1,40 @@ +CREATE TABLE `Signatures_RomToSource` ( + `SourceId` int NOT NULL, + `RomId` int NOT NULL, + PRIMARY KEY (`SourceId`, `RomId`) +); + +CREATE TABLE `Signatures_Games_Countries` ( + `GameId` INT NOT NULL, + `CountryId` INT NOT NULL, + PRIMARY KEY (`GameId`, `CountryId`), + CONSTRAINT `GameCountry` FOREIGN KEY (`GameId`) REFERENCES `Signatures_Games` (`Id`) ON DELETE CASCADE ON UPDATE NO ACTION +); + +CREATE TABLE `Signatures_Games_Languages` ( + `GameId` INT NOT NULL, + `LanguageId` INT NOT NULL, + PRIMARY KEY (`GameId`, `LanguageId`), + CONSTRAINT `GameLanguage` FOREIGN KEY (`GameId`) REFERENCES `Signatures_Games` (`Id`) ON DELETE CASCADE ON UPDATE NO ACTION +); + +CREATE TABLE `Country` ( + `Id` INT NOT NULL AUTO_INCREMENT, + `Code` VARCHAR(20) NULL, + `Value` VARCHAR(255) NULL, + PRIMARY KEY (`Id`), + INDEX `id_Code` (`Code` ASC) VISIBLE, + INDEX `id_Value` (`Value` ASC) VISIBLE +); + +CREATE TABLE `Language` ( + `Id` INT NOT NULL AUTO_INCREMENT, + `Code` VARCHAR(20) NULL, + `Value` VARCHAR(255) NULL, + PRIMARY KEY (`Id`), + INDEX `id_Code` (`Code` ASC) VISIBLE, + INDEX `id_Value` (`Value` ASC) VISIBLE +); + +ALTER TABLE `Games_Roms` +ADD COLUMN `RomDataVersion` INT DEFAULT 1; \ No newline at end of file diff --git a/gaseous-server/Support/Language.txt b/gaseous-server/Support/Language.txt new file mode 100644 index 0000000..cdf301c --- /dev/null +++ b/gaseous-server/Support/Language.txt @@ -0,0 +1,47 @@ +ar|Arabic +bg|Bulgarian +bs|Bosnian +cs|Czech +cy|Welsh +da|Danish +de|German +el|Greek +en|English +eo|Esperanto +es|Spanish +et|Estonian +fa|Persian +fi|Finnish +fr|French +fr-ca|French Canadian +ga|Irish +gd|Gaelic +gu|Gujarati +he|Hebrew +hi|Hindi +hr|Croatian +hu|Hungarian +is|Icelandic +it|Italian +ja|Japanese +ko|Korean +lt|Lithuanian +lv|Latvian +ms|Malay +nl|Dutch +no|Norwegian +pl|Polish +pt|Portuguese +ro|Romanian +ru|Russian +sk|Slovakian +sl|Slovenian +sq|Albanian +sr|Serbian +sv|Swedish +th|Thai +tr|Turkish +ur|Urdu +vi|Vietnamese +yi|Yiddish +zh|Chinese diff --git a/gaseous-server/gaseous-server.csproj b/gaseous-server/gaseous-server.csproj index 97cc403..5da4ac1 100644 --- a/gaseous-server/gaseous-server.csproj +++ b/gaseous-server/gaseous-server.csproj @@ -16,20 +16,20 @@ bin\Release\net8.0\gaseous-server.xml - - - + + + - - - - + + + + - - - + + + - + @@ -39,6 +39,8 @@ + + @@ -64,6 +66,7 @@ + @@ -85,6 +88,8 @@ true PreserveNewest + + @@ -108,5 +113,6 @@ + \ No newline at end of file diff --git a/gaseous-server/wwwroot/pages/dialogs/librarynew.html b/gaseous-server/wwwroot/pages/dialogs/librarynew.html index 0f9c6d9..8525fce 100644 --- a/gaseous-server/wwwroot/pages/dialogs/librarynew.html +++ b/gaseous-server/wwwroot/pages/dialogs/librarynew.html @@ -39,7 +39,7 @@ }, processResults: function (data) { var arr = []; - + arr.push({ id: 0, text: 'Any' @@ -74,11 +74,11 @@ ajaxCall( '/api/v1.1/Library?Name=' + encodeURIComponent(libName) + '&DefaultPlatformId=' + libPlatform[0].id + '&Path=' + encodeURIComponent(libPath), 'POST', - function(result) { + function (result) { drawLibrary(); - closeSubDialog(); + closeDialog(); }, - function(error) { + function (error) { alert('An error occurred while creating the library:\n\n' + JSON.stringify(error.responseText)); } ); diff --git a/gaseous-server/wwwroot/pages/dialogs/rominfo.html b/gaseous-server/wwwroot/pages/dialogs/rominfo.html index b5ce6e2..3e848b9 100644 --- a/gaseous-server/wwwroot/pages/dialogs/rominfo.html +++ b/gaseous-server/wwwroot/pages/dialogs/rominfo.html @@ -1,7 +1,9 @@ 
General
- - + +
Title Match
@@ -59,7 +61,7 @@ @@ -144,7 +148,7 @@ document.getElementById('romDelete').style.display = 'none'; } - if (result.attributes.length > 0) { + if (result.attributes) { document.getElementById('properties_bodypanel_attributes').appendChild(BuildAttributesTable(result.attributes, result.source)); document.getElementById('properties_bodypanel_archive_content').appendChild(BuildArchiveTable(result.attributes, result.source)); } @@ -276,8 +280,8 @@ var aTable = document.createElement('table'); aTable.style.width = '100%'; - for (var i = 0; i < attributes.length; i++) { - if (attributes[i].key != "ZipContents") { + for (const [key, value] of Object.entries(attributes)) { + if (key != "ZipContents") { // show attributes button document.getElementById('properties_toc_attributes').style.display = ''; var aRow = document.createElement('tr'); @@ -285,15 +289,15 @@ var aTitleCell = document.createElement('th'); aTitleCell.width = "25%"; if (sourceName == "TOSEC") { - aTitleCell.innerHTML = ConvertTOSECAttributeName(attributes[i].key); + aTitleCell.innerHTML = ConvertTOSECAttributeName(key); } else { - aTitleCell.innerHTML = attributes[i].key; + aTitleCell.innerHTML = key; } aRow.appendChild(aTitleCell); var aValueCell = document.createElement('td'); aValueCell.width = "75%"; - aValueCell.innerHTML = attributes[i].value; + aValueCell.innerHTML = value; aRow.appendChild(aValueCell); aTable.appendChild(aRow); @@ -304,13 +308,13 @@ } function BuildArchiveTable(attributes, sourceName) { - for (var i = 0; i < attributes.length; i++) { - if (attributes[i].key == "ZipContents") { - var archiveContent = JSON.parse(attributes[i].value); - + for (const [key, value] of Object.entries(attributes)) { + if (key == "ZipContents") { + var archiveContent = JSON.parse(value); + // show archive button document.getElementById('properties_toc_archive').style.display = ''; - + var aTable = document.createElement('table'); aTable.className = 'romtable'; aTable.setAttribute('cellspacing', 0); @@ -343,6 +347,17 @@ hRow.appendChild(aHashCell); aBody.appendChild(hRow); + if (archiveContent[r].isSignatureSelector == true) { + var sigRow = document.createElement('tr'); + + var sigCell = document.createElement('td'); + sigCell.setAttribute('colspan', 2); + sigCell.style.paddingLeft = '20px'; + sigCell.innerHTML = "Hash used to identify this archive"; + sigRow.appendChild(sigCell); + aBody.appendChild(sigRow); + } + aTable.appendChild(aBody); } } @@ -354,18 +369,18 @@ function ConvertTOSECAttributeName(attributeName) { var tosecAttributeNames = { "cr": "Cracked", - "f" : "Fixed", - "h" : "Hacked", - "m" : "Modified", - "p" : "Pirated", - "t" : "Trained", + "f": "Fixed", + "h": "Hacked", + "m": "Modified", + "p": "Pirated", + "t": "Trained", "tr": "Translated", - "o" : "Over Dump", - "u" : "Under Dump", - "v" : "Virus", - "b" : "Bad Dump", - "a" : "Alternate", - "!" : "Known Verified Dump" + "o": "Over Dump", + "u": "Under Dump", + "v": "Virus", + "b": "Bad Dump", + "a": "Alternate", + "!": "Known Verified Dump" }; if (attributeName in tosecAttributeNames) { @@ -378,4 +393,4 @@ SelectTab('general'); document.getElementById('romDelete').setAttribute("onclick", "showSubDialog('romdelete', " + modalVariables + ");"); - + \ No newline at end of file diff --git a/gaseous-server/wwwroot/pages/settings.html b/gaseous-server/wwwroot/pages/settings.html index 74cd83e..4b0b700 100644 --- a/gaseous-server/wwwroot/pages/settings.html +++ b/gaseous-server/wwwroot/pages/settings.html @@ -1,4 +1,5 @@ -
+
@@ -6,27 +7,40 @@
Settings
System
- - - + + + + +
Firmware
- +
About
- +
- Wallpaper by Lorenzo Herrera / Unsplash + Wallpaper by Lorenzo Herrera / Unsplash
+ \ No newline at end of file diff --git a/gaseous-server/wwwroot/pages/settings/libraries.html b/gaseous-server/wwwroot/pages/settings/libraries.html new file mode 100644 index 0000000..d30f616 --- /dev/null +++ b/gaseous-server/wwwroot/pages/settings/libraries.html @@ -0,0 +1,63 @@ +
+

Libraries

+
+ + + +
+
+ + \ No newline at end of file diff --git a/gaseous-server/wwwroot/pages/settings/services.html b/gaseous-server/wwwroot/pages/settings/services.html new file mode 100644 index 0000000..5d61e6c --- /dev/null +++ b/gaseous-server/wwwroot/pages/settings/services.html @@ -0,0 +1,290 @@ +
+

Services

+
+ + +
+
+ + \ No newline at end of file diff --git a/gaseous-server/wwwroot/pages/settings/settings.html b/gaseous-server/wwwroot/pages/settings/settings.html index 93e6a06..aaa8a6e 100644 --- a/gaseous-server/wwwroot/pages/settings/settings.html +++ b/gaseous-server/wwwroot/pages/settings/settings.html @@ -2,37 +2,74 @@

Settings

-

Libraries

- - -
-
- -

Advanced Settings

-

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

-

Background Task Timers

- - -
-
- -

System Settings

- +
- + + + + + + + + + + + + + + + + + + + + + + + + @@ -47,10 +84,12 @@ - + - + @@ -61,339 +100,11 @@
Logging +

Metadata Sources

+
+ Signature Source + + + +
+ + +
+ + + +
+

Logging

+
Write logs - +
- +
Emulator +

Emulator

+
Enable debug mode
\ No newline at end of file diff --git a/gaseous-server/wwwroot/pages/settings/system.html b/gaseous-server/wwwroot/pages/settings/system.html index 8e24b68..d7210e6 100644 --- a/gaseous-server/wwwroot/pages/settings/system.html +++ b/gaseous-server/wwwroot/pages/settings/system.html @@ -22,7 +22,7 @@

Database

-

Signatures

+

Local Database Signatures

+ \ No newline at end of file diff --git a/gaseous-server/wwwroot/styles/style.css b/gaseous-server/wwwroot/styles/style.css index 90bacfb..82c4582 100644 --- a/gaseous-server/wwwroot/styles/style.css +++ b/gaseous-server/wwwroot/styles/style.css @@ -23,21 +23,29 @@ h3 { border-bottom-width: 1px; /*border-image: linear-gradient(to right, blue 25%, yellow 25%, yellow 50%,red 50%, red 75%, teal 75%) 5;*/ - border-image: linear-gradient(to right, rgba(255,0,0,1) 0%, rgba(251,255,0,1) 16%, rgba(0,255,250,1) 30%, rgba(0,16,255,1) 46%, rgba(250,0,255,1) 62%, rgba(255,0,0,1) 78%, rgba(255,237,0,1) 90%, rgba(20,255,0,1) 100%) 5; + border-image: linear-gradient(to right, rgba(255, 0, 0, 1) 0%, rgba(251, 255, 0, 1) 16%, rgba(0, 255, 250, 1) 30%, rgba(0, 16, 255, 1) 46%, rgba(250, 0, 255, 1) 62%, rgba(255, 0, 0, 1) 78%, rgba(255, 237, 0, 1) 90%, rgba(20, 255, 0, 1) 100%) 5; } /* The Modal (background) */ .modal { - display: none; /* Hidden by default */ - position: fixed; /* Stay in place */ - z-index: 100; /* Sit on top */ + display: none; + /* Hidden by default */ + position: fixed; + /* Stay in place */ + z-index: 100; + /* Sit on top */ left: 0; top: 0; - width: 100%; /* Full width */ - height: 100%; /* Full height */ - overflow: none; /* Enable scroll if needed */ - background-color: rgb(0,0,0); /* Fallback color */ - background-color: rgba(0,0,0,0.4); /* Black w/ opacity */ + width: 100%; + /* Full width */ + height: 100%; + /* Full height */ + overflow: none; + /* Enable scroll if needed */ + background-color: rgb(0, 0, 0); + /* Fallback color */ + background-color: rgba(0, 0, 0, 0.4); + /* Black w/ opacity */ backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); filter: drop-shadow(5px 5px 10px #000); @@ -47,22 +55,28 @@ h3 { /* Modal Content/Box */ .modal-content { background-color: #383838; - margin: 10% auto; /* 15% from the top and centered */ + margin: 10% auto; + /* 15% from the top and centered */ padding: 10px; border: 1px solid #888; border-radius: 10px; - width: 700px; /* Could be more or less, depending on screen size */ + width: 700px; + /* Could be more or less, depending on screen size */ min-height: 358px; } + .modal-content-sub { background-color: #383838; - margin: 20% auto; /* 20% from the top and centered */ + margin: 20% auto; + /* 20% from the top and centered */ padding: 10px; border: 1px solid #888; border-radius: 10px; - width: 300px; /* Could be more or less, depending on screen size */ + width: 300px; + /* Could be more or less, depending on screen size */ min-height: 110px; } + #modal-heading { margin-block: 5px; border-bottom-style: solid; @@ -70,8 +84,9 @@ h3 { border-bottom-width: 3px; /*border-image: linear-gradient(to right, blue 25%, yellow 25%, yellow 50%,red 50%, red 75%, teal 75%) 5;*/ - border-image: linear-gradient(to right, rgba(255,0,0,1) 0%, rgba(251,255,0,1) 16%, rgba(0,255,250,1) 30%, rgba(0,16,255,1) 46%, rgba(250,0,255,1) 62%, rgba(255,0,0,1) 78%, rgba(255,237,0,1) 90%, rgba(20,255,0,1) 100%) 5; + border-image: linear-gradient(to right, rgba(255, 0, 0, 1) 0%, rgba(251, 255, 0, 1) 16%, rgba(0, 255, 250, 1) 30%, rgba(0, 16, 255, 1) 46%, rgba(250, 0, 255, 1) 62%, rgba(255, 0, 0, 1) 78%, rgba(255, 237, 0, 1) 90%, rgba(20, 255, 0, 1) 100%) 5; } + #modal-content { height: 100%; } @@ -268,7 +283,7 @@ h3 { } #games_filter { - + width: 200px; /* border-style: solid; border-width: 1px; @@ -296,7 +311,13 @@ h3 { z-index: 1; } -input[type='text'], input[type='number'], input[type="email"], input[type="password"], input[type="datetime-local"] { +input[type='text'], +input[type='number'], +input[type="email"], +input[type="password"], +input[type="datetime-local"], +input[type="url"], +textarea { background-color: #2b2b2b; color: white; padding: 4px; @@ -313,10 +334,21 @@ input[type='text'], input[type='number'], input[type="email"], input[type="passw height: 21px; } -input[type='text']:hover, input[type='number']:hover, input[type="email"]:hover, input[type="password"]:hover, input[type="datetime-local"]:hover { +input[type='text']:hover, +input[type='number']:hover, +input[type="email"]:hover, +input[type="password"]:hover, +input[type="datetime-local"]:hover, +input[type="url"]:hover, +textarea:hover { border-color: #939393; } +textarea { + height: unset; + font-family: 'Courier New', Courier, monospace; +} + input[id='filter_panel_search'] { width: 160px; } @@ -351,9 +383,7 @@ input[name='filter_panel_range_max'] { background: #555; } -.text_link { - -} +.text_link {} .text_link:hover { cursor: pointer; @@ -390,9 +420,9 @@ input[name='filter_panel_range_max'] { background-color: rgba(0, 22, 56, 0.8); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); - box-shadow: 5px 5px 19px 0px rgba(0,0,0,0.44); - -webkit-box-shadow: 5px 5px 19px 0px rgba(0,0,0,0.44); - -moz-box-shadow: 5px 5px 19px 0px rgba(0,0,0,0.44); + box-shadow: 5px 5px 19px 0px rgba(0, 0, 0, 0.44); + -webkit-box-shadow: 5px 5px 19px 0px rgba(0, 0, 0, 0.44); + -moz-box-shadow: 5px 5px 19px 0px rgba(0, 0, 0, 0.44); } .games_pager_number { @@ -525,13 +555,13 @@ input[name='filter_panel_range_max'] { overflow-y: auto; /* display: flex; */ justify-content: center; - align-items: center; + align-items: center; } #games_library_alpha_pager { width: 50px; justify-content: center; - align-items: center; + align-items: center; } .games_library_alpha_pager_letter { @@ -586,22 +616,22 @@ input[name='filter_panel_range_max'] { .game_tile:hover { cursor: pointer; - text-decoration: underline; + /* text-decoration: underline; background-color: #2b2b2b; border-radius: 10px 10px 10px 10px; -webkit-border-radius: 10px 10px 10px 10px; -moz-border-radius: 10px 10px 10px 10px; - border: 1px solid #2b2b2b; + border: 1px solid #2b2b2b; */ } .game_tile_small:hover { cursor: pointer; - text-decoration: underline; + /* text-decoration: underline; background-color: #2b2b2b; border-radius: 10px 10px 10px 10px; -webkit-border-radius: 10px 10px 10px 10px; -moz-border-radius: 10px 10px 10px 10px; - border: 1px solid #2b2b2b; + border: 1px solid #2b2b2b; */ } .game_tile_row { @@ -625,6 +655,19 @@ input[name='filter_panel_range_max'] { display: inline-block; max-width: 200px; max-height: 200px; + border-radius: 7px; + border-width: 2px; + border-style: solid; + border-color: transparent; + overflow: hidden; +} + +.game_tile:hover .game_tile_box { + border-color: yellow; + outline-width: 2px; + outline-style: solid; + outline-offset: -3px; + outline-color: black; } .game_tile_box_row { @@ -706,9 +749,9 @@ input[name='filter_panel_range_max'] { } .game_tile_image_shadow { - box-shadow: 5px 5px 19px 0px rgba(0,0,0,0.44); - -webkit-box-shadow: 5px 5px 19px 0px rgba(0,0,0,0.44); - -moz-box-shadow: 5px 5px 19px 0px rgba(0,0,0,0.44); + box-shadow: 5px 5px 19px 0px rgba(0, 0, 0, 0.44); + -webkit-box-shadow: 5px 5px 19px 0px rgba(0, 0, 0, 0.44); + -moz-box-shadow: 5px 5px 19px 0px rgba(0, 0, 0, 0.44); } .game_tile_image_row { @@ -720,11 +763,13 @@ input[name='filter_panel_range_max'] { background-color: transparent; } -.game_tile_image, .unknown { +.game_tile_image, +.unknown { background-color: transparent; } -.game_tile_image_row, .unknown { +.game_tile_image_row, +.unknown { background-color: transparent; } @@ -790,9 +835,9 @@ input[name='filter_panel_range_max'] { max-width: 250px; max-height: 350px; width: 100%; - box-shadow: 5px 5px 19px 0px rgba(0,0,0,0.44); - -webkit-box-shadow: 5px 5px 19px 0px rgba(0,0,0,0.44); - -moz-box-shadow: 5px 5px 19px 0px rgba(0,0,0,0.44); + box-shadow: 5px 5px 19px 0px rgba(0, 0, 0, 0.44); + -webkit-box-shadow: 5px 5px 19px 0px rgba(0, 0, 0, 0.44); + -moz-box-shadow: 5px 5px 19px 0px rgba(0, 0, 0, 0.44); } .gamegenrelabel { @@ -842,9 +887,9 @@ input[name='filter_panel_range_max'] { padding: 10px; /*height: 350px;*/ margin-bottom: 20px; - box-shadow: 5px 5px 19px 0px rgba(0,0,0,0.44); - -webkit-box-shadow: 5px 5px 19px 0px rgba(0,0,0,0.44); - -moz-box-shadow: 5px 5px 19px 0px rgba(0,0,0,0.44); + box-shadow: 5px 5px 19px 0px rgba(0, 0, 0, 0.44); + -webkit-box-shadow: 5px 5px 19px 0px rgba(0, 0, 0, 0.44); + -moz-box-shadow: 5px 5px 19px 0px rgba(0, 0, 0, 0.44); } #gamescreenshots_main { @@ -903,11 +948,16 @@ iframe { background-color: #383838; color: black; text-align: center; - user-select: none; /* standard syntax */ - -webkit-user-select: none; /* webkit (safari, chrome) browsers */ - -moz-user-select: none; /* mozilla browsers */ - -khtml-user-select: none; /* webkit (konqueror) browsers */ - -ms-user-select: none; /* IE10+ */ + user-select: none; + /* standard syntax */ + -webkit-user-select: none; + /* webkit (safari, chrome) browsers */ + -moz-user-select: none; + /* mozilla browsers */ + -khtml-user-select: none; + /* webkit (konqueror) browsers */ + -ms-user-select: none; + /* IE10+ */ } .gamescreenshots_arrows:hover { @@ -981,9 +1031,7 @@ iframe { background-color: rgba(56, 56, 56, 0.9); } -#gamesummarytext_label { - -} +#gamesummarytext_label {} .line-clamp-4 { overflow: hidden; @@ -1057,9 +1105,9 @@ th { -webkit-border-radius: 5px 5px 5px 5px; -moz-border-radius: 5px 5px 5px 5px; border: 1px solid #19d348; - box-shadow: 5px 5px 19px 0px rgba(0,0,0,0.44); - -webkit-box-shadow: 5px 5px 19px 0px rgba(0,0,0,0.44); - -moz-box-shadow: 5px 5px 19px 0px rgba(0,0,0,0.44); + box-shadow: 5px 5px 19px 0px rgba(0, 0, 0, 0.44); + -webkit-box-shadow: 5px 5px 19px 0px rgba(0, 0, 0, 0.44); + -moz-box-shadow: 5px 5px 19px 0px rgba(0, 0, 0, 0.44); } .romstart:hover { @@ -1084,9 +1132,9 @@ th { border-color: white; background-color: blue; outline-color: blue; - box-shadow: 5px 5px 19px 0px rgba(0,0,0,0.44); - -webkit-box-shadow: 5px 5px 19px 0px rgba(0,0,0,0.44); - -moz-box-shadow: 5px 5px 19px 0px rgba(0,0,0,0.44); + box-shadow: 5px 5px 19px 0px rgba(0, 0, 0, 0.44); + -webkit-box-shadow: 5px 5px 19px 0px rgba(0, 0, 0, 0.44); + -moz-box-shadow: 5px 5px 19px 0px rgba(0, 0, 0, 0.44); } .properties_button:hover { @@ -1115,14 +1163,18 @@ th { height: 100%; } -div[name="properties_toc_item"],div[name="properties_user_toc_item"],div[name="properties_profile_toc_item"] { +div[name="properties_toc_item"], +div[name="properties_user_toc_item"], +div[name="properties_profile_toc_item"] { padding: 10px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #2b2b2b; } -div[name="properties_toc_item"]:hover,div[name="properties_user_toc_item"]:hover,div[name="properties_profile_toc_item"]:hover { +div[name="properties_toc_item"]:hover, +div[name="properties_user_toc_item"]:hover, +div[name="properties_profile_toc_item"]:hover { background-color: #2b2b2b; cursor: pointer; } @@ -1150,7 +1202,8 @@ div[name="properties_toc_item"]:hover,div[name="properties_user_toc_item"]:hover border-radius: 5px; } -.select2-container--default:hover, .select2-selection--multiple:hover { +.select2-container--default:hover, +.select2-selection--multiple:hover { border-color: #939393; } @@ -1197,7 +1250,8 @@ div[name="properties_toc_item"]:hover,div[name="properties_user_toc_item"]:hover border-radius: 5px; } -.select2-selection--single:hover, .select2-selection__rendered:hover { +.select2-selection--single:hover, +.select2-selection__rendered:hover { border-color: #939393; } @@ -1302,9 +1356,7 @@ button:not(.select2-selection__choice__remove):not(.ejs_menu_button):disabled { background-color: #555; } -#emulator { - -} +#emulator {} .emulator_partscreen { margin: 0 auto; @@ -1377,15 +1429,14 @@ button:not(.select2-selection__choice__remove):not(.ejs_menu_button):disabled { margin-left: 15px; } -.rom_checkbox_box { - -} +.rom_checkbox_box {} .rom_checkbox_box_hidden { display: none; } -#rom_edit, #rom_edit_delete { +#rom_edit, +#rom_edit_delete { float: right; } @@ -1398,9 +1449,9 @@ button:not(.select2-selection__choice__remove):not(.ejs_menu_button):disabled { } #game { - box-shadow: 5px 5px 19px 0px rgba(0,0,0,0.44); - -webkit-box-shadow: 5px 5px 19px 0px rgba(0,0,0,0.44); - -moz-box-shadow: 5px 5px 19px 0px rgba(0,0,0,0.44); + box-shadow: 5px 5px 19px 0px rgba(0, 0, 0, 0.44); + -webkit-box-shadow: 5px 5px 19px 0px rgba(0, 0, 0, 0.44); + -moz-box-shadow: 5px 5px 19px 0px rgba(0, 0, 0, 0.44); } #gametitle_criticrating { @@ -1440,7 +1491,7 @@ button:not(.select2-selection__choice__remove):not(.ejs_menu_button):disabled { width: 1000px; height: 90%; margin: 25px auto; -/* overflow-x: scroll;*/ + /* overflow-x: scroll;*/ position: relative; } @@ -1468,7 +1519,8 @@ button:not(.select2-selection__choice__remove):not(.ejs_menu_button):disabled { } .bgalt1 { - background-color: transparent;; + background-color: transparent; + ; } .logs_table_cell_150px { @@ -1520,13 +1572,33 @@ button:not(.select2-selection__choice__remove):not(.ejs_menu_button):disabled { background-color: #383838; } -.string { color: lightblue; } -.number { color: lightblue; } -.boolean { color: lightblue; } -.null { color: magenta; } -.key { color: greenyellow; } -.brace { color: #888; } -.square { color: #fff000; } +.string { + color: lightblue; +} + +.number { + color: lightblue; +} + +.boolean { + color: lightblue; +} + +.null { + color: magenta; +} + +.key { + color: greenyellow; +} + +.brace { + color: #888; +} + +.square { + color: #fff000; +} .tagBox { position: absolute; @@ -1557,12 +1629,16 @@ button:not(.select2-selection__choice__remove):not(.ejs_menu_button):disabled { } .loginwindow { - position: fixed; /* Stay in place */ + position: fixed; + /* Stay in place */ left: 0; top: 0; - width: 100%; /* Full width */ - height: 100%; /* Full height */ - overflow: auto; /* Enable scroll if needed */ + width: 100%; + /* Full width */ + height: 100%; + /* Full height */ + overflow: auto; + /* Enable scroll if needed */ /*background-color: rgb(0,0,0); /* Fallback color */ /*background-color: rgba(0,0,0,0.4); /* Black w/ opacity */ /*backdrop-filter: blur(8px); @@ -1575,11 +1651,13 @@ button:not(.select2-selection__choice__remove):not(.ejs_menu_button):disabled { .loginwindow-content { position: relative; background-color: #383838; - margin: 15% auto; /* 15% from the top and centered */ + margin: 15% auto; + /* 15% from the top and centered */ padding: 10px; border: 1px solid #888; border-radius: 10px; - width: 350px; /* Could be more or less, depending on screen size */ + width: 350px; + /* Could be more or less, depending on screen size */ min-height: 250px; } @@ -1615,7 +1693,8 @@ button:not(.select2-selection__choice__remove):not(.ejs_menu_button):disabled { } /* Links inside the dropdown */ -.dropdown-content a, .dropdown-content span { +.dropdown-content a, +.dropdown-content span { color: black; padding: 12px 16px; text-decoration: none; @@ -1625,12 +1704,16 @@ button:not(.select2-selection__choice__remove):not(.ejs_menu_button):disabled { .dropdown-content span { cursor: auto; } - + /* Change color of dropdown links on hover */ -.dropdown-content a:hover {background-color: #ddd;} - +.dropdown-content a:hover { + background-color: #ddd; +} + /* Show the dropdown menu (use JS to add this class to the .dropdown-content container when the user clicks on the dropdown button) */ -.show {display:block;} +.show { + display: block; +} .dropdownroleitem { text-transform: capitalize; From 7400a8c040b45f126949c79580ac540098994066 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Sat, 18 May 2024 19:34:08 +1000 Subject: [PATCH 3/8] Change license from GPL to AGPL (#355) Closes #328 --- LICENSE | 149 ++++++++++++++++++++++++++------------------------------ 1 file changed, 68 insertions(+), 81 deletions(-) diff --git a/LICENSE b/LICENSE index 0f2028b..29ebfa5 100644 --- a/LICENSE +++ b/LICENSE @@ -1,5 +1,5 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies @@ -7,17 +7,15 @@ Preamble - The GNU General Public License is a free, copyleft license for -software and other kinds of works. + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to +our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. +software for all its users. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you @@ -26,44 +24,34 @@ them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. The precise terms and conditions for copying, distribution and modification follow. @@ -72,7 +60,7 @@ modification follow. 0. Definitions. - "This License" refers to version 3 of the GNU General Public License. + "This License" refers to version 3 of the GNU Affero General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. @@ -549,35 +537,45 @@ to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. - 13. Use with the GNU Affero General Public License. + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single +under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General +Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published +GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's +versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. @@ -631,44 +629,33 @@ to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - Gaseous - Copyright (C) 2023 Gaseous + + Copyright (C) This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + GNU Affero General Public License for more details. - You should have received a copy of the GNU General Public License + You should have received a copy of the GNU Affero General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) 2023 Gaseous - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. +For more information on this, and how to apply and follow the GNU AGPL, see +. \ No newline at end of file From c82ffb6c97d59c04b463ec12aba217c8d1510171 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 18 May 2024 19:41:36 +1000 Subject: [PATCH 4/8] chore(deps): bump Magick.NET-Q8-AnyCPU from 13.7.0 to 13.8.0 (#356) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [Magick.NET-Q8-AnyCPU](https://github.com/dlemstra/Magick.NET) from 13.7.0 to 13.8.0.
Release notes

Sourced from Magick.NET-Q8-AnyCPU's releases.

Magick.NET 13.8.0

Changes in Magick.NET:

Related changes in ImageMagick since the last release of Magick.NET:

Library updates:

  • ImageMagick 7.1.1-32 (2024-05-05)
  • aom 3.9.0 (2024-04-23)
  • deflate 1.20.0 (2024-03-23)
  • openexr 3.2.4 (2024-03-26)
  • fribidi 1.0.14 (2024-04-25)
  • harfbuzz 8.4.0 (2024-03-29)
  • lzma 5.4.6 (2024-01-26)
  • webp 1.4.0 (2023-04-13)
  • xml 2.12.6 (2024-03-15)

Full Changelog: https://github.com/dlemstra/Magick.NET/compare/13.7.0...13.8.0

Commits
  • 5ac3d81 Published Magick.NET 13.8.0
  • 54aab7e Renamed Building.md to CONTRIBUTING.md
  • 68af1ba Revert breaking changes in enum order (#1627).
  • 3ffd1b0 Updated docs.
  • ea8a818 Updated Magick.Native.
  • a5fc2ba Update doc typo in *PerceptualHash (#1624)
  • cdc21d1 Use NSubstitute instead of a test class.
  • e8072a4 Code style change.
  • d958a69 Document missing Exception for MagickImage.OilPaint (#1623)
  • 417f8b4 Correct return type of channel methods in Moments and PerceptualHash (#1621)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=Magick.NET-Q8-AnyCPU&package-manager=nuget&previous-version=13.7.0&new-version=13.8.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gaseous-server/gaseous-server.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gaseous-server/gaseous-server.csproj b/gaseous-server/gaseous-server.csproj index 5da4ac1..2689d29 100644 --- a/gaseous-server/gaseous-server.csproj +++ b/gaseous-server/gaseous-server.csproj @@ -21,7 +21,7 @@ - + From cea654692e5df1285652dd394addb67cc4393387 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 18 May 2024 19:42:03 +1000 Subject: [PATCH 5/8] chore(deps): bump Microsoft.AspNetCore.OpenApi from 8.0.4 to 8.0.5 (#357) Bumps [Microsoft.AspNetCore.OpenApi](https://github.com/dotnet/aspnetcore) from 8.0.4 to 8.0.5.
Release notes

Sourced from Microsoft.AspNetCore.OpenApi's releases.

.NET 8.0.5

Release

Commits
  • c9e3996 Merged PR 39207: [internal/release/8.0] Updated Version.Details.xml - replace...
  • 1681d9a Merged PR 39048: [internal/release/8.0] Update dependencies from dnceng/inter...
  • b5c1ba3 Merged PR 39041: [internal/release/8.0] Update dependencies from dnceng/inter...
  • 582b2e3 Merged PR 38666: [internal/release/8.0] Update dependencies from dnceng/inter...
  • 4fb5420 Merge in 'release/8.0' changes
  • d65b2f0 [release/8.0] Update Wix version (#55101)
  • eac2e5a Update dependencies from https://github.com/dotnet/arcade build 20240404.3 (#...
  • 90f8928 Merged PR 38780: Fix Abort lock
  • 1002bb7 Merge in 'release/8.0' changes
  • fa6339e Merge pull request #55034 from vseanreesermsft/internal-merge-8.0-2024-04-09-...
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=Microsoft.AspNetCore.OpenApi&package-manager=nuget&previous-version=8.0.4&new-version=8.0.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Michael Green <84688932+michael-j-green@users.noreply.github.com> --- gaseous-server/gaseous-server.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gaseous-server/gaseous-server.csproj b/gaseous-server/gaseous-server.csproj index 2689d29..a2d1551 100644 --- a/gaseous-server/gaseous-server.csproj +++ b/gaseous-server/gaseous-server.csproj @@ -27,7 +27,7 @@ - + From e0cff368196bb175a17dd51553c53d87cc61263f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 18 May 2024 19:44:13 +1000 Subject: [PATCH 6/8] chore(deps): bump Microsoft.AspNetCore.Identity.UI from 8.0.4 to 8.0.5 (#358) Bumps [Microsoft.AspNetCore.Identity.UI](https://github.com/dotnet/aspnetcore) from 8.0.4 to 8.0.5.
Release notes

Sourced from Microsoft.AspNetCore.Identity.UI's releases.

.NET 8.0.5

Release

Commits
  • c9e3996 Merged PR 39207: [internal/release/8.0] Updated Version.Details.xml - replace...
  • 1681d9a Merged PR 39048: [internal/release/8.0] Update dependencies from dnceng/inter...
  • b5c1ba3 Merged PR 39041: [internal/release/8.0] Update dependencies from dnceng/inter...
  • 582b2e3 Merged PR 38666: [internal/release/8.0] Update dependencies from dnceng/inter...
  • 4fb5420 Merge in 'release/8.0' changes
  • d65b2f0 [release/8.0] Update Wix version (#55101)
  • eac2e5a Update dependencies from https://github.com/dotnet/arcade build 20240404.3 (#...
  • 90f8928 Merged PR 38780: Fix Abort lock
  • 1002bb7 Merge in 'release/8.0' changes
  • fa6339e Merge pull request #55034 from vseanreesermsft/internal-merge-8.0-2024-04-09-...
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=Microsoft.AspNetCore.Identity.UI&package-manager=nuget&previous-version=8.0.4&new-version=8.0.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gaseous-server/gaseous-server.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gaseous-server/gaseous-server.csproj b/gaseous-server/gaseous-server.csproj index a2d1551..4b1a6ac 100644 --- a/gaseous-server/gaseous-server.csproj +++ b/gaseous-server/gaseous-server.csproj @@ -26,7 +26,7 @@ - + From be1d53b3b1b5436a210ae4d22745742615d91401 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Sat, 18 May 2024 22:26:30 +1000 Subject: [PATCH 7/8] Replaced unknown game image (#359) Replaced unknown game image with an entirely new image --- .gitignore | 3 ++- gaseous-server/wwwroot/.DS_Store | Bin 10244 -> 10244 bytes gaseous-server/wwwroot/images/unknowngame.png | Bin 20351 -> 94626 bytes gaseous-server/wwwroot/images/unknowngame.pxd | Bin 0 -> 228256 bytes 4 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 gaseous-server/wwwroot/images/unknowngame.pxd diff --git a/.gitignore b/.gitignore index b849cf0..21896b9 100644 --- a/.gitignore +++ b/.gitignore @@ -404,6 +404,7 @@ ASALocalRun/ # Local History for Visual Studio .localhistory/ gaseous-server/.DS_Store +gaseous-server/wwwroot/.DS_Store gaseous-server/wwwroot/emulators/EmulatorJS .devcontainer/.env -.mono/ \ No newline at end of file +.mono/ diff --git a/gaseous-server/wwwroot/.DS_Store b/gaseous-server/wwwroot/.DS_Store index f620c5da2981dcfc9b18f5642241f354c74ac368..d579713fbb1bb179790151bcea101465ff620b11 100644 GIT binary patch literal 10244 zcmeHMZ)_aJ6@PE-#JkxNHm*ZLn#&!zLfphQ=kuT7rVZym5eXzD;T-HZ3Fhv0W3SlT zJ#P2TN!?VATB(K5iuOYhh0=bgs+LNjRU4qC>X$ZZE42ur5CLBRA@PYy{YzE#4}CMU zXYbx0kuOcCv~${dJ2UUSnR)YjGjH|)0LLnNKR^NiWO^9YK0;ZO#M;@@kR-pRk0_En zfCDDz&tsp_jfo z6sTlFQ#}}~)1#1lkz_5>$F!8e4bKM8eXvA+!7cgoe=c9LOxH`LE~C`ezG`(xhti>T zoXE~Q3t2DcRot;$`4}rrI*ygEz31}xn#RJc)-~?fUe2_QG8Zs)gIJDFnYQjMj5!rs zce!jIFe5FBnC&)XU-_{`sA&SIpzP8W){@cyDiq6D@KYjTR8&k>mM=ml5G|^Xd^ef~n z%?Elu`zWbvrmvbU+m>U`Q7fC-IygzoSY3tygX=H{>u?J={DY)|P;JyOz@f?Vrht-I z-$4y(-5C1BXu_c4F7i~sMOKj%1FcsNKVZOb!5Lf~fP*@52J{41<%OG;S0%);vKq}f zf~x>X-c^`$1;-lV4LHg3SKUcAE-ntF(>;mwaB9U%28Qdrgn0p_ zmR`cPg3z2oEAaHlzZ%-z>bUTXwrp+AulpN=tgKPh>ta*WM`w;5pVhRAYusa4InS&b z6FJXtXSM5H+9&oE9Q#n&sM7v0RdB3I(WaJlg`8EW5VJ9ASy}Tlg1b<5EbEZtnx5&{ zN2fjGl*ihbqEOTHjO&!WajtCIB>jS`ll5`1#Dv{@jj~HrQO>X35dV00Z+hpaGJEzN zIDF}PZC$6TuD@ZbYPx3LGLGilf??~XJ$Gcm)V=u`+L~<7JZTzbMOlYElXk9XToj>QDeicC$*bR};-STViRT2hupAF-`TMb<7H*J+Xm9Gz*@c}py|b(<_7WA)=@ zgK|-=#&-0OKyK2dDf`1r^(%_zPCh{Urw~<#hGj+5k65|9Vfj^`+(lJ)O;yE={mS*X z%gQwEd_|g!E9zq76SA!R=04W({+#O_EE)FlkjD4Q@{Bv5D;ozFX!ov3?3ZP}j8xA= z_UNYPl({wT-WrP?WvWJX-Oy>$n>OCq8Oz3w$lA*!qnUQqr1OH-KpY!#GUKHfI3bzY z&M71X0pK=HW<)b|)vA5UqUjiwN@GbZWT!3fcBD@Hf;Z1l4{se!9 zzrcI&Pi)6E*oB+%X55C|_z6to01o0Xj^lnjfOq2z7Enh6=g`6mR&fDOlK;PfR6Ddzgl8t5rgGRF-Ku{MOXr)rTl|i_`|iAJ|A*Gy zUR%o??4w=lZ`hEydHbz{w|#na8HNJ2HJ}C^fMY)7DID`07xj4Mo~Uk#A0ekOPOZ42 zaLt-SY8}jZU$F*NK|ATEP;|5INEtn!? z@5T&{;sov?bRWXQn8isvfwOo&<_YT-+UVeeSjI&>Lr7o3v-mJRf?vk3;A8kW;r&Vc zCZYX%_}w*_*Sk$fPGWc+JAl7okLY~+s27e3EJsu0?P z!Bi`r&;kB~#sj=AfLcR`JB$7e3Yz-pe>;zkdMg~d@OU_Q$giS3rFl5Of~yvsp@UQU z&f~-x&=Z{f=ATbXUpvcZAL3XEU7B-*X5RKFGk6EMbT=r|97~OX77yftqpjn<*5S)w zYLEi^p@Eg~r6I__lJKQ&R-tw1c;b;pD+Sl${A2${bog4-=?P-7HCJd&I{w&XP3rKd z(TbV0RtBMQf$}^LJ#DHx$-+I5o dtNv#|;49gc9H5~PEObmn_y6er|NnXa|1b4R&B6cx delta 42 wcmZn(XbG6$F8U^hRb&g29E<<0s6daRqLNf)wgY_Me8%&rgy;w@(a04k6Tg8%>k diff --git a/gaseous-server/wwwroot/images/unknowngame.png b/gaseous-server/wwwroot/images/unknowngame.png index 78b85731e652aefa0b0920d2cec0198d32bb7e5d..4eddb0231e41f2e5b072e7889f415401ca01797f 100644 GIT binary patch literal 94626 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 Ef?U-T7ytkO literal 20351 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 diff --git a/gaseous-server/wwwroot/images/unknowngame.pxd b/gaseous-server/wwwroot/images/unknowngame.pxd new file mode 100644 index 0000000000000000000000000000000000000000..5dafd290f577c8803006ba051b6cde4fc9c0dbb0 GIT binary patch literal 228256 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

e{R^lR0Ybl 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 literal 0 HcmV?d00001 From fd7b3545714e69d6bc13088d6a025fa00a044b3f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 May 2024 23:32:38 +1000 Subject: [PATCH 8/8] chore(deps): bump Swashbuckle.AspNetCore from 6.5.0 to 6.6.1 (#360) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.5.0 to 6.6.1.

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=Swashbuckle.AspNetCore&package-manager=nuget&previous-version=6.5.0&new-version=6.6.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gaseous-server/gaseous-server.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gaseous-server/gaseous-server.csproj b/gaseous-server/gaseous-server.csproj index 4b1a6ac..dbf32fe 100644 --- a/gaseous-server/gaseous-server.csproj +++ b/gaseous-server/gaseous-server.csproj @@ -24,7 +24,7 @@ - +
Release notes

Sourced from Swashbuckle.AspNetCore's releases.

v6.6.1

What's Changed

... (truncated)