Add a list of available cores for each platform to the platform map (#130)

This commit is contained in:
Michael Green
2023-09-23 16:14:04 -07:00
committed by GitHub
parent fff22ea8d9
commit d94c921815
10 changed files with 1635 additions and 51 deletions

View File

@@ -156,7 +156,7 @@ namespace gaseous_server.Classes.Metadata
IGDBSlug = platform.Slug, IGDBSlug = platform.Slug,
AlternateNames = new List<string>{ platform.AlternativeName } AlternateNames = new List<string>{ platform.AlternativeName }
}; };
Models.PlatformMapping.WritePlatformMap(item, false); Models.PlatformMapping.WritePlatformMap(item, false, true);
} }
} }

View File

@@ -110,32 +110,32 @@ namespace gaseous_server.Controllers
return Ok(new { count = files.Count, size }); return Ok(new { count = files.Count, size });
} }
[HttpPost] // [HttpPost]
[Route("{PlatformId}")] // [Route("{PlatformId}")]
[ProducesResponseType(typeof(PlatformMapping.PlatformMapItem), StatusCodes.Status200OK)] // [ProducesResponseType(typeof(PlatformMapping.PlatformMapItem), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)] // [ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status409Conflict)] // [ProducesResponseType(StatusCodes.Status409Conflict)]
public ActionResult NewPlatformMap(long PlatformId, PlatformMapping.PlatformMapItem Map) // public ActionResult NewPlatformMap(long PlatformId, PlatformMapping.PlatformMapItem Map)
{ // {
try // try
{ // {
PlatformMapping.PlatformMapItem platformMapItem = PlatformMapping.GetPlatformMap(PlatformId); // PlatformMapping.PlatformMapItem platformMapItem = PlatformMapping.GetPlatformMap(PlatformId);
if (platformMapItem != null) // if (platformMapItem != null)
{ // {
return Conflict(); // return Conflict();
} // }
else // else
{ // {
PlatformMapping.WritePlatformMap(Map, false); // PlatformMapping.WritePlatformMap(Map, false, false);
return Ok(PlatformMapping.GetPlatformMap(PlatformId)); // return Ok(PlatformMapping.GetPlatformMap(PlatformId));
} // }
} // }
catch // catch
{ // {
return NotFound(); // return NotFound();
} // }
} // }
[HttpPatch] [HttpPatch]
[Route("{PlatformId}")] [Route("{PlatformId}")]
@@ -149,7 +149,7 @@ namespace gaseous_server.Controllers
if (platformMapItem != null) if (platformMapItem != null)
{ {
PlatformMapping.WritePlatformMap(Map, true); PlatformMapping.WritePlatformMap(Map, true, false);
return Ok(PlatformMapping.GetPlatformMap(PlatformId)); return Ok(PlatformMapping.GetPlatformMap(PlatformId));
} }
else else

View File

