1
0
mirror of synced 2024-11-28 00:20:53 +01:00

Use base controller for logger service

Add shared project
This commit is contained in:
asesidaa 2022-09-04 18:14:41 +08:00
parent a5b8bb10ff
commit 94e3d03762
39 changed files with 286 additions and 358 deletions

14
Shared/Shared.projitems Normal file
View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
<HasSharedItems>true</HasSharedItems>
<SharedGUID>29FAECCD-4C19-44F3-963F-6535BE962E2E</SharedGUID>
</PropertyGroup>
<PropertyGroup Label="Configuration">
<Import_RootNamespace>Shared</Import_RootNamespace>
</PropertyGroup>
<ItemGroup>
<Folder Include="$(MSBuildThisFileDirectory)Models" />
</ItemGroup>
</Project>

11
Shared/Shared.shproj Normal file
View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Globals">
<ProjectGuid>{739247D2-9B9B-45DE-A97F-216E0D97930C}</ProjectGuid>
</PropertyGroup>
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.Common.Default.props" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.Common.props" />
<Import Project="Shared.projitems" Label="Shared" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.CSharp.targets" />
</Project>

View File

@ -5,6 +5,8 @@ VisualStudioVersion = 17.0.32112.339
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TaikoLocalServer", "TaikoLocalServer\TaikoLocalServer.csproj", "{98FDA12C-CD3C-42D0-BEBE-4E809E6E41AC}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TaikoLocalServer", "TaikoLocalServer\TaikoLocalServer.csproj", "{98FDA12C-CD3C-42D0-BEBE-4E809E6E41AC}"
EndProject EndProject
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Shared", "Shared\Shared.shproj", "{739247D2-9B9B-45DE-A97F-216E0D97930C}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU

View File

@ -2,15 +2,19 @@
namespace TaikoLocalServer.Common.Utils; namespace TaikoLocalServer.Common.Utils;
using DanScoreDataStage = GetDanScoreResponse.DanScoreData.DanScoreDataStage;
public static class ObjectMappers public static class ObjectMappers
{ {
public static readonly IObjectMap<DanStageScoreDatum, GetDanScoreResponse.DanScoreData.DanScoreDataStage> DanStageDataMap; public static readonly IObjectMap<DanStageScoreDatum, DanScoreDataStage> DanStageDbToResponseMap;
public static readonly IObjectMap<DanScoreDataStage, DanStageScoreDatum> DanStageResponseToDbMap;
static ObjectMappers() static ObjectMappers()
{ {
var mapper = new ObjectMapper(); var mapper = new ObjectMapper();
DanStageDataMap = mapper.AddMap<DanStageScoreDatum, GetDanScoreResponse.DanScoreData.DanScoreDataStage>() DanStageDbToResponseMap = mapper.AddMap<DanStageScoreDatum, DanScoreDataStage>()
.Add(t => t.ComboCnt, s => s.ComboCount) .Add(t => t.ComboCnt, s => s.ComboCount)
.Add(t => t.GoodCnt, s => s.GoodCount) .Add(t => t.GoodCnt, s => s.GoodCount)
.Add(t => t.OkCnt, s => s.OkCount) .Add(t => t.OkCnt, s => s.OkCount)
@ -19,5 +23,15 @@ public static class ObjectMappers
.Add(t => t.PoundCnt, s => s.DrumrollCount) .Add(t => t.PoundCnt, s => s.DrumrollCount)
.Add(t => t.PlayScore, s => s.PlayScore) .Add(t => t.PlayScore, s => s.PlayScore)
.Add(t => t.HighScore, s => s.HighScore); .Add(t => t.HighScore, s => s.HighScore);
DanStageResponseToDbMap = mapper.AddMap<DanScoreDataStage, DanStageScoreDatum>()
.Add(t => t.ComboCount, s => s.ComboCnt)
.Add(t => t.GoodCount, s => s.GoodCnt)
.Add(t => t.OkCount, s => s.OkCnt)
.Add(t => t.BadCount, s => s.NgCnt)
.Add(t => t.TotalHitCount, s => s.HitCnt)
.Add(t => t.DrumrollCount, s => s.PoundCnt)
.Add(t => t.PlayScore, s => s.PlayScore)
.Add(t => t.HighScore, s => s.HighScore);
} }
} }

View File

