using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Http; using System.Reflection; using System.Threading.Tasks; using AutoMapper; using AutoMapper.QueryableExtensions; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using TOOHUCardAPI.Data; using TOOHUCardAPI.Data.Models; using TOOHUCardAPI.Data.Repositories; using TOOHUCardAPI.Data.Services; using TOOHUCardAPI.DTO; using TOOHUCardAPI.DTO.PlayerData; namespace TOOHUCardAPI.Controllers { [Route("api/[controller]")] [ApiController] public class PlayerDataController : MethodBasedController { private readonly ILogger _logger; private readonly UserRepository _userRepository; private readonly IMapper _mapper; private readonly StoreService _storeService; public PlayerDataController(ILogger logger, UserRepository userRepository, IMapper mapper, StoreService storeService) { _logger = logger; _userRepository = userRepository; _mapper = mapper; _storeService = storeService; } [EndpointHandler("save_card_level")] private async Task SaveCardLevel(string body) { PlayerDataSaveCardLevelRequest request = JsonConvert.DeserializeObject(body); int totalCost = await _storeService.LevelUpCard(request.SteamId, request.CardItemCode, request.LevelIncrease); return Ok(new PlayerDataSaveCardLevelResponse { TotalCost = totalCost }); } [EndpointHandler("day_first_win")] private async Task GiveFirstWin(string body) { PlayerDataFirstWinRequest request = JsonConvert.DeserializeObject(body); var bonusPoints = await _storeService.GiveFirstWinBonus(request.SteamId); return Ok(new PlayerDataFirstWinResponse { BonusPoints = bonusPoints }); } [EndpointHandler("save_key_count")] private async Task SaveKeyCount(string body) { PlayerDataSaveKeyCountRequest request = JsonConvert.DeserializeObject(body); User user = await _userRepository.GetUser(request.SteamId); if (user == null) { throw new InvalidUserException(); } user.KeyTotal = request.KeyTotal; user.KeyUseCount = request.KeyUseCount; await _userRepository.UpdateUser(user); return Ok(new OkResponse()); } [EndpointHandler("buy_key")] private async Task BuyMagicKey(string body) { PlayerDataBuyMagicKeyRequest request = JsonConvert.DeserializeObject(body); var totalCost = await _storeService.PurchaseMagicKey(request.Count, request.SteamId); return Ok(new PlayerDataBuyMagicKeyResponse { TotalCost = totalCost }); } [EndpointHandler("save_card_group")] private async Task SaveCardGroup(string body) { PlayerDataSaveCardGroupRequest request = JsonConvert.DeserializeObject(body); User user = await _userRepository.GetUser(request.SteamId); if (user == null) { throw new InvalidUserException(); } EncodedCardGroup group = user.EncodedCardGroups.FirstOrDefault(group => group.GroupKey == request.GroupKey) ?? new EncodedCardGroup() { GroupKey = request.GroupKey }; group.EncodedString = request.GroupData; user.EncodedCardGroups = user.EncodedCardGroups.Where(group2 => group.Id != group2.Id).Append(group).ToList(); await _userRepository.UpdateUser(user); return Ok(new OkResponse()); } [EndpointHandler("get")] private async Task Get(string body) { PlayerDataGetRequestObject requestObject = JsonConvert.DeserializeObject(body); IEnumerable users = await Task.WhenAll(requestObject.Ids.Values.Select(val => _userRepository.GetOrCreateUser(val))); IEnumerable queriedUserSteamIds = requestObject.Ids.Select(i => i.Value); IEnumerable responsePlayers = users .Where(user => queriedUserSteamIds.Contains(user.SteamId)) .Select(user => user.ToGetResponse(_mapper)); Dictionary playersStatic = requestObject.Ids .Select(pair => KeyValuePair.Create(pair.Key, responsePlayers.FirstOrDefault(resp => resp.SteamId == pair.Value))) .ToDictionary(kv => kv.Key, kv => kv.Value); Dictionary> dynamicResponses = playersStatic .Select(kv => { var obj = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(kv.Value)); return KeyValuePair.Create(kv.Key, obj); }) .ToDictionary(kv => kv.Key, kv => kv.Value); foreach (var kv in dynamicResponses) { var props = kv.Value; var user = users.FirstOrDefault(user1 => user1.SteamId == requestObject.Ids[kv.Key]); foreach (var cardgroup in user.EncodedCardGroups ?? new List()) { props[$"{cardgroup.GroupKey}"] = cardgroup.EncodedString; } } PlayerDataGetResponseObject response = new PlayerDataGetResponseObject() { Players = dynamicResponses }; return Ok(response); } } }