public async Task PostChat(BasicChatPostObject chatPostObject)
        {
            string liveId = this.liveId;

            if (liveId == "")
            {
                throw new ChatPostException("コメントが投稿できる状態にありません。しばらく待ってから再試行してください。");
            }

            try
            {
                await this.commentSender.Send(liveId, chatPostObject.Text, (chatPostObject as ChatPostObject)?.Mail ?? "");
            }
            catch (NiconicoUtils.NetworkNicoLiveCommentSenderException e)
            {
                throw new ChatPostException($"サーバーに接続できませんでした", e);
            }
            catch (NiconicoUtils.InvalidPlayerStatusNicoLiveCommentSenderException e)
            {
                throw new ChatPostException($"サーバーから無効な PlayerStatus が返されました\n\n{e.PlayerStatus}", e);
            }
            catch (NiconicoUtils.ResponseFormatNicoLiveCommentSenderException e)
            {
                throw new ChatPostException($"サーバーから予期しない形式の応答がありました\n\n{e.Response}", e);
            }
            catch (NiconicoUtils.ResponseErrorNicoLiveCommentSenderException e)
            {
                throw new ChatPostException($"サーバーからエラーが返されました", e);
            }
        }
예제 #2
0
 public async void PostChat(ChatCollectService.IChatCollectService service, ChatCollectService.BasicChatPostObject postObject)
 {
     if (!service.CanPost)
     {
         ErrorOccurredInChatPosting(service, postObject, "このコメント元はコメント投稿をサポートしていません");
         return;
     }
     try
     {
         await service.PostChat(postObject);
     }
     catch (ChatCollectService.ChatPostException e)
     {
         ErrorOccurredInChatPosting(service, postObject, e.Message);
     }
 }
예제 #3
0
 public override Task PostChat(BasicChatPostObject postObject)
 {
     throw new NotSupportedException();
 }
예제 #4
0
 public override Task PostChat(BasicChatPostObject postObject)
 {
     throw new NotImplementedException();
 }
 public virtual Task PostChat(BasicChatPostObject postObject)
 {
     throw new NotSupportedException("Posting is not supprted on this ChatCollectService");
 }
        public async Task PostChat(BasicChatPostObject chatPostObject)
        {
            if (!CanPost)
            {
                throw new NotSupportedException("Posting is not supprted on this ChatCollectService");
            }

            if (lastThreadTag == null || lastResNum == -1 || socketStream == null || postingResult != null)
            {
                throw new ChatPostException("コメントが投稿できる状態にありません。しばらく待ってから再試行してください。");
            }

            //postkey取得
            string postKey = await httpClient.GetStringAsync($"/api/v2/getpostkey?thread={lastThreadTag.Thread}&block_no={(lastResNum + 1) / 100}");

            postKey = postKey.Substring(postKey.IndexOf('=') + 1);

            // vposは10msec単位 サーバ時刻を基準に計算
            int vpos = (int)(lastThreadTag.ServerTime - lastThreadTag.Thread) * 100 + (int)((getDateTimeJstNow() - lastThreadTag.ReceivedTime).Value.TotalMilliseconds) / 10;

            string mail = (chatPostObject as ChatPostObject)?.Mail ?? "";

            XElement postXml = new XElement("chat",
                                            new XAttribute("thread", lastThreadTag.Thread),
                                            new XAttribute("ticket", lastThreadTag.Ticket),
                                            new XAttribute("vpos", vpos),
                                            new XAttribute("postkey", postKey),
                                            new XAttribute("mail", mail),
                                            new XAttribute("user_id", userId),
                                            new XAttribute("premium", isPremium ? "1" : "0"),
                                            new XAttribute("staff", "0"),
                                            new XText(chatPostObject.Text));

            byte[] postData = utf8Encoding.GetBytes(postXml.ToString(SaveOptions.DisableFormatting) + "\0"); //最後にnull文字が必要

            postingResult = new TaskCompletionSource <int>();                                                //コメント受信側で投稿の結果応答を入れてもらう
            await socketStream.WriteAsync(postData, 0, postData.Length);

            int result;

            using (new Timer((_) => postingResult?.TrySetCanceled(), null, 5000, Timeout.Infinite))//結果応答を5秒以内に受信できなければタイムアウト
            {
                try
                {
                    await postingResult.Task;//結果が来るまで待つ
                    result = postingResult.Task.Result;
                }
                catch (OperationCanceledException)
                {
                    //タイムアウトした
                    throw new ChatPostException("コメントを送信しましたがサーバーから結果応答を受信できませんでした。");
                }
                finally
                {
                    postingResult = null;
                }
            }

            if (result != 0)
            {
                throw new ChatPostException($"コメント投稿でサーバーからエラーが返されました。エラーコードは'{result}'です。");
            }
        }