Beispiel #1
0
        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)
                                             )
                                ));
        }
Beispiel #2
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));
            }
        }