rank endpoint done

This commit is contained in:
2021-11-07 14:00:18 -05:00
parent e232accdb1
commit e14f7fae74
18 changed files with 2536 additions and 25 deletions

View File

@@ -40,6 +40,14 @@ namespace TOOHUCardAPI.Controllers
return Ok(new OkResponse()); return Ok(new OkResponse());
} }
[EndpointHandler("reset")]
private async Task<IActionResult> ResetRank(string body)
{
RankDataResetRequest request = JsonConvert.DeserializeObject<RankDataResetRequest>(body);
await _rankService.ResetRank(request.SteamId, RankTypeExtensions.ParseRankType(request.RankType));
return Ok(new OkResponse());
}
[HttpGet] [HttpGet]
public async Task<IActionResult> GetRankData(string rank_type) public async Task<IActionResult> GetRankData(string rank_type)
{ {

View File

@@ -1,7 +1,10 @@
using Newtonsoft.Json;
namespace TOOHUCardAPI.DTO.RankData namespace TOOHUCardAPI.DTO.RankData
{ {
public class RankDataResetRequest: AbstractPlayerTargetedRequest public class RankDataResetRequest: AbstractPlayerTargetedRequest
{ {
[JsonProperty("rank_type")]
public string RankType { get; set; }
} }
} }

View File

@@ -36,8 +36,8 @@ namespace TOOHUCardAPI.DTO.RankData
{ {
RankType = ((char) rankEntry.RankType).ToString(), RankType = ((char) rankEntry.RankType).ToString(),
SteamId = rankEntry.User.SteamId, SteamId = rankEntry.User.SteamId,
UserId = rankEntry.AccountId, UserId = rankEntry.User.AccountId,
Username = rankEntry.Username, Username = rankEntry.User.Username,
Version = rankEntry.Version, Version = rankEntry.Version,
Wave = rankEntry.Wave, Wave = rankEntry.Wave,
Damage = rankEntry.Damage, Damage = rankEntry.Damage,

View File

@@ -14,6 +14,7 @@ namespace TOOHUCardAPI.Data
public static int MaxKeyPurchaseAmount { get; set; } public static int MaxKeyPurchaseAmount { get; set; }
public static string StarterDeckGroupKey { get; set; } public static string StarterDeckGroupKey { get; set; }
public static string StarterDeckGroupData { get; set; } public static string StarterDeckGroupData { get; set; }
public static int DefaultRankBonus { get; set; }
public static void Init(IConfiguration configuration) public static void Init(IConfiguration configuration)
{ {
var fields = typeof(AppSettings).GetProperties(); var fields = typeof(AppSettings).GetProperties();

View File

@@ -10,5 +10,6 @@ namespace TOOHUCardAPI.Data.Models
public int Id { get; set; } public int Id { get; set; }
public string GroupKey { get; set; } public string GroupKey { get; set; }
public string EncodedString { get; set; } public string EncodedString { get; set; }
public long UserSteamId { get; set; }
} }
} }

View File

@@ -12,9 +12,7 @@ namespace TOOHUCardAPI.Data.Models
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; } public int Id { get; set; }
public RankType RankType { get; set; } public RankType RankType { get; set; }
public string Username { get; set; }
public User User { get; set; } public User User { get; set; }
public long AccountId { get; set; }
public string Version { get; set; } public string Version { get; set; }
public int Wave { get; set; } public int Wave { get; set; }
public float Damage { get; set; } public float Damage { get; set; }

View File

@@ -11,5 +11,6 @@ namespace TOOHUCardAPI.Data.Models
public int Id { get; set; } public int Id { get; set; }
public string TowerKey { get; set; } public string TowerKey { get; set; }
public string EncodedData { get; set; } public string EncodedData { get; set; }
public int RankEntryId { get; set; }
} }
} }

View File

@@ -23,6 +23,8 @@ namespace TOOHUCardAPI.Data.Models
public int PowerMaxTotal { get; set; } public int PowerMaxTotal { get; set; }
public string PetModel { get; set; } public string PetModel { get; set; }
public string PetEffect { get; set; } public string PetEffect { get; set; }
public string Username { get; set; }
public long AccountId { get; set; }
public List<EncodedCardGroup> EncodedCardGroups { get; set; } public List<EncodedCardGroup> EncodedCardGroups { get; set; }
public List<CardLevel> CardLevels { get; set; } public List<CardLevel> CardLevels { get; set; }
} }

