private async Task <XElement> GetPlayerElement(Card card) { var player = card.Player; var profile = player.JubeatProfile; bool changed = false; bool freshProfile = false; if (profile.ClanData == null) { Random rng = new Random(); profile.ClanData = new JubeatClanProfileData() { Team = (byte)(rng.Next(1, 5)), Street = rng.Next(1, 9), Section = rng.Next(1, 5), HouseNo1 = (short)(rng.Next(1, 10)), HouseNo2 = (short)(rng.Next(1, 100)), TuneCount = 0, ClearCount = 0, FcCount = 0, ExCount = 0, MatchCount = 0, BeatCount = 0, SaveCount = 0, SavedCount = 0, BonusTunePoints = 0, BonusTunePlayed = false, }; changed = true; freshProfile = true; } if (profile.ClanSettings == null) { profile.ClanSettings = new JubeatClanSettings() { Sort = 0, Category = 0, Marker = 0, Theme = 0, RankSort = 0, ComboDisplay = 0, Hard = 0, Hazard = 0, Title = 0, Parts = 0, EmblemBackground = 0, EmblemMain = 823, EmblemOrnament = 0, EmblemEffect = 0, EmblemBalloon = 0 }; changed = true; } if (changed) { await ctx.SaveChangesAsync(); } var settings = profile.ClanSettings; var data = profile.ClanData; var latestScore = await ctx.JubeatScores .Where(s => s.ProfileID == profile.ID) .OrderByDescending(s => s.Timestamp) .FirstOrDefaultAsync(); if (latestScore == null) { latestScore = new JubeatScore(); } return(new XElement("player", new KS32("jid", profile.ID), new KS32("session_id", 1), new KStr("name", profile.Name), new KU64("event_flag", 2), new XElement("info", new KS32("tune_cnt", data.TuneCount), new KS32("save_cnt", data.SaveCount), new KS32("saved_cnt", data.SavedCount), new KS32("fc_cnt", data.FcCount), new KS32("ex_cnt", data.ExCount), new KS32("clear_cnt", data.ClearCount), new KS32("match_cnt", data.MatchCount), new KS32("beat_cnt", data.BeatCount), new KS32("mynews_cnt", 0), new KS32("mtg_entry_cnt", 0), new KS32("mtg_hold_cnt", 0), new KU8("mtg_result", 0), new KS32("bonus_tune_points", data.BonusTunePoints), new KBool("is_bonus_tune_played", data.BonusTunePlayed) ), new XElement("last", new KS64("play_time", data.PlayTime), new KStr("shopname", "xxx"), new KStr("areaname", "xxx"), new KS32("music_id", latestScore.MusicID), new KS8("seq_id", latestScore.Seq), new KS8("sort", settings.Sort), new KS8("category", settings.Category), new KS8("expert_option", settings.ExpertOption), new XElement("settings", new KS8("marker", settings.Marker), new KS8("theme", settings.Theme), new KS16("title", settings.Title), new KS16("parts", settings.Parts), new KS8("rank_sort", settings.RankSort), new KS8("combo_disp", settings.ComboDisplay), new KS16("emblem", new short[] { settings.EmblemBackground, settings.EmblemMain, settings.EmblemOrnament, settings.EmblemEffect, settings.EmblemBalloon }), new KS8("matching", settings.Matching), new KS8("hard", settings.Hard), new KS8("hazard", settings.Hazard) ) ), new XElement("item", new KS32("music_list", 64, -1), new KS32("secret_list", 64, -1), new KS32("theme_list", 16, -1), new KS32("marker_list", 16, -1), new KS32("title_list", 160, -1), new KS32("parts_list", 160, -1), new KS32("emblem_list", 96, -1), new KS32("commu_list", 16, -1), new XElement("new", new KS32("secret_list", 64, 0), new KS32("theme_list", 16, 0), new KS32("marker_list", 16, 0) ) ), new XElement("team", new XAttribute("id", freshProfile ? 0 : data.Team), new KS32("section", freshProfile ? 0 : data.Section), new KS32("street", freshProfile ? 0 : data.Street), new KS32("house_number_1", freshProfile ? 0 : data.HouseNo1), new KS32("house_number_2", freshProfile ? 0 : data.HouseNo2), new XElement("move", new XAttribute("house_number_1", data.HouseNo1), new XAttribute("house_number_2", data.HouseNo2), new XAttribute("id", data.Team), new XAttribute("section", data.Section), new XAttribute("street", data.Street) ) ), new XElement("jbox", new KS32("point", data.JboxPoints), new XElement("emblem", new XElement("normal", new KS16("index", 1182) ), new XElement("premium", new KS16("index", 1197) ) ) ), new XElement("news", new KS16("checked", 0), new KU32("checked_flag", 1) ), new XElement("free_first_play", new KBool("is_available", false) ), new XElement("event_info", new XElement("event", new XAttribute("type", 15), new KU8("state", 1) ) ), new XElement("new_music"), new XElement("gift_list"), new XElement("jubility", new XAttribute("param", data.JubilityParam), GenJubilityTargetMusicList(profile) ), new XElement("born", new KS8("status", 1), new KS16("year", 2000) ), new XElement("question_list"), new XElement("official_news", new XElement("news_list") ), GenDroplist(), new XElement("daily_bonus_list"), GenClanCourseList(), new XElement("server"), new XElement("rivallist"), await GenFcChallenge(), new XElement("navi", new KU64("flag", freshProfile ? 0UL : 122UL) ) )); }
public async Task <ActionResult <EamuseXrpcData> > Register([FromBody] EamuseXrpcData xrpcData) { try { XElement dataE = xrpcData.Document.Element("call").Element("gameend").Element("data"); XElement playerE = dataE.Element("player"); xrpcData.Document = new XDocument(new XElement("response", new XElement("gameend"))); if (playerE == null) { return(xrpcData); } int jid = int.Parse(playerE.Element("jid").Value); JubeatProfile profile = await ctx.JubeatProfiles .Include(p => p.ClanData) .Include(p => p.ClanSettings) .Include(p => p.Jubilitys) .SingleOrDefaultAsync(p => p.ID == jid); var data = profile.ClanData; var settings = profile.ClanSettings; if (profile == null || data == null || settings == null) { return(NotFound()); } XElement teamE = playerE.Element("team"); data.Team = byte.Parse(teamE.Attribute("id").Value); data.Street = int.Parse(teamE.Element("street").Value); data.Section = int.Parse(teamE.Element("section").Value); data.HouseNo1 = short.Parse(teamE.Element("house_number_1").Value); data.HouseNo1 = short.Parse(teamE.Element("house_number_2").Value); XElement infoE = dataE.Element("info"); data.PlayTime = int.Parse(infoE.Element("play_time").Value); XElement pInfoE = playerE.Element("info"); data.TuneCount = int.Parse(pInfoE.Element("tune_cnt").Value); data.ClearCount = int.Parse(pInfoE.Element("clear_cnt").Value); data.FcCount = int.Parse(pInfoE.Element("fc_cnt").Value); data.ExCount = int.Parse(pInfoE.Element("ex_cnt").Value); data.MatchCount = int.Parse(pInfoE.Element("match_cnt").Value); data.BeatCount = int.Parse(pInfoE.Element("beat_cnt").Value); data.SaveCount = int.Parse(pInfoE.Element("save_cnt").Value); data.SavedCount = int.Parse(pInfoE.Element("saved_cnt").Value); data.BonusTunePoints = int.Parse(pInfoE.Element("bonus_tune_points").Value); data.BonusTunePlayed = pInfoE.Element("is_bonus_tune_played").Value == "1"; XElement jboxE = playerE.Element("jbox"); data.JboxPoints = int.Parse(jboxE.Element("point").Value); XElement lastE = playerE.Element("last"); settings.ExpertOption = sbyte.Parse(lastE.Element("expert_option").Value); settings.Sort = sbyte.Parse(lastE.Element("sort").Value); settings.Category = sbyte.Parse(lastE.Element("category").Value); XElement settingsE = lastE.Element("settings"); settings.Marker = sbyte.Parse(settingsE.Element("marker").Value); settings.Theme = sbyte.Parse(settingsE.Element("theme").Value); settings.RankSort = sbyte.Parse(settingsE.Element("rank_sort").Value); settings.ComboDisplay = sbyte.Parse(settingsE.Element("combo_disp").Value); settings.Matching = sbyte.Parse(settingsE.Element("matching").Value); settings.Hard = sbyte.Parse(settingsE.Element("hard").Value); settings.Hazard = sbyte.Parse(settingsE.Element("hazard").Value); IEnumerable <XElement> tunes = dataE.Element("result").Elements("tune"); foreach (XElement tune in tunes) { XElement tunePlayer = tune.Element("player"); XElement tuneScore = tunePlayer.Element("score"); int musicId = int.Parse(tune.Element("music").Value); sbyte seq = sbyte.Parse(tuneScore.Attribute("seq").Value); JubeatScore score = new JubeatScore() { ProfileID = profile.ID, MusicID = musicId, Seq = seq }; score.Timestamp = long.Parse(tune.Element("timestamp").Value); score.Score = int.Parse(tunePlayer.Element("score").Value); score.Clear = sbyte.Parse(tuneScore.Attribute("clear").Value); score.IsHardMode = tunePlayer.Element("is_hard_mode").Value == "1"; score.IsHazardMode = tunePlayer.Element("is_hazard_end").Value == "1"; score.NumPerfect = short.Parse(tunePlayer.Element("nr_perfect").Value); score.NumGreat = short.Parse(tunePlayer.Element("nr_great").Value); 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); 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"); data.JubilityParam = int.Parse(jubility.Attribute("param").Value); profile.Jubilitys.Clear(); foreach (XElement targetMusic in jubility.Element("target_music_list").Elements("target_music")) { profile.Jubilitys.Add(new JubeatClanJubility() { MusicID = int.Parse(targetMusic.Element("music_id").Value), Seq = sbyte.Parse(targetMusic.Element("seq").Value), Score = int.Parse(targetMusic.Element("score").Value), Value = int.Parse(targetMusic.Element("value").Value), IsHardMode = targetMusic.Element("is_hard_mode").Value == "1" }); } await ctx.SaveChangesAsync(); return(xrpcData); } catch (Exception e) { Console.WriteLine(e.ToString()); return(StatusCode(500)); } }