예제 #1
0
        private void RequestComment()
        {
            //タイムシフト
            if (Status.Archive)
            {
                try {
                    Console.WriteLine("Request:" + Vpos + " " + LastRequestTime);
                    var query = new GetRequestQuery(GetWayBackKeyApiUrl);
                    query.AddQuery("thread", Status.ThreadId);

                    var a   = NicoNicoWrapperMain.Session.GetAsync(query.TargetUrl).Result;
                    var key = a.Split('=')[1];

                    var xml = BuildThread(ResFrom, LastRequestTime + 60, key);

                    Console.WriteLine(xml);

                    XmlSocket.Send(xml);

                    Task.Run(() => {
                        XmlSocket.RecursiveReceive(new MemoryStream());
                    });
                } catch (RequestTimeout) {
                }
            }
            else
            {
                var xml = BuildThread();

                XmlSocket.Send(xml);
                Task.Run(() => {
                    XmlSocket.RecursiveReceive(new MemoryStream());
                });
            }
        }
예제 #2
0
        public void ConfirmReservation(string id, ConfirmReservation conf)
        {
            if (conf == null)
            {
                return;
            }
            //lvを消す
            id = id.Replace("lv", "");

            try {
                var request = new GetRequestQuery(WatchingReservationApiUrl);
                request.AddQuery("mode", "confirm_watch_my");
                request.AddQuery("vid", id);

                var a = NicoNicoWrapperMain.Session.GetAsync(request.TargetUrl).Result;

                var doc = new HtmlDocument();
                doc.LoadHtml2(a);

                conf.Id      = id;
                conf.Expires = doc.DocumentNode.SelectSingleNode("//div[@class='info']/div[1]/p").InnerText;
                conf.Title   = doc.DocumentNode.SelectSingleNode("//div[@class='info']/div/strong").InnerText;

                conf.Token = Regex.Match(a, "confirmToWatch[^,]+,[ ]'(.*)'").Groups[1].Value;
            }catch (RequestTimeout) {
                conf.Expires = null;
                conf.Title   = null;
                conf.Token   = null;
                return;
            }
        }
예제 #3
0
        //コメントナンバーを返す
        public string Post(string comment, string mail, string vpos)
        {
            Video.Status = "コメント投稿中";

            try {
                var query = new GetRequestQuery(GetPostKeyApiUrl);
                query.AddQuery("version_sub", "2");
                query.AddQuery("block_no", Math.Floor((decimal)(LastRes + 1) / 100).ToString());
                query.AddQuery("version", "1");
                query.AddQuery("yugi", "");
                query.AddQuery("device", "1");
                query.AddQuery("thread", GetFlv.ThreadID);

                var postkey = NicoNicoWrapperMain.Session.GetAsync(query.TargetUrl).Result;
                postkey = HttpUtility.UrlDecode(postkey).Split('=')[1];

                var root = new XmlDocument();
                var chat = root.CreateElement("chat");
                chat.SetAttribute("thread", GetFlv.ThreadID);
                chat.SetAttribute("vpos", vpos);
                chat.SetAttribute("mail", mail);
                chat.SetAttribute("ticket", Ticket);
                chat.SetAttribute("user_id", GetFlv.UserId);
                chat.SetAttribute("postkey", postkey);
                if (GetFlv.IsPremium)
                {
                    chat.SetAttribute("premium", "1");
                }
                chat.InnerText = comment;
                root.AppendChild(chat);

                var request = new HttpRequestMessage(HttpMethod.Post, GetFlv.CommentServerUrl);
                request.Content = new StringContent(root.InnerXml);
                request.Content.Headers.ContentType = new MediaTypeHeaderValue("text/xml");

                var a = NicoNicoWrapperMain.Session.GetAsync(request).Result;

                var doc = new HtmlDocument();
                doc.LoadHtml2(a);

                var status = doc.DocumentNode.SelectSingleNode("packet/chat_result").Attributes["status"].Value;
                if (status != "0")
                {
                    Video.Status = "コメントの投稿に失敗しました";
                    return(null);
                }
                else
                {
                    Video.Status = "コメントを投稿しました";
                    return(doc.DocumentNode.SelectSingleNode("packet/chat_result").Attributes["no"].Value);
                }
            } catch (RequestTimeout) {
                Video.Status = "コメントの投稿に失敗しました(タイムアウト)";
                return(null);
            }
        }
