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