Example #1
0
        /// <summary>
        /// 全コメントルームのポート情報などを取得します。
        /// </summary>
        public CommentRoomInfo[] GetAllRoomInfo(PlayerStatus playerStatus,
                                                int communityLevel)
        {
            var result    = new List <CommentRoomInfo>();
            var arenaInfo = GetArenaInfo(playerStatus);

            // ルーム数を取得します。
            var roomCount = (
                communityLevel > 0 ?
                CommunityLevelTable.GetNumberOfSeet(communityLevel) / 500 :
                1);

            result.Add(arenaInfo);

            var arenaInfoAddrNum = NicoString.GetMessageServerNumber(
                arenaInfo.Address);

            for (var i = 1; i < roomCount; ++i)
            {
                var carry  = 0;
                var msPort = CommentServerPort(arenaInfo.Port + i, out carry);
                var msAddr = CommentServerAddress(arenaInfoAddrNum + carry);

                // 各立ち見席の情報を設定します。
                var roomInfo = new CommentRoomInfo(
                    "立ち見" + (char)((int)'A' + (i - 1)) + "列",
                    msAddr,
                    msPort,
                    arenaInfo.Thread + i);

                result.Add(roomInfo);
            }

            return(result.ToArray());
        }
Example #2
0
        /// <summary>
        /// アリーナのコメントサーバー情報を取得します。
        /// </summary>
        public CommentRoomInfo GetArenaInfo(PlayerStatus playerStatus)
        {
            var roomLabel = playerStatus.User.RoomLabel;
            var ms        = playerStatus.MS;

            if (playerStatus.Stream.ProviderType != ProviderType.Channel)
            {
                throw new NicoLiveException(
                          "チャンネル生放送以外には対応していません。");
            }

            // メッセージサーバーのURLから番号を取得します。
            var msAddrNum = NicoString.GetMessageServerNumber(ms.Address);

            if (msAddrNum < 0)
            {
                return(new CommentRoomInfo(
                           roomLabel,
                           ms.Address,
                           ms.Port,
                           ms.Thread));
            }

            return(new CommentRoomInfo(
                       roomLabel,
                       ms.Address,
                       ms.Port,
                       ms.Thread));
        }
        /// <summary>
        /// 全コメントルームのポート情報などを取得します。
        /// </summary>
        public CommentRoomInfo[] GetAllRoomInfo(PlayerStatus playerStatus,
                                                int communityLevel)
        {
            var arenaInfo    = GetArenaInfo(playerStatus);
            var arenaAddrNum = NicoString.GetMessageServerNumber(
                arenaInfo.Address);

            if (arenaInfo.RoomLabel != "先頭のルーム")
            {
                return(new CommentRoomInfo[] { arenaInfo });
            }

            return(LiveRoomDataList.Select(data =>
            {
                var carry = 0;
                var msAddr = CommentServerAddress(
                    arenaAddrNum + data.Offset, out carry);
                var msPort = CommentServerPort(arenaInfo.Port + carry);

                return new CommentRoomInfo(
                    data.Name,
                    msAddr,
                    msPort,
                    arenaInfo.Thread + data.Offset);
            }).ToArray());
        }