예제 #4
0
        public VideoViewModel(string url) : base(url)
        {
            var query = new GetRequestQuery(url);

            query.AddQuery("watch_harmful", 1);

            VideoUrl           = query.TargetUrl;
            WatchiApiInstance  = new NicoNicoWatchApi(this);
            StoryBoardInstance = new NicoNicoStoryBoard(this);
        }
예제 #5
0
        public void OpenTweetView()
        {
            var query = new GetRequestQuery("https://twitter.com/intent/tweet");

            query.AddQuery("url", Uri.EscapeDataString("http://www.nicovideo.jp" + new Uri(VideoUrl).AbsolutePath));
            query.AddQuery("hashtags", ApiData.Video.Id);
            query.AddQuery("original_referer", Uri.EscapeDataString(VideoUrl));
            query.AddQuery("text", Uri.EscapeDataString(ApiData.Video.Title + "(" + NicoNicoUtil.ConvertTime(ApiData.Video.Duration) + ")"));

            TweetBrowser             = new WebBrowser();
            TweetBrowser.Navigating += (obj, e) => {
                if (e.Uri.Query == "")
                {
                    TweetPopupOpen = false;
                }
            };

            TweetPopupOpen = true;
            TweetBrowser.Navigate(query.TargetUrl);
        }
예제 #6
0
        public async Task HeartbeatAsync(string id)
        {
            try {
                var query = new GetRequestQuery(Dmc.ApiUrls.First() + "/" + id);
                query.AddQuery("_format", "json");
                query.AddQuery("_method", "PUT");

                var request = new HttpRequestMessage(HttpMethod.Post, new Uri(query.TargetUrl));

                request.Content = new StringContent(LastResponseXml);
                request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

                var a = await App.ViewModelRoot.CurrentUser.Session.GetAsync(request);

                if (!NicoNicoUtil.IsValidJson(a))
                {
                    return;
                }
                var doc = DynamicJson.Parse(a);

                if (doc.data())
                {
                    var data = doc.data;
                    if (data != null)
                    {
                        LastResponseXml = data.ToString();
                    }
                    else
                    {
                    }
                }


                return;
            } catch (RequestFailed) {
                return;
            }
        }
예제 #7
0
        public async Task <bool> ToggleFollowOwnerAsync(NicoNicoWatchApiData apiData)
        {
            try {
                if (apiData.IsChannelVideo)
                {
                    GetRequestQuery query = null;
                    if (apiData.IsUploaderFollowed)
                    {
                        query = new GetRequestQuery(ChannelUnFollowApi);
                    }
                    else
                    {
                        query = new GetRequestQuery(ChannelFollowApi);
                    }

                    query.AddQuery("channel_id", apiData.Channel.Id);
                    query.AddQuery("return_json", 1);
                    query.AddQuery("time", apiData.Channel.FavoriteTokenTime);
                    query.AddQuery("key", apiData.Channel.FavoriteToken);

                    var a = await App.ViewModelRoot.CurrentUser.Session.GetAsync(query.TargetUrl);

                    var json = DynamicJson.Parse(a);

                    if (json.status == "succeed")
                    {
                        if (apiData.IsUploaderFollowed)
                        {
                            Owner.Status = "フォローを解除しました";
                        }
                        else
                        {
                            Owner.Status = "フォローしました";
                        }
                        return(true);
                    }
                }
                else
                {
                    if (apiData.IsUploaderFollowed)
                    {
                        var request = new HttpRequestMessage(HttpMethod.Delete, string.Format(UploaderInfoApi, apiData.Owner.Id))
                        {
                            Content = new FormUrlEncodedContent(new Dictionary <string, string>())
                        };
                        request.Headers.Add("x-request-with", Owner.VideoUrl);

                        var a = await App.ViewModelRoot.CurrentUser.Session.GetAsync(request);

                        var json = DynamicJson.Parse(a);

                        if (json.meta.status == 200D)
                        {
                            Owner.Status = "フォローを解除しました";
                            return(true);
                        }
                        else
                        {
                            Owner.Status = "フォロー解除に失敗しました";
                            return(false);
                        }
                    }
                    else
                    {
                        var request = new HttpRequestMessage(HttpMethod.Post, string.Format(UploaderInfoApi, apiData.Owner.Id))
                        {
                            Content = new FormUrlEncodedContent(new Dictionary <string, string>())
                        };
                        request.Headers.Add("x-request-with", Owner.VideoUrl);

                        var a = await App.ViewModelRoot.CurrentUser.Session.GetAsync(request);

                        var json = DynamicJson.Parse(a);
                        if (json.meta.status == 200D)
                        {
                            Owner.Status = "フォローしました";
                            return(true);
                        }
                        else
                        {
                            Owner.Status = "フォローに失敗しました";
                            return(false);
                        }
                    }
                }
                return(false);
            } catch (RequestFailed) {
                return(false);
            }
        }
