Exemplo n.º 1
0
        private void Update(Nekoxy.Session session)
        {
            this.IsUntaken = false;

            var data = DynamicJson.Parse(SvData.JsonParse(session.Response.BodyAsString));
            kcsapi_questlist questlist = new kcsapi_questlist
            {
                api_count      = (int)data.api_data.api_count,
                api_disp_page  = (int)data.api_data.api_disp_page,
                api_page_count = (int)data.api_data.api_page_count,
                api_exec_count = (int)data.api_data.api_exec_count
            };

            if (data.api_data.api_list != null)
            {
                var list       = new List <kcsapi_quest>();
                var serializer = new DataContractJsonSerializer(typeof(kcsapi_quest));

                foreach (var x in data.api_data.api_list)
                {
                    try
                    {
                        list.Add(
                            serializer.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(x.ToString()))) as kcsapi_quest
                            );
                    }
                    catch { }
                }

                questlist.api_list = list.ToArray();
            }


            if (this.questPages.Count > questlist.api_page_count)
            {
                while (this.questPages.Count > questlist.api_page_count)
                {
                    this.questPages.RemoveAt(this.questPages.Count - 1);
                }
            }

            else if (this.questPages.Count < questlist.api_page_count)
            {
                while (this.questPages.Count < questlist.api_page_count)
                {
                    this.questPages.Add(null);
                }
            }


            if (questlist.api_list == null)
            {
                this.IsEmpty = true;
                this.All     = this.Current = new List <Quest>();
            }
            else
            {
                var page = questlist.api_disp_page - 1;
                if (page >= this.questPages.Count)
                {
                    page = this.questPages.Count - 1;
                }

                this.questPages[page] = new ConcurrentDictionary <int, Quest>();
                this.IsEmpty          = false;

                var quests = questlist.api_list
                             .Select(x => new Quest(x));

                foreach (var quest in quests)
                {
                    this.questPages[page].AddOrUpdate(quest.Id, quest, (_, __) => quest);
                }

                this.All = this.questPages.Where(x => x != null)
                           .SelectMany(x => x.Select(kvp => kvp.Value))
                           .Distinct(x => x.Id)
                           .OrderBy(x => x.Id)
                           .ToList();

                var current = this.All.Where(x => x.State == QuestState.TakeOn || x.State == QuestState.Accomplished)
                              .OrderBy(x => x.Id)
                              .ToList();

                while (current.Count < questlist.api_exec_count)
                {
                    current.Add(null);
                }
                this.Current = current;
            }
        }