@@ -25,7 +25,10 @@ namespace gaseous_server.Models
{ {
string rawJson = reader.ReadToEnd(); string rawJson = reader.ReadToEnd();
List<PlatformMapItem> platforms = new List<PlatformMapItem>(); List<PlatformMapItem> platforms = new List<PlatformMapItem>();
platforms = Newtonsoft.Json.JsonConvert.DeserializeObject<List<PlatformMapItem>>(rawJson); Newtonsoft.Json.JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings{
MaxDepth = 64
};
platforms = Newtonsoft.Json.JsonConvert.DeserializeObject<List<PlatformMapItem>>(rawJson, jsonSerializerSettings);
foreach (PlatformMapItem mapItem in platforms) foreach (PlatformMapItem mapItem in platforms)
{ {
@@ -41,7 +44,7 @@ namespace gaseous_server.Models
} }
else else
{ {
WritePlatformMap(mapItem, true); WritePlatformMap(mapItem, true, true);
Logging.Log(Logging.LogType.Information, "Platform Map", "Overwriting " + mapItem.IGDBName + " with default values."); Logging.Log(Logging.LogType.Information, "Platform Map", "Overwriting " + mapItem.IGDBName + " with default values.");
} }
} }
@@ -49,7 +52,7 @@ namespace gaseous_server.Models
{ {
Logging.Log(Logging.LogType.Information, "Platform Map", "Importing " + mapItem.IGDBName + " from predefined data."); Logging.Log(Logging.LogType.Information, "Platform Map", "Importing " + mapItem.IGDBName + " from predefined data.");
// doesn't exist - add it // doesn't exist - add it
WritePlatformMap(mapItem, false); WritePlatformMap(mapItem, false, true);
} }
} }
} }
@@ -73,13 +76,13 @@ namespace gaseous_server.Models
// still here? we must have found the item we're looking for! overwrite it // still here? we must have found the item we're looking for! overwrite it
Logging.Log(Logging.LogType.Information, "Platform Map", "Replacing " + mapItem.IGDBName + " from external JSON file."); Logging.Log(Logging.LogType.Information, "Platform Map", "Replacing " + mapItem.IGDBName + " from external JSON file.");
WritePlatformMap(mapItem, true); WritePlatformMap(mapItem, true, true);
} }
catch catch
{ {
// we caught a not found error, insert a new record // we caught a not found error, insert a new record
Logging.Log(Logging.LogType.Information, "Platform Map", "Importing " + mapItem.IGDBName + " from external JSON file."); Logging.Log(Logging.LogType.Information, "Platform Map", "Importing " + mapItem.IGDBName + " from external JSON file.");
WritePlatformMap(mapItem, false); WritePlatformMap(mapItem, false, true);
} }
} }
} }
@@ -126,7 +129,7 @@ namespace gaseous_server.Models
} }
} }
public static void WritePlatformMap(PlatformMapItem item, bool Update) public static void WritePlatformMap(PlatformMapItem item, bool Update, bool AllowAvailableEmulatorOverwrite)
{ {
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
string sql = ""; string sql = "";
@@ -134,12 +137,19 @@ namespace gaseous_server.Models
if (Update == false) if (Update == false)
{ {
// insert // insert
sql = "INSERT INTO PlatformMap (Id, RetroPieDirectoryName, WebEmulator_Type, WebEmulator_Core) VALUES (@Id, @RetroPieDirectoryName, @WebEmulator_Type, @WebEmulator_Core)"; sql = "INSERT INTO PlatformMap (Id, RetroPieDirectoryName, WebEmulator_Type, WebEmulator_Core, AvailableWebEmulators) VALUES (@Id, @RetroPieDirectoryName, @WebEmulator_Type, @WebEmulator_Core, @AvailableWebEmulators)";
} }
else else
{ {
// update // update
sql = "UPDATE PlatformMap SET RetroPieDirectoryName=@RetroPieDirectoryName, WebEmulator_Type=@WebEmulator_Type, WebEmulator_Core=@WebEmulator_Core WHERE Id = @Id"; if (AllowAvailableEmulatorOverwrite == true)
{
sql = "UPDATE PlatformMap SET RetroPieDirectoryName=@RetroPieDirectoryName, WebEmulator_Type=@WebEmulator_Type, WebEmulator_Core=@WebEmulator_Core, AvailableWebEmulators=@AvailableWebEmulators WHERE Id = @Id";
}
else
{
sql = "UPDATE PlatformMap SET RetroPieDirectoryName=@RetroPieDirectoryName, WebEmulator_Type=@WebEmulator_Type, WebEmulator_Core=@WebEmulator_Core WHERE Id = @Id";
}
} }
dbDict.Add("Id", item.IGDBId); dbDict.Add("Id", item.IGDBId);
dbDict.Add("RetroPieDirectoryName", item.RetroPieDirectoryName); dbDict.Add("RetroPieDirectoryName", item.RetroPieDirectoryName);
@@ -147,11 +157,13 @@ namespace gaseous_server.Models
{ {
dbDict.Add("WebEmulator_Type", item.WebEmulator.Type); dbDict.Add("WebEmulator_Type", item.WebEmulator.Type);
dbDict.Add("WebEmulator_Core", item.WebEmulator.Core); dbDict.Add("WebEmulator_Core", item.WebEmulator.Core);
dbDict.Add("AvailableWebEmulators", Newtonsoft.Json.JsonConvert.SerializeObject(item.WebEmulator.AvailableWebEmulators));
} }
else else
{ {
dbDict.Add("WebEmulator_Type", ""); dbDict.Add("WebEmulator_Type", "");
dbDict.Add("WebEmulator_Core", ""); dbDict.Add("WebEmulator_Core", "");
dbDict.Add("AvailableWebEmulators", "");
} }
db.ExecuteCMD(sql, dbDict); db.ExecuteCMD(sql, dbDict);
@@ -304,7 +316,8 @@ namespace gaseous_server.Models
mapItem.RetroPieDirectoryName = (string)Common.ReturnValueIfNull(row["RetroPieDirectoryName"], ""); mapItem.RetroPieDirectoryName = (string)Common.ReturnValueIfNull(row["RetroPieDirectoryName"], "");
mapItem.WebEmulator = new PlatformMapItem.WebEmulatorItem{ mapItem.WebEmulator = new PlatformMapItem.WebEmulatorItem{
Type = (string)Common.ReturnValueIfNull(row["WebEmulator_Type"], ""), Type = (string)Common.ReturnValueIfNull(row["WebEmulator_Type"], ""),
Core = (string)Common.ReturnValueIfNull(row["WebEmulator_Core"], "") Core = (string)Common.ReturnValueIfNull(row["WebEmulator_Core"], ""),
AvailableWebEmulators = Newtonsoft.Json.JsonConvert.DeserializeObject<List<PlatformMapItem.WebEmulatorItem.AvailableWebEmulatorItem>>((string)Common.ReturnValueIfNull(row["AvailableWebEmulators"], "[]"))
}; };
mapItem.Bios = bioss; mapItem.Bios = bioss;
@@ -378,6 +391,21 @@ namespace gaseous_server.Models
{ {
public string Type { get; set; } public string Type { get; set; }
public string Core { get; set; } public string Core { get; set; }
public List<AvailableWebEmulatorItem> AvailableWebEmulators { get; set; } = new List<AvailableWebEmulatorItem>();
public class AvailableWebEmulatorItem
{
public string EmulatorType { get; set; }
public List<AvailableWebEmulatorCoreItem> AvailableWebEmulatorCores { get; set; } = new List<AvailableWebEmulatorCoreItem>();
public class AvailableWebEmulatorCoreItem
{
public string Core { get; set; }
public string? AlternateCoreName { get; set; } = "";
public bool Default { get; set; } = false;
}
}
} }
public List<EmulatorBiosItem> Bios { get; set; } public List<EmulatorBiosItem> Bios { get; set; }

View File

@@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Server.Kestrel.Core; using Microsoft.AspNetCore.Server.Kestrel.Core;
using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models;
Logging.WriteToDiskOnly = true;
Logging.Log(Logging.LogType.Information, "Startup", "Starting Gaseous Server " + Assembly.GetExecutingAssembly().GetName().Version); Logging.Log(Logging.LogType.Information, "Startup", "Starting Gaseous Server " + Assembly.GetExecutingAssembly().GetName().Version);
// set up db // set up db
@@ -188,5 +189,7 @@ ProcessQueue.QueueItems.Add(new ProcessQueue.QueueItem(
}) })
); );
Logging.WriteToDiskOnly = false;
// start the app // start the app
app.Run(); app.Run();