예제 #8
0
        public async Task <DmcSession> CreateAsync()
        {
            dynamic json = new DynamicJson();

            json.session = new {
                recipe_id    = Dmc.RecipeId,
                content_id   = Dmc.ContentId,
                content_type = "movie",

                content_src_id_sets = new List <dynamic>(),
                timing_constraint   = "unlimited",
                keep_method         = new {
                    heartbeat = new {
                        lifetime = Dmc.HeartbeatLifeTime
                    }
                },
                protocol = new {
                    name       = "http",
                    parameters = new {
                        http_parameters = new {
                            parameters = new {
                                http_output_download_parameters = new {}
                            }
                        }
                    }
                },
                content_uri            = "",
                session_operation_auth = new {
                    session_operation_auth_by_signature = new {
                        token     = Dmc.Token,
                        signature = Dmc.Signature
                    }
                },
                content_auth = new {
                    auth_type           = Dmc.AuthType,
                    max_content_count   = 10,
                    content_key_timeout = Dmc.ContentKeyTimeout,
                    service_id          = "nicovideo",
                    service_user_id     = Dmc.ServiceUserId
                },
                client_info = new {
                    player_id = Dmc.PlayerId
                },
                priority = Dmc.Priority
            };


            var mux = new {
                video_src_ids = new List <string>(),
                audio_src_ids = new List <string>()
            };

            foreach (var video in Dmc.Videos)
            {
                mux.video_src_ids.Add(video);
            }
            foreach (var audio in Dmc.Audios)
            {
                mux.audio_src_ids.Add(audio);
            }


            json.session.content_src_id_sets = new[] { new { content_src_ids = new[] { new { src_id_to_mux = mux } } } };

            try {
                var str   = json.ToString();
                var query = new GetRequestQuery(Dmc.ApiUrls.First());
                query.AddQuery("_format", "json");

                var request = new HttpRequestMessage(HttpMethod.Post, new Uri(query.TargetUrl))
                {
                    Content = new StringContent(json.ToString())
                };
                request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

                var a = await App.ViewModelRoot.CurrentUser.Session.GetAsync(request);

                var ret = new DmcSession();

                var doc = DynamicJson.Parse(a);
                ret.Id         = doc.data.session.id;
                ret.ContentUri = doc.data.session.content_uri;

                LastResponseXml = doc.data.ToString();
                return(ret);
            } catch (RequestFailed) {
                return(null);
            }
        }