View File

@@ -27,12 +27,25 @@ namespace TOOHUCardAPI.Data.Repositories
public async Task<IEnumerable<RankEntry>> GetRankEntries(RankType rankType) public async Task<IEnumerable<RankEntry>> GetRankEntries(RankType rankType)
{ {
return await AllIncluded().Where(i => i.RankType == rankType).ToListAsync(); return await AllIncluded().Where(i => i.RankType == rankType).OrderByDescending(i => i.Wave).ThenByDescending(i => i.Damage).ToListAsync();
} }
public async Task InsertRankEntry(RankEntry entry) public async Task<RankEntry> GetRankEntry(long steamid, RankType rankType)
{ {
await _appDbContext.RankEntries.AddAsync(entry); return await AllIncluded().Where(i => i.User.SteamId == steamid && i.RankType == rankType).FirstOrDefaultAsync();
}
public async Task<RankEntry> InsertRankEntry(RankEntry entry)
{
var newEntry = await _appDbContext.RankEntries.AddAsync(entry);
await _appDbContext.SaveChangesAsync();
return newEntry.Entity;
}
public async Task DeleteRankEntry(RankEntry entry)
{
entry.TowersUsed.Clear();
_appDbContext.RankEntries.Remove(entry);
await _appDbContext.SaveChangesAsync(); await _appDbContext.SaveChangesAsync();
} }
} }

View File

@@ -15,12 +15,42 @@ namespace TOOHUCardAPI.Data.Services
private readonly ILogger<RankService> _logger; private readonly ILogger<RankService> _logger;
private readonly RankRepository _rankRepository; private readonly RankRepository _rankRepository;
private readonly UserRepository _userRepository; private readonly UserRepository _userRepository;
private readonly UserService _userService;
private readonly StoreService _storeService;
public RankService(ILogger<RankService> logger, RankRepository rankRepository, UserRepository userRepository) public RankService(ILogger<RankService> logger, RankRepository rankRepository, UserRepository userRepository, UserService userService, StoreService storeService)
{ {
_logger = logger; _logger = logger;
_rankRepository = rankRepository; _rankRepository = rankRepository;
_userRepository = userRepository; _userRepository = userRepository;
_userService = userService;
_storeService = storeService;
}
private async Task AwardPointsForEntry(long steamid, RankEntry entry, List<RankEntry> allEntries)
{
int bonus = AppSettings.DefaultRankBonus;
int index = allEntries.FindIndex(i => i.Id == entry.Id)+1;
switch (index)
{
case <= 4:
bonus = 500 - (index - 1) * 100;
break;
case <= 9:
bonus = 170 - (index - 5) * 10;
break;
case <=15:
bonus = 125 - (index - 10) * 5;
break;
case <= 25:
bonus = 96 - (index - 16) * 4;
break;
case <= 50:
bonus = 58 - (index - 26) * 2;
break;
}
await _storeService.AwardPoints(steamid, bonus, $"reached rank index {index}");
} }
public async Task<List<RankEntryDTO>> GetRankEntries(RankType rankType) public async Task<List<RankEntryDTO>> GetRankEntries(RankType rankType)
@@ -40,17 +70,26 @@ namespace TOOHUCardAPI.Data.Services
RankEntry toUpload = new RankEntry RankEntry toUpload = new RankEntry
{ {
RankType = RankTypeExtensions.ParseRankType(entry.RankType), RankType = RankTypeExtensions.ParseRankType(entry.RankType),
Username = entry.Username,
User = await _userRepository.GetUser(entry.SteamId), User = await _userRepository.GetUser(entry.SteamId),
AccountId = entry.UserId,
Version = entry.Version, Version = entry.Version,
Wave = entry.Wave, Wave = entry.Wave,
Damage = entry.Damage, Damage = entry.Damage,
TowersUsed = towersUsed, TowersUsed = towersUsed,
UpdateTime = DateTime.Now UpdateTime = DateTime.Now
}; };
await _rankRepository.InsertRankEntry(toUpload); toUpload = await _rankRepository.InsertRankEntry(toUpload);
_logger.LogInformation("Uploaded a rank entry for {SteamId}", entry.SteamId); List<RankEntry> allEntries = (await _rankRepository.GetRankEntries(toUpload.RankType)).ToList();
await _userService.UpdateUserAccountDetails(entry.SteamId, entry.UserId, entry.Username);
await _userService.UpdateUserMaxWave(entry.SteamId, entry.Wave, toUpload.RankType);
await AwardPointsForEntry(entry.SteamId, toUpload, allEntries);
_logger.LogInformation("Uploaded a rank entry for {SteamId} on ranking type {RankType}", entry.SteamId, toUpload.RankType.ToString());
}
public async Task ResetRank(long steamid, RankType rankType)
{
RankEntry entry = await _rankRepository.GetRankEntry(steamid, rankType);
await _rankRepository.DeleteRankEntry(entry);
_logger.LogInformation("Reset rank entry for {SteamId} on ranking type {RankType}", steamid, rankType.ToString());
} }
} }
} }

