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); } }
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); } }
public override Task PostChat(BasicChatPostObject postObject) { throw new NotSupportedException(); }
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}'です。"); } }