@ -1,27 +1,21 @@
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.AmAuth;
[ApiController] [ApiController]
[Route("/sys/servlet/PowerOn")] [Route("/sys/servlet/PowerOn")]
public class PowerOnController : ControllerBase public class PowerOnController : BaseController<PowerOnController>
{ {
private const string HostStartup = "vsapi.taiko-p.jp"; private const string HOST_STARTUP = "vsapi.taiko-p.jp";
private readonly ILogger<PowerOnController> logger;
public PowerOnController(ILogger<PowerOnController> logger) {
this.logger = logger;
}
[HttpPost] [HttpPost]
public ContentResult PowerOn([FromForm] PowerOnRequest request) public ContentResult PowerOn([FromForm] PowerOnRequest request)
{ {
logger.LogInformation("Power on request: {Request}",request.Stringify()); Logger.LogInformation("Power on request: {Request}",request.Stringify());
var now = DateTime.Now; var now = DateTime.Now;
var response = new Dictionary<string, string> var response = new Dictionary<string, string>
{ {
{"stat", "1"}, {"stat", "1"},
{"uri", HostStartup}, {"uri", HOST_STARTUP},
{"host", HostStartup}, {"host", HOST_STARTUP},
{"place_id", "JPN0123"}, {"place_id", "JPN0123"},
{"name", "NAMCO"}, {"name", "NAMCO"},
{"nickname", "NAMCO"}, {"nickname", "NAMCO"},

View File

@ -1,18 +1,14 @@
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.AmUpdater;
public class MuchaController : ControllerBase public class MuchaController : BaseController<MuchaController>
{ {
private const string UrlBase = "https://v402-front.mucha-prd.nbgi-amnet.jp:10122"; private const string URL_BASE = "https://v402-front.mucha-prd.nbgi-amnet.jp:10122";
private readonly ILogger<MuchaController> logger;
public MuchaController(ILogger<MuchaController> logger) {
this.logger = logger;
}
[HttpPost("/mucha_front/boardauth.do")] [HttpPost("/mucha_front/boardauth.do")]
public ContentResult BoardAuth([FromForm] MuchaUpdateCheckRequest request) public ContentResult BoardAuth([FromForm] MuchaUpdateCheckRequest request)
{ {
logger.LogInformation("Mucha request: {Request}", request.Stringify()); Logger.LogInformation("Mucha request: {Request}", request.Stringify());
var serverTime = DateTime.Now.ToString("yyyyMMddHHmm"); var serverTime = DateTime.Now.ToString("yyyyMMddHHmm");
var utcServerTime = DateTime.UtcNow.ToString("yyyyMMddHHmm"); var utcServerTime = DateTime.UtcNow.ToString("yyyyMMddHHmm");
var response = new Dictionary<string, string> var response = new Dictionary<string, string>
@ -35,12 +31,12 @@ public class MuchaController : ControllerBase
{ "AREA_FULL_3", "" }, { "AREA_FULL_3", "" },
{ "AREA_FULL_3_EN", "" }, { "AREA_FULL_3_EN", "" },
{ "AUTH_INTERVAL", "86400" }, { "AUTH_INTERVAL", "86400" },
{ "CHARGE_URL", $"{UrlBase}/charge/" }, { "CHARGE_URL", $"{URL_BASE}/charge/" },
{ "CONSUME_TOKEN", "0" }, { "CONSUME_TOKEN", "0" },
{ "COUNTRY_CD", "JPN" }, { "COUNTRY_CD", "JPN" },
{ "DONGLE_FLG", "1" }, { "DONGLE_FLG", "1" },
{ "EXPIRATION_DATE", "null" }, { "EXPIRATION_DATE", "null" },
{ "FILE_URL", $"{UrlBase}/file/" }, { "FILE_URL", $"{URL_BASE}/file/" },
{ "FORCE_BOOT", "0" }, { "FORCE_BOOT", "0" },
{ "PLACE_ID", request.PlaceId ?? "" }, { "PLACE_ID", request.PlaceId ?? "" },
{ "PREFECTURE_ID", "14" }, { "PREFECTURE_ID", "14" },
@ -50,9 +46,9 @@ public class MuchaController : ControllerBase
{ "SHOP_NAME_EN", "NAMCO" }, { "SHOP_NAME_EN", "NAMCO" },
{ "SHOP_NICKNAME", "W" }, { "SHOP_NICKNAME", "W" },
{ "SHOP_NICKNAME_EN", "W" }, { "SHOP_NICKNAME_EN", "W" },
{ "URL_1", $"{UrlBase}/url1/" }, { "URL_1", $"{URL_BASE}/url1/" },
{ "URL_2", $"{UrlBase}/url2/" }, { "URL_2", $"{URL_BASE}/url2/" },
{ "URL_3", $"{UrlBase}/url3/" }, { "URL_3", $"{URL_BASE}/url3/" },
{ "USE_TOKEN", "0" } { "USE_TOKEN", "0" }
}; };
var formOutput = FormOutputUtil.ToFormOutput(response); var formOutput = FormOutputUtil.ToFormOutput(response);
@ -62,15 +58,15 @@ public class MuchaController : ControllerBase
[HttpPost("/mucha_front/updatacheck.do")] [HttpPost("/mucha_front/updatacheck.do")]
public ContentResult UpdateCheck(MuchaBoardAuthRequest request) public ContentResult UpdateCheck(MuchaBoardAuthRequest request)
{ {
logger.LogInformation("Request is {Request}", request.Stringify()); Logger.LogInformation("Request is {Request}", request.Stringify());
var response = new Dictionary<string, string> var response = new Dictionary<string, string>
{ {
{ "RESULTS", "001" }, { "RESULTS", "001" },
{ "UPDATE_VER_1", request.GameVersion ?? "S1210JPN08.18" }, { "UPDATE_VER_1", request.GameVersion ?? "S1210JPN08.18" },
{ "UPDATE_URL_1", $"{UrlBase}/updUrl1/" }, { "UPDATE_URL_1", $"{URL_BASE}/updUrl1/" },
{ "UPDATE_SIZE_1", "0" }, { "UPDATE_SIZE_1", "0" },
{ "UPDATE_CRC_1", "0000000000000000" }, { "UPDATE_CRC_1", "0000000000000000" },
{ "CHECK_URL_1", $"{UrlBase}/checkUrl/" }, { "CHECK_URL_1", $"{URL_BASE}/checkUrl/" },
{ "EXE_VER_1", request.GameVersion ?? "S1210JPN08.18" }, { "EXE_VER_1", request.GameVersion ?? "S1210JPN08.18" },
{ "INFO_SIZE_1", "0" }, { "INFO_SIZE_1", "0" },
{ "COM_SIZE_1", "0" }, { "COM_SIZE_1", "0" },

View File

@ -0,0 +1,8 @@
namespace TaikoLocalServer.Controllers.Api;
[ApiController]
[Route("/api/[controller]")]
public class DashboardController : BaseController<DashboardController>
{
}

View File

@ -0,0 +1,8 @@
namespace TaikoLocalServer.Controllers;
public abstract class BaseController<T> : ControllerBase where T : BaseController<T>
{
private ILogger<T>? logger;
protected ILogger<T> Logger => (logger ??= HttpContext.RequestServices.GetService<ILogger<T>>()) ?? throw new InvalidOperationException();
}

View File

@ -1,19 +1,14 @@
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[Route("/v12r03/chassis/addtokencount.php")] [Route("/v12r03/chassis/addtokencount.php")]
[ApiController] [ApiController]
public class AddTokenCountController : ControllerBase public class AddTokenCountController : BaseController<AddTokenCountController>
{ {
private readonly ILogger<AddTokenCountController> logger;
public AddTokenCountController(ILogger<AddTokenCountController> logger) {
this.logger = logger;
}
[HttpPost] [HttpPost]
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult AddTokenCount([FromBody] AddTokenCountRequest request) public IActionResult AddTokenCount([FromBody] AddTokenCountRequest request)
{ {
logger.LogInformation("AddTokenCount request : {Request}", request.Stringify()); Logger.LogInformation("AddTokenCount request : {Request}", request.Stringify());
var response = new AddTokenCountResponse var response = new AddTokenCountResponse
{ {

View File

@ -1,18 +1,15 @@
using System.Text.Json; using System.Text.Json;
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[ApiController] [ApiController]
[Route("/v12r03/chassis/baidcheck.php")] [Route("/v12r03/chassis/baidcheck.php")]
public class BaidController:ControllerBase public class BaidController : BaseController<BaidController>
{ {
private readonly ILogger<BaidController> logger;
private readonly TaikoDbContext context; private readonly TaikoDbContext context;
public BaidController(ILogger<BaidController> logger, TaikoDbContext context) public BaidController(TaikoDbContext context)
{ {
this.logger = logger;
this.context = context; this.context = context;
} }
@ -21,11 +18,11 @@ public class BaidController:ControllerBase
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult GetBaid([FromBody] BAIDRequest request) public IActionResult GetBaid([FromBody] BAIDRequest request)
{ {
logger.LogInformation("Baid request: {Request}", request.Stringify()); Logger.LogInformation("Baid request: {Request}", request.Stringify());
BAIDResponse response; BAIDResponse response;
if (!context.Cards.Any(card => card.AccessCode == request.AccessCode)) if (!context.Cards.Any(card => card.AccessCode == request.AccessCode))
{ {
logger.LogInformation("New user from access code {AccessCode}", request.AccessCode); Logger.LogInformation("New user from access code {AccessCode}", request.AccessCode);
var newId = context.Cards.Any() ? context.Cards.Max(card => card.Baid) + 1 : 1; var newId = context.Cards.Any() ? context.Cards.Max(card => card.Baid) + 1 : 1;
response = new BAIDResponse response = new BAIDResponse
@ -94,11 +91,11 @@ public class BaidController:ControllerBase
} }
catch (JsonException e) catch (JsonException e)
{ {
logger.LogError(e, "Parsing costume json data failed"); Logger.LogError(e, "Parsing costume json data failed");
} }
if (costumeData == null || costumeData.Count < 5) if (costumeData == null || costumeData.Count < 5)
{ {
logger.LogWarning("Costume data is null or count less than 5!"); Logger.LogWarning("Costume data is null or count less than 5!");
costumeData = new List<uint> { 0, 0, 0, 0, 0 }; costumeData = new List<uint> { 0, 0, 0, 0, 0 };
} }
@ -114,7 +111,7 @@ public class BaidController:ControllerBase
.DefaultIfEmpty() .DefaultIfEmpty()
.Max(); .Max();
var gotDanFlagArray = FlagCalculator.ComputeGotDanFlags(danData); var gotDanFlagArray = FlagCalculator.ComputeGotDanFlags(danData);
logger.LogInformation("Got dan array {Array}", gotDanFlagArray.Stringify()); Logger.LogInformation("Got dan array {Array}", gotDanFlagArray.Stringify());
response = new BAIDResponse response = new BAIDResponse
{ {

View File

@ -1,19 +1,14 @@
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[ApiController] [ApiController]
[Route("/v12r03/chassis/bookkeeping.php")] [Route("/v12r03/chassis/bookkeeping.php")]
public class BookkeepingController : ControllerBase public class BookkeepingController : BaseController<BookkeepingController>
{ {
private readonly ILogger<BookkeepingController> logger;
public BookkeepingController(ILogger<BookkeepingController> logger) {
this.logger = logger;
}
[HttpPost] [HttpPost]
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult StartupAuth([FromBody] BookKeepingRequest request) public IActionResult StartupAuth([FromBody] BookKeepingRequest request)
{ {
logger.LogInformation("Bookkeeping request: {Request}", request.Stringify()); Logger.LogInformation("Bookkeeping request: {Request}", request.Stringify());
var response = new BookKeepingResponse var response = new BookKeepingResponse
{ {
Result = 1 Result = 1

View File

@ -1,19 +1,14 @@
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[Route("/v12r03/chassis/challengecompe.php")] [Route("/v12r03/chassis/challengecompe.php")]
[ApiController] [ApiController]
public class ChallengeCompetitionController : ControllerBase public class ChallengeCompetitionController : BaseController<ChallengeCompetitionController>
{ {
private readonly ILogger<ChallengeCompetitionController> logger;
public ChallengeCompetitionController(ILogger<ChallengeCompetitionController> logger) {
this.logger = logger;
}
[HttpPost] [HttpPost]
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult HandleChallenge([FromBody] ChallengeCompeRequest request) public IActionResult HandleChallenge([FromBody] ChallengeCompeRequest request)
{ {
logger.LogInformation("ChallengeCompe request : {Request}", request.Stringify()); Logger.LogInformation("ChallengeCompe request : {Request}", request.Stringify());
var response = new ChallengeCompeResponse var response = new ChallengeCompeResponse
{ {

View File

@ -1,16 +1,13 @@
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[Route("/v12r03/chassis/crownsdata.php")] [Route("/v12r03/chassis/crownsdata.php")]
[ApiController] [ApiController]
public class CrownsDataController : ControllerBase public class CrownsDataController : BaseController<CrownsDataController>
{ {
private readonly ILogger<CrownsDataController> logger;
private readonly TaikoDbContext context; private readonly TaikoDbContext context;
public CrownsDataController(ILogger<CrownsDataController> logger, TaikoDbContext context) public CrownsDataController(TaikoDbContext context)
{ {
this.logger = logger;
this.context = context; this.context = context;
} }
@ -18,7 +15,7 @@ public class CrownsDataController : ControllerBase
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult CrownsData([FromBody] CrownsDataRequest request) public IActionResult CrownsData([FromBody] CrownsDataRequest request)
{ {
logger.LogInformation("CrownsData request : {Request}", request.Stringify()); Logger.LogInformation("CrownsData request : {Request}", request.Stringify());
var songBestData = context.SongBestData.Where(datum => datum.Baid == request.Baid).ToList(); var songBestData = context.SongBestData.Where(datum => datum.Baid == request.Baid).ToList();

View File

@ -1,19 +1,14 @@
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[Route("/v12r03/chassis/executeqrcode.php")] [Route("/v12r03/chassis/executeqrcode.php")]
[ApiController] [ApiController]
public class ExecuteQrCodeController : ControllerBase public class ExecuteQrCodeController : BaseController<ExecuteQrCodeController>
{ {
private readonly ILogger<ExecuteQrCodeController> logger;
public ExecuteQrCodeController(ILogger<ExecuteQrCodeController> logger) {
this.logger = logger;
}
[HttpPost] [HttpPost]
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult ExecuteQrCode([FromBody] ExecuteQrcodeRequest request) public IActionResult ExecuteQrCode([FromBody] ExecuteQrcodeRequest request)
{ {
logger.LogInformation("ExecuteQrcode request : {Request}", request.Stringify()); Logger.LogInformation("ExecuteQrcode request : {Request}", request.Stringify());
var response = new ExecuteQrcodeResponse var response = new ExecuteQrcodeResponse
{ {

View File

@ -1,19 +1,14 @@
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[Route("/v12r03/chassis/getaidata.php")] [Route("/v12r03/chassis/getaidata.php")]
[ApiController] [ApiController]
public class GetAiDataController : ControllerBase public class GetAiDataController : BaseController<GetAiDataController>
{ {
private readonly ILogger<GetAiDataController> logger;
public GetAiDataController(ILogger<GetAiDataController> logger) {
this.logger = logger;
}
[HttpPost] [HttpPost]
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult GetAiData([FromBody] GetAiDataRequest request) public IActionResult GetAiData([FromBody] GetAiDataRequest request)
{ {
logger.LogInformation("GetAiData request : {Request}", request.Stringify()); Logger.LogInformation("GetAiData request : {Request}", request.Stringify());
var response = new GetAiDataResponse var response = new GetAiDataResponse
{ {

View File

@ -1,19 +1,14 @@
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[Route("/v12r03/chassis/getaiscore.php")] [Route("/v12r03/chassis/getaiscore.php")]
[ApiController] [ApiController]
public class GetAiScoreController : ControllerBase public class GetAiScoreController : BaseController<GetAiScoreController>
{ {
private readonly ILogger<GetAiScoreController> logger;
public GetAiScoreController(ILogger<GetAiScoreController> logger) {
this.logger = logger;
}
[HttpPost] [HttpPost]
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult GetAiScore([FromBody] GetAiScoreRequest request) public IActionResult GetAiScore([FromBody] GetAiScoreRequest request)
{ {
logger.LogInformation("GetAiScore request : {Request}", request.Stringify()); Logger.LogInformation("GetAiScore request : {Request}", request.Stringify());
var response = new GetAiScoreResponse var response = new GetAiScoreResponse
{ {

View File

@ -0,0 +1,23 @@
namespace TaikoLocalServer.Controllers.Game;
[Route("/v12r03/chassis/getapplicationurl.php")]
[ApiController]
public class GetApplicationUrlController : BaseController<GetApplicationUrlController>
{
private const string APPLICATION_URL = "vsapi.taiko-p.jp";
[HttpPost]
[Produces("application/protobuf")]
public IActionResult GetApplicationUrl([FromBody] GetApplicationUrlRequest request)
{
Logger.LogInformation("GetApplicationUrl request : {Request}", request.Stringify());
var response = new GetApplicationUrlResponse
{
Result = 1,
ApplicationUrl = APPLICATION_URL
};
return Ok(response);
}
}

View File

@ -1,19 +1,14 @@
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[Route("/v12r03/chassis/getdanodai.php")] [Route("/v12r03/chassis/getdanodai.php")]
[ApiController] [ApiController]
public class GetDanOdaiController : ControllerBase public class GetDanOdaiController : BaseController<GetDanOdaiController>
{ {
private readonly ILogger<GetDanOdaiController> logger;
public GetDanOdaiController(ILogger<GetDanOdaiController> logger) {
this.logger = logger;
}
[HttpPost] [HttpPost]
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult GetDanOdai([FromBody] GetDanOdaiRequest request) public IActionResult GetDanOdai([FromBody] GetDanOdaiRequest request)
{ {
logger.LogInformation("GetDanOdai request : {Request}", request.Stringify()); Logger.LogInformation("GetDanOdai request : {Request}", request.Stringify());
var response = new GetDanOdaiResponse var response = new GetDanOdaiResponse
{ {
@ -31,7 +26,7 @@ public class GetDanOdaiController : ControllerBase
manager.OdaiDataList.TryGetValue(danId, out var odaiData); manager.OdaiDataList.TryGetValue(danId, out var odaiData);
if (odaiData is null) if (odaiData is null)
{ {
logger.LogWarning("Requested dan id {Id} does not exist!", danId); Logger.LogWarning("Requested dan id {Id} does not exist!", danId);
continue; continue;
} }

View File

@ -1,16 +1,13 @@
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[Route("/v12r03/chassis/getdanscore.php")] [Route("/v12r03/chassis/getdanscore.php")]
[ApiController] [ApiController]
public class GetDanScoreController : ControllerBase public class GetDanScoreController : BaseController<GetDanScoreController>
{ {
private readonly ILogger<GetDanScoreController> logger;
private readonly TaikoDbContext context; private readonly TaikoDbContext context;
public GetDanScoreController(ILogger<GetDanScoreController> logger, TaikoDbContext context) public GetDanScoreController(TaikoDbContext context)
{ {
this.logger = logger;
this.context = context; this.context = context;
} }
@ -18,7 +15,7 @@ public class GetDanScoreController : ControllerBase
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult GetDanScore([FromBody] GetDanScoreRequest request) public IActionResult GetDanScore([FromBody] GetDanScoreRequest request)
{ {
logger.LogInformation("GetDanScore request : {Request}", request.Stringify()); Logger.LogInformation("GetDanScore request : {Request}", request.Stringify());
var response = new GetDanScoreResponse var response = new GetDanScoreResponse
{ {
@ -43,7 +40,7 @@ public class GetDanScoreController : ControllerBase
}; };
foreach (var stageScoreDatum in datum.DanStageScoreData) foreach (var stageScoreDatum in datum.DanStageScoreData)
{ {
responseData.AryDanScoreDataStages.Add(ObjectMappers.DanStageDataMap.Apply(stageScoreDatum)); responseData.AryDanScoreDataStages.Add(ObjectMappers.DanStageDbToResponseMap.Apply(stageScoreDatum));
} }
response.AryDanScoreDatas.Add(responseData); response.AryDanScoreDatas.Add(responseData);

View File

@ -1,19 +1,14 @@
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[Route("/v12r03/chassis/getfolder.php")] [Route("/v12r03/chassis/getfolder.php")]
[ApiController] [ApiController]
public class GetFolderController : ControllerBase public class GetFolderController : BaseController<GetFolderController>
{ {
private readonly ILogger<GetFolderController> logger;
public GetFolderController(ILogger<GetFolderController> logger) {
this.logger = logger;
}
[HttpPost] [HttpPost]
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult GetFolder([FromBody] GetfolderRequest request) public IActionResult GetFolder([FromBody] GetfolderRequest request)
{ {
logger.LogInformation("GetFolder request : {Request}", request.Stringify()); Logger.LogInformation("GetFolder request : {Request}", request.Stringify());
var response = new GetfolderResponse var response = new GetfolderResponse
{ {

View File

@ -1,16 +1,13 @@
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[Route("/v12r03/chassis/getscorerank.php")] [Route("/v12r03/chassis/getscorerank.php")]
[ApiController] [ApiController]
public class GetScoreRankController : ControllerBase public class GetScoreRankController : BaseController<GetScoreRankController>
{ {
private readonly ILogger<GetScoreRankController> logger;
private readonly TaikoDbContext context; private readonly TaikoDbContext context;
public GetScoreRankController(ILogger<GetScoreRankController> logger, TaikoDbContext context) public GetScoreRankController(TaikoDbContext context)
{ {
this.logger = logger;
this.context = context; this.context = context;
} }
@ -18,7 +15,7 @@ public class GetScoreRankController : ControllerBase
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult GetScoreRank([FromBody] GetScoreRankRequest request) public IActionResult GetScoreRank([FromBody] GetScoreRankRequest request)
{ {
logger.LogInformation("GetScoreRank request : {Request}", request.Stringify()); Logger.LogInformation("GetScoreRank request : {Request}", request.Stringify());
var kiwamiScores = new byte[Constants.KIWAMI_SCORE_RANK_ARRAY_SIZE]; var kiwamiScores = new byte[Constants.KIWAMI_SCORE_RANK_ARRAY_SIZE];
var miyabiScores = new ushort[Constants.MIYABI_CORE_RANK_ARRAY_SIZE]; var miyabiScores = new ushort[Constants.MIYABI_CORE_RANK_ARRAY_SIZE];
var ikiScores = new ushort[Constants.IKI_CORE_RANK_ARRAY_SIZE]; var ikiScores = new ushort[Constants.IKI_CORE_RANK_ARRAY_SIZE];

View File

@ -1,19 +1,14 @@
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[Route("/v12r03/chassis/getshopfolder.php")] [Route("/v12r03/chassis/getshopfolder.php")]
[ApiController] [ApiController]
public class GetShopFolderController : ControllerBase public class GetShopFolderController : BaseController<GetShopFolderController>
{ {
private readonly ILogger<GetShopFolderController> logger;
public GetShopFolderController(ILogger<GetShopFolderController> logger) {
this.logger = logger;
}
[HttpPost] [HttpPost]
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult GetShopFolder([FromBody] GetShopFolderRequest request) public IActionResult GetShopFolder([FromBody] GetShopFolderRequest request)
{ {
logger.LogInformation("GetShopFolder request : {Request}", request.Stringify()); Logger.LogInformation("GetShopFolder request : {Request}", request.Stringify());
var response = new GetShopFolderResponse var response = new GetShopFolderResponse
{ {

View File

@ -1,19 +1,14 @@
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[Route("/v12r03/chassis/getsongintroduction.php")] [Route("/v12r03/chassis/getsongintroduction.php")]
[ApiController] [ApiController]
public class GetSongIntroductionController : ControllerBase public class GetSongIntroductionController : BaseController<GetSongIntroductionController>
{ {
private readonly ILogger<GetSongIntroductionController> logger;
public GetSongIntroductionController(ILogger<GetSongIntroductionController> logger) {
this.logger = logger;
}
[HttpPost] [HttpPost]
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult GetSongIntroduction([FromBody] GetSongIntroductionRequest request) public IActionResult GetSongIntroduction([FromBody] GetSongIntroductionRequest request)
{ {
logger.LogInformation("GetSongIntroduction request : {Request}", request.Stringify()); Logger.LogInformation("GetSongIntroduction request : {Request}", request.Stringify());
var response = new GetSongIntroductionResponse var response = new GetSongIntroductionResponse
{ {

View File

@ -1,19 +1,14 @@
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[Route("/v12r03/chassis/gettelop.php")] [Route("/v12r03/chassis/gettelop.php")]
[ApiController] [ApiController]
public class GetTelopController : ControllerBase public class GetTelopController : BaseController<GetTelopController>
{ {
private readonly ILogger<GetTelopController> logger;
public GetTelopController(ILogger<GetTelopController> logger) {
this.logger = logger;
}
[HttpPost] [HttpPost]
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult GetTelop([FromBody] GettelopRequest request) public IActionResult GetTelop([FromBody] GettelopRequest request)
{ {
logger.LogInformation("GetTelop request : {Request}", request.Stringify()); Logger.LogInformation("GetTelop request : {Request}", request.Stringify());
var startDateTime = DateTime.Now - TimeSpan.FromDays(999.0); var startDateTime = DateTime.Now - TimeSpan.FromDays(999.0);
var endDateTime = DateTime.Now + TimeSpan.FromDays(999.0); var endDateTime = DateTime.Now + TimeSpan.FromDays(999.0);

View File

@ -1,19 +1,14 @@
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[Route("/v12r03/chassis/gettokencount.php")] [Route("/v12r03/chassis/gettokencount.php")]
[ApiController] [ApiController]
public class GetTokenCountController : ControllerBase public class GetTokenCountController : BaseController<GetTokenCountController>
{ {
private readonly ILogger<GetTokenCountController> logger;
public GetTokenCountController(ILogger<GetTokenCountController> logger) {
this.logger = logger;
}
[HttpPost] [HttpPost]
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult GetTokenCount([FromBody] GetTokenCountRequest request) public IActionResult GetTokenCount([FromBody] GetTokenCountRequest request)
{ {
logger.LogInformation("GetTokenCount request : {Request}", request.Stringify()); Logger.LogInformation("GetTokenCount request : {Request}", request.Stringify());
var response = new GetTokenCountResponse var response = new GetTokenCountResponse
{ {

View File

@ -1,20 +1,14 @@
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[ApiController] [ApiController]
[Route("/v12r03/chassis/heartbeat.php")] [Route("/v12r03/chassis/heartbeat.php")]
public class HeartbeatController : ControllerBase public class HeartbeatController : BaseController<HeartbeatController>
{ {
private readonly ILogger<HeartbeatController> logger;
public HeartbeatController(ILogger<HeartbeatController> logger) {
this.logger = logger;
}
[HttpPost] [HttpPost]
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult HeartBeat([FromBody] HeartBeatRequest request) public IActionResult HeartBeat([FromBody] HeartBeatRequest request)
{ {
logger.LogInformation("Heartbeat request: {Request}", request.Stringify()); Logger.LogInformation("Heartbeat request: {Request}", request.Stringify());
var response = new HeartBeatResponse var response = new HeartBeatResponse
{ {
Result = 1, Result = 1,

View File

@ -1,24 +1,16 @@
using System.Collections; using System.Collections;
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[ApiController] [ApiController]
[Route("/v12r03/chassis/initialdatacheck.php")] [Route("/v12r03/chassis/initialdatacheck.php")]
public class InitialDataCheckController : ControllerBase public class InitialDataCheckController : BaseController<InitialDataCheckController>
{ {
private readonly ILogger<InitialDataCheckController> logger;
public InitialDataCheckController(ILogger<InitialDataCheckController> logger)
{
this.logger = logger;
}
[HttpPost] [HttpPost]
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult InitialDataCheck([FromBody] InitialdatacheckRequest request) public IActionResult InitialDataCheck([FromBody] InitialdatacheckRequest request)
{ {
logger.LogInformation("Initial data check request: {Request}", request.Stringify()); Logger.LogInformation("Initial data check request: {Request}", request.Stringify());
var musicAttributeManager = MusicAttributeManager.Instance; var musicAttributeManager = MusicAttributeManager.Instance;
@ -46,7 +38,6 @@ public class InitialDataCheckController : ControllerBase
IsDanplay = true, IsDanplay = true,
IsAibattle = false, IsAibattle = false,
IsClose = false, IsClose = false,
//SongIntroductionEndDatetime = (DateTime.Now + TimeSpan.FromDays(999)).ToString(Constants.DATE_TIME_FORMAT),
DefaultSongFlg = enabledArray, DefaultSongFlg = enabledArray,
AchievementSongBit = enabledArray, AchievementSongBit = enabledArray,
AryShopFolderDatas = AryShopFolderDatas =

View File

@ -1,16 +1,13 @@
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[Route("/v12r03/chassis/mydonentry.php")] [Route("/v12r03/chassis/mydonentry.php")]
[ApiController] [ApiController]
public class MyDonEntryController : ControllerBase public class MyDonEntryController : BaseController<MyDonEntryController>
{ {
private readonly ILogger<MyDonEntryController> logger;
private readonly TaikoDbContext context; private readonly TaikoDbContext context;
public MyDonEntryController(ILogger<MyDonEntryController> logger, TaikoDbContext context) public MyDonEntryController(TaikoDbContext context)
{ {
this.logger = logger;
this.context = context; this.context = context;
} }
@ -18,7 +15,7 @@ public class MyDonEntryController : ControllerBase
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult GetMyDonEntry([FromBody] MydonEntryRequest request) public IActionResult GetMyDonEntry([FromBody] MydonEntryRequest request)
{ {
logger.LogInformation("MyDonEntry request : {Request}", request.Stringify()); Logger.LogInformation("MyDonEntry request : {Request}", request.Stringify());
var newId = context.Cards.Any() ? context.Cards.Max(card => card.Baid) + 1 : 1; var newId = context.Cards.Any() ? context.Cards.Max(card => card.Baid) + 1 : 1;
context.Cards.Add(new Card context.Cards.Add(new Card
@ -26,6 +23,7 @@ public class MyDonEntryController : ControllerBase
AccessCode = request.AccessCode, AccessCode = request.AccessCode,
Baid = newId Baid = newId
}); });
context.UserData.Add(new UserDatum context.UserData.Add(new UserDatum
{ {
Baid = newId, Baid = newId,
@ -35,7 +33,8 @@ public class MyDonEntryController : ControllerBase
AchievementDisplayDifficulty = Difficulty.None, AchievementDisplayDifficulty = Difficulty.None,
ColorFace = 0, ColorFace = 0,
ColorBody = 1, ColorBody = 1,
ColorLimb = 3 ColorLimb = 3,
FavoriteSongsArray = "{}"
}); });
context.SaveChanges(); context.SaveChanges();

View File

@ -1,19 +1,16 @@
using System.Globalization; using System.Globalization;
using System.Text.Json; using System.Text.Json;
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[Route("/v12r03/chassis/playresult.php")] [Route("/v12r03/chassis/playresult.php")]
[ApiController] [ApiController]
public class PlayResultController : ControllerBase public class PlayResultController : BaseController<PlayResultController>
{ {
private readonly ILogger<PlayResultController> logger;
private readonly TaikoDbContext context; private readonly TaikoDbContext context;
public PlayResultController(ILogger<PlayResultController> logger, TaikoDbContext context) public PlayResultController(TaikoDbContext context)
{ {
this.logger = logger;
this.context = context; this.context = context;
} }
@ -21,12 +18,12 @@ public class PlayResultController : ControllerBase
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult UploadPlayResult([FromBody] PlayResultRequest request) public IActionResult UploadPlayResult([FromBody] PlayResultRequest request)
{ {
logger.LogInformation("PlayResult request : {Request}", request.Stringify()); Logger.LogInformation("PlayResult request : {Request}", request.Stringify());
var decompressed = GZipBytesUtil.DecompressGZipBytes(request.PlayresultData); var decompressed = GZipBytesUtil.DecompressGZipBytes(request.PlayresultData);
var playResultData = Serializer.Deserialize<PlayResultDataRequest>(new ReadOnlySpan<byte>(decompressed)); var playResultData = Serializer.Deserialize<PlayResultDataRequest>(new ReadOnlySpan<byte>(decompressed));
logger.LogInformation("Play result data {Data}", playResultData.Stringify()); Logger.LogInformation("Play result data {Data}", playResultData.Stringify());
var response = new PlayResultResponse var response = new PlayResultResponse
{ {
@ -63,6 +60,7 @@ public class PlayResultController : ControllerBase
{ {
if (playResultDataRequest.IsNotRecordedDan) if (playResultDataRequest.IsNotRecordedDan)
{ {
Logger.LogInformation("Dan score will not be saved!");
return; return;
} }
var danScoreDataQuery = context.DanScoreData var danScoreDataQuery = context.DanScoreData
@ -113,18 +111,13 @@ public class PlayResultController : ControllerBase
add = false; add = false;
} }
// FIXME: Add proper logic for high score update
if (danStageData.HighScore >= stageData.PlayScore) if (danStageData.HighScore >= stageData.PlayScore)
{ {
continue; continue;
} }
danStageData.GoodCount = stageData.GoodCnt;
danStageData.OkCount = stageData.OkCnt; ObjectMappers.DanStageResponseToDbMap.Apply(stageData, danStageData);
danStageData.BadCount = stageData.NgCnt;
danStageData.PlayScore = stageData.PlayScore;
danStageData.HighScore = stageData.PlayScore;
danStageData.ComboCount = stageData.ComboCnt;
danStageData.TotalHitCount = stageData.HitCnt;
danStageData.DrumrollCount = stageData.PoundCnt;
if (add) if (add)
{ {

View File

@ -1,19 +1,14 @@
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[Route("/v12r03/chassis/rewarditem.php")] [Route("/v12r03/chassis/rewarditem.php")]
[ApiController] [ApiController]
public class RewardItemController : ControllerBase public class RewardItemController : BaseController<RewardItemController>
{ {
private readonly ILogger<RewardItemController> logger;
public RewardItemController(ILogger<RewardItemController> logger) {
this.logger = logger;
}
[HttpPost] [HttpPost]
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult RewardItem([FromBody] RewardItemRequest request) public IActionResult RewardItem([FromBody] RewardItemRequest request)
{ {
logger.LogInformation("RewardItem request : {Request}", request.Stringify()); Logger.LogInformation("RewardItem request : {Request}", request.Stringify());
var response = new RewardItemResponse var response = new RewardItemResponse
{ {

View File

@ -0,0 +1,79 @@
using Throw;
namespace TaikoLocalServer.Controllers.Game;
[Route("/v12r03/chassis/selfbest.php")]
[ApiController]
public class SelfBestController : BaseController<SelfBestController>
{
private readonly TaikoDbContext context;
public SelfBestController(TaikoDbContext context)
{
this.context = context;
}
[HttpPost]
[Produces("application/protobuf")]
public IActionResult SelfBest([FromBody] SelfBestRequest request)
{
Logger.LogInformation("SelfBest request : {Request}", request.Stringify());
var response = new SelfBestResponse
{
Result = 1,
Level = request.Level
};
var manager = MusicAttributeManager.Instance;
var requestDifficulty = (Difficulty)request.Level;
requestDifficulty.Throw().IfOutOfRange();
var playerBestData = context.SongBestData
.Where(datum => datum.Baid == request.Baid &&
(datum.Difficulty == requestDifficulty ||
(datum.Difficulty == Difficulty.UraOni && requestDifficulty == Difficulty.Oni)))
.ToList();
foreach (var songNo in request.ArySongNoes)
{
if (!manager.MusicAttributes.ContainsKey(songNo))
{
Logger.LogWarning("Music no {No} is missing!", songNo);
continue;
}
var selfBestData = GetSongSelfBestData(playerBestData, songNo);
response.ArySelfbestScores.Add(selfBestData);
}
response.ArySelfbestScores.Sort((data, otherData) => data.SongNo.CompareTo(otherData.SongNo));
return Ok(response);
}
private static SelfBestResponse.SelfBestData GetSongSelfBestData(IEnumerable<SongBestDatum> playerBestData, uint songNo)
{
var songBestDatum = playerBestData.Where(datum => datum.SongId == songNo);
var selfBestData = new SelfBestResponse.SelfBestData
{
SongNo = songNo,
};
foreach (var datum in songBestDatum)
{
if (datum.Difficulty == Difficulty.UraOni)
{
selfBestData.UraBestScore = datum.BestScore;
selfBestData.UraBestScoreRate = datum.BestRate;
continue;
}
selfBestData.SelfBestScore = datum.BestScore;
selfBestData.SelfBestScoreRate = datum.BestRate;
}
return selfBestData;
}
}

View File

@ -1,19 +1,14 @@
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[Route("/v12r03/chassis/songpurchase.php")] [Route("/v12r03/chassis/songpurchase.php")]
[ApiController] [ApiController]
public class SongPurchaseController : ControllerBase public class SongPurchaseController : BaseController<SongPurchaseController>
{ {
private readonly ILogger<SongPurchaseController> logger;
public SongPurchaseController(ILogger<SongPurchaseController> logger) {
this.logger = logger;
}
[HttpPost] [HttpPost]
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult SongPurchase([FromBody] SongPurchaseRequest request) public IActionResult SongPurchase([FromBody] SongPurchaseRequest request)
{ {
logger.LogInformation("SongPurchase request : {Request}", request.Stringify()); Logger.LogInformation("SongPurchase request : {Request}", request.Stringify());
var response = new SongPurchaseResponse var response = new SongPurchaseResponse
{ {

View File

@ -1,22 +1,16 @@
using taiko.vsinterface; using taiko.vsinterface;
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[ApiController] [ApiController]
[Route("/v01r00/chassis/startupauth.php")] [Route("/v01r00/chassis/startupauth.php")]
public class StartupAuthController : ControllerBase public class StartupAuthController : BaseController<StartupAuthController>
{ {
private readonly ILogger<StartupAuthController> logger;
public StartupAuthController(ILogger<StartupAuthController> logger) {
this.logger = logger;
}
[HttpPost] [HttpPost]
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult StartupAuth([FromBody] StartupAuthRequest request) public IActionResult StartupAuth([FromBody] StartupAuthRequest request)
{ {
logger.LogInformation("StartupAuth request: {Request}", request.Stringify()); Logger.LogInformation("StartupAuth request: {Request}", request.Stringify());
var response = new StartupAuthResponse var response = new StartupAuthResponse
{ {
Result = 1 Result = 1

View File

@ -1,19 +1,14 @@
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[Route("/v12r03/chassis/tournamentcheck.php")] [Route("/v12r03/chassis/tournamentcheck.php")]
[ApiController] [ApiController]
public class TournamentCheckController : ControllerBase public class TournamentCheckController : BaseController<TournamentCheckController>
{ {
private readonly ILogger<TournamentCheckController> logger;
public TournamentCheckController(ILogger<TournamentCheckController> logger) {
this.logger = logger;
}
[HttpPost] [HttpPost]
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult TournamentCheck([FromBody] TournamentcheckRequest request) public IActionResult TournamentCheck([FromBody] TournamentcheckRequest request)
{ {
logger.LogInformation("TournamentCheck request : {Request}", request.Stringify()); Logger.LogInformation("TournamentCheck request : {Request}", request.Stringify());
var response = new TournamentcheckResponse var response = new TournamentcheckResponse
{ {

View File

@ -1,19 +1,17 @@
using System.Collections; using System.Collections;
using System.Text.Json; using System.Text.Json;
using Throw;
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[Route("/v12r03/chassis/userdata.php")] [Route("/v12r03/chassis/userdata.php")]
[ApiController] [ApiController]
public class UserDataController : ControllerBase public class UserDataController : BaseController<UserDataController>
{ {
private readonly ILogger<UserDataController> logger;
private readonly TaikoDbContext context; private readonly TaikoDbContext context;
public UserDataController(ILogger<UserDataController> logger, TaikoDbContext context) public UserDataController(TaikoDbContext context)
{ {
this.logger = logger;
this.context = context; this.context = context;
} }
@ -21,7 +19,7 @@ public class UserDataController : ControllerBase
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult GetUserData([FromBody] UserDataRequest request) public IActionResult GetUserData([FromBody] UserDataRequest request)
{ {
logger.LogInformation("UserData request : {Request}", request.Stringify()); Logger.LogInformation("UserData request : {Request}", request.Stringify());
var musicAttributeManager = MusicAttributeManager.Instance; var musicAttributeManager = MusicAttributeManager.Instance;
@ -60,21 +58,20 @@ public class UserDataController : ControllerBase
userData = context.UserData.First(datum => datum.Baid == request.Baid); userData = context.UserData.First(datum => datum.Baid == request.Baid);
} }
var favoriteSongs = new uint[] { 0 }; var favoriteSongs = Array.Empty<uint>();
try try
{ {
favoriteSongs = JsonSerializer.Deserialize<uint[]>(userData.FavoriteSongsArray); favoriteSongs = JsonSerializer.Deserialize<uint[]>(userData.FavoriteSongsArray);
} }
catch (JsonException e) catch (JsonException e)
{ {
logger.LogError(e, "Parsing favorite songs json data failed"); Logger.LogError(e, "Parsing favorite songs json data failed");
}
if (favoriteSongs == null || favoriteSongs.Length < 1)
{
logger.LogWarning("Favorite songs is null!");
favoriteSongs = new uint[] { };
} }
// The only way to get a null is provide string "null" as input,
// which means database content need to be fixed, so better throw
favoriteSongs.ThrowIfNull("Favorite song should never be null!");
var response = new UserDataResponse var response = new UserDataResponse
{ {
Result = 1, Result = 1,

View File

@ -1,19 +1,14 @@
namespace TaikoLocalServer.Controllers; namespace TaikoLocalServer.Controllers.Game;
[Route("/v12r03/chassis/verifyqrcode.php")] [Route("/v12r03/chassis/verifyqrcode.php")]
[ApiController] [ApiController]
public class VerifyQrCodeController : ControllerBase public class VerifyQrCodeController : BaseController<VerifyQrCodeController>
{ {
private readonly ILogger<VerifyQrCodeController> logger;
public VerifyQrCodeController(ILogger<VerifyQrCodeController> logger) {
this.logger = logger;
}
[HttpPost] [HttpPost]
[Produces("application/protobuf")] [Produces("application/protobuf")]
public IActionResult VerifyQrCode([FromBody] VerifyQrcodeRequest request) public IActionResult VerifyQrCode([FromBody] VerifyQrcodeRequest request)
{ {
logger.LogInformation("VerifyQrCode request : {Request}", request.Stringify()); Logger.LogInformation("VerifyQrCode request : {Request}", request.Stringify());
var response = new VerifyQrcodeResponse var response = new VerifyQrcodeResponse
{ {

View File

@ -1,28 +0,0 @@
namespace TaikoLocalServer.Controllers;
[Route("/v12r03/chassis/getapplicationurl.php")]
[ApiController]
public class GetApplicationUrlController : ControllerBase
{
private const string ApplicationUrl = "vsapi.taiko-p.jp";
private readonly ILogger<GetApplicationUrlController> logger;
public GetApplicationUrlController(ILogger<GetApplicationUrlController> logger) {
this.logger = logger;
}
[HttpPost]
[Produces("application/protobuf")]
public IActionResult GetApplicationUrl([FromBody] GetApplicationUrlRequest request)
{
logger.LogInformation("GetApplicationUrl request : {Request}", request.Stringify());
var response = new GetApplicationUrlResponse
{
Result = 1,
ApplicationUrl = ApplicationUrl
};
return Ok(response);
}
}

View File

@ -1,70 +0,0 @@
namespace TaikoLocalServer.Controllers;
[Route("/v12r03/chassis/selfbest.php")]
[ApiController]
public class SelfBestController : ControllerBase
{
private readonly ILogger<SelfBestController> logger;
private readonly TaikoDbContext context;
public SelfBestController(ILogger<SelfBestController> logger, TaikoDbContext context)
{
this.logger = logger;
this.context = context;
}
[HttpPost]
[Produces("application/protobuf")]
public IActionResult SelfBest([FromBody] SelfBestRequest request)
{
logger.LogInformation("SelfBest request : {Request}", request.Stringify());
var response = new SelfBestResponse
{
Result = 1,
Level = request.Level
};
var manager = MusicAttributeManager.Instance;
var difficulty = (Difficulty)request.Level;
var playerBestData = context.SongBestData
.Where(datum => datum.Baid == request.Baid &&
(datum.Difficulty == difficulty || (datum.Difficulty == Difficulty.UraOni && difficulty == Difficulty.Oni)))
.ToList();
foreach (var songNo in request.ArySongNoes)
{
if (!manager.MusicAttributes.ContainsKey(songNo))
{
logger.LogWarning("Music no {No} is missing!", songNo);
continue;
}
var songBestDatum = playerBestData.Where(datum => datum.SongId == songNo);
var selfBestData = new SelfBestResponse.SelfBestData
{
SongNo = songNo,
};
foreach (var datum in songBestDatum)
{
if (datum.Difficulty == difficulty)
{
selfBestData.SelfBestScore = datum.BestScore;
selfBestData.SelfBestScoreRate = datum.BestRate;
}
else if (datum.Difficulty == Difficulty.UraOni)
{
selfBestData.UraBestScore = datum.BestScore;
selfBestData.UraBestScoreRate = datum.BestRate;
}
}
response.ArySelfbestScores.Add(selfBestData);
}
response.ArySelfbestScores.Sort((data, otherData) => data.SongNo.CompareTo(otherData.SongNo));
return Ok(response);
}
}

View File

@ -23,6 +23,7 @@
<PackageReference Include="Swan.Core" Version="6.0.2-beta.90" /> <PackageReference Include="Swan.Core" Version="6.0.2-beta.90" />
<PackageReference Include="Swan.Logging" Version="6.0.2-beta.69" /> <PackageReference Include="Swan.Logging" Version="6.0.2-beta.69" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
<PackageReference Include="Throw" Version="1.2.0" />
<PackageReference Include="Yoh.Text.Json.NamingPolicies" Version="0.2.1" /> <PackageReference Include="Yoh.Text.Json.NamingPolicies" Version="0.2.1" />
</ItemGroup> </ItemGroup>