Example #4
0
        /// <summary>
        /// アリーナのコメントサーバー情報を取得します。
        /// </summary>
        public CommentRoomInfo GetArenaInfo(PlayerStatus playerStatus)
        {
            var arenaName = playerStatus.Stream.DefaultCommunity;
            var roomLabel = playerStatus.User.RoomLabel;
            var ms        = playerStatus.MS;
            var offset    = 0;

            if (playerStatus.Stream.ProviderType != ProviderType.Community)
            {
                throw new NicoLiveException(
                          "ユーザー生放送以外には対応していません。");
            }

            // メッセージサーバーのURLから番号を取得します。
            var msAddrNum = NicoString.GetMessageServerNumber(ms.Address);

            if (msAddrNum < 0)
            {
                return(new CommentRoomInfo(
                           roomLabel,
                           ms.Address,
                           ms.Port,
                           ms.Thread));
            }

            // アリーナ席へのオフセットを取得します。
            if (roomLabel.IndexOf("A") >= 0)
            {
                offset = 1;
            }
            else if (roomLabel.IndexOf("B") >= 0)
            {
                offset = 2;
            }
            else if (roomLabel.IndexOf("C") >= 0)
            {
                offset = 3;
            }
            else
            {
                offset = 0;
            }

            var carry  = 0;
            var msPort = CommentServerPort(ms.Port - offset, out carry);
            var msAddr = CommentServerAddress(msAddrNum + carry);

            // サーバーアドレス番号はポート番号のオーバーフローによって
            // 上下します。
            // - ポート番号が2805以下なら、アドレス番号は1下がる
            // - ポート番号が2814以上なら、アドレス番号は1上がる
            return(new CommentRoomInfo(
                       arenaName,
                       msAddr,
                       msPort,
                       ms.Thread - offset));
        }
        /// <summary>
        /// アドレスやポート番号が記述されたXMLファイルから情報を取得します。
        /// </summary>
        public static CommentRoomInfo[] GetAllRoomInfoFromXml(string filepath)
        {
            if (string.IsNullOrEmpty(filepath))
            {
                throw new ArgumentNullException("filepath");
            }

            using (var stream = new FileStream(filepath, FileMode.Open))
            {
                var doc = XDocument.Load(stream);

                var addrNode = doc.XPathSelectElement("/live/ms/addr");
                if (addrNode == null || string.IsNullOrEmpty(addrNode.Value))
                {
                    throw new ArgumentException("addr要素が見つかりません。");
                }
                var startAddrNum = NicoString.GetMessageServerNumber(addrNode.Value);

                var portNode = doc.XPathSelectElement("/live/ms/port");
                if (portNode == null || string.IsNullOrEmpty(portNode.Value))
                {
                    throw new ArgumentException("addr要素が見つかりません。");
                }
                var startPort = int.Parse(portNode.Value);

                var tidListNode = doc.XPathSelectElements("/live/tid_list");
                if (!tidListNode.Any())
                {
                    throw new ArgumentException("tid_list要素が見つかりません。");
                }

                return(tidListNode.Elements("tid")
                       .Select(_ => _.Value)
                       .Where(_ => !string.IsNullOrEmpty(_))
                       .Select(_ => int.Parse(_))
                       .SelectWithIndex((tid, i) =>
                {
                    /*var name = (i < LiveRoomDataList.Count() ?
                     *  LiveRoomDataList[i].Name : "不明(" + i + ")");*/

                    int carry;
                    var addr = CommentServerAddress(startAddrNum + i, out carry);
                    var port = CommentServerPort(startPort + carry);

                    return new CommentRoomInfo(i.ToString(), addr, port, tid);
                })
                       .ToArray());
            }
        }
        /// <summary>
        /// アリーナのコメントサーバー情報を取得します。
        /// </summary>
        public CommentRoomInfo GetArenaInfo(PlayerStatus playerStatus)
        {
            var roomLabel = playerStatus.User.RoomLabel;
            var ms        = playerStatus.MS;

            if (playerStatus.Stream.ProviderType != ProviderType.Official)
            {
                throw new NicoLiveException(
                          "公式生放送以外には対応していません。");
            }

            // メッセージサーバーのURLから番号を取得します。
            var msAddrNum = NicoString.GetMessageServerNumber(ms.Address);

            if (msAddrNum < 0)
            {
                return(new CommentRoomInfo(
                           roomLabel,
                           ms.Address,
                           ms.Port,
                           ms.Thread));
            }

            // アリーナへのオフセットを取得します。
            OfficialLiveRoomData data;

            if (!LiveRoomDataDic.TryGetValue(roomLabel, out data))
            {
                return(new CommentRoomInfo(
                           roomLabel,
                           ms.Address,
                           ms.Port,
                           ms.Thread));
            }

            var carry  = 0;
            var msAddr = CommentServerAddress(msAddrNum - data.Offset, out carry);
            var msPort = CommentServerPort(ms.Port + carry);

            // サーバーポート番号はアドレス番号のオーバーフローによって
            // 上下します。
            return(new CommentRoomInfo(
                       "先頭のルーム",
                       msAddr,
                       msPort,
                       ms.Thread - data.Offset));
        }