private static kcsapi_questlist Serialize(Session session) { try { var djson = DynamicJson.Parse(session.GetResponseAsJson()); var questlist = new kcsapi_questlist { api_count = Convert.ToInt32(djson.api_data.api_count), api_disp_page = Convert.ToInt32(djson.api_data.api_disp_page), api_page_count = Convert.ToInt32(djson.api_data.api_page_count), api_exec_count = Convert.ToInt32(djson.api_data.api_exec_count), }; if (djson.api_data.api_list != null) { var list = new List<kcsapi_quest>(); var serializer = new DataContractJsonSerializer(typeof(kcsapi_quest)); foreach (var x in (object[])djson.api_data.api_list) { try { list.Add(serializer.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(x.ToString()))) as kcsapi_quest); } catch (SerializationException ex) { // 最後のページで任務数が 5 に満たないとき、api_list が -1 で埋められるというクソ API のせい Debug.WriteLine(ex.Message); } } questlist.api_list = list.ToArray(); } return questlist; } catch (Exception ex) { Debug.WriteLine(ex); return null; } }
private void Update(kcsapi_questlist questlist) { this.IsUntaken = false; // キャッシュしてるページの数が、取得したページ数 (api_page_count) より大きいとき // 取得したページ数と同じ数になるようにキャッシュしてるページを減らす 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; foreach (var quest in questlist.api_list.Select(x => new Quest(x))) { 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(); // 遂行中の任務数に満たない場合、未取得分として null で埋める while (current.Count < questlist.api_exec_count) current.Add(null); this.Current = current; } }
private void Update(kcsapi_questlist questlist) { this.IsUntaken = false; // キャッシュしてるページの数が、取得したページ数 (api_page_count) より大きいとき // 取得したページ数と同じ数になるようにキャッシュしてるページを減らす 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); } this.questPages[questlist.api_disp_page - 1] = new ConcurrentDictionary<int, Quest>(); questlist.api_list.Select(x => new Quest(x)) .ForEach(x => this.questPages[questlist.api_disp_page - 1].AddOrUpdate(x.Id, x, (_, __) => x)); var current = this.All.Where(x => x.State == QuestState.TakeOn || x.State == QuestState.Accomplished) .OrderBy(x => x.Id) .ToList(); // 遂行中の任務数に満たない場合、未取得分として null で埋める while (current.Count < questlist.api_exec_count) current.Add(null); this.Current = current; this.RaisePropertyChanged("All"); }