From f21f01fbb652c422cd16d449cc2e97f5ff07f217 Mon Sep 17 00:00:00 2001 From: BtbN Date: Thu, 6 Jun 2019 21:12:33 +0200 Subject: [PATCH] Refactor ID storage a bit --- ClanServer/ClanServerContext.cs | 19 ++++++-- ClanServer/Controllers/Core/Cardmng.cs | 29 ++++++------- ClanServer/Controllers/L44/Gameend.cs | 60 ++++++++++++++++---------- ClanServer/Controllers/L44/Gametop.cs | 30 +++++++------ ClanServer/Models/Card.cs | 35 +++------------ ClanServer/Models/JubeatHighscore.cs | 38 ++++++++++++++++ ClanServer/Models/JubeatProfile.cs | 4 +- ClanServer/Models/JubeatScore.cs | 17 ++------ ClanServer/Startup.cs | 14 +++++- 9 files changed, 148 insertions(+), 98 deletions(-) create mode 100644 ClanServer/Models/JubeatHighscore.cs diff --git a/ClanServer/ClanServerContext.cs b/ClanServer/ClanServerContext.cs index ecf05fe..ed8450b 100644 --- a/ClanServer/ClanServerContext.cs +++ b/ClanServer/ClanServerContext.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; @@ -30,11 +30,23 @@ namespace ClanServer var jbScoreEntity = modelBuilder.Entity(); jbScoreEntity - .HasIndex(score => new { score.ProfileID, score.MusicID, score.Seq }) - .IsUnique(); + .HasIndex(score => new { score.ProfileID, score.MusicID, score.Seq }); jbScoreEntity .HasIndex(score => new { score.ProfileID, score.MusicID }); jbScoreEntity + .HasIndex(score => new { score.MusicID, score.Seq }); + jbScoreEntity + .HasIndex(score => score.ProfileID); + + var jbHighScoreEntity = modelBuilder.Entity(); + jbHighScoreEntity + .HasIndex(score => new { score.ProfileID, score.MusicID, score.Seq }) + .IsUnique(); + jbHighScoreEntity + .HasIndex(score => new { score.ProfileID, score.MusicID }); + jbHighScoreEntity + .HasIndex(score => new { score.MusicID, score.Seq }); + jbHighScoreEntity .HasIndex(score => score.ProfileID); } @@ -44,5 +56,6 @@ namespace ClanServer public DbSet JubeatClanProfileData { get; set; } public DbSet JubeatProfiles { get; set; } public DbSet JubeatScores { get; set; } + public DbSet JubeatHighscores { get; set; } } } diff --git a/ClanServer/Controllers/Core/Cardmng.cs b/ClanServer/Controllers/Core/Cardmng.cs index 727733c..cc4372e 100644 --- a/ClanServer/Controllers/Core/Cardmng.cs +++ b/ClanServer/Controllers/Core/Cardmng.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -27,21 +27,21 @@ namespace ClanServer.Controllers.Core { XElement cardmng = data.Document.Element("call").Element("cardmng"); - byte[] cardId = cardmng.Attribute("cardid").Value.ToBytesFromHex(); + string cardId = cardmng.Attribute("cardid").Value.ToUpper(); string cardType = cardmng.Attribute("cardtype").Value; string update = cardmng.Attribute("update").Value; - var card = ctx.Cards.SingleOrDefault(c => c.CardId.SequenceEqual(cardId)); + var card = ctx.Cards.SingleOrDefault(c => c.CardId == cardId); if (card != null) { data.Document = new XDocument(new XElement("response", new XElement("cardmng", new XAttribute("binded", "1"), - new XAttribute("dataid", card.DataIdStr), + new XAttribute("dataid", card.DataId), new XAttribute("ecflag", "1"), new XAttribute("newflag", "0"), new XAttribute("expired", "0"), - new XAttribute("refid", card.RefIdStr) + new XAttribute("refid", card.RefId) ))); } else @@ -60,11 +60,11 @@ namespace ClanServer.Controllers.Core XElement cardmng = data.Document.Element("call").Element("cardmng"); string pass = cardmng.Attribute("pass").Value; - byte[] refId = cardmng.Attribute("refid").Value.ToBytesFromHex(); + string refId = cardmng.Attribute("refid").Value.ToUpper(); Card card = await ctx.Cards .Include(c => c.Player) - .SingleOrDefaultAsync(c => c.RefId.SequenceEqual(refId)); + .SingleOrDefaultAsync(c => c.RefId == refId); int status; if (card != null && card.Player != null && card.Player.Passwd == pass) @@ -84,11 +84,10 @@ namespace ClanServer.Controllers.Core { XElement cardmng = data.Document.Element("call").Element("cardmng"); - string cardId = cardmng.Attribute("cardid").Value; - byte[] cardIdBytes = cardId.ToBytesFromHex(); + string cardId = cardmng.Attribute("cardid").Value.ToUpper(); string passwd = cardmng.Attribute("passwd").Value; - if (await ctx.Cards.AnyAsync(c => c.CardId.SequenceEqual(cardIdBytes))) + if (await ctx.Cards.AnyAsync(c => c.CardId == cardId)) { data.Document = new XDocument(new XElement("response", new XElement("cardmng"))); return data; @@ -109,9 +108,9 @@ namespace ClanServer.Controllers.Core Card card = new Card() { - CardId = cardIdBytes, - DataId = dataId, - RefId = refId, + CardId = cardId, + DataId = dataId.ToHexString(), + RefId = refId.ToHexString(), Player = player }; @@ -121,8 +120,8 @@ namespace ClanServer.Controllers.Core await ctx.SaveChangesAsync(); data.Document = new XDocument(new XElement("response", new XElement("cardmng", - new XAttribute("dataid", card.DataIdStr), - new XAttribute("refid", card.RefIdStr) + new XAttribute("dataid", card.DataId), + new XAttribute("refid", card.RefId) ))); return data; diff --git a/ClanServer/Controllers/L44/Gameend.cs b/ClanServer/Controllers/L44/Gameend.cs index 78f2a0f..1b05f7c 100644 --- a/ClanServer/Controllers/L44/Gameend.cs +++ b/ClanServer/Controllers/L44/Gameend.cs @@ -100,21 +100,12 @@ namespace ClanServer.Controllers.L44 int musicId = int.Parse(tune.Element("music").Value); sbyte seq = sbyte.Parse(tuneScore.Attribute("seq").Value); - JubeatScore score = ctx.JubeatScores - .Where(s => s.MusicID == musicId && s.Seq == seq && s.ProfileID == profile.ID) - .SingleOrDefault(); - - if (score == null) + JubeatScore score = new JubeatScore() { - score = new JubeatScore() - { - ProfileID = profile.ID, - MusicID = musicId, - Seq = seq - }; - - ctx.JubeatScores.Add(score); - } + ProfileID = profile.ID, + MusicID = musicId, + Seq = seq + }; score.Timestamp = long.Parse(tune.Element("timestamp").Value); score.Score = int.Parse(tunePlayer.Element("score").Value); @@ -126,15 +117,40 @@ namespace ClanServer.Controllers.L44 score.NumGood = short.Parse(tunePlayer.Element("nr_good").Value); score.NumPoor = short.Parse(tunePlayer.Element("nr_poor").Value); score.NumMiss = short.Parse(tunePlayer.Element("nr_miss").Value); - score.BestScore = int.Parse(tunePlayer.Element("best_score").Value); - score.BestClear = int.Parse(tunePlayer.Element("best_clear").Value); - score.PlayCount = int.Parse(tunePlayer.Element("play_cnt").Value); - score.ClearCount = int.Parse(tunePlayer.Element("clear_cnt").Value); - score.FcCount = int.Parse(tunePlayer.Element("fc_cnt").Value); - score.ExcCount = int.Parse(tunePlayer.Element("ex_cnt").Value); - string[] mbarStrs = tunePlayer.Element("mbar").Value.Split(' '); - score.MBar = Array.ConvertAll(mbarStrs, s => byte.Parse(s)); + string[] mbarStrs = tunePlayer.Element("play_mbar").Value.Split(' '); + score.Bar = Array.ConvertAll(mbarStrs, s => byte.Parse(s)); + + ctx.JubeatScores.Add(score); + + JubeatHighscore highscore = ctx.JubeatHighscores + .Where(s => s.MusicID == musicId && s.Seq == seq && s.ProfileID == profile.ID) + .SingleOrDefault(); + + if (highscore == null) + { + highscore = new JubeatHighscore() + { + ProfileID = profile.ID, + MusicID = musicId, + Seq = seq + }; + + ctx.JubeatHighscores.Add(highscore); + } + + if (score.Score > highscore.Score) + highscore.Timestamp = score.Timestamp; + + highscore.Score = int.Parse(tunePlayer.Element("best_score").Value); + highscore.Clear = sbyte.Parse(tunePlayer.Element("best_clear").Value); + highscore.PlayCount = int.Parse(tunePlayer.Element("play_cnt").Value); + highscore.ClearCount = int.Parse(tunePlayer.Element("clear_cnt").Value); + highscore.FcCount = int.Parse(tunePlayer.Element("fc_cnt").Value); + highscore.ExcCount = int.Parse(tunePlayer.Element("ex_cnt").Value); + + mbarStrs = tunePlayer.Element("mbar").Value.Split(' '); + highscore.Bar = Array.ConvertAll(mbarStrs, s => byte.Parse(s)); } XElement jubility = playerE.Element("jubility"); diff --git a/ClanServer/Controllers/L44/Gametop.cs b/ClanServer/Controllers/L44/Gametop.cs index 2a5ccc5..c90ded4 100644 --- a/ClanServer/Controllers/L44/Gametop.cs +++ b/ClanServer/Controllers/L44/Gametop.cs @@ -42,7 +42,7 @@ namespace ClanServer.Controllers.L44 { XElement gametop = data.Document.Element("call").Element("gametop"); XElement player = gametop.Element("data").Element("player"); - byte[] refId = player.Element("refid").Value.ToBytesFromHex(); + string refId = player.Element("refid").Value.ToUpper(); string name = player.Element("name").Value; Card card = await ctx.Cards @@ -50,7 +50,7 @@ namespace ClanServer.Controllers.L44 .ThenInclude(p => p.Jubilitys) .Include(c => c.Player.JubeatProfile.ClanData) .Include(c => c.Player.JubeatProfile.ClanSettings) - .SingleOrDefaultAsync(c => c.RefId.SequenceEqual(refId)); + .SingleOrDefaultAsync(c => c.RefId == refId); if (card == null || card.Player == null) return NotFound(); @@ -86,14 +86,14 @@ namespace ClanServer.Controllers.L44 var gametop = data.Document.Element("call").Element("gametop"); var player = gametop.Element("data").Element("player"); - byte[] refId = player.Element("refid").Value.ToBytesFromHex(); + string refId = player.Element("refid").Value.ToUpper(); Card card = await ctx.Cards .Include(c => c.Player.JubeatProfile) .ThenInclude(p => p.Jubilitys) .Include(c => c.Player.JubeatProfile.ClanData) .Include(c => c.Player.JubeatProfile.ClanSettings) - .SingleOrDefaultAsync(c => c.RefId.SequenceEqual(refId)); + .SingleOrDefaultAsync(c => c.RefId == refId); if (card == null || card.Player == null || card.Player.JubeatProfile == null) return NotFound(); @@ -473,10 +473,12 @@ namespace ClanServer.Controllers.L44 if (profile == null) return NotFound(); - var scoreGroups = ctx.JubeatScores + var scoreGroups = ctx.JubeatHighscores .Where(s => s.ProfileID == profile.ID) .GroupBy(s => s.MusicID); + Console.WriteLine(scoreGroups.ToString()); + XElement mdataList = new XElement("mdata_list"); foreach (var scoreGroup in scoreGroups) @@ -489,17 +491,17 @@ namespace ClanServer.Controllers.L44 var exCnt = new int[3]; var bars = new[] { new byte[30], new byte[30], new byte[30] }; - foreach (JubeatScore score in scoreGroup) + foreach (JubeatHighscore highscore in scoreGroup) { - int seq = score.Seq; + int seq = highscore.Seq; - scoreRes[seq] = score.Score; - clearRes[seq] = score.Clear; - playCnt[seq] = score.PlayCount; - clearCnt[seq] = score.ClearCount; - fcCnt[seq] = score.FcCount; - exCnt[seq] = score.ExcCount; - bars[seq] = score.MBar; + scoreRes[seq] = highscore.Score; + clearRes[seq] = highscore.Clear; + playCnt[seq] = highscore.PlayCount; + clearCnt[seq] = highscore.ClearCount; + fcCnt[seq] = highscore.FcCount; + exCnt[seq] = highscore.ExcCount; + bars[seq] = highscore.Bar; } mdataList.Add(new XElement("music", new XAttribute("music_id", scoreGroup.Key), diff --git a/ClanServer/Models/Card.cs b/ClanServer/Models/Card.cs index 4f2bdb5..a4b54bf 100644 --- a/ClanServer/Models/Card.cs +++ b/ClanServer/Models/Card.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -15,36 +15,15 @@ namespace ClanServer.Models public int PlayerID { get; set; } [Required] - [MaxLength(8), MinLength(8)] - public byte[] CardId { get; set; } + [MaxLength(16), MinLength(16)] + public string CardId { get; set; } [Required] - [MaxLength(8), MinLength(8)] - public byte[] DataId { get; set; } + [MaxLength(16), MinLength(16)] + public string DataId { get; set; } [Required] - [MaxLength(8), MinLength(8)] - public byte[] RefId { get; set; } - - [NotMapped] - public string CardIdStr - { - get => CardId.ToHexString(); - set => CardId = value.ToBytesFromHex(); - } - - [NotMapped] - public string DataIdStr - { - get => DataId.ToHexString(); - set => DataId = value.ToBytesFromHex(); - } - - [NotMapped] - public string RefIdStr - { - get => RefId.ToHexString(); - set => RefId = value.ToBytesFromHex(); - } + [MaxLength(16), MinLength(16)] + public string RefId { get; set; } } } \ No newline at end of file diff --git a/ClanServer/Models/JubeatHighscore.cs b/ClanServer/Models/JubeatHighscore.cs new file mode 100644 index 0000000..b2e1662 --- /dev/null +++ b/ClanServer/Models/JubeatHighscore.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace ClanServer.Models +{ + public class JubeatHighscore + { + public int ID { get; set; } + + [Required] + public JubeatProfile Profile { get; set; } + public int ProfileID { get; set; } + + public long Timestamp { get; set; } + + public int MusicID { get; set; } + + [Range(0, 2)] + public sbyte Seq { get; set; } + + public int Score { get; set; } + + public sbyte Clear { get; set; } + + public int PlayCount { get; set; } + + public int ClearCount { get; set; } + + public int FcCount { get; set; } + + public int ExcCount { get; set; } + + [MinLength(30), MaxLength(30)] + public byte[] Bar { get; set; } + } +} diff --git a/ClanServer/Models/JubeatProfile.cs b/ClanServer/Models/JubeatProfile.cs index c9019ee..a8e0d87 100644 --- a/ClanServer/Models/JubeatProfile.cs +++ b/ClanServer/Models/JubeatProfile.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -22,5 +22,7 @@ namespace ClanServer.Models public ICollection Jubilitys { get; set; } public ICollection Scores { get; set; } + + public ICollection Highscores { get; set; } } } diff --git a/ClanServer/Models/JubeatScore.cs b/ClanServer/Models/JubeatScore.cs index dc8a502..aa6c268 100644 --- a/ClanServer/Models/JubeatScore.cs +++ b/ClanServer/Models/JubeatScore.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -17,6 +17,7 @@ namespace ClanServer.Models public int MusicID { get; set; } + [Range(0, 2)] public sbyte Seq { get; set; } public int Score { get; set; } @@ -37,19 +38,7 @@ namespace ClanServer.Models public bool IsHazardMode { get; set; } - public int BestScore { get; set; } - - public int BestClear { get; set; } - - public int PlayCount { get; set; } - - public int ClearCount { get; set; } - - public int FcCount { get; set; } - - public int ExcCount { get; set; } - [MinLength(30), MaxLength(30)] - public byte[] MBar { get; set; } + public byte[] Bar { get; set; } } } diff --git a/ClanServer/Startup.cs b/ClanServer/Startup.cs index 8ffb02f..c384539 100644 --- a/ClanServer/Startup.cs +++ b/ClanServer/Startup.cs @@ -9,6 +9,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Console; using Microsoft.Extensions.Options; namespace ClanServer @@ -17,8 +18,16 @@ namespace ClanServer { public const int Port = 9091; - public Startup(IConfiguration configuration) +#pragma warning disable CS0618 + public static readonly LoggerFactory LogFactory + = new LoggerFactory(new[] { new ConsoleLoggerProvider((_, __) => true, true) }); +#pragma warning restore CS0618 + + private readonly IHostingEnvironment CurEnv; + + public Startup(IHostingEnvironment env, IConfiguration configuration) { + CurEnv = env; Configuration = configuration; } @@ -31,6 +40,9 @@ namespace ClanServer services .AddDbContext(options => { + if (CurEnv.IsDevelopment()) + options.UseLoggerFactory(LogFactory); + options.UseSqlite("Data Source=clanserver.db"); });