Files
the-cycle/src/Prospect.Server.Api/Services/CloudScript/Functions/RequestMissionCompleted.cs
T
2025-03-25 20:06:35 +02:00

127 lines
6.4 KiB
C#

using System.Text.Json;
using System.Text.Json.Serialization;
using Prospect.Server.Api.Models.Data;
using Prospect.Server.Api.Services.Auth.Extensions;
using Prospect.Server.Api.Services.UserData;
namespace Prospect.Server.Api.Services.CloudScript.Functions;
public class FYRequestMissionCompletedRequest {
[JsonPropertyName("currentMissionId")]
public string CurrentMissionID { get; set; }
}
public class FYRequestMissionCompletedResult {
[JsonPropertyName("userId")]
public string UserID { get; set; }
[JsonPropertyName("currentMissionId")]
public string CurrentMissionID { get; set; }
[JsonPropertyName("rewards")]
public List<FYCustomItemInfo> Rewards { get; set; }
[JsonPropertyName("updatedCurrencies")]
public FYCurrencyItem[] UpdatedCurrencies { get; set; }
[JsonPropertyName("progress")]
public int Progress { get; set; }
}
[CloudScriptFunction("RequestMissionCompleted")]
public class RequestMissionCompleted : ICloudScriptFunction<FYRequestMissionCompletedRequest, FYRequestMissionCompletedResult>
{
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly UserDataService _userDataService;
private readonly TitleDataService _titleDataService;
public RequestMissionCompleted(IHttpContextAccessor httpContextAccessor, UserDataService userDataService, TitleDataService titleDataService)
{
_httpContextAccessor = httpContextAccessor;
_userDataService = userDataService;
_titleDataService = titleDataService;
}
public async Task<FYRequestMissionCompletedResult> ExecuteAsync(FYRequestMissionCompletedRequest request)
{
var context = _httpContextAccessor.HttpContext;
if (context == null)
{
throw new CloudScriptException("CloudScript was not called within a http request");
}
var userId = context.User.FindAuthUserId();
var userData = await _userDataService.FindAsync(userId, userId, new List<string>{"OnboardingProgression", "Inventory", "Balance"});
var onboardingMission = JsonSerializer.Deserialize<OnboardingMission>(userData["OnboardingProgression"].Value);
var inventory = JsonSerializer.Deserialize<List<FYCustomItemInfo>>(userData["Inventory"].Value);
var titleData = _titleDataService.Find(new List<string>{"OnboardingMissions", "OnboardingRewardMissions", "Blueprints"});
var rewards = JsonSerializer.Deserialize<Dictionary<string, TitleDataMissionRewardInfo>>(titleData["OnboardingRewardMissions"]);
var blueprints = JsonSerializer.Deserialize<Dictionary<string, TitleDataBlueprintInfo>>(titleData["Blueprints"]);
var missions = JsonSerializer.Deserialize<Dictionary<string, TitleDataMissionInfo>>(titleData["OnboardingMissions"]);
var balance = JsonSerializer.Deserialize<PlayerBalance>(userData["Balance"].Value);
var currentMission = missions[onboardingMission.CurrentMissionID];
var missionRewardId = currentMission.OnboardingRewards.RowName;
var nextMissionId = currentMission.NextMissionRowHandle.RowName;
onboardingMission.CurrentMissionID = nextMissionId;
onboardingMission.Progress = 0;
List<FYCustomItemInfo> rewardedItems = new List<FYCustomItemInfo>();
List<FYCurrencyItem> changedCurrencies = [];
if (rewards.ContainsKey(missionRewardId)) {
var missionRewards = rewards[missionRewardId].RewardEntries;
foreach (var reward in missionRewards) {
if (reward.RewardRowHandle.RowName == "SoftCurrency") {
balance.SoftCurrency += reward.RewardAmount;
changedCurrencies.Add(new FYCurrencyItem { CurrencyName = "SoftCurrency", Amount = balance.SoftCurrency });
} else if (reward.RewardRowHandle.RowName == "Aurum") {
balance.HardCurrency += reward.RewardAmount;
changedCurrencies.Add(new FYCurrencyItem { CurrencyName = "Aurum", Amount = balance.HardCurrency });
} else if (reward.RewardRowHandle.RowName == "InsuranceCurrency") {
balance.InsuranceCurrency += reward.RewardAmount;
changedCurrencies.Add(new FYCurrencyItem { CurrencyName = "InsuranceCurrency", Amount = balance.InsuranceCurrency });
} else {
// TODO: Inventory limit check
var blueprintData = blueprints[reward.RewardRowHandle.RowName];
var remainingAmount = reward.RewardAmount * blueprintData.AmountPerPurchase;
while (remainingAmount > 0) {
var itemStackAmount = Math.Min(blueprintData.MaxAmountPerStack, remainingAmount);
// TODO: Mission rewards are probably already given in stacks
var itemInfo = new FYCustomItemInfo{
ItemId = Guid.NewGuid().ToString(),
Amount = itemStackAmount,
BaseItemId = reward.RewardRowHandle.RowName,
Durability = blueprintData.DurabilityMax,
Insurance = "",
InsuranceOwnerPlayfabId = "",
ModData = new FYModItems { M = [] },
Origin = new FYItemOriginBackend { G = "", P = "", T = "" },
InsuredAttachmentId = "",
PrimaryVanityId = 0,
SecondaryVanityId = 0,
RolledPerks = [],
};
inventory.Add(itemInfo);
rewardedItems.Add(itemInfo);
remainingAmount -= itemStackAmount;
}
}
}
}
await _userDataService.UpdateAsync(
userId, userId,
new Dictionary<string, string>{
["OnboardingProgression"] = JsonSerializer.Serialize(onboardingMission),
["Inventory"] = JsonSerializer.Serialize(inventory),
["Balance"] = JsonSerializer.Serialize(balance),
}
);
return new FYRequestMissionCompletedResult
{
UserID = userId,
CurrentMissionID = nextMissionId,
Rewards = rewardedItems,
UpdatedCurrencies = changedCurrencies.ToArray(),
Progress = 0
};
}
}