예제 #9
0
        //コメント取得
        public async Task <List <NicoNicoCommentEntry> > GetCommentAsync()
        {
            Video.CommentStatus = "取得中";
            var list = new List <NicoNicoCommentEntry>();

            //---ユーザーコメント取得---
            var root   = new XmlDocument();
            var packet = root.CreateElement("packet");

            var thread = root.CreateElement("thread");

            thread.SetAttribute("thread", GetFlv.ThreadID);
            thread.SetAttribute("version", "20090904");
            thread.SetAttribute("user_id", GetFlv.UserId);
            thread.SetAttribute("userkey", GetFlv.UserKey);
            thread.SetAttribute("scores", "1");

            var leaves = root.CreateElement("thread_leaves");

            leaves.SetAttribute("thread", GetFlv.ThreadID);
            leaves.SetAttribute("user_id", GetFlv.UserId);
            leaves.SetAttribute("userkey", GetFlv.UserKey);
            leaves.SetAttribute("scores", "1");
            leaves.InnerText = "0-" + ((GetFlv.Length / 60) + 1) + ":100,1000";

            //公式動画だったらThreadkeyも取得する
            if (ApiData.IsOfficial)
            {
                try {
                    var query = new GetRequestQuery(GetThreadKeyApiUrl);
                    query.AddQuery("thread", GetFlv.ThreadID);
                    query.AddQuery("language_id", 0);

                    var threadKeyRaw = await NicoNicoWrapperMain.Session.GetAsync(query.TargetUrl);

                    var temp      = threadKeyRaw.Split('&');
                    var threadKey = temp[0].Split('=')[1];
                    var force184  = temp[1].Split('=')[1];

                    thread.SetAttribute("threadkey", threadKey);
                    thread.SetAttribute("force_184", force184);
                    leaves.SetAttribute("threadkey", threadKey);
                    leaves.SetAttribute("force_184", force184);

                    thread.RemoveAttribute("userkey");
                    leaves.RemoveAttribute("userkey");
                } catch (RequestTimeout) {
                    Video.CommentStatus = "取得失敗";
                }
            }
            packet.AppendChild(thread);
            packet.AppendChild(leaves);
            root.AppendChild(packet);

            try {
                var request = new HttpRequestMessage(HttpMethod.Post, GetFlv.CommentServerUrl);
                request.Content = new StringContent(root.InnerXml);
                request.Content.Headers.ContentType = new MediaTypeHeaderValue("text/xml");

                var a = await NicoNicoWrapperMain.Session.GetAsync(request);

                var doc = new HtmlDocument();
                doc.LoadHtml2(a);

                var resultcode = doc.DocumentNode.SelectSingleNode("/packet/thread").Attributes["resultcode"].Value;

                if (resultcode == "11")
                {
                    Video.Status = "取得失敗(復帰中)";

                    var recv = new GetRequestQuery(GetFlv.CommentServerUrl + "thread");
                    recv.AddQuery("version", "20090904");
                    recv.AddQuery("thread", GetFlv.ThreadID);
                    recv.AddQuery("res_from", "-1000");

                    a = NicoNicoWrapperMain.Session.GetAsync(recv.TargetUrl).Result;
                    doc.LoadHtml2(a);
                }

                StoreEntry(doc, list);
                //------

                if (resultcode != "0")
                {
                    Video.CommentStatus = "取得失敗";
                    return(null);
                }


                if (list.Count == 0 && resultcode == "0")
                {
                    Video.CommentStatus = "取得完了";
                    return(list);
                }
                list.Sort();


                Ticket  = doc.DocumentNode.SelectSingleNode("packet/thread").Attributes["ticket"].Value;
                LastRes = int.Parse(doc.DocumentNode.SelectSingleNode("packet/thread").Attributes["last_res"].Value);

                Video.CommentStatus = "取得完了";

                return(list);
            } catch (RequestTimeout) {
                Video.CommentStatus = "取得失敗(タイムアウト)";
                return(null);
            }
        }
