Beispiel #1
0
        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));
            }
        }
Beispiel #2
0
        public async Task <ActionResult <EamuseXrpcData> > GetMdata([FromBody] EamuseXrpcData data)
        {
            var gametop = data.Document.Element("call").Element("gametop");
            var player  = gametop.Element("data").Element("player");
            int jid     = int.Parse(player.Element("jid").Value);

            var profile = await ctx.JubeatProfiles.SingleOrDefaultAsync(p => p.ID == jid);

            if (profile == null)
            {
                return(NotFound());
            }

            List <JubeatHighscore> scores = await ctx.JubeatHighscores
                                            .Where(s => s.ProfileID == profile.ID)
                                            .ToListAsync();

            var scoreGroups = new Dictionary <int, JubeatHighscore[]>();

            foreach (var score in scores)
            {
                if (!scoreGroups.ContainsKey(score.MusicID))
                {
                    scoreGroups.Add(score.MusicID, new JubeatHighscore[3]);
                }

                scoreGroups[score.MusicID][score.Seq] = score;
            }

            XElement mdataList = new XElement("mdata_list");

            foreach (var scoreGroup in scoreGroups)
            {
                var scoreRes = new int[3];
                var clearRes = new sbyte[3];
                var playCnt  = new int[3];
                var clearCnt = new int[3];
                var fcCnt    = new int[3];
                var exCnt    = new int[3];
                var bars     = new[] { new byte[30], new byte[30], new byte[30] };

                for (int seq = 0; seq < 3; ++seq)
                {
                    JubeatHighscore score = scoreGroup.Value[seq];
                    if (score == null)
                    {
                        continue;
                    }

                    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.Bar;
                }

                mdataList.Add(new XElement("music", new XAttribute("music_id", scoreGroup.Key),
                                           new KS32("score", scoreRes),
                                           new KS8("clear", clearRes),
                                           new KS32("play_cnt", playCnt),
                                           new KS32("clear_cnt", clearCnt),
                                           new KS32("fc_cnt", fcCnt),
                                           new KS32("ex_cnt", exCnt),
                                           new KU8("bar", bars[0]).AddAttr("seq", 0),
                                           new KU8("bar", bars[1]).AddAttr("seq", 1),
                                           new KU8("bar", bars[2]).AddAttr("seq", 2)
                                           ));
            }

            data.Document = new XDocument(new XElement("response", new XElement("gametop", new XElement("data",
                                                                                                        new XElement("player",
                                                                                                                     new KS32("jid", jid),
                                                                                                                     mdataList
                                                                                                                     )
                                                                                                        ))));

            return(data);
        }