/// <summary> /// コメント部屋から切断されたときに呼ばれます。 /// </summary> internal void OnDisconnectedRoom(CommentRoom sender, DisconnectReason reason) { // Connectedとの関係で先に呼びます。 if (sender != null) { FireDisconnectedRoom(sender.Index, sender.RoomLabel, reason); } // 接続しているルーム数を減らします。 // プロパティ値変更を正しく伝えるために必要です。 var count = Interlocked.Decrement(ref this.connectedRoomCount); // 全ルームからの接続が途切れたときにのみ。 if (count == this.RoomCount - 1) { this.RaisePropertyChanged("IsConnectedAll"); } // 全部屋の切断時はオブジェクトを初期化します。 if (count == 0) { NotifyDisconnect(); // 切断処理後じゃないと、プロパティの値が変わっていません。 this.RaisePropertyChanged("IsConnected"); } }
/// <summary> /// コメント受信時に呼ばれます。 /// </summary> internal void OnCommentReceivedRoom(CommentRoom sender, Comment comment) { this.CommentReceived.SafeRaiseEvent( this, new CommentRoomReceivedEventArgs( sender.Index, sender.RoomLabel, comment)); }
/// <summary> /// コメントサーバーに接続します。 /// </summary> /// <remarks> /// 接続失敗時には例外が返されます。 /// </remarks> public void Connect(PlayerStatus playerStatus, CookieContainer cc, bool currentRoomOnly, TimeSpan timeout) { lock (ConnectLock) { if (playerStatus == null) { throw new ArgumentNullException("playerStatus"); } // 例外が発生する可能性があります。 var streamInfo = LiveUtil.GetLiveStreamInfo(playerStatus, cc); // 各コメントルームの情報を取得します。 var roomInfoList = GetAllRoomInfo( streamInfo.PlayerStatus, streamInfo.LiveInfo.CommunityLevel); var currentRoomIndex = FindRoomIndex( playerStatus.MS.Port, roomInfoList); var roomList = new List <CommentRoom>(); // 各コメントルームに接続します。 for (var i = 0; i < roomInfoList.Count(); ++i) { if (currentRoomOnly && i != currentRoomIndex) { roomList.Add(null); continue; } var room = new CommentRoom(this, roomInfoList[i], i); // 接続に失敗した場合、例外が返ります。 room.Connect(cc, timeout); roomList.Add(room); } Disconnect(); lock (SyncRoot) { this.connectedRoomCount = 0; this.playerStatus = streamInfo.PlayerStatus; this.publishStatus = streamInfo.PublishStatus; this.liveInfo = streamInfo.LiveInfo; this.roomList = roomList; this.currentRoomIndex = currentRoomIndex; this.cookieContainer = cc; } // フィールド値を設定した後に、OnConnectedRoomを呼びます。 foreach (var room in ClonedCommentRoomList) { OnConnectedRoom(room); } // 接続時のイベントを発生させます。 FireConnected(); } }
/// <summary> /// コメント送信時に呼ばれます。 /// </summary> internal void OnCommentSentRoom(CommentRoom sender, PostComment comment) { this.CommentSent.SafeRaiseEvent( this, new CommentRoomSentEventArgs( sender.Index, sender.RoomLabel, comment)); // 未送信のコメント数が変わった可能性があります。 this.RaisePropertyChanged("LeaveCommentCount"); }
/// <summary> /// コメント部屋に接続したときに呼ばれます。 /// </summary> internal void OnConnectedRoom(CommentRoom sender) { // 接続しているルーム数を増やします。 // プロパティ値変更を正しく伝えるために必要です。 var count = Interlocked.Increment(ref this.connectedRoomCount); if (count == 1) { this.RaisePropertyChanged("IsConnected"); } if (count == this.RoomCount) { this.RaisePropertyChanged("IsConnectedAll"); } if (sender != null) { FireConnectedRoom(sender.Index, sender.RoomLabel); } }
/// <summary> /// 公式放送のコメントサーバーに接続します。 /// </summary> /// <remarks> /// 接続失敗時には例外が返されます。 /// </remarks> public void ConnectToOfficial(string filepath, CookieContainer cc, TimeSpan timeout) { lock (ConnectLock) { // 各コメントルームの情報を取得します。 var roomInfoList = Detail.OfficialLiveInfoCreator .GetAllRoomInfoFromXml(filepath); var roomList = new List <CommentRoom>(); // 各コメントルームに接続します。 for (var i = 0; i < roomInfoList.Count(); ++i) { var room = new CommentRoom(this, roomInfoList[i], i); // 接続に失敗した場合、例外が返ります。 room.Connect(cc, timeout); roomList.Add(room); } Disconnect(); lock (SyncRoot) { this.connectedRoomCount = 0; this.playerStatus = null; this.publishStatus = null; this.liveInfo = null; this.roomList = roomList; this.currentRoomIndex = -1; this.cookieContainer = cc; } // フィールド値を設定した後に、OnConnectedRoomを呼びます。 foreach (var room in ClonedCommentRoomList) { OnConnectedRoom(room); } // 接続時のイベントを発生させます。 FireConnected(); } }
/// <summary> /// 公式放送のコメントサーバーに接続します。 /// </summary> /// <remarks> /// 接続失敗時には例外が返されます。 /// </remarks> public void ConnectToOfficial(string filepath, CookieContainer cc, TimeSpan timeout) { lock (ConnectLock) { // 各コメントルームの情報を取得します。 var roomInfoList = Detail.OfficialLiveInfoCreator .GetAllRoomInfoFromXml(filepath); var roomList = new List<CommentRoom>(); // 各コメントルームに接続します。 for (var i = 0; i < roomInfoList.Count(); ++i) { var room = new CommentRoom(this, roomInfoList[i], i); // 接続に失敗した場合、例外が返ります。 room.Connect(cc, timeout); roomList.Add(room); } Disconnect(); lock (SyncRoot) { this.connectedRoomCount = 0; this.playerStatus = null; this.publishStatus = null; this.liveInfo = null; this.roomList = roomList; this.currentRoomIndex = -1; this.cookieContainer = cc; } // フィールド値を設定した後に、OnConnectedRoomを呼びます。 foreach (var room in ClonedCommentRoomList) { OnConnectedRoom(room); } // 接続時のイベントを発生させます。 FireConnected(); } }
/// <summary> /// コメントサーバーに接続します。 /// </summary> /// <remarks> /// 接続失敗時には例外が返されます。 /// </remarks> public void Connect(PlayerStatus playerStatus, CookieContainer cc, bool currentRoomOnly, TimeSpan timeout) { lock (ConnectLock) { if (playerStatus == null) { throw new ArgumentNullException("playerStatus"); } // 例外が発生する可能性があります。 var streamInfo = LiveUtil.GetLiveStreamInfo(playerStatus, cc); // 各コメントルームの情報を取得します。 var roomInfoList = GetAllRoomInfo( streamInfo.PlayerStatus, streamInfo.LiveInfo.CommunityLevel); var currentRoomIndex = FindRoomIndex( playerStatus.MS.Port, roomInfoList); var roomList = new List<CommentRoom>(); // 各コメントルームに接続します。 for (var i = 0; i < roomInfoList.Count(); ++i) { if (currentRoomOnly && i != currentRoomIndex) { roomList.Add(null); continue; } var room = new CommentRoom(this, roomInfoList[i], i); // 接続に失敗した場合、例外が返ります。 room.Connect(cc, timeout); roomList.Add(room); } Disconnect(); lock (SyncRoot) { this.connectedRoomCount = 0; this.playerStatus = streamInfo.PlayerStatus; this.publishStatus = streamInfo.PublishStatus; this.liveInfo = streamInfo.LiveInfo; this.roomList = roomList; this.currentRoomIndex = currentRoomIndex; this.cookieContainer = cc; } // フィールド値を設定した後に、OnConnectedRoomを呼びます。 foreach (var room in ClonedCommentRoomList) { OnConnectedRoom(room); } // 接続時のイベントを発生させます。 FireConnected(); } }