From 93926eedf8b79c1cdd887eed14c23e4e9f6417a9 Mon Sep 17 00:00:00 2001 From: AeonLucid Date: Fri, 7 Jan 2022 22:29:20 +0100 Subject: [PATCH] Add more CloudScript functions, start of EnterMatchmaking --- .../Controllers/ClientController.cs | 12 +- .../Controllers/CloudScriptController.cs | 301 ++---------------- src/Prospect.Server.Api/Hubs/CycleHub.cs | 8 + .../Models/Client/Data/FEntityKey.cs | 2 +- .../Models/Client/FExecuteFunctionRequest.cs | 6 +- .../Properties/launchSettings.json | 2 +- .../Prospect.Server.Api.csproj | 1 + .../CloudScript/CloudScriptException.cs | 22 ++ .../CloudScript/CloudScriptFunction.cs | 12 + .../CloudScript/CloudScriptFunctionLoader.cs | 80 +++++ .../CloudScript/CloudScriptService.cs | 49 +++ .../CloudScript/Functions/EnterMatchmaking.cs | 22 ++ .../Functions/GetCharacterVanity.cs | 67 ++++ .../Functions/GetCraftingInProgressData.cs | 41 +++ .../CloudScript/Functions/GetFriendList.cs | 15 + .../CloudScript/Functions/GetPlayerSets.cs | 49 +++ .../Functions/GetPlayersInventoriesLimits.cs | 38 +++ .../Functions/GetSignalRConnection.cs | 16 + .../Functions/RequestFactionProgression.cs | 48 +++ .../Functions/RequestMaintenanceModeState.cs | 15 + .../Functions/RequestPlayerContracts.cs | 109 +++++++ .../Functions/SetMatchAllowJoin.cs | 16 + .../Functions/UpdatePlayerPresenceState.cs | 12 + .../Functions/UpdateRetentionBonus.cs | 38 +++ .../CloudScript/Functions/VivoxLogin.cs | 15 + .../CloudScript/Functions/VivoxSettings.cs | 15 + .../CloudScript/ICloudScriptFunction.cs | 6 + .../Data/FYActiveContractPlayerData.cs | 2 +- .../Models}/Data/FYFactionContractData.cs | 2 +- .../Models}/Data/FYFactionContractsData.cs | 2 +- .../Models}/Data/FYFactionsContractsData.cs | 2 +- .../Data/FYItemCurrentlyBeingCrafted.cs | 4 +- .../FYPurchaseInventoryInsuranceRequest.cs | 7 + .../CloudScript/Models}/Data/FYTimestamp.cs | 2 +- .../Models/Data/FYVivoxJoinTokenRequest.cs | 18 ++ .../CloudScript/Models/FYBaseSocialRequest.cs | 9 + .../CloudScript/Models/FYEmptyRequest.cs | 6 + .../Models/FYEnterMatchAzureFunction.cs | 28 ++ .../Models/FYEnterMatchAzureFunctionResult.cs | 30 ++ .../Models/FYGetCharacterVanityRequest.cs | 6 + .../FYGetCraftingInProgressDataRequest.cs | 9 + .../FYGetCraftingInProgressDataResult.cs | 8 +- .../Models/FYGetPlayerContractsRequest.cs | 6 + .../Models}/FYGetPlayerContractsResult.cs | 4 +- .../FYGetPlayersInventoriesLimitsRequest.cs | 9 + .../CloudScript/Models/FYGetPlayersSets.cs | 9 + .../Models/FYGetSignalRConnection.cs | 9 + .../Models/FYGetSignalRConnectionResult.cs | 12 + .../Models/FYMaintenanceModeState.cs | 9 + .../FYQueryFactionProgressionRequest.cs | 6 + .../FYRequestMaintenanceModeStateResult.cs | 9 + .../Models/FYRetentionBonusRequest.cs | 6 + .../Models/FYSetAllowJoinRequest.cs | 12 + .../FYUpdatePlayerPresenceStateRequest.cs | 9 + .../CloudScript/Models/FYVivoxJoinData.cs | 15 + .../Models/FYVivoxLoginTokenRequest.cs | 9 + .../CloudScript/Models/FYVivoxSettingsData.cs | 15 + src/Prospect.Server.Api/Startup.cs | 12 +- 58 files changed, 1004 insertions(+), 299 deletions(-) create mode 100644 src/Prospect.Server.Api/Hubs/CycleHub.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/CloudScriptException.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/CloudScriptFunction.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/CloudScriptFunctionLoader.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/CloudScriptService.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Functions/EnterMatchmaking.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Functions/GetCharacterVanity.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Functions/GetCraftingInProgressData.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Functions/GetFriendList.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Functions/GetPlayerSets.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Functions/GetPlayersInventoriesLimits.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Functions/GetSignalRConnection.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Functions/RequestFactionProgression.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Functions/RequestMaintenanceModeState.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Functions/RequestPlayerContracts.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Functions/SetMatchAllowJoin.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Functions/UpdatePlayerPresenceState.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Functions/UpdateRetentionBonus.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Functions/VivoxLogin.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Functions/VivoxSettings.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/ICloudScriptFunction.cs rename src/Prospect.Server.Api/{Models/CloudScript => Services/CloudScript/Models}/Data/FYActiveContractPlayerData.cs (80%) rename src/Prospect.Server.Api/{Models/CloudScript => Services/CloudScript/Models}/Data/FYFactionContractData.cs (82%) rename src/Prospect.Server.Api/{Models/CloudScript => Services/CloudScript/Models}/Data/FYFactionContractsData.cs (81%) rename src/Prospect.Server.Api/{Models/CloudScript => Services/CloudScript/Models}/Data/FYFactionsContractsData.cs (82%) rename src/Prospect.Server.Api/{Models/CloudScript => Services/CloudScript/Models}/Data/FYItemCurrentlyBeingCrafted.cs (81%) create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYPurchaseInventoryInsuranceRequest.cs rename src/Prospect.Server.Api/{Models/CloudScript => Services/CloudScript/Models}/Data/FYTimestamp.cs (68%) create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYVivoxJoinTokenRequest.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Models/FYBaseSocialRequest.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Models/FYEmptyRequest.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Models/FYEnterMatchAzureFunction.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Models/FYEnterMatchAzureFunctionResult.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Models/FYGetCharacterVanityRequest.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Models/FYGetCraftingInProgressDataRequest.cs rename src/Prospect.Server.Api/{Models/CloudScript => Services/CloudScript/Models}/FYGetCraftingInProgressDataResult.cs (70%) create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Models/FYGetPlayerContractsRequest.cs rename src/Prospect.Server.Api/{Models/CloudScript => Services/CloudScript/Models}/FYGetPlayerContractsResult.cs (83%) create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Models/FYGetPlayersInventoriesLimitsRequest.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Models/FYGetPlayersSets.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Models/FYGetSignalRConnection.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Models/FYGetSignalRConnectionResult.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Models/FYMaintenanceModeState.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Models/FYQueryFactionProgressionRequest.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Models/FYRequestMaintenanceModeStateResult.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Models/FYRetentionBonusRequest.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Models/FYSetAllowJoinRequest.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Models/FYUpdatePlayerPresenceStateRequest.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Models/FYVivoxJoinData.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Models/FYVivoxLoginTokenRequest.cs create mode 100644 src/Prospect.Server.Api/Services/CloudScript/Models/FYVivoxSettingsData.cs diff --git a/src/Prospect.Server.Api/Controllers/ClientController.cs b/src/Prospect.Server.Api/Controllers/ClientController.cs index 664af2d..2f7924c 100644 --- a/src/Prospect.Server.Api/Controllers/ClientController.cs +++ b/src/Prospect.Server.Api/Controllers/ClientController.cs @@ -21,7 +21,8 @@ public class ClientController : Controller { private const int AppIdDefault = 480; private const int AppIdCycleBeta = 1600361; - + + private readonly ILogger _logger; private readonly PlayFabSettings _settings; private readonly AuthTokenService _authTokenService; private readonly DbUserService _userService; @@ -29,7 +30,8 @@ public class ClientController : Controller private readonly UserDataService _userDataService; private readonly TitleDataService _titleDataService; - public ClientController(IOptions settings, + public ClientController(ILogger logger, + IOptions settings, AuthTokenService authTokenService, DbUserService userService, DbEntityService entityService, @@ -37,6 +39,7 @@ public class ClientController : Controller TitleDataService titleDataService) { _settings = settings.Value; + _logger = logger; _authTokenService = authTokenService; _userService = userService; _entityService = entityService; @@ -113,6 +116,11 @@ public class ClientController : Controller } }); } + + _logger.LogWarning("Invalid steam ticket specified, IsValid {IsValid}, HasValidSignature {Sig}, AppId {AppId}", + ticket.IsValid, + ticket.HasValidSignature, + ticket.AppId); } return BadRequest(new ClientResponse diff --git a/src/Prospect.Server.Api/Controllers/CloudScriptController.cs b/src/Prospect.Server.Api/Controllers/CloudScriptController.cs index 6d51c86..c225c5d 100644 --- a/src/Prospect.Server.Api/Controllers/CloudScriptController.cs +++ b/src/Prospect.Server.Api/Controllers/CloudScriptController.cs @@ -2,10 +2,8 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Prospect.Server.Api.Models.Client; -using Prospect.Server.Api.Models.CloudScript; -using Prospect.Server.Api.Models.CloudScript.Data; using Prospect.Server.Api.Services.Auth.Entity; -using Prospect.Server.Api.Services.Auth.Extensions; +using Prospect.Server.Api.Services.CloudScript; namespace Prospect.Server.Api.Controllers; @@ -15,289 +13,36 @@ namespace Prospect.Server.Api.Controllers; public class CloudScriptController : Controller { private readonly ILogger _logger; + private readonly CloudScriptService _cloudScriptService; - public CloudScriptController(ILogger logger) + public CloudScriptController(ILogger logger, CloudScriptService cloudScriptService) { _logger = logger; + _cloudScriptService = cloudScriptService; } - + [HttpPost("ExecuteFunction")] [Produces(MediaTypeNames.Application.Json)] - public IActionResult ExecuteFunction(FExecuteFunctionRequest request) + public async Task ExecuteFunction(FExecuteFunctionRequest request) { - _logger.LogInformation("Executing function {Function}", request.FunctionName); + _logger.LogDebug("Executing CloudScript function {Function}", request.FunctionName); - object result = null; - - switch (request.FunctionName) - { - case "RequestMaintenanceModeState": - result = new - { - enabled = false - }; - break; - case "GetCharacterVanity": - result = new - { - userId = User.FindAuthUserId(), - error = (object) null, - returnVanity = new - { - userId = User.FindAuthUserId(), - head_item = new - { - id = "Black02M_Head1", - materialIndex = 0, - }, - boots_item = new - { - id = "StarterOutfit01_Boots_M", - materialIndex = 0, - }, - chest_item = new - { - id = "StarterOutfit01_Chest_M", - materialIndex = 0, - }, - glove_item = new - { - id = "StarterOutfit01_Gloves_M", - materialIndex = 0, - }, - base_suit_item = new - { - id = "StarterOutfit01M_BaseSuit", - materialIndex = 0, - }, - melee_weapon_item = new - { - id = "Melee_Omega", - materialIndex = 0, - }, - body_type = 1, - archetype_id = "TheProspector", - slot_index = 0 - } - }; - break; - case "SetMatchAllowJoin": - result = new - { - sessionId = (object)null, - success = false - }; - break; - case "GetFriendList": - // TODO: ? - result = new - { - - }; - break; - case "GetPlayerSets": - result = new - { - success = true, - entries = new [] - { - new - { - setData = new - { - id = "", - userId = User.FindAuthUserId(), - kit = "", - shield = "", - helmet = "", - weaponOne = "", - weaponTwo = "", - bag = "", - bagItemsAsJsonStr = "", - safeItemsAsJsonStr = "" - }, - items = Array.Empty() - } - } - }; - break; - case "RequestFactionProgression": - result = new - { - factions = new [] - { - new - { - factionId = "ICA", - currentProgression = 0 - }, - new - { - factionId = "Korolev", - currentProgression = 0 - }, - new - { - factionId = "Osiris", - currentProgression = 0 - }, - }, - userId = User.FindAuthUserId(), - error = "" - }; - break; - case "GetPlayersInventoriesLimits": - result = new - { - success = true, - entries = new [] - { - new { - userId = User.FindAuthUserId(), - inventoryStashLimit = 75, - inventoryBagLimit = 300, - inventorySafeLimit = 5 - } - } - }; - break; - case "UpdateRetentionBonus": - result = new - { - playerData = new - { - daysClaimed = 0, - lastClaimTime = new - { - seconds = 1635033600 - } - }, - userId = User.FindAuthUserId(), - error = (object)null - }; - break; - case "GetCraftingInProgressData": - result = new FYGetCraftingInProgressDataResult - { - UserId = User.FindAuthUserId(), - Error = null, - ItemCurrentlyBeingCrafted = new FYItemCurrentlyBeingCrafted - { - ItemId = null, - ItemRarity = -1, - PurchaseAmount = -1, - UtcTimestampWhenCraftingStarted = new FYTimestamp - { - Seconds = 0 - } - } - }; - break; - case "RequestPlayerContracts": - result = new FYGetPlayerContractsResult - { - UserId = User.FindAuthUserId(), - Error = null, - ActiveContracts = new List(), - FactionsContracts = new FYFactionsContractsData - { - Boards = new List - { - new FYFactionContractsData - { - FactionId = "ICA", - Contracts = new List - { - new FYFactionContractData - { - ContractId = "NEW-Easy-ICA-Gather-1", - ContractIsLockedDueToLowFactionReputation = false - }, - new FYFactionContractData - { - ContractId = "NEW-Medium-ICA-Uplink-1", - ContractIsLockedDueToLowFactionReputation = false - }, - new FYFactionContractData - { - ContractId = "NEW-Hard-ICA-Uplink-1", - ContractIsLockedDueToLowFactionReputation = false - } - } - }, - new FYFactionContractsData - { - FactionId = "Korolev", - Contracts = new List - { - new FYFactionContractData - { - ContractId = "NEW-Easy-KOR-Mine-4", - ContractIsLockedDueToLowFactionReputation = false - }, - new FYFactionContractData - { - ContractId = "NEW-Medium-KOR-Mine-1", - ContractIsLockedDueToLowFactionReputation = false - }, - new FYFactionContractData - { - ContractId = "NEW-Hard-KOR-PvP-6", - ContractIsLockedDueToLowFactionReputation = false - } - } - }, - new FYFactionContractsData - { - FactionId = "Osiris", - Contracts = new List - { - new FYFactionContractData - { - ContractId = "NEW-Easy-Osiris-Brightcaps-1", - ContractIsLockedDueToLowFactionReputation = false - }, - new FYFactionContractData - { - ContractId = "NEW-Medium-Osiris-Gather-1", - ContractIsLockedDueToLowFactionReputation = false - }, - new FYFactionContractData - { - ContractId = "NEW-Hard-Osiris-Gather-7", - ContractIsLockedDueToLowFactionReputation = false - } - } - } - }, - LastBoardRefreshTimeUtc = new FYTimestamp - { - Seconds = (int)DateTimeOffset.UtcNow.ToUnixTimeSeconds() - } - }, - RefreshHours24UtcFromBackend = 12 - }; - break; - default: - _logger.LogWarning("Missing function {Function}", request.FunctionName); - - result = new - { - - }; - break; - } - - return Ok(new ClientResponse - { - Code = 200, - Status = "OK", - Data = new FExecuteFunctionResult + var result = await _cloudScriptService.ExecuteAsync(request.FunctionName, request.FunctionParameter, request.GeneratePlayStreamEvent); + if (result != null) + { + return Ok(new ClientResponse { - ExecutionTimeMilliseconds = 12, - FunctionName = request.FunctionName, - FunctionResult = result - } - }); + Code = 200, + Status = "OK", + Data = new FExecuteFunctionResult + { + ExecutionTimeMilliseconds = 12, + FunctionName = request.FunctionName, + FunctionResult = result + } + }); + } + + return StatusCode(500); } } \ No newline at end of file diff --git a/src/Prospect.Server.Api/Hubs/CycleHub.cs b/src/Prospect.Server.Api/Hubs/CycleHub.cs new file mode 100644 index 0000000..2b0afc6 --- /dev/null +++ b/src/Prospect.Server.Api/Hubs/CycleHub.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNetCore.SignalR; + +namespace Prospect.Server.Api.Hubs; + +public class CycleHub : Hub +{ + +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Models/Client/Data/FEntityKey.cs b/src/Prospect.Server.Api/Models/Client/Data/FEntityKey.cs index 9c59ce9..4d216cd 100644 --- a/src/Prospect.Server.Api/Models/Client/Data/FEntityKey.cs +++ b/src/Prospect.Server.Api/Models/Client/Data/FEntityKey.cs @@ -18,5 +18,5 @@ public class FEntityKey // Not in PlayFab SDK [JsonPropertyName("TypeString")] - public string TypeString { get; set; } = null!; + public string? TypeString { get; set; } = null!; } \ No newline at end of file diff --git a/src/Prospect.Server.Api/Models/Client/FExecuteFunctionRequest.cs b/src/Prospect.Server.Api/Models/Client/FExecuteFunctionRequest.cs index cb762d7..239e5d8 100644 --- a/src/Prospect.Server.Api/Models/Client/FExecuteFunctionRequest.cs +++ b/src/Prospect.Server.Api/Models/Client/FExecuteFunctionRequest.cs @@ -18,12 +18,12 @@ public class FExecuteFunctionRequest [JsonPropertyName("Entity")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] public FEntityKey? Entity { get; set; } - + /// /// The name of the CloudScript function to execute /// [JsonPropertyName("FunctionName")] - public string? FunctionName { get; set; } + public string FunctionName { get; set; } = null!; /// /// [optional] Object that is passed in to the function as the FunctionArgument field of the FunctionExecutionContext data structure @@ -38,5 +38,5 @@ public class FExecuteFunctionRequest /// [JsonPropertyName("GeneratePlayStreamEvent")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] - public bool? GeneratePlayStreamEvent { get; set; } + public bool GeneratePlayStreamEvent { get; set; } } \ No newline at end of file diff --git a/src/Prospect.Server.Api/Properties/launchSettings.json b/src/Prospect.Server.Api/Properties/launchSettings.json index 3a338b1..cb765b9 100644 --- a/src/Prospect.Server.Api/Properties/launchSettings.json +++ b/src/Prospect.Server.Api/Properties/launchSettings.json @@ -4,7 +4,7 @@ "commandName": "Project", "dotnetRunMessages": "true", "launchBrowser": false, - "applicationUrl": "http://localhost:5000", + "applicationUrl": "http://localhost:5000;https://localhost:5443", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } diff --git a/src/Prospect.Server.Api/Prospect.Server.Api.csproj b/src/Prospect.Server.Api/Prospect.Server.Api.csproj index ea9e827..00d9ef7 100644 --- a/src/Prospect.Server.Api/Prospect.Server.Api.csproj +++ b/src/Prospect.Server.Api/Prospect.Server.Api.csproj @@ -9,6 +9,7 @@ + diff --git a/src/Prospect.Server.Api/Services/CloudScript/CloudScriptException.cs b/src/Prospect.Server.Api/Services/CloudScript/CloudScriptException.cs new file mode 100644 index 0000000..9043ef6 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/CloudScriptException.cs @@ -0,0 +1,22 @@ +using System.Runtime.Serialization; + +namespace Prospect.Server.Api.Services.CloudScript; + +public class CloudScriptException : Exception +{ + public CloudScriptException() + { + } + + protected CloudScriptException(SerializationInfo info, StreamingContext context) : base(info, context) + { + } + + public CloudScriptException(string? message) : base(message) + { + } + + public CloudScriptException(string? message, Exception? innerException) : base(message, innerException) + { + } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/CloudScriptFunction.cs b/src/Prospect.Server.Api/Services/CloudScript/CloudScriptFunction.cs new file mode 100644 index 0000000..f7e8324 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/CloudScriptFunction.cs @@ -0,0 +1,12 @@ +namespace Prospect.Server.Api.Services.CloudScript; + +[AttributeUsage(AttributeTargets.Class)] +public class CloudScriptFunction : Attribute +{ + public CloudScriptFunction(string name) + { + Name = name; + } + + public string Name { get; } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/CloudScriptFunctionLoader.cs b/src/Prospect.Server.Api/Services/CloudScript/CloudScriptFunctionLoader.cs new file mode 100644 index 0000000..6480984 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/CloudScriptFunctionLoader.cs @@ -0,0 +1,80 @@ +using System.Diagnostics.CodeAnalysis; +using System.Linq.Expressions; +using System.Reflection; + +namespace Prospect.Server.Api.Services.CloudScript; + +public record CloudScriptFunctionData(Type Clazz, Type RequestType, bool ReturnsObject, Func Delegate); + +public class CloudScriptFunctionLoader +{ + private readonly ILogger _logger; + private readonly Dictionary _methods; + + public CloudScriptFunctionLoader(ILogger logger) + { + _logger = logger; + _methods = LoadMethods(); + } + + public bool TryGetFunction(string name, [MaybeNullWhen(false)] out CloudScriptFunctionData functionData) + { + return _methods.TryGetValue(name, out functionData); + } + + private Dictionary LoadMethods() + { + var result = new Dictionary(); + + var genericInterface = typeof(ICloudScriptFunction<,>); + + foreach (var clazz in typeof(CloudScriptFunctionLoader).Assembly.GetTypes()) + { + var attribute = clazz.GetCustomAttribute(); + if (attribute == null) + { + continue; + } + + var clazzInterface = clazz.GetInterfaces().FirstOrDefault(x => x.IsGenericType && x.GetGenericTypeDefinition() == genericInterface); + if (clazzInterface != null) + { + var genericTypes = clazzInterface.GetGenericArguments(); + var typeReq = genericTypes[0]; + var typeRes = genericTypes[1]; + + var method = clazz.GetMethod("ExecuteAsync", new []{ typeReq }); + if (method == null) + { + _logger.LogWarning("ExecuteAsync method not found for class {Class}", clazz.FullName); + continue; + } + + // Expression. + var argInstance = Expression.Parameter(typeof(object), "instance"); + var argRequest = Expression.Parameter(typeof(object), "request"); + + var invokeReturn = Expression.Label(typeof(Task)); + + var invokeArgs = new Expression[] + { + Expression.Convert(argRequest, typeReq) + }; + + var invokeCall = Expression.Call(Expression.Convert(argInstance, clazz), method, invokeArgs); + + var invoke = Expression.Block( + Expression.Return(invokeReturn, invokeCall), + Expression.Label(invokeReturn, Expression.Default(typeof(Task))) + ); + + var lambda = Expression.Lambda>(invoke, argInstance, argRequest).Compile(); + + // Store lambda expression. + result.Add(attribute.Name, new CloudScriptFunctionData(clazz, typeReq, true, lambda)); + } + } + + return result; + } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/CloudScriptService.cs b/src/Prospect.Server.Api/Services/CloudScript/CloudScriptService.cs new file mode 100644 index 0000000..99add55 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/CloudScriptService.cs @@ -0,0 +1,49 @@ +using System.Text.Json; + +namespace Prospect.Server.Api.Services.CloudScript; + +public class CloudScriptService +{ + private readonly ILogger _logger; + private readonly IServiceScopeFactory _serviceScopeFactory; + private readonly CloudScriptFunctionLoader _functionLoader; + + public CloudScriptService(ILogger logger, IServiceScopeFactory serviceScopeFactory, CloudScriptFunctionLoader functionLoader) + { + _logger = logger; + _serviceScopeFactory = serviceScopeFactory; + _functionLoader = functionLoader; + } + + public async Task ExecuteAsync(string name, string? parameter, bool generatePlayStreamEvent) + { + if (!_functionLoader.TryGetFunction(name, out var function)) + { + _logger.LogWarning("Function {Function} is missing", name); + return null; + } + + if (parameter == null) + { + _logger.LogWarning("Function {Function} was called without a parameter", name); + return null; + } + + using (var scope = _serviceScopeFactory.CreateScope()) + { + var functionClazz = ActivatorUtilities.CreateInstance(scope.ServiceProvider, function.Clazz); + var functionParam = JsonSerializer.Deserialize(parameter, function.RequestType); + if (functionParam == null) + { + _logger.LogWarning("Function {Function} deserialization returned null", name); + return null; + } + + var functionTask = function.Delegate(functionClazz, functionParam); + + await functionTask; + + return (object)((dynamic)functionTask).Result; + } + } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Functions/EnterMatchmaking.cs b/src/Prospect.Server.Api/Services/CloudScript/Functions/EnterMatchmaking.cs new file mode 100644 index 0000000..c432176 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Functions/EnterMatchmaking.cs @@ -0,0 +1,22 @@ +using Prospect.Server.Api.Services.CloudScript.Models; + +namespace Prospect.Server.Api.Services.CloudScript.Functions; + +[CloudScriptFunction("EnterMatchmaking")] +public class EnterMatchmaking : ICloudScriptFunction +{ + public Task ExecuteAsync(FYEnterMatchAzureFunction request) + { + return Task.FromResult(new FYEnterMatchAzureFunctionResult + { + Success = true, + Address = "127.0.0.1", + ErrorMessage = "", + Port = 30229, + ShardIndex = 0, + SingleplayerStation = false, + MaintenanceMode = false, + SessionTimeJoinDelay = 0 + }); + } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Functions/GetCharacterVanity.cs b/src/Prospect.Server.Api/Services/CloudScript/Functions/GetCharacterVanity.cs new file mode 100644 index 0000000..4311e2b --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Functions/GetCharacterVanity.cs @@ -0,0 +1,67 @@ +using Prospect.Server.Api.Services.Auth.Extensions; +using Prospect.Server.Api.Services.CloudScript.Models; + +namespace Prospect.Server.Api.Services.CloudScript.Functions; + +[CloudScriptFunction("GetCharacterVanity")] +public class GetCharacterVanity : ICloudScriptFunction +{ + private readonly IHttpContextAccessor _httpContextAccessor; + + public GetCharacterVanity(IHttpContextAccessor httpContextAccessor) + { + _httpContextAccessor = httpContextAccessor; + } + + public Task ExecuteAsync(FYGetCharacterVanityRequest request) + { + var context = _httpContextAccessor.HttpContext; + if (context == null) + { + return Task.FromResult(null); + } + + return Task.FromResult(new + { + userId = context.User.FindAuthUserId(), + error = (object?)null, + returnVanity = new + { + userId = context.User.FindAuthUserId(), + head_item = new + { + id = "Black02M_Head1", + materialIndex = 0, + }, + boots_item = new + { + id = "StarterOutfit01_Boots_M", + materialIndex = 0, + }, + chest_item = new + { + id = "StarterOutfit01_Chest_M", + materialIndex = 0, + }, + glove_item = new + { + id = "StarterOutfit01_Gloves_M", + materialIndex = 0, + }, + base_suit_item = new + { + id = "StarterOutfit01M_BaseSuit", + materialIndex = 0, + }, + melee_weapon_item = new + { + id = "Melee_Omega", + materialIndex = 0, + }, + body_type = 1, + archetype_id = "TheProspector", + slot_index = 0 + } + }); + } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Functions/GetCraftingInProgressData.cs b/src/Prospect.Server.Api/Services/CloudScript/Functions/GetCraftingInProgressData.cs new file mode 100644 index 0000000..bb04f27 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Functions/GetCraftingInProgressData.cs @@ -0,0 +1,41 @@ +using Prospect.Server.Api.Services.Auth.Extensions; +using Prospect.Server.Api.Services.CloudScript.Models; +using Prospect.Server.Api.Services.CloudScript.Models.Data; + +namespace Prospect.Server.Api.Services.CloudScript.Functions; + +[CloudScriptFunction("GetCraftingInProgressData")] +public class GetCraftingInProgressData : ICloudScriptFunction +{ + private readonly IHttpContextAccessor _httpContextAccessor; + + public GetCraftingInProgressData(IHttpContextAccessor httpContextAccessor) + { + _httpContextAccessor = httpContextAccessor; + } + + public Task ExecuteAsync(FYGetCraftingInProgressDataRequest request) + { + var context = _httpContextAccessor.HttpContext; + if (context == null) + { + throw new CloudScriptException("CloudScript was not called within a http request"); + } + + return Task.FromResult(new FYGetCraftingInProgressDataResult + { + UserId = context.User.FindAuthUserId(), + Error = string.Empty, + ItemCurrentlyBeingCrafted = new FYItemCurrentlyBeingCrafted + { + ItemId = null, + ItemRarity = -1, + PurchaseAmount = -1, + UtcTimestampWhenCraftingStarted = new FYTimestamp + { + Seconds = 0 + } + } + }); + } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Functions/GetFriendList.cs b/src/Prospect.Server.Api/Services/CloudScript/Functions/GetFriendList.cs new file mode 100644 index 0000000..34d6d78 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Functions/GetFriendList.cs @@ -0,0 +1,15 @@ +using Prospect.Server.Api.Services.CloudScript.Models; + +namespace Prospect.Server.Api.Services.CloudScript.Functions; + +[CloudScriptFunction("GetFriendList")] +public class GetFriendList : ICloudScriptFunction +{ + public Task ExecuteAsync(FYBaseSocialRequest request) + { + return Task.FromResult(new + { + + }); + } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Functions/GetPlayerSets.cs b/src/Prospect.Server.Api/Services/CloudScript/Functions/GetPlayerSets.cs new file mode 100644 index 0000000..6b662b7 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Functions/GetPlayerSets.cs @@ -0,0 +1,49 @@ +using Prospect.Server.Api.Services.Auth.Extensions; +using Prospect.Server.Api.Services.CloudScript.Models; + +namespace Prospect.Server.Api.Services.CloudScript.Functions; + +[CloudScriptFunction("GetPlayerSets")] +public class GetPlayerSets : ICloudScriptFunction +{ + private readonly IHttpContextAccessor _httpContextAccessor; + + public GetPlayerSets(IHttpContextAccessor httpContextAccessor) + { + _httpContextAccessor = httpContextAccessor; + } + + public Task ExecuteAsync(FYGetPlayersSets request) + { + var context = _httpContextAccessor.HttpContext; + if (context == null) + { + return Task.FromResult(null); + } + + return Task.FromResult(new + { + success = true, + entries = new [] + { + new + { + setData = new + { + id = "", + userId = context.User.FindAuthUserId(), + kit = "", + shield = "", + helmet = "", + weaponOne = "", + weaponTwo = "", + bag = "", + bagItemsAsJsonStr = "", + safeItemsAsJsonStr = "" + }, + items = Array.Empty() + } + } + }); + } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Functions/GetPlayersInventoriesLimits.cs b/src/Prospect.Server.Api/Services/CloudScript/Functions/GetPlayersInventoriesLimits.cs new file mode 100644 index 0000000..7d76ee6 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Functions/GetPlayersInventoriesLimits.cs @@ -0,0 +1,38 @@ +using Prospect.Server.Api.Services.Auth.Extensions; +using Prospect.Server.Api.Services.CloudScript.Models; + +namespace Prospect.Server.Api.Services.CloudScript.Functions; + +[CloudScriptFunction("GetPlayersInventoriesLimits")] +public class GetPlayersInventoriesLimits : ICloudScriptFunction +{ + private readonly IHttpContextAccessor _httpContextAccessor; + + public GetPlayersInventoriesLimits(IHttpContextAccessor httpContextAccessor) + { + _httpContextAccessor = httpContextAccessor; + } + + public Task ExecuteAsync(FYGetPlayersInventoriesLimitsRequest request) + { + var context = _httpContextAccessor.HttpContext; + if (context == null) + { + return Task.FromResult(null); + } + + return Task.FromResult(new + { + success = true, + entries = new [] + { + new { + userId = context.User.FindAuthUserId(), + inventoryStashLimit = 75, + inventoryBagLimit = 300, + inventorySafeLimit = 5 + } + } + }); + } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Functions/GetSignalRConnection.cs b/src/Prospect.Server.Api/Services/CloudScript/Functions/GetSignalRConnection.cs new file mode 100644 index 0000000..3d71ceb --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Functions/GetSignalRConnection.cs @@ -0,0 +1,16 @@ +using Prospect.Server.Api.Services.CloudScript.Models; + +namespace Prospect.Server.Api.Services.CloudScript.Functions; + +[CloudScriptFunction("GetSignalRConnection")] +public class GetSignalRConnection : ICloudScriptFunction +{ + public Task ExecuteAsync(FYGetSignalRConnection request) + { + return Task.FromResult(new FYGetSignalRConnectionResult + { + Url = "https://localhost:5443/signalr/?hub=pubsub", + AccessToken = "TEST" + }); + } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Functions/RequestFactionProgression.cs b/src/Prospect.Server.Api/Services/CloudScript/Functions/RequestFactionProgression.cs new file mode 100644 index 0000000..4f4a667 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Functions/RequestFactionProgression.cs @@ -0,0 +1,48 @@ +using Prospect.Server.Api.Services.Auth.Extensions; +using Prospect.Server.Api.Services.CloudScript.Models; + +namespace Prospect.Server.Api.Services.CloudScript.Functions; + +[CloudScriptFunction("RequestFactionProgression")] +public class RequestFactionProgression : ICloudScriptFunction +{ + private readonly IHttpContextAccessor _httpContextAccessor; + + public RequestFactionProgression(IHttpContextAccessor httpContextAccessor) + { + _httpContextAccessor = httpContextAccessor; + } + + public Task ExecuteAsync(FYQueryFactionProgressionRequest request) + { + var context = _httpContextAccessor.HttpContext; + if (context == null) + { + return Task.FromResult(null); + } + + return Task.FromResult(new + { + factions = new [] + { + new + { + factionId = "ICA", + currentProgression = 0 + }, + new + { + factionId = "Korolev", + currentProgression = 0 + }, + new + { + factionId = "Osiris", + currentProgression = 0 + }, + }, + userId = context.User.FindAuthUserId(), + error = "" + }); + } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Functions/RequestMaintenanceModeState.cs b/src/Prospect.Server.Api/Services/CloudScript/Functions/RequestMaintenanceModeState.cs new file mode 100644 index 0000000..284c4d7 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Functions/RequestMaintenanceModeState.cs @@ -0,0 +1,15 @@ +using Prospect.Server.Api.Services.CloudScript.Models; + +namespace Prospect.Server.Api.Services.CloudScript.Functions; + +[CloudScriptFunction("RequestMaintenanceModeState")] +public class RequestMaintenanceModeState : ICloudScriptFunction +{ + public Task ExecuteAsync(FYMaintenanceModeState request) + { + return Task.FromResult(new FYRequestMaintenanceModeStateResult + { + Enabled = false + }); + } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Functions/RequestPlayerContracts.cs b/src/Prospect.Server.Api/Services/CloudScript/Functions/RequestPlayerContracts.cs new file mode 100644 index 0000000..f2b43a5 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Functions/RequestPlayerContracts.cs @@ -0,0 +1,109 @@ +using Prospect.Server.Api.Services.Auth.Extensions; +using Prospect.Server.Api.Services.CloudScript.Models; +using Prospect.Server.Api.Services.CloudScript.Models.Data; + +namespace Prospect.Server.Api.Services.CloudScript.Functions; + +[CloudScriptFunction("RequestPlayerContracts")] +public class RequestPlayerContracts : ICloudScriptFunction +{ + private readonly IHttpContextAccessor _httpContextAccessor; + + public RequestPlayerContracts(IHttpContextAccessor httpContextAccessor) + { + _httpContextAccessor = httpContextAccessor; + } + + public Task ExecuteAsync(FYGetPlayerContractsRequest request) + { + var context = _httpContextAccessor.HttpContext; + if (context == null) + { + throw new CloudScriptException("CloudScript was not called within a http request"); + } + + return Task.FromResult(new FYGetPlayerContractsResult + { + UserId = context.User.FindAuthUserId(), + Error = null, + ActiveContracts = new List(), + FactionsContracts = new FYFactionsContractsData + { + Boards = new List + { + new FYFactionContractsData + { + FactionId = "ICA", + Contracts = new List + { + new FYFactionContractData + { + ContractId = "NEW-Easy-ICA-Gather-1", + ContractIsLockedDueToLowFactionReputation = false + }, + new FYFactionContractData + { + ContractId = "NEW-Medium-ICA-Uplink-1", + ContractIsLockedDueToLowFactionReputation = false + }, + new FYFactionContractData + { + ContractId = "NEW-Hard-ICA-Uplink-1", + ContractIsLockedDueToLowFactionReputation = false + } + } + }, + new FYFactionContractsData + { + FactionId = "Korolev", + Contracts = new List + { + new FYFactionContractData + { + ContractId = "NEW-Easy-KOR-Mine-4", + ContractIsLockedDueToLowFactionReputation = false + }, + new FYFactionContractData + { + ContractId = "NEW-Medium-KOR-Mine-1", + ContractIsLockedDueToLowFactionReputation = false + }, + new FYFactionContractData + { + ContractId = "NEW-Hard-KOR-PvP-6", + ContractIsLockedDueToLowFactionReputation = false + } + } + }, + new FYFactionContractsData + { + FactionId = "Osiris", + Contracts = new List + { + new FYFactionContractData + { + ContractId = "NEW-Easy-Osiris-Brightcaps-1", + ContractIsLockedDueToLowFactionReputation = false + }, + new FYFactionContractData + { + ContractId = "NEW-Medium-Osiris-Gather-1", + ContractIsLockedDueToLowFactionReputation = false + }, + new FYFactionContractData + { + ContractId = "NEW-Hard-Osiris-Gather-7", + ContractIsLockedDueToLowFactionReputation = false + } + } + } + }, + LastBoardRefreshTimeUtc = new FYTimestamp + { + Seconds = (int)DateTimeOffset.UtcNow.ToUnixTimeSeconds() + } + }, + RefreshHours24UtcFromBackend = 12 + }); + } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Functions/SetMatchAllowJoin.cs b/src/Prospect.Server.Api/Services/CloudScript/Functions/SetMatchAllowJoin.cs new file mode 100644 index 0000000..60272f4 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Functions/SetMatchAllowJoin.cs @@ -0,0 +1,16 @@ +using Prospect.Server.Api.Services.CloudScript.Models; + +namespace Prospect.Server.Api.Services.CloudScript.Functions; + +[CloudScriptFunction("SetMatchAllowJoin")] +public class SetMatchAllowJoin : ICloudScriptFunction +{ + public Task ExecuteAsync(FYSetAllowJoinRequest request) + { + return Task.FromResult(new + { + sessionId = (object?)null, + success = false + }); + } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Functions/UpdatePlayerPresenceState.cs b/src/Prospect.Server.Api/Services/CloudScript/Functions/UpdatePlayerPresenceState.cs new file mode 100644 index 0000000..d704b2e --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Functions/UpdatePlayerPresenceState.cs @@ -0,0 +1,12 @@ +using Prospect.Server.Api.Services.CloudScript.Models; + +namespace Prospect.Server.Api.Services.CloudScript.Functions; + +[CloudScriptFunction("UpdatePlayerPresenceState")] +public class UpdatePlayerPresenceState : ICloudScriptFunction +{ + public Task ExecuteAsync(FYUpdatePlayerPresenceStateRequest request) + { + return Task.FromResult(new { }); + } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Functions/UpdateRetentionBonus.cs b/src/Prospect.Server.Api/Services/CloudScript/Functions/UpdateRetentionBonus.cs new file mode 100644 index 0000000..2ff2660 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Functions/UpdateRetentionBonus.cs @@ -0,0 +1,38 @@ +using Prospect.Server.Api.Services.Auth.Extensions; +using Prospect.Server.Api.Services.CloudScript.Models; + +namespace Prospect.Server.Api.Services.CloudScript.Functions; + +[CloudScriptFunction("UpdateRetentionBonus")] +public class UpdateRetentionBonus : ICloudScriptFunction +{ + private readonly IHttpContextAccessor _httpContextAccessor; + + public UpdateRetentionBonus(IHttpContextAccessor httpContextAccessor) + { + _httpContextAccessor = httpContextAccessor; + } + + public Task ExecuteAsync(FYRetentionBonusRequest request) + { + var context = _httpContextAccessor.HttpContext; + if (context == null) + { + return Task.FromResult(null); + } + + return Task.FromResult(new + { + playerData = new + { + daysClaimed = 0, + lastClaimTime = new + { + seconds = 1635033600 + } + }, + userId = context.User.FindAuthUserId(), + error = (object?)null + }); + } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Functions/VivoxLogin.cs b/src/Prospect.Server.Api/Services/CloudScript/Functions/VivoxLogin.cs new file mode 100644 index 0000000..dd3ec2b --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Functions/VivoxLogin.cs @@ -0,0 +1,15 @@ +using Prospect.Server.Api.Services.CloudScript.Models; + +namespace Prospect.Server.Api.Services.CloudScript.Functions; + +[CloudScriptFunction("VivoxLogin")] +public class VivoxLogin : ICloudScriptFunction +{ + public Task ExecuteAsync(FYVivoxLoginTokenRequest request) + { + return Task.FromResult(new FYVivoxJoinData + { + + }); + } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Functions/VivoxSettings.cs b/src/Prospect.Server.Api/Services/CloudScript/Functions/VivoxSettings.cs new file mode 100644 index 0000000..b9886d1 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Functions/VivoxSettings.cs @@ -0,0 +1,15 @@ +using Prospect.Server.Api.Services.CloudScript.Models; + +namespace Prospect.Server.Api.Services.CloudScript.Functions; + +[CloudScriptFunction("VivoxSettings")] +public class VivoxSettings : ICloudScriptFunction +{ + public Task ExecuteAsync(FYEmptyRequest request) + { + return Task.FromResult(new FYVivoxSettingsData + { + + }); + } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/ICloudScriptFunction.cs b/src/Prospect.Server.Api/Services/CloudScript/ICloudScriptFunction.cs new file mode 100644 index 0000000..ddddbef --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/ICloudScriptFunction.cs @@ -0,0 +1,6 @@ +namespace Prospect.Server.Api.Services.CloudScript; + +public interface ICloudScriptFunction +{ + Task ExecuteAsync(TReq request); +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Models/CloudScript/Data/FYActiveContractPlayerData.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYActiveContractPlayerData.cs similarity index 80% rename from src/Prospect.Server.Api/Models/CloudScript/Data/FYActiveContractPlayerData.cs rename to src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYActiveContractPlayerData.cs index 02d4a0b..de74e13 100644 --- a/src/Prospect.Server.Api/Models/CloudScript/Data/FYActiveContractPlayerData.cs +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYActiveContractPlayerData.cs @@ -1,6 +1,6 @@ using System.Text.Json.Serialization; -namespace Prospect.Server.Api.Models.CloudScript.Data; +namespace Prospect.Server.Api.Services.CloudScript.Models.Data; public class FYActiveContractPlayerData { diff --git a/src/Prospect.Server.Api/Models/CloudScript/Data/FYFactionContractData.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYFactionContractData.cs similarity index 82% rename from src/Prospect.Server.Api/Models/CloudScript/Data/FYFactionContractData.cs rename to src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYFactionContractData.cs index ca84442..5ce3ed0 100644 --- a/src/Prospect.Server.Api/Models/CloudScript/Data/FYFactionContractData.cs +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYFactionContractData.cs @@ -1,6 +1,6 @@ using System.Text.Json.Serialization; -namespace Prospect.Server.Api.Models.CloudScript.Data; +namespace Prospect.Server.Api.Services.CloudScript.Models.Data; public class FYFactionContractData { diff --git a/src/Prospect.Server.Api/Models/CloudScript/Data/FYFactionContractsData.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYFactionContractsData.cs similarity index 81% rename from src/Prospect.Server.Api/Models/CloudScript/Data/FYFactionContractsData.cs rename to src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYFactionContractsData.cs index 4a15432..cd1d9cf 100644 --- a/src/Prospect.Server.Api/Models/CloudScript/Data/FYFactionContractsData.cs +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYFactionContractsData.cs @@ -1,6 +1,6 @@ using System.Text.Json.Serialization; -namespace Prospect.Server.Api.Models.CloudScript.Data; +namespace Prospect.Server.Api.Services.CloudScript.Models.Data; public class FYFactionContractsData { diff --git a/src/Prospect.Server.Api/Models/CloudScript/Data/FYFactionsContractsData.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYFactionsContractsData.cs similarity index 82% rename from src/Prospect.Server.Api/Models/CloudScript/Data/FYFactionsContractsData.cs rename to src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYFactionsContractsData.cs index 2cbddca..866d8ac 100644 --- a/src/Prospect.Server.Api/Models/CloudScript/Data/FYFactionsContractsData.cs +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYFactionsContractsData.cs @@ -1,6 +1,6 @@ using System.Text.Json.Serialization; -namespace Prospect.Server.Api.Models.CloudScript.Data; +namespace Prospect.Server.Api.Services.CloudScript.Models.Data; public class FYFactionsContractsData { diff --git a/src/Prospect.Server.Api/Models/CloudScript/Data/FYItemCurrentlyBeingCrafted.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYItemCurrentlyBeingCrafted.cs similarity index 81% rename from src/Prospect.Server.Api/Models/CloudScript/Data/FYItemCurrentlyBeingCrafted.cs rename to src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYItemCurrentlyBeingCrafted.cs index 355f9af..d1c4e05 100644 --- a/src/Prospect.Server.Api/Models/CloudScript/Data/FYItemCurrentlyBeingCrafted.cs +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYItemCurrentlyBeingCrafted.cs @@ -1,11 +1,11 @@ using System.Text.Json.Serialization; -namespace Prospect.Server.Api.Models.CloudScript.Data; +namespace Prospect.Server.Api.Services.CloudScript.Models.Data; public class FYItemCurrentlyBeingCrafted { [JsonPropertyName("itemId")] - public string ItemId { get; set; } = null!; + public string? ItemId { get; set; } [JsonPropertyName("itemRarity")] public int ItemRarity { get; set; } diff --git a/src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYPurchaseInventoryInsuranceRequest.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYPurchaseInventoryInsuranceRequest.cs new file mode 100644 index 0000000..608da97 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYPurchaseInventoryInsuranceRequest.cs @@ -0,0 +1,7 @@ +namespace Prospect.Server.Api.Services.CloudScript.Models.Data; + +public class FYPurchaseInventoryInsuranceRequest +{ + // m_insuranceId + // m_itemIds +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Models/CloudScript/Data/FYTimestamp.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYTimestamp.cs similarity index 68% rename from src/Prospect.Server.Api/Models/CloudScript/Data/FYTimestamp.cs rename to src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYTimestamp.cs index 026dafe..e6e4f11 100644 --- a/src/Prospect.Server.Api/Models/CloudScript/Data/FYTimestamp.cs +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYTimestamp.cs @@ -1,6 +1,6 @@ using System.Text.Json.Serialization; -namespace Prospect.Server.Api.Models.CloudScript.Data; +namespace Prospect.Server.Api.Services.CloudScript.Models.Data; public class FYTimestamp { diff --git a/src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYVivoxJoinTokenRequest.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYVivoxJoinTokenRequest.cs new file mode 100644 index 0000000..a6b41ba --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/Data/FYVivoxJoinTokenRequest.cs @@ -0,0 +1,18 @@ +using System.Text.Json.Serialization; + +namespace Prospect.Server.Api.Services.CloudScript.Models.Data; + +public class FYVivoxJoinTokenRequest +{ + [JsonPropertyName("userName")] + public string? Username { get; set; } + + [JsonPropertyName("channel")] + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public string? Channel { get; set; } + + // TODO: channelType + // TODO: hasText + // TODO: hasAudio + // TODO: channelId +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Models/FYBaseSocialRequest.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/FYBaseSocialRequest.cs new file mode 100644 index 0000000..5061940 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/FYBaseSocialRequest.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace Prospect.Server.Api.Services.CloudScript.Models; + +public class FYBaseSocialRequest +{ + [JsonPropertyName("targetPlayFabId")] + public string? TargetPlayFabId { get; set; } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Models/FYEmptyRequest.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/FYEmptyRequest.cs new file mode 100644 index 0000000..d0a2aad --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/FYEmptyRequest.cs @@ -0,0 +1,6 @@ +namespace Prospect.Server.Api.Services.CloudScript.Models; + +public class FYEmptyRequest +{ + +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Models/FYEnterMatchAzureFunction.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/FYEnterMatchAzureFunction.cs new file mode 100644 index 0000000..b19f698 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/FYEnterMatchAzureFunction.cs @@ -0,0 +1,28 @@ +using System.Text.Json.Serialization; +using Prospect.Server.Api.Services.CloudScript.Models.Data; + +namespace Prospect.Server.Api.Services.CloudScript.Models; + +public class FYEnterMatchAzureFunction +{ + [JsonPropertyName("optimalRegion")] + public string? OptimalRegion { get; set; } + + [JsonPropertyName("isMatch")] + public bool IsMatch { get; set; } + + [JsonPropertyName("bypassMaintenanceMode")] + public bool BypassMaintenanceMode { get; set; } + + [JsonPropertyName("debugOption")] + public string? DebugOption { get; set; } + + [JsonPropertyName("mapName")] + public string? MapName { get; set; } + + [JsonPropertyName("squad_id")] + public string? SquadId { get; set; } + + [JsonPropertyName("purchaseInventoryInsurances")] + public List? PurchaseInventoryInsurances { get; set; } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Models/FYEnterMatchAzureFunctionResult.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/FYEnterMatchAzureFunctionResult.cs new file mode 100644 index 0000000..63d3089 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/FYEnterMatchAzureFunctionResult.cs @@ -0,0 +1,30 @@ +using System.Text.Json.Serialization; + +namespace Prospect.Server.Api.Services.CloudScript.Models; + +public class FYEnterMatchAzureFunctionResult +{ + [JsonPropertyName("success")] + public bool Success { get; set; } + + [JsonPropertyName("address")] + public string? Address { get; set; } + + [JsonPropertyName("errorMessage")] + public string? ErrorMessage { get; set; } + + [JsonPropertyName("port")] + public int Port { get; set; } + + [JsonPropertyName("sharedIndex")] + public int ShardIndex { get; set; } + + [JsonPropertyName("singleplayerStation")] + public bool SingleplayerStation { get; set; } + + [JsonPropertyName("maintenanceMode")] + public bool MaintenanceMode { get; set; } + + [JsonPropertyName("sessionTimeJoinDelay")] + public float SessionTimeJoinDelay { get; set; } +} diff --git a/src/Prospect.Server.Api/Services/CloudScript/Models/FYGetCharacterVanityRequest.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/FYGetCharacterVanityRequest.cs new file mode 100644 index 0000000..26979b0 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/FYGetCharacterVanityRequest.cs @@ -0,0 +1,6 @@ +namespace Prospect.Server.Api.Services.CloudScript.Models; + +public class FYGetCharacterVanityRequest +{ + +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Models/FYGetCraftingInProgressDataRequest.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/FYGetCraftingInProgressDataRequest.cs new file mode 100644 index 0000000..3d5425c --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/FYGetCraftingInProgressDataRequest.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace Prospect.Server.Api.Services.CloudScript.Models; + +public class FYGetCraftingInProgressDataRequest +{ + [JsonPropertyName("userId")] + public string? UserId { get; set; } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Models/CloudScript/FYGetCraftingInProgressDataResult.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/FYGetCraftingInProgressDataResult.cs similarity index 70% rename from src/Prospect.Server.Api/Models/CloudScript/FYGetCraftingInProgressDataResult.cs rename to src/Prospect.Server.Api/Services/CloudScript/Models/FYGetCraftingInProgressDataResult.cs index eefaa5c..ac627c5 100644 --- a/src/Prospect.Server.Api/Models/CloudScript/FYGetCraftingInProgressDataResult.cs +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/FYGetCraftingInProgressDataResult.cs @@ -1,14 +1,14 @@ using System.Text.Json.Serialization; -using Prospect.Server.Api.Models.CloudScript.Data; +using Prospect.Server.Api.Services.CloudScript.Models.Data; -namespace Prospect.Server.Api.Models.CloudScript; +namespace Prospect.Server.Api.Services.CloudScript.Models; public class FYGetCraftingInProgressDataResult { [JsonPropertyName("userId")] public string UserId { get; set; } = null!; - - [JsonPropertyName("error")] + + [JsonPropertyName("error")] public string Error { get; set; } = null!; [JsonPropertyName("itemCurrentlyBeingCrafted")] diff --git a/src/Prospect.Server.Api/Services/CloudScript/Models/FYGetPlayerContractsRequest.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/FYGetPlayerContractsRequest.cs new file mode 100644 index 0000000..697663a --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/FYGetPlayerContractsRequest.cs @@ -0,0 +1,6 @@ +namespace Prospect.Server.Api.Services.CloudScript.Models; + +public class FYGetPlayerContractsRequest +{ + +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Models/CloudScript/FYGetPlayerContractsResult.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/FYGetPlayerContractsResult.cs similarity index 83% rename from src/Prospect.Server.Api/Models/CloudScript/FYGetPlayerContractsResult.cs rename to src/Prospect.Server.Api/Services/CloudScript/Models/FYGetPlayerContractsResult.cs index f443b75..536ea0b 100644 --- a/src/Prospect.Server.Api/Models/CloudScript/FYGetPlayerContractsResult.cs +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/FYGetPlayerContractsResult.cs @@ -1,7 +1,7 @@ using System.Text.Json.Serialization; -using Prospect.Server.Api.Models.CloudScript.Data; +using Prospect.Server.Api.Services.CloudScript.Models.Data; -namespace Prospect.Server.Api.Models.CloudScript; +namespace Prospect.Server.Api.Services.CloudScript.Models; public class FYGetPlayerContractsResult { diff --git a/src/Prospect.Server.Api/Services/CloudScript/Models/FYGetPlayersInventoriesLimitsRequest.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/FYGetPlayersInventoriesLimitsRequest.cs new file mode 100644 index 0000000..d76dfea --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/FYGetPlayersInventoriesLimitsRequest.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace Prospect.Server.Api.Services.CloudScript.Models; + +public class FYGetPlayersInventoriesLimitsRequest +{ + [JsonPropertyName("userIds")] + public List? UserIds { get; set; } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Models/FYGetPlayersSets.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/FYGetPlayersSets.cs new file mode 100644 index 0000000..4feced1 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/FYGetPlayersSets.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace Prospect.Server.Api.Services.CloudScript.Models; + +public class FYGetPlayersSets +{ + [JsonPropertyName("userIds")] + public List? UserIds { get; set; } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Models/FYGetSignalRConnection.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/FYGetSignalRConnection.cs new file mode 100644 index 0000000..5a4d21c --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/FYGetSignalRConnection.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace Prospect.Server.Api.Services.CloudScript.Models; + +public class FYGetSignalRConnection +{ + [JsonPropertyName("userId")] + public string UserId { get; set; } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Models/FYGetSignalRConnectionResult.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/FYGetSignalRConnectionResult.cs new file mode 100644 index 0000000..a1f56bb --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/FYGetSignalRConnectionResult.cs @@ -0,0 +1,12 @@ +using System.Text.Json.Serialization; + +namespace Prospect.Server.Api.Services.CloudScript.Models; + +public class FYGetSignalRConnectionResult +{ + [JsonPropertyName("url")] + public string Url { get; set; } = null!; + + [JsonPropertyName("accessToken")] + public string AccessToken { get; set; } = null!; +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Models/FYMaintenanceModeState.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/FYMaintenanceModeState.cs new file mode 100644 index 0000000..eb61ecc --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/FYMaintenanceModeState.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace Prospect.Server.Api.Services.CloudScript.Models; + +public class FYMaintenanceModeState +{ + [JsonPropertyName("bypassMaintenanceMode")] + public bool BypassMaintenanceMode { get; set; } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Models/FYQueryFactionProgressionRequest.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/FYQueryFactionProgressionRequest.cs new file mode 100644 index 0000000..7c77cc8 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/FYQueryFactionProgressionRequest.cs @@ -0,0 +1,6 @@ +namespace Prospect.Server.Api.Services.CloudScript.Models; + +public class FYQueryFactionProgressionRequest +{ + +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Models/FYRequestMaintenanceModeStateResult.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/FYRequestMaintenanceModeStateResult.cs new file mode 100644 index 0000000..424c243 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/FYRequestMaintenanceModeStateResult.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace Prospect.Server.Api.Services.CloudScript.Models; + +public class FYRequestMaintenanceModeStateResult +{ + [JsonPropertyName("enabled")] + public bool Enabled { get; set; } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Models/FYRetentionBonusRequest.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/FYRetentionBonusRequest.cs new file mode 100644 index 0000000..58a4d38 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/FYRetentionBonusRequest.cs @@ -0,0 +1,6 @@ +namespace Prospect.Server.Api.Services.CloudScript.Models; + +public class FYRetentionBonusRequest +{ + +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Models/FYSetAllowJoinRequest.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/FYSetAllowJoinRequest.cs new file mode 100644 index 0000000..a0d9d2e --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/FYSetAllowJoinRequest.cs @@ -0,0 +1,12 @@ +using System.Text.Json.Serialization; + +namespace Prospect.Server.Api.Services.CloudScript.Models; + +public class FYSetAllowJoinRequest +{ + [JsonPropertyName("sessionId")] + public string? SessionId { get; set; } + + [JsonPropertyName("allowJoin")] + public bool AllowJoin { get; set; } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Models/FYUpdatePlayerPresenceStateRequest.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/FYUpdatePlayerPresenceStateRequest.cs new file mode 100644 index 0000000..52f90ba --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/FYUpdatePlayerPresenceStateRequest.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace Prospect.Server.Api.Services.CloudScript.Models; + +public class FYUpdatePlayerPresenceStateRequest +{ + [JsonPropertyName("inMatch")] + public bool InMatch { get; set; } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Models/FYVivoxJoinData.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/FYVivoxJoinData.cs new file mode 100644 index 0000000..0fef03c --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/FYVivoxJoinData.cs @@ -0,0 +1,15 @@ +using System.Text.Json.Serialization; +using Prospect.Server.Api.Services.CloudScript.Models.Data; + +namespace Prospect.Server.Api.Services.CloudScript.Models; + +public class FYVivoxJoinData +{ + [JsonPropertyName("request")] + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public FYVivoxJoinTokenRequest? Request { get; set; } + + [JsonPropertyName("token")] + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public string? Token { get; set; } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Models/FYVivoxLoginTokenRequest.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/FYVivoxLoginTokenRequest.cs new file mode 100644 index 0000000..dcf0bf5 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/FYVivoxLoginTokenRequest.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace Prospect.Server.Api.Services.CloudScript.Models; + +public class FYVivoxLoginTokenRequest +{ + [JsonPropertyName("username")] + public string? Username { get; set; } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Services/CloudScript/Models/FYVivoxSettingsData.cs b/src/Prospect.Server.Api/Services/CloudScript/Models/FYVivoxSettingsData.cs new file mode 100644 index 0000000..c0d4c4a --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Models/FYVivoxSettingsData.cs @@ -0,0 +1,15 @@ +using System.Text.Json.Serialization; + +namespace Prospect.Server.Api.Services.CloudScript.Models; + +public class FYVivoxSettingsData +{ + [JsonPropertyName("vivoxServer")] + public string? VivoxServer { get; set; } + + [JsonPropertyName("vivoxDomain")] + public string? VivoxDomain { get; set; } + + [JsonPropertyName("vivoxIssuer")] + public string? VivoxIssuer { get; set; } +} \ No newline at end of file diff --git a/src/Prospect.Server.Api/Startup.cs b/src/Prospect.Server.Api/Startup.cs index 7c8c966..08e1de1 100644 --- a/src/Prospect.Server.Api/Startup.cs +++ b/src/Prospect.Server.Api/Startup.cs @@ -1,7 +1,9 @@ using Prospect.Server.Api.Config; using Prospect.Server.Api.Converters; +using Prospect.Server.Api.Hubs; using Prospect.Server.Api.Middleware; using Prospect.Server.Api.Services.Auth; +using Prospect.Server.Api.Services.CloudScript; using Prospect.Server.Api.Services.Database; using Prospect.Server.Api.Services.Qos; using Prospect.Server.Api.Services.UserData; @@ -35,6 +37,9 @@ public class Startup services.AddHostedService(); services.AddSingleton(); + + services.AddScoped(); + services.AddSingleton(); services.AddAuthentication(_ => { @@ -42,7 +47,11 @@ public class Startup }) .AddUserAuthentication(_ => {}) .AddEntityAuthentication(_ => {}); - + + services.AddHttpContextAccessor(); + + services.AddSignalR(); + services.AddControllers().AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new DateTimeConverter()); @@ -64,6 +73,7 @@ public class Startup app.UseEndpoints(endpoints => { endpoints.MapControllers(); + endpoints.MapHub("/signalr"); }); } } \ No newline at end of file