예제 #10
0
        public async Task <List <NicoNicoCommentList> > GetAllCommentAsync()
        {
            var normalList    = new NicoNicoCommentList("通常コメント");
            var uploaderList  = new NicoNicoCommentList("投稿者コメント");
            var communityList = new NicoNicoCommentList("コミュニティコメント");
            var channelList   = new NicoNicoCommentList("チャンネルコメント");
            var officialList  = new NicoNicoCommentList("公式コメント");

            try {
                var ret = new List <NicoNicoCommentList>();

                //通常コメントを取得
                //ret.Add(new NicoNicoCommentList() { ListName = "通常コメント", CommentList = await GetNormalCommentAsync() });

                //パケットIDとコメントタイプを紐付ける
                var dic = new Dictionary <long, CommentType>();

                var jsonarray = new List <object>();
                {
                    PacketId = PacketCount;
                    //rs
                    jsonarray.Add(new { ping = new { content = "rs:" + RequestId % IdLimit } });

                    //ps 通常コメント
                    jsonarray.Add(new { ping = new { content = "ps:" + PacketId % IdLimit } });

                    var normalThread = new {
                        thread      = Owner.ApiData.Thread.ThreadIds.Default,
                        version     = "20090904",
                        language    = 0,
                        user_id     = int.Parse(Owner.ApiData.Viewer.Id),
                        with_global = 1,
                        scores      = 1,
                        nicoru      = 0,
                        userkey     = Owner.ApiData.Context.UserKey
                    };

                    dic[PacketId] = CommentType.Normal;
                    jsonarray.Add(new { thread = normalThread });

                    //pf
                    jsonarray.Add(new { ping = new { content = "pf:" + PacketId++ % IdLimit } });
                    //------
                    //ps 通常コメント leaves
                    jsonarray.Add(new { ping = new { content = "ps:" + PacketId % IdLimit } });

                    var normalLeaves = new {
                        thread   = Owner.ApiData.Thread.ThreadIds.Default,
                        language = 0,
                        user_id  = int.Parse(Owner.ApiData.Viewer.Id),
                        content  = "0-" + ((Owner.ApiData.Video.Duration / 60) + 1) + ":100," + GetReadCommentCount(Owner.ApiData.Video.Duration).ToString(),
                        scores   = 1,
                        nicoru   = 0,
                        userkey  = Owner.ApiData.Context.UserKey
                    };

                    dic[PacketId] = CommentType.NormalLeaves;
                    jsonarray.Add(new { thread_leaves = normalLeaves });
                    //pf leaves
                    jsonarray.Add(new { ping = new { content = "pf:" + PacketId++ % IdLimit } });
                    //------

                    //投稿者コメント有りフラグ
                    if (Owner.ApiData.Thread.HasOwnerThread == "1")
                    {
                        //ps 投稿者コメント
                        jsonarray.Add(new { ping = new { content = "ps:" + PacketId % IdLimit } });

                        var forkThread = new {
                            thread      = Owner.ApiData.Thread.ThreadIds.Default,
                            version     = "20061206",
                            fork        = 1,
                            user_id     = int.Parse(Owner.ApiData.Viewer.Id),
                            res_from    = -1000,
                            with_global = 1,
                            scores      = 1,
                            nicoru      = 0,
                            userkey     = Owner.ApiData.Context.UserKey
                        };

                        dic[PacketId] = CommentType.Uploader;
                        jsonarray.Add(new { thread = forkThread });
                        //pf fork
                        jsonarray.Add(new { ping = new { content = "pf:" + PacketId++ % IdLimit } });
                    }

                    if (Owner.ApiData.IsChannelVideo)
                    {
                        //ps チャンネルコメント
                        jsonarray.Add(new { ping = new { content = "ps:" + PacketId % IdLimit } });

                        var query = new GetRequestQuery(ThreadKeyApiUrl);
                        query.AddQuery("thread", Owner.ApiData.Thread.ThreadIds.Community);

                        var threadkey = await App.ViewModelRoot.CurrentUser.Session.GetAsync(query.TargetUrl);

                        var threadKeyDic = HttpUtility.ParseQueryString(threadkey);

                        channelList.ThreadKey = threadKeyDic["threadkey"];
                        channelList.Force184  = threadKeyDic["force_184"];

                        var channelThread = new {
                            thread      = Owner.ApiData.Thread.ThreadIds.Community,
                            version     = "20090904",
                            language    = 0,
                            user_id     = int.Parse(Owner.ApiData.Viewer.Id),
                            force_184   = channelList.Force184,
                            with_global = 1,
                            scores      = 1,
                            nicoru      = 0,
                            threadkey   = channelList.ThreadKey
                        };

                        dic[PacketId] = CommentType.Channel;
                        jsonarray.Add(new { thread = channelThread });

                        //pf channel
                        jsonarray.Add(new { ping = new { content = "pf:" + PacketId++ % IdLimit } });

                        jsonarray.Add(new { ping = new { content = "ps:" + PacketId % IdLimit } });

                        var channelLeaves = new {
                            thread    = Owner.ApiData.Thread.ThreadIds.Community,
                            language  = 0,
                            user_id   = int.Parse(Owner.ApiData.Viewer.Id),
                            content   = "0-" + ((Owner.ApiData.Video.Duration / 60) + 1) + ":100," + GetReadCommentCount(Owner.ApiData.Video.Duration).ToString(),
                            scores    = 1,
                            nicoru    = 0,
                            force_184 = threadKeyDic["force_184"],
                            threadkey = threadKeyDic["threadkey"]
                        };

                        dic[PacketId] = CommentType.ChannelLeaves;
                        jsonarray.Add(new { thread_leaves = channelLeaves });


                        //pf channel
                        jsonarray.Add(new { ping = new { content = "pf:" + PacketId++ % IdLimit } });
                    }


                    //rf
                    jsonarray.Add(new { ping = new { content = "rf:" + RequestId++ % IdLimit } });

                    PacketCount += jsonarray.Count;
                }


                var request = new HttpRequestMessage(HttpMethod.Post, Owner.ApiData.Thread.ServerUrl)
                {
                    Content = new StringContent(DynamicJson.Serialize(jsonarray), Encoding.UTF8, "text/plain")
                };
                var a = await App.ViewModelRoot.CurrentUser.Session.GetAsync(request);

                //結果
                {
                    var currentType = CommentType.Normal;
                    foreach (var entry in DynamicJson.Parse(a))
                    {
                        //コメントタイプを確認
                        if (entry.ping())
                        {
                            var content = entry.ping.content as string;
                            if (content.Contains("ps"))
                            {
                                currentType = dic[long.Parse(content.Split(':')[1])];
                            }
                            continue;
                        }
                        if (entry.thread())
                        {
                            var thread = entry.thread;


                            switch (currentType)
                            {
                            case CommentType.NormalLeaves: {
                                normalList.ThreadId = thread.thread;
                                normalList.Ticket   = thread.ticket() ? thread.ticket : "";
                                normalList.LastRes  = thread.last_res() ? (int)thread.last_res : 0;
                                break;
                            }

                            case CommentType.Uploader: {
                                break;
                            }

                            case CommentType.Channel: {
                                break;
                            }

                            case CommentType.ChannelLeaves: {
                                channelList.ThreadId = thread.thread;
                                channelList.Ticket   = thread.ticket() ? thread.ticket : "";
                                channelList.LastRes  = thread.last_res() ? (int)thread.last_res : 0;
                                break;
                            }
                            }
                            continue;
                        }

                        if (entry.chat())
                        {
                            var chat = entry.chat;

                            switch (currentType)
                            {
                            case CommentType.NormalLeaves: {
                                if (chat.deleted())
                                {
                                    continue;
                                }

                                var item = new NicoNicoCommentEntry()
                                {
                                    Number    = (int)chat.no,
                                    Vpos      = (int)chat.vpos,
                                    PostedAt  = (long)chat.date,
                                    Anonymity = chat.anonymity(),
                                    UserId    = chat.user_id,
                                    Mail      = chat.mail() ? chat.mail : "",
                                    Content   = chat.content,
                                    Score     = chat.score() ? (int)chat.score : 0
                                };
                                item.DisassembleMail();
                                normalList.Add(item);
                                break;
                            }

                            case CommentType.Uploader: {
                                if (chat.deleted())
                                {
                                    continue;
                                }

                                var item = new NicoNicoCommentEntry()
                                {
                                    Number   = (int)chat.no,
                                    Vpos     = (int)chat.vpos,
                                    PostedAt = (long)chat.date,
                                    Content  = chat.content,
                                    Mail     = chat.mail() ? chat.mail : ""
                                };
                                item.Mail       = new string(item.Mail.Select(n => (ConvMap.ContainsKey(n) ? ConvMap[n] : n)).ToArray());
                                item.IsUploader = true;

                                item.DisassembleMail();
                                uploaderList.Add(item);
                                break;
                            }

                            case CommentType.Channel: {
                                break;
                            }

                            case CommentType.ChannelLeaves: {
                                if (chat.deleted())
                                {
                                    continue;
                                }

                                var item = new NicoNicoCommentEntry()
                                {
                                    Number    = (int)chat.no,
                                    Vpos      = (int)chat.vpos,
                                    PostedAt  = (long)chat.date,
                                    Anonymity = chat.anonymity(),
                                    UserId    = chat.user_id,
                                    Mail      = chat.mail() ? chat.mail : "",
                                    Content   = chat.content,
                                    Score     = chat.score() ? (int)chat.score : 0
                                };

                                item.DisassembleMail();
                                channelList.Add(item);

                                break;
                            }
                            }
                        }
                    }

                    if (!normalList.IsEmpty())
                    {
                        normalList.Sort();
                        ret.Add(normalList);
                    }
                    if (!communityList.IsEmpty())
                    {
                        communityList.Sort();
                        ret.Add(communityList);
                    }
                    if (!channelList.IsEmpty())
                    {
                        channelList.Sort();
                        ret.Add(channelList);
                    }
                    if (!officialList.IsEmpty())
                    {
                        officialList.Sort();
                        ret.Add(officialList);
                    }
                    if (!uploaderList.IsEmpty())
                    {
                        uploaderList.Sort();
                        ret.Add(uploaderList);
                    }
                }
                return(ret);
            } catch (RequestFailed) {
                Owner.Status = "コメントの取得に失敗しました";
                return(null);
            }
        }
