public static async Task<List<comment>> GetCommentsV2(GuokrObjectWithId obj, int offset = 0, int limit = 10) { var req = NewJsonRequest(); req.Method = Method.GET; if (obj.object_name == "article") { req.Resource = "minisite/article_reply.json"; req.Parameters.Add(new Parameter() { Name = "article_id", Value = obj.id, Type = ParameterType.GetOrPost }); } else if (obj.object_name == "post") { #if false req.Resource = "group/post_reply.json"; req.Parameters.Add(new Parameter() { Name = "post_id", Value = obj.id, Type = ParameterType.GetOrPost }); #endif req.Resource = "group/post_reply.json"; req.Parameters.Add(new Parameter() { Name = "post_id", Value = obj.id, Type = ParameterType.GetOrPost }); req.Parameters.Add(new Parameter() { Name = "retrieve_type", Value = "by_post", Type = ParameterType.GetOrPost }); } else { throw new GuokrException() { errnum = GuokrErrorCode.InternalError, errmsg = "object_name = " + obj.object_name + " is not supported" }; } req.Parameters.Add(new Parameter() { Name = "limit", Value = limit, Type = ParameterType.GetOrPost }); req.Parameters.Add(new Parameter() { Name = "offset", Value = offset, Type = ParameterType.GetOrPost }); if (ViewModelLocator.ApplicationSettingsStatic.GuokrAccountLoginStatus) req.AddParameter(new Parameter() { Name = "access_token", Value = ViewModelLocator.ApplicationSettingsStatic.GuokrAccountProfile.access_token, Type = ParameterType.GetOrPost }); var resp = await RestSharpAsync.RestSharpExecuteAsyncTask<GetArticleCommentsResponse>(ApiClient, req); ProcessError(resp); if (resp.Data != null) return resp.Data.ToCommentList(offset); else throw new GuokrException() { errnum = GuokrErrorCode.CallFailure, errmsg = resp.Content }; }
public static async Task<List<comment>> GetCommentsV3(GuokrObjectWithId obj, int offset = 0, int limit = 10) { int pagecount = 50; int page = offset / pagecount; offset %= pagecount; string path = "/post/" + obj.id.ToString() + "/"; if (page > 0) path += "?page=" + (page + 1).ToString(); bool needRefresh = false; if (buf.GetStatus(path) == BufferStatus.Completed && offset >= buf.GetBufLength(path)) needRefresh = true; if (needRefresh) { var post = obj as GuokrPost; await GetPostDetail(post); if (post.reply_count / pagecount < page || offset + page * pagecount >= post.reply_count) return new List<comment>(); buf.RefreshBuf(path); } #if DEBUG Deployment.Current.Dispatcher.BeginInvoke(() => MessageBox.Show(string.Format("offset, {0}; limit, {1}; page, {2}; buf.getbuflength, {3}; needRefresh, {4}", offset, limit, page, buf.GetBufLength(path), needRefresh.ToString()))); #endif switch (buf.GetStatus(path)) { case BufferStatus.NotAvailable: case BufferStatus.Failed: buf.SetBufToInProgress(path); var req = new RestRequest(); req.Resource = path; req.Method = Method.GET; if (needRefresh) { if (req.Resource.Contains("?")) req.Resource += "&"; else req.Resource += "?"; req.Resource += "_=" + (DateTime.Now.Second + DateTime.Now.Minute * 60).ToString(); } var resp = await RestSharpAsync.RestSharpExecuteAsyncTask(WwwClient, req); ProcessError(resp); if (resp.StatusCode != HttpStatusCode.OK) throw new GuokrException() { errmsg = "Can't retrieve html for " + path, errnum = GuokrErrorCode.CallFailure }; var doc = new HtmlDocument(); doc.LoadHtml(resp.Content); ParsePostComments(path, doc); return await buf.SafeGetBufRange(path, offset, limit); case BufferStatus.InProgress: case BufferStatus.Completed: return await buf.SafeGetBufRange(path, offset, limit); default: throw new NotImplementedException(); } }