Add a list of available cores for each platform to the platform map (#130)
This commit is contained in:
@@ -156,7 +156,7 @@ namespace gaseous_server.Classes.Metadata
|
||||
IGDBSlug = platform.Slug,
|
||||
AlternateNames = new List<string>{ platform.AlternativeName }
|
||||
};
|
||||
Models.PlatformMapping.WritePlatformMap(item, false);
|
||||
Models.PlatformMapping.WritePlatformMap(item, false, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -110,32 +110,32 @@ namespace gaseous_server.Controllers
|
||||
return Ok(new { count = files.Count, size });
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[Route("{PlatformId}")]
|
||||
[ProducesResponseType(typeof(PlatformMapping.PlatformMapItem), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ProducesResponseType(StatusCodes.Status409Conflict)]
|
||||
public ActionResult NewPlatformMap(long PlatformId, PlatformMapping.PlatformMapItem Map)
|
||||
{
|
||||
try
|
||||
{
|
||||
PlatformMapping.PlatformMapItem platformMapItem = PlatformMapping.GetPlatformMap(PlatformId);
|
||||
// [HttpPost]
|
||||
// [Route("{PlatformId}")]
|
||||
// [ProducesResponseType(typeof(PlatformMapping.PlatformMapItem), StatusCodes.Status200OK)]
|
||||
// [ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
// [ProducesResponseType(StatusCodes.Status409Conflict)]
|
||||
// public ActionResult NewPlatformMap(long PlatformId, PlatformMapping.PlatformMapItem Map)
|
||||
// {
|
||||
// try
|
||||
// {
|
||||
// PlatformMapping.PlatformMapItem platformMapItem = PlatformMapping.GetPlatformMap(PlatformId);
|
||||
|
||||
if (platformMapItem != null)
|
||||
{
|
||||
return Conflict();
|
||||
}
|
||||
else
|
||||
{
|
||||
PlatformMapping.WritePlatformMap(Map, false);
|
||||
return Ok(PlatformMapping.GetPlatformMap(PlatformId));
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
// if (platformMapItem != null)
|
||||
// {
|
||||
// return Conflict();
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// PlatformMapping.WritePlatformMap(Map, false, false);
|
||||
// return Ok(PlatformMapping.GetPlatformMap(PlatformId));
|
||||
// }
|
||||
// }
|
||||
// catch
|
||||
// {
|
||||
// return NotFound();
|
||||
// }
|
||||
// }
|
||||
|
||||
[HttpPatch]
|
||||
[Route("{PlatformId}")]
|
||||
@@ -149,7 +149,7 @@ namespace gaseous_server.Controllers
|
||||
|
||||
if (platformMapItem != null)
|
||||
{
|
||||
PlatformMapping.WritePlatformMap(Map, true);
|
||||
PlatformMapping.WritePlatformMap(Map, true, false);
|
||||
return Ok(PlatformMapping.GetPlatformMap(PlatformId));
|
||||
}
|
||||
else
|
||||
|
@@ -25,7 +25,10 @@ namespace gaseous_server.Models
|
||||
{
|
||||
string rawJson = reader.ReadToEnd();
|
||||
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)
|
||||
{
|
||||
@@ -41,7 +44,7 @@ namespace gaseous_server.Models
|
||||
}
|
||||
else
|
||||
{
|
||||
WritePlatformMap(mapItem, true);
|
||||
WritePlatformMap(mapItem, true, true);
|
||||
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.");
|
||||
// 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
|
||||
Logging.Log(Logging.LogType.Information, "Platform Map", "Replacing " + mapItem.IGDBName + " from external JSON file.");
|
||||
WritePlatformMap(mapItem, true);
|
||||
WritePlatformMap(mapItem, true, true);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// we caught a not found error, insert a new record
|
||||
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);
|
||||
string sql = "";
|
||||
@@ -134,12 +137,19 @@ namespace gaseous_server.Models
|
||||
if (Update == false)
|
||||
{
|
||||
// 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
|
||||
{
|
||||
// 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("RetroPieDirectoryName", item.RetroPieDirectoryName);
|
||||
@@ -147,11 +157,13 @@ namespace gaseous_server.Models
|
||||
{
|
||||
dbDict.Add("WebEmulator_Type", item.WebEmulator.Type);
|
||||
dbDict.Add("WebEmulator_Core", item.WebEmulator.Core);
|
||||
dbDict.Add("AvailableWebEmulators", Newtonsoft.Json.JsonConvert.SerializeObject(item.WebEmulator.AvailableWebEmulators));
|
||||
}
|
||||
else
|
||||
{
|
||||
dbDict.Add("WebEmulator_Type", "");
|
||||
dbDict.Add("WebEmulator_Core", "");
|
||||
dbDict.Add("AvailableWebEmulators", "");
|
||||
}
|
||||
db.ExecuteCMD(sql, dbDict);
|
||||
|
||||
@@ -304,7 +316,8 @@ namespace gaseous_server.Models
|
||||
mapItem.RetroPieDirectoryName = (string)Common.ReturnValueIfNull(row["RetroPieDirectoryName"], "");
|
||||
mapItem.WebEmulator = new PlatformMapItem.WebEmulatorItem{
|
||||
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;
|
||||
|
||||
@@ -378,6 +391,21 @@ namespace gaseous_server.Models
|
||||
{
|
||||
public string Type { 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; }
|
||||
|
@@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Server.Kestrel.Core;
|
||||
using Microsoft.OpenApi.Models;
|
||||
|
||||
Logging.WriteToDiskOnly = true;
|
||||
Logging.Log(Logging.LogType.Information, "Startup", "Starting Gaseous Server " + Assembly.GetExecutingAssembly().GetName().Version);
|
||||
|
||||
// set up db
|
||||
@@ -188,5 +189,7 @@ ProcessQueue.QueueItems.Add(new ProcessQueue.QueueItem(
|
||||
})
|
||||
);
|
||||
|
||||
Logging.WriteToDiskOnly = false;
|
||||
|
||||
// start the app
|
||||
app.Run();
|
||||
|
File diff suppressed because one or more lines are too long
@@ -59,8 +59,7 @@
|
||||
</td>
|
||||
<td>
|
||||
<select id="mapping_edit_webemulatorengine" style="width: 100%;">
|
||||
<option value="">-</option>
|
||||
<option value="EmulatorJS">EmulatorJS</option>
|
||||
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -68,8 +67,10 @@
|
||||
<td style="width: 25%;">
|
||||
<h4>Core</h4>
|
||||
</td>
|
||||
<td style="text-align: right;">
|
||||
<input id="mapping_edit_webemulatorcore" type="text" style="width: 98%;"/>
|
||||
<td>
|
||||
<select id="mapping_edit_webemulatorcore" style="width: 100%;">
|
||||
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr name="mapping_edit_webemulator">
|
||||
@@ -99,6 +100,10 @@
|
||||
modalContent[0].classList.add('collections_modal');
|
||||
}
|
||||
|
||||
var availableWebEmulators = [];
|
||||
|
||||
DisplayWebEmulatorContent(false);
|
||||
|
||||
ajaxCall(
|
||||
'/api/v1/PlatformMaps/' + modalVariables,
|
||||
'GET',
|
||||
@@ -133,18 +138,47 @@
|
||||
document.getElementById('mapping_edit_igdbslug').value = result.igdbSlug;
|
||||
document.getElementById('mapping_edit_retropie').value = result.retroPieDirectoryName;
|
||||
|
||||
// set up web emulator drop downs
|
||||
$('#mapping_edit_webemulatorengine').select2();
|
||||
if (result.webEmulator.type.length > 0) {
|
||||
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;
|
||||
$('#mapping_edit_webemulatorcore').select2();
|
||||
|
||||
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 {
|
||||
document.getElementById('mapping_edit_enablewebemulator').checked = false;
|
||||
|
||||
// no emulators available
|
||||
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) {
|
||||
for (var i = 0; i < tagList.length; i++) {
|
||||
var data = {
|
||||
@@ -291,6 +374,7 @@
|
||||
});
|
||||
|
||||
function DisplayWebEmulatorContent(showContent) {
|
||||
console.log(showContent);
|
||||
var webEmulatorRows = document.getElementsByName('mapping_edit_webemulator');
|
||||
|
||||
for (var i = 0; i < webEmulatorRows.length; i++) {
|
||||
|
@@ -375,7 +375,11 @@
|
||||
|
||||
var launchButton = '';
|
||||
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 = [
|
||||
|
2
gaseous-tools/Database/MySQL/gaseous-1003.sql
Normal file
2
gaseous-tools/Database/MySQL/gaseous-1003.sql
Normal file
@@ -0,0 +1,2 @@
|
||||
ALTER TABLE `PlatformMap`
|
||||
ADD COLUMN `AvailableWebEmulators` JSON NULL;
|
@@ -8,6 +8,8 @@ namespace gaseous_tools
|
||||
{
|
||||
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)
|
||||
{
|
||||
LogItem logItem = new LogItem
|
||||
@@ -61,6 +63,11 @@ namespace gaseous_tools
|
||||
Console.WriteLine(TraceOutput);
|
||||
Console.ResetColor();
|
||||
|
||||
if (WriteToDiskOnly == true)
|
||||
{
|
||||
LogToDiskOnly = true;
|
||||
}
|
||||
|
||||
if (LogToDiskOnly == false)
|
||||
{
|
||||
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
|
@@ -18,6 +18,7 @@
|
||||
<None Remove="Database\MySQL\gaseous-1000.sql" />
|
||||
<None Remove="Database\MySQL\gaseous-1001.sql" />
|
||||
<None Remove="Database\MySQL\gaseous-1002.sql" />
|
||||
<None Remove="Database\MySQL\gaseous-1003.sql" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="Database\" />
|
||||
@@ -27,5 +28,6 @@
|
||||
<EmbeddedResource Include="Database\MySQL\gaseous-1000.sql" />
|
||||
<EmbeddedResource Include="Database\MySQL\gaseous-1001.sql" />
|
||||
<EmbeddedResource Include="Database\MySQL\gaseous-1002.sql" />
|
||||
<EmbeddedResource Include="Database\MySQL\gaseous-1003.sql" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
Reference in New Issue
Block a user