File diff suppressed because one or more lines are too long

View File

@@ -59,8 +59,7 @@
</td> </td>
<td> <td>
<select id="mapping_edit_webemulatorengine" style="width: 100%;"> <select id="mapping_edit_webemulatorengine" style="width: 100%;">
<option value="">-</option>
<option value="EmulatorJS">EmulatorJS</option>
</select> </select>
</td> </td>
</tr> </tr>
@@ -68,8 +67,10 @@
<td style="width: 25%;"> <td style="width: 25%;">
<h4>Core</h4> <h4>Core</h4>
</td> </td>
<td style="text-align: right;"> <td>
<input id="mapping_edit_webemulatorcore" type="text" style="width: 98%;"/> <select id="mapping_edit_webemulatorcore" style="width: 100%;">
</select>
</td> </td>
</tr> </tr>
<tr name="mapping_edit_webemulator"> <tr name="mapping_edit_webemulator">
@@ -99,6 +100,10 @@
modalContent[0].classList.add('collections_modal'); modalContent[0].classList.add('collections_modal');
} }
var availableWebEmulators = [];
DisplayWebEmulatorContent(false);
ajaxCall( ajaxCall(
'/api/v1/PlatformMaps/' + modalVariables, '/api/v1/PlatformMaps/' + modalVariables,
'GET', 'GET',
@@ -133,18 +138,47 @@
document.getElementById('mapping_edit_igdbslug').value = result.igdbSlug; document.getElementById('mapping_edit_igdbslug').value = result.igdbSlug;
document.getElementById('mapping_edit_retropie').value = result.retroPieDirectoryName; document.getElementById('mapping_edit_retropie').value = result.retroPieDirectoryName;
// set up web emulator drop downs
$('#mapping_edit_webemulatorengine').select2(); $('#mapping_edit_webemulatorengine').select2();
if (result.webEmulator.type.length > 0) { $('#mapping_edit_webemulatorcore').select2();
document.getElementById('mapping_edit_enablewebemulator').checked = true;
$('#mapping_edit_webemulatorengine').val(result.webEmulator.type);
DisplayWebEmulatorHelp(result.webEmulator.type);
$('#mapping_edit_webemulatorengine').trigger('change');
document.getElementById('mapping_edit_webemulatorcore').value = result.webEmulator.core;
DisplayWebEmulatorContent(true); // start populating drop downs
if (result.webEmulator) {
if (result.webEmulator.availableWebEmulators.length > 0) {
availableWebEmulators = result.webEmulator.availableWebEmulators;
var offOption = new Option("-", "", false, false);
$('#mapping_edit_webemulatorengine').append(offOption).trigger('change');
for (var e = 0; e < result.webEmulator.availableWebEmulators.length; e++) {
var newOption = new Option(result.webEmulator.availableWebEmulators[e].emulatorType, result.webEmulator.availableWebEmulators[e].emulatorType, false, false);
$('#mapping_edit_webemulatorengine').append(newOption).trigger('change');
}
$('#mapping_edit_webemulatorengine').val(result.webEmulator.type);
$('#mapping_edit_webemulatorengine').trigger('change');
// select cores
RenderWebEmulatorCores(result.webEmulator.core);
if (result.webEmulator.type.length > 0) {
document.getElementById('mapping_edit_enablewebemulator').checked = true;
}
DisplayWebEmulatorHelp(result.webEmulator.type);
$('#mapping_edit_webemulatorengine').on('change', function(e) {
RenderWebEmulatorCores();
});
if (result.webEmulator.type.length > 0) {
DisplayWebEmulatorContent(true);
} else {
DisplayWebEmulatorContent(false);
}
} else {
// no emulators available
DisplayWebEmulatorContent(false);
}
} else { } else {
document.getElementById('mapping_edit_enablewebemulator').checked = false; // no emulators available
DisplayWebEmulatorContent(false); DisplayWebEmulatorContent(false);
} }
@@ -173,6 +207,55 @@
} }
); );
function RenderWebEmulatorCores(preSelectCore) {
var selectedEngine = document.getElementById('mapping_edit_webemulatorengine').value;
console.log("Engine: " + selectedEngine);
console.log("Preselect: " + preSelectCore);
console.log(JSON.stringify(availableWebEmulators));
$('#mapping_edit_webemulatorcore').empty().trigger("change");
// get cores for currently selected emulator
if (availableWebEmulators && (selectedEngine != undefined && selectedEngine != "")) {
if (availableWebEmulators.length > 0) {
var emuFound = false;
for (var e = 0; e < availableWebEmulators.length; e++) {
if (availableWebEmulators[e].emulatorType == selectedEngine) {
emuFound = true;
for (var c = 0; c < availableWebEmulators[e].availableWebEmulatorCores.length; c++) {
var coreName = availableWebEmulators[e].availableWebEmulatorCores[c].core;
if (availableWebEmulators[e].availableWebEmulatorCores[c].alternateCoreName) {
coreName += " (Maps to core: " + availableWebEmulators[e].availableWebEmulatorCores[c].alternateCoreName + ")";
}
if (availableWebEmulators[e].availableWebEmulatorCores[c].default == true) {
coreName += " (Default)";
}
console.log(coreName);
var newOption;
if (availableWebEmulators[e].availableWebEmulatorCores[c].core == preSelectCore) {
newOption = new Option(coreName, availableWebEmulators[e].availableWebEmulatorCores[c].core, true, true);
} else {
newOption = new Option(coreName, availableWebEmulators[e].availableWebEmulatorCores[c].core, false, false);
}
$('#mapping_edit_webemulatorcore').append(newOption).trigger('change');
}
}
}
if (emuFound == false) {
var newOption = new Option("-", "", true, true);
$('#mapping_edit_webemulatorcore').append(newOption).trigger('change');
}
} else {
var newOption = new Option("-", "", true, true);
$('#mapping_edit_webemulatorcore').append(newOption).trigger('change');
}
} else {
var newOption = new Option("-", "", true, true);
$('#mapping_edit_webemulatorcore').append(newOption).trigger('change');
}
}
function AddTokensFromList(selectObj, tagList) { function AddTokensFromList(selectObj, tagList) {
for (var i = 0; i < tagList.length; i++) { for (var i = 0; i < tagList.length; i++) {
var data = { var data = {
@@ -291,6 +374,7 @@
}); });
function DisplayWebEmulatorContent(showContent) { function DisplayWebEmulatorContent(showContent) {
console.log(showContent);
var webEmulatorRows = document.getElementsByName('mapping_edit_webemulator'); var webEmulatorRows = document.getElementsByName('mapping_edit_webemulator');
for (var i = 0; i < webEmulatorRows.length; i++) { for (var i = 0; i < webEmulatorRows.length; i++) {

View File

@@ -375,7 +375,11 @@
var launchButton = ''; var launchButton = '';
if (result[i].emulator) { if (result[i].emulator) {
launchButton = '<a href="/index.html?page=emulator&engine=' + result[i].emulator.type + '&core=' + result[i].emulator.core + '&platformid=' + result[i].platform.id + '&gameid=' + gameId + '&rompath=' + encodeURIComponent('/api/v1/Games/' + gameId + '/roms/' + result[i].id + '/' + encodeURIComponent(result[i].name)) + '" class="romstart">Launch</a>'; if (result[i].emulator.type) {
if (result[i].emulator.type.length > 0) {
launchButton = '<a href="/index.html?page=emulator&engine=' + result[i].emulator.type + '&core=' + result[i].emulator.core + '&platformid=' + result[i].platform.id + '&gameid=' + gameId + '&rompath=' + encodeURIComponent('/api/v1/Games/' + gameId + '/roms/' + result[i].id + '/' + encodeURIComponent(result[i].name)) + '" class="romstart">Launch</a>';
}
}
} }
var newRow = [ var newRow = [

View File

@@ -0,0 +1,2 @@
ALTER TABLE `PlatformMap`
ADD COLUMN `AvailableWebEmulators` JSON NULL;

View File

@@ -8,6 +8,8 @@ namespace gaseous_tools
{ {
public class Logging public class Logging
{ {
public static bool WriteToDiskOnly { get; set; } = false;
static public void Log(LogType EventType, string ServerProcess, string Message, Exception? ExceptionValue = null, bool LogToDiskOnly = false) static public void Log(LogType EventType, string ServerProcess, string Message, Exception? ExceptionValue = null, bool LogToDiskOnly = false)
{ {
LogItem logItem = new LogItem LogItem logItem = new LogItem
@@ -61,6 +63,11 @@ namespace gaseous_tools
Console.WriteLine(TraceOutput); Console.WriteLine(TraceOutput);
Console.ResetColor(); Console.ResetColor();
if (WriteToDiskOnly == true)
{
LogToDiskOnly = true;
}
if (LogToDiskOnly == false) if (LogToDiskOnly == false)
{ {
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);

View File

@@ -18,6 +18,7 @@
<None Remove="Database\MySQL\gaseous-1000.sql" /> <None Remove="Database\MySQL\gaseous-1000.sql" />
<None Remove="Database\MySQL\gaseous-1001.sql" /> <None Remove="Database\MySQL\gaseous-1001.sql" />
<None Remove="Database\MySQL\gaseous-1002.sql" /> <None Remove="Database\MySQL\gaseous-1002.sql" />
<None Remove="Database\MySQL\gaseous-1003.sql" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="Database\" /> <Folder Include="Database\" />
@@ -27,5 +28,6 @@
<EmbeddedResource Include="Database\MySQL\gaseous-1000.sql" /> <EmbeddedResource Include="Database\MySQL\gaseous-1000.sql" />
<EmbeddedResource Include="Database\MySQL\gaseous-1001.sql" /> <EmbeddedResource Include="Database\MySQL\gaseous-1001.sql" />
<EmbeddedResource Include="Database\MySQL\gaseous-1002.sql" /> <EmbeddedResource Include="Database\MySQL\gaseous-1002.sql" />
<EmbeddedResource Include="Database\MySQL\gaseous-1003.sql" />
</ItemGroup> </ItemGroup>
</Project> </Project>