예제 #11
0
        public async Task <int> PostAsync(NicoNicoCommentList target, int vpos, string mail, string text)
        {
            try {
                var query = new GetRequestQuery(GetPostKeyApiUrl);
                query.AddQuery("thread", target.ThreadId);
                query.AddQuery("block_no", Math.Floor((decimal)(target.LastRes + 1) / 100).ToString());
                query.AddQuery("device", "1");
                query.AddQuery("version", "1");
                query.AddQuery("version_sub", "6");
                var postkey = await App.ViewModelRoot.CurrentUser.Session.GetAsync(query.TargetUrl);


                PacketId = PacketCount;

                var jsonarray = new List <object>();

                //rs
                jsonarray.Add(new { ping = new { content = "rs:" + RequestId % IdLimit } });
                //ps
                jsonarray.Add(new { ping = new { content = "ps:" + PacketId % IdLimit } });

                //コメント投稿
                var chat = new {
                    thread  = target.ThreadId,
                    vpos    = vpos,
                    mail    = mail,
                    ticket  = target.Ticket,
                    user_id = int.Parse(Owner.ApiData.Viewer.Id),
                    premium = Owner.ApiData.Viewer.IsPremium ? 1 : 0,
                    postkey = postkey,
                    content = text
                };

                jsonarray.Add(new { chat = chat });

                //pf
                jsonarray.Add(new { ping = new { content = "pf:" + PacketId++ % IdLimit } });
                //rf
                jsonarray.Add(new { ping = new { content = "rf:" + RequestId++ % IdLimit } });


                var request = new HttpRequestMessage(HttpMethod.Post, Owner.ApiData.Thread.ServerUrl)
                {
                    Content = new StringContent(DynamicJson.Serialize(jsonarray), Encoding.UTF8, "text/plain")
                };

                PacketCount += jsonarray.Count;

                var a = await App.ViewModelRoot.CurrentUser.Session.GetAsync(request);

                //成功したか確認
                foreach (var entry in DynamicJson.Parse(a))
                {
                    if (entry.chat_result())
                    {
                        if (entry.chat_result.status == 0D)
                        {
                            Owner.Status = "コメントを投稿しました";
                            return((int)entry.chat_result.no);
                        }
                        else
                        {
                            Owner.Status = "コメントの投稿に失敗しました";
                            return(-1);
                        }
                    }
                }
                return(-1);
            } catch (RequestFailed) {
                Owner.Status = "コメントの投稿に失敗しました";
                return(-1);
            }
        }