View File

@@ -29,6 +29,13 @@ namespace TOOHUCardAPI.Data.Services
_logger.LogInformation("User with steamid {SteamId} was given {PointsGiven} points. New total: {PointsTotal}", user.SteamId, points, user.Point); _logger.LogInformation("User with steamid {SteamId} was given {PointsGiven} points. New total: {PointsTotal}", user.SteamId, points, user.Point);
} }
public async Task AwardPoints(long steamid, int points, string reason)
{
User user = await _userRepository.GetUser(steamid);
await AddPoints(points, user);
_logger.LogInformation("awarded {Points} points to {SteamId} for reason [\"{reason}\"]", points, steamid, reason);
}
public async Task<User> SaveKeyTotal(long steamId, int keyTotal, int keyUseCount) public async Task<User> SaveKeyTotal(long steamId, int keyTotal, int keyUseCount)
{ {
User user = await _userRepository.GetUser(steamId); User user = await _userRepository.GetUser(steamId);

View File

@@ -2,6 +2,7 @@ using System;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using TOOHUCardAPI.Data.Enums;
using TOOHUCardAPI.Data.Models; using TOOHUCardAPI.Data.Models;
using TOOHUCardAPI.Data.Repositories; using TOOHUCardAPI.Data.Repositories;
@@ -61,5 +62,31 @@ namespace TOOHUCardAPI.Data.Services
await _userRepository.UpdateUser(user); await _userRepository.UpdateUser(user);
_logger.LogInformation("User {SteamId} saved new pet data with model: {PetModel} and effect {PetEffect}", user.SteamId, petModel, petEffect); _logger.LogInformation("User {SteamId} saved new pet data with model: {PetModel} and effect {PetEffect}", user.SteamId, petModel, petEffect);
} }
public async Task UpdateUserAccountDetails(long steamid, long newAccountId, string newUsername)
{
User user = await _userRepository.GetUser(steamid);
user.AccountId = newAccountId;
user.Username = newUsername;
await _userRepository.UpdateUser(user);
}
public async Task UpdateUserMaxWave(long steamid, int wave, RankType rankType)
{
User user = await _userRepository.GetUser(steamid);
switch (rankType)
{
case RankType.Single:
user.MaxWave = Math.Max(wave, user.MaxWave);
break;
case RankType.Team:
user.MaxTeamWave = Math.Max(wave, user.MaxTeamWave);
break;
default:
throw new ArgumentOutOfRangeException(nameof(rankType), rankType, null);
}
await _userRepository.UpdateUser(user);
}
} }
} }

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,71 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace TOOHUCardAPI.Migrations
{
public partial class newfields : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "AccountId",
table: "RankEntries");
migrationBuilder.DropColumn(
name: "Username",
table: "RankEntries");
migrationBuilder.AddColumn<long>(
name: "AccountId",
table: "Users",
type: "bigint",
nullable: false,
defaultValue: 0L);
migrationBuilder.AddColumn<string>(
name: "Username",
table: "Users",
type: "text",
nullable: true);
migrationBuilder.AlterColumn<float>(
name: "Damage",
table: "RankEntries",
type: "real",
nullable: false,
oldClrType: typeof(long),
oldType: "bigint");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "AccountId",
table: "Users");
migrationBuilder.DropColumn(
name: "Username",
table: "Users");
migrationBuilder.AlterColumn<long>(
name: "Damage",
table: "RankEntries",
type: "bigint",
nullable: false,
oldClrType: typeof(float),
oldType: "real");
migrationBuilder.AddColumn<long>(
name: "AccountId",
table: "RankEntries",
type: "bigint",
nullable: false,
defaultValue: 0L);
migrationBuilder.AddColumn<string>(
name: "Username",
table: "RankEntries",
type: "text",
nullable: true);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,97 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace TOOHUCardAPI.Migrations
{
public partial class cascadedeletechildren : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_EncodedCardGroup_Users_UserSteamId",
table: "EncodedCardGroup");
migrationBuilder.DropForeignKey(
name: "FK_RankTowerEntry_RankEntries_RankEntryId",
table: "RankTowerEntry");
migrationBuilder.AlterColumn<int>(
name: "RankEntryId",
table: "RankTowerEntry",
type: "integer",
nullable: false,
defaultValue: 0,
oldClrType: typeof(int),
oldType: "integer",
oldNullable: true);
migrationBuilder.AlterColumn<long>(
name: "UserSteamId",
table: "EncodedCardGroup",
type: "bigint",
nullable: false,
defaultValue: 0L,
oldClrType: typeof(long),
oldType: "bigint",
oldNullable: true);
migrationBuilder.AddForeignKey(
name: "FK_EncodedCardGroup_Users_UserSteamId",
table: "EncodedCardGroup",
column: "UserSteamId",
principalTable: "Users",
principalColumn: "SteamId",
onDelete: ReferentialAction.Cascade);
migrationBuilder.AddForeignKey(
name: "FK_RankTowerEntry_RankEntries_RankEntryId",
table: "RankTowerEntry",
column: "RankEntryId",
principalTable: "RankEntries",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_EncodedCardGroup_Users_UserSteamId",
table: "EncodedCardGroup");
migrationBuilder.DropForeignKey(
name: "FK_RankTowerEntry_RankEntries_RankEntryId",
table: "RankTowerEntry");
migrationBuilder.AlterColumn<int>(
name: "RankEntryId",
table: "RankTowerEntry",
type: "integer",
nullable: true,
oldClrType: typeof(int),
oldType: "integer");
migrationBuilder.AlterColumn<long>(
name: "UserSteamId",
table: "EncodedCardGroup",
type: "bigint",
nullable: true,
oldClrType: typeof(long),
oldType: "bigint");
migrationBuilder.AddForeignKey(
name: "FK_EncodedCardGroup_Users_UserSteamId",
table: "EncodedCardGroup",
column: "UserSteamId",
principalTable: "Users",
principalColumn: "SteamId",
onDelete: ReferentialAction.Restrict);
migrationBuilder.AddForeignKey(
name: "FK_RankTowerEntry_RankEntries_RankEntryId",
table: "RankTowerEntry",
column: "RankEntryId",
principalTable: "RankEntries",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
}
}
}

