/// <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()); }
/// <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()); }
/// <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)); }