Beispiel #1
0
        /// <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");
            }
        }
Beispiel #2
0
 /// <summary>
 /// コメント受信時に呼ばれます。
 /// </summary>
 internal void OnCommentReceivedRoom(CommentRoom sender, Comment comment)
 {
     this.CommentReceived.SafeRaiseEvent(
         this,
         new CommentRoomReceivedEventArgs(
             sender.Index, sender.RoomLabel, comment));
 }
Beispiel #3
0
        /// <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();
            }
        }
Beispiel #4
0
        /// <summary>
        /// コメント送信時に呼ばれます。
        /// </summary>
        internal void OnCommentSentRoom(CommentRoom sender, PostComment comment)
        {
            this.CommentSent.SafeRaiseEvent(
                this,
                new CommentRoomSentEventArgs(
                    sender.Index, sender.RoomLabel, comment));

            // 未送信のコメント数が変わった可能性があります。
            this.RaisePropertyChanged("LeaveCommentCount");
        }
Beispiel #5
0
        /// <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);
            }
        }
Beispiel #6
0
        /// <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();
            }
        }
Beispiel #7
0
        /// <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();
            }
        }
Beispiel #8
0
        /// <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();
            }
        }
Beispiel #9
0
        /// <summary>
        /// コメント送信時に呼ばれます。
        /// </summary>
        internal void OnCommentSentRoom(CommentRoom sender, PostComment comment)
        {
            this.CommentSent.SafeRaiseEvent(
                this,
                new CommentRoomSentEventArgs(
                    sender.Index, sender.RoomLabel, comment));

            // 未送信のコメント数が変わった可能性があります。
            this.RaisePropertyChanged("LeaveCommentCount");
        }
Beispiel #10
0
 /// <summary>
 /// コメント受信時に呼ばれます。
 /// </summary>
 internal void OnCommentReceivedRoom(CommentRoom sender, Comment comment)
 {
     this.CommentReceived.SafeRaiseEvent(
         this,
         new CommentRoomReceivedEventArgs(
             sender.Index, sender.RoomLabel, comment));
 }
Beispiel #11
0
        /// <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");
            }
        }
Beispiel #12
0
        /// <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);
            }
        }