View File

@@ -930,7 +930,7 @@ namespace TOOHUCardAPI.Migrations
b.Property<string>("GroupKey") b.Property<string>("GroupKey")
.HasColumnType("text"); .HasColumnType("text");
b.Property<long?>("UserSteamId") b.Property<long>("UserSteamId")
.HasColumnType("bigint"); .HasColumnType("bigint");
b.HasKey("Id"); b.HasKey("Id");
@@ -947,11 +947,8 @@ namespace TOOHUCardAPI.Migrations
.HasColumnType("integer") .HasColumnType("integer")
.HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
b.Property<long>("AccountId") b.Property<float>("Damage")
.HasColumnType("bigint"); .HasColumnType("real");
b.Property<long>("Damage")
.HasColumnType("bigint");
b.Property<int>("RankType") b.Property<int>("RankType")
.HasColumnType("integer"); .HasColumnType("integer");
@@ -962,9 +959,6 @@ namespace TOOHUCardAPI.Migrations
b.Property<long?>("UserSteamId") b.Property<long?>("UserSteamId")
.HasColumnType("bigint"); .HasColumnType("bigint");
b.Property<string>("Username")
.HasColumnType("text");
b.Property<string>("Version") b.Property<string>("Version")
.HasColumnType("text"); .HasColumnType("text");
@@ -988,7 +982,7 @@ namespace TOOHUCardAPI.Migrations
b.Property<string>("EncodedData") b.Property<string>("EncodedData")
.HasColumnType("text"); .HasColumnType("text");
b.Property<int?>("RankEntryId") b.Property<int>("RankEntryId")
.HasColumnType("integer"); .HasColumnType("integer");
b.Property<string>("TowerKey") b.Property<string>("TowerKey")
@@ -1008,6 +1002,9 @@ namespace TOOHUCardAPI.Migrations
.HasColumnType("bigint") .HasColumnType("bigint")
.HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
b.Property<long>("AccountId")
.HasColumnType("bigint");
b.Property<bool>("Ban") b.Property<bool>("Ban")
.HasColumnType("boolean"); .HasColumnType("boolean");
@@ -1050,6 +1047,9 @@ namespace TOOHUCardAPI.Migrations
b.Property<int>("PowerMaxTotal") b.Property<int>("PowerMaxTotal")
.HasColumnType("integer"); .HasColumnType("integer");
b.Property<string>("Username")
.HasColumnType("text");
b.Property<bool>("Vip") b.Property<bool>("Vip")
.HasColumnType("boolean"); .HasColumnType("boolean");
@@ -1079,7 +1079,9 @@ namespace TOOHUCardAPI.Migrations
{ {
b.HasOne("TOOHUCardAPI.Data.Models.User", null) b.HasOne("TOOHUCardAPI.Data.Models.User", null)
.WithMany("EncodedCardGroups") .WithMany("EncodedCardGroups")
.HasForeignKey("UserSteamId"); .HasForeignKey("UserSteamId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
}); });
modelBuilder.Entity("TOOHUCardAPI.Data.Models.RankEntry", b => modelBuilder.Entity("TOOHUCardAPI.Data.Models.RankEntry", b =>
@@ -1095,7 +1097,9 @@ namespace TOOHUCardAPI.Migrations
{ {
b.HasOne("TOOHUCardAPI.Data.Models.RankEntry", null) b.HasOne("TOOHUCardAPI.Data.Models.RankEntry", null)
.WithMany("TowersUsed") .WithMany("TowersUsed")
.HasForeignKey("RankEntryId"); .HasForeignKey("RankEntryId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
}); });
modelBuilder.Entity("TOOHUCardAPI.Data.Models.RankEntry", b => modelBuilder.Entity("TOOHUCardAPI.Data.Models.RankEntry", b =>

View File

@@ -18,6 +18,7 @@
"FirstWinBonusPointsMax": "5", "FirstWinBonusPointsMax": "5",
"DailyKeyBonus": "2", "DailyKeyBonus": "2",
"MaxKeyPurchaseAmount": "200", "MaxKeyPurchaseAmount": "200",
"DefaultRankBonus": "10",
"StarterDeckGroupKey": "cardgroup1", "StarterDeckGroupKey": "cardgroup1",
"StarterDeckGroupData": "48616B7572656920536872696E65#00022#00202#00045#20054#20172#00362#00055#00212#00075#00065#00085#00154#00242#00173#00163#20122#20194#00093#00312#00272#00262#20064#20132#00192#00282#00113#00012#00032#20104#00333#00103#20164" "StarterDeckGroupData": "48616B7572656920536872696E65#00022#00202#00045#20054#20172#00362#00055#00212#00075#00065#00085#00154#00242#00173#00163#20122#20194#00093#00312#00272#00262#20064#20132#00192#00282#00113#00012#00032#20104#00333#00103#20164"
} }