1
This commit is contained in:
@@ -0,0 +1,192 @@
|
||||
using System.Collections.Generic;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
namespace BarrageGrab.Modles.BiliProtoEntity
|
||||
{
|
||||
/// <summary>
|
||||
/// B站直播弹幕WS协议操作码
|
||||
/// </summary>
|
||||
public enum BiliOperation
|
||||
{
|
||||
/// <summary>客户端心跳</summary>
|
||||
HEARTBEAT = 2,
|
||||
/// <summary>服务器心跳回复 (人气值)</summary>
|
||||
HEARTBEAT_REPLY = 3,
|
||||
/// <summary>普通消息 (弹幕/礼物/进房等)</summary>
|
||||
MESSAGE = 5,
|
||||
/// <summary>客户端认证请求</summary>
|
||||
AUTH = 7,
|
||||
/// <summary>服务器认证回复</summary>
|
||||
AUTH_REPLY = 8
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// B站WS协议版本 (影响Payload压缩方式)
|
||||
/// </summary>
|
||||
public enum BiliProtocolVersion
|
||||
{
|
||||
/// <summary>JSON明文</summary>
|
||||
PLAIN = 0,
|
||||
/// <summary>认证用JSON</summary>
|
||||
PLAIN_AUTH = 1,
|
||||
/// <summary>Zlib压缩 (内部可能含多个包)</summary>
|
||||
ZLIB = 2,
|
||||
/// <summary>Brotli压缩 (内部可能含多个包)</summary>
|
||||
BROTLI = 3
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// B站WS协议帧头 (16字节, Big-Endian)
|
||||
/// </summary>
|
||||
public struct BiliSocketFrame
|
||||
{
|
||||
/// <summary>整个包长度 (header+body)</summary>
|
||||
public uint PacketLength;
|
||||
/// <summary>头长度 (固定16)</summary>
|
||||
public ushort HeaderLength;
|
||||
/// <summary>协议版本</summary>
|
||||
public BiliProtocolVersion ProtocolVersion;
|
||||
/// <summary>操作码</summary>
|
||||
public BiliOperation Operation;
|
||||
/// <summary>序列号 (固定1)</summary>
|
||||
public uint SequenceId;
|
||||
|
||||
public const int HEADER_SIZE = 16;
|
||||
|
||||
/// <summary>从字节缓冲区解析帧头</summary>
|
||||
public static bool TryParse(byte[] buffer, int offset, int count, out BiliSocketFrame frame)
|
||||
{
|
||||
frame = default(BiliSocketFrame);
|
||||
if (buffer == null || count < HEADER_SIZE) return false;
|
||||
// Big-Endian 解析
|
||||
frame.PacketLength = ReadUInt32BE(buffer, offset);
|
||||
frame.HeaderLength = ReadUInt16BE(buffer, offset + 4);
|
||||
frame.ProtocolVersion = (BiliProtocolVersion)ReadUInt16BE(buffer, offset + 6);
|
||||
frame.Operation = (BiliOperation)ReadUInt32BE(buffer, offset + 8);
|
||||
frame.SequenceId = ReadUInt32BE(buffer, offset + 12);
|
||||
return frame.HeaderLength >= HEADER_SIZE && frame.PacketLength >= HEADER_SIZE;
|
||||
}
|
||||
|
||||
/// <summary>帧体数据 (从 HeaderLength 开始到 PacketLength)</summary>
|
||||
public static byte[] GetPayload(byte[] buffer, int offset, BiliSocketFrame frame)
|
||||
{
|
||||
int bodyLen = (int)frame.PacketLength - frame.HeaderLength;
|
||||
if (bodyLen <= 0) return new byte[0];
|
||||
var data = new byte[bodyLen];
|
||||
System.Array.Copy(buffer, offset + frame.HeaderLength, data, 0, bodyLen);
|
||||
return data;
|
||||
}
|
||||
|
||||
public static uint ReadUInt32BE(byte[] buf, int off)
|
||||
{
|
||||
return (uint)((buf[off] << 24) | (buf[off + 1] << 16) | (buf[off + 2] << 8) | buf[off + 3]);
|
||||
}
|
||||
|
||||
public static ushort ReadUInt16BE(byte[] buf, int off)
|
||||
{
|
||||
return (ushort)((buf[off] << 8) | buf[off + 1]);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// B站弹幕消息 (cmd字段用于路由)
|
||||
/// </summary>
|
||||
public class BiliMessage
|
||||
{
|
||||
/// <summary>消息类型 (DANMU_MSG / SEND_GIFT / INTERACT_WORD 等)</summary>
|
||||
public string Cmd { get; set; }
|
||||
|
||||
/// <summary>原始数据</summary>
|
||||
public JObject Raw { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// B站弹幕消息 cmd 列表 (用于识别已知类型)
|
||||
/// </summary>
|
||||
public static class BiliCmd
|
||||
{
|
||||
public const string DANMU_MSG = "DANMU_MSG";
|
||||
public const string SEND_GIFT = "SEND_GIFT";
|
||||
public const string INTERACT_WORD = "INTERACT_WORD";
|
||||
public const string LIKE_INFO_V3_CLICK = "LIKE_INFO_V3_CLICK";
|
||||
public const string ONLINE_RANK_COUNT = "ONLINE_RANK_COUNT";
|
||||
public const string WATCHED_CHANGE = "WATCHED_CHANGE";
|
||||
public const string LIVE = "LIVE";
|
||||
public const string PREPARING = "PREPARING";
|
||||
public const string ROOM_REAL_TIME_MESSAGE_UPDATE = "ROOM_REAL_TIME_MESSAGE_UPDATE";
|
||||
public const string SUPER_CHAT_MESSAGE = "SUPER_CHAT_MESSAGE";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// B站弹幕消息(DANMU_MSG)简化结构
|
||||
/// </summary>
|
||||
public class BiliDanmuMsg
|
||||
{
|
||||
/// <summary>弹幕内容 (info[1])</summary>
|
||||
public string Content { get; set; }
|
||||
/// <summary>用户UID (info[2][0])</summary>
|
||||
public long Uid { get; set; }
|
||||
/// <summary>用户昵称 (info[2][1])</summary>
|
||||
public string Uname { get; set; }
|
||||
/// <summary>管理员? (info[2][2]==1)</summary>
|
||||
public bool IsAdmin { get; set; }
|
||||
/// <summary>主播? (info[2][4]存在)</summary>
|
||||
public bool IsAnchor { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// B站礼物消息(SEND_GIFT.data)简化结构
|
||||
/// </summary>
|
||||
public class BiliGiftData
|
||||
{
|
||||
public long Uid { get; set; }
|
||||
public string Uname { get; set; }
|
||||
public string Face { get; set; }
|
||||
public uint GiftId { get; set; }
|
||||
public string GiftName { get; set; }
|
||||
/// <summary>礼物数量</summary>
|
||||
public uint Num { get; set; }
|
||||
/// <summary>本批次礼物数 (连击时为本次增量)</summary>
|
||||
public uint ComboNum { get; set; }
|
||||
/// <summary>礼物连击总数</summary>
|
||||
public uint SuperBatchNum { get; set; }
|
||||
/// <summary>价格 (1 = 1000金瓜子)</summary>
|
||||
public long Price { get; set; }
|
||||
/// <summary>金币类型 gold=付费 silver=免费</summary>
|
||||
public string CoinType { get; set; }
|
||||
/// <summary>礼物图片</summary>
|
||||
public string GifUrl { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// B站进房/关注消息(INTERACT_WORD.data)简化结构
|
||||
/// </summary>
|
||||
public class BiliInteractData
|
||||
{
|
||||
public long Uid { get; set; }
|
||||
public string Uname { get; set; }
|
||||
/// <summary>1=进入 2=关注 3=分享</summary>
|
||||
public int MsgType { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// B站点赞消息(LIKE_INFO_V3_CLICK.data)简化结构
|
||||
/// </summary>
|
||||
public class BiliLikeData
|
||||
{
|
||||
public long Uid { get; set; }
|
||||
public string Uname { get; set; }
|
||||
public string LikeText { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// B站房间统计(ONLINE_RANK_COUNT.data / ROOM_REAL_TIME_MESSAGE_UPDATE.data)简化结构
|
||||
/// </summary>
|
||||
public class BiliRoomStats
|
||||
{
|
||||
/// <summary>在线人数</summary>
|
||||
public long Online { get; set; }
|
||||
/// <summary>看过人数</summary>
|
||||
public long Watched { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using Newtonsoft.Json;
|
||||
@@ -6,6 +6,25 @@ using Org.BouncyCastle.Asn1.Crmf;
|
||||
|
||||
namespace BarrageGrab.Modles.JsonEntity
|
||||
{
|
||||
/// <summary>
|
||||
/// 直播平台
|
||||
/// </summary>
|
||||
public enum LivePlatform
|
||||
{
|
||||
/// <summary>
|
||||
/// 抖音
|
||||
/// </summary>
|
||||
Douyin = 0,
|
||||
/// <summary>
|
||||
/// 快手
|
||||
/// </summary>
|
||||
Kuaishou = 1,
|
||||
/// <summary>
|
||||
/// 哔哩哔哩
|
||||
/// </summary>
|
||||
Bilibili = 2
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 弹幕消息类型
|
||||
/// </summary>
|
||||
@@ -96,6 +115,11 @@ namespace BarrageGrab.Modles.JsonEntity
|
||||
/// </summary>
|
||||
public string ProcessName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 直播平台
|
||||
/// </summary>
|
||||
public LivePlatform Platform { get; set; } = LivePlatform.Douyin;
|
||||
|
||||
/// <summary>
|
||||
/// 消息对象
|
||||
/// </summary>
|
||||
@@ -106,11 +130,12 @@ namespace BarrageGrab.Modles.JsonEntity
|
||||
|
||||
}
|
||||
|
||||
public BarrageMsgPack(string data, PackMsgType type, string processName)
|
||||
public BarrageMsgPack(string data, PackMsgType type, string processName, LivePlatform platform = LivePlatform.Douyin)
|
||||
{
|
||||
Data = data;
|
||||
Type = type;
|
||||
ProcessName = processName;
|
||||
Platform = platform;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -0,0 +1,358 @@
|
||||
using System.Collections.Generic;
|
||||
using ProtoBuf;
|
||||
|
||||
namespace BarrageGrab.Modles.KsProtoEntity
|
||||
{
|
||||
[ProtoContract]
|
||||
public class KsSocketMessage
|
||||
{
|
||||
[ProtoMember(1)]
|
||||
public KsPayloadType PayloadType { get; set; }
|
||||
|
||||
[ProtoMember(2)]
|
||||
public KsCompressionType CompressionType { get; set; }
|
||||
|
||||
[ProtoMember(3)]
|
||||
public byte[] Payload { get; set; }
|
||||
}
|
||||
|
||||
public enum KsCompressionType
|
||||
{
|
||||
UNKNOWN = 0,
|
||||
NONE = 1,
|
||||
GZIP = 2,
|
||||
AES = 3
|
||||
}
|
||||
|
||||
public enum KsPayloadType
|
||||
{
|
||||
UNKNOWN = 0,
|
||||
CS_HEARTBEAT = 1,
|
||||
CS_ERROR = 3,
|
||||
CS_PING = 4,
|
||||
PS_HOST_INFO = 51,
|
||||
SC_HEARTBEAT_ACK = 101,
|
||||
SC_ECHO = 102,
|
||||
SC_ERROR = 103,
|
||||
SC_PING_ACK = 104,
|
||||
SC_INFO = 105,
|
||||
CS_ENTER_ROOM = 200,
|
||||
CS_USER_PAUSE = 201,
|
||||
CS_USER_EXIT = 202,
|
||||
CS_AUTHOR_PUSH_TRAFFIC_ZERO = 203,
|
||||
CS_HORSE_RACING = 204,
|
||||
CS_RACE_LOSE = 205,
|
||||
CS_VOIP_SIGNAL = 206,
|
||||
SC_ENTER_ROOM_ACK = 300,
|
||||
SC_AUTHOR_PAUSE = 301,
|
||||
SC_AUTHOR_RESUME = 302,
|
||||
SC_AUTHOR_PUSH_TRAFFIC_ZERO = 303,
|
||||
SC_AUTHOR_HEARTBEAT_MISS = 304,
|
||||
SC_PIP_STARTED = 305,
|
||||
SC_PIP_ENDED = 306,
|
||||
SC_HORSE_RACING_ACK = 307,
|
||||
SC_VOIP_SIGNAL = 308,
|
||||
SC_FEED_PUSH = 310,
|
||||
SC_ASSISTANT_STATUS = 311,
|
||||
SC_REFRESH_WALLET = 312,
|
||||
SC_LIVE_CHAT_CALL = 320,
|
||||
SC_LIVE_CHAT_CALL_ACCEPTED = 321,
|
||||
SC_LIVE_CHAT_CALL_REJECTED = 322,
|
||||
SC_LIVE_CHAT_READY = 323,
|
||||
SC_LIVE_CHAT_GUEST_END = 324,
|
||||
SC_LIVE_CHAT_ENDED = 325,
|
||||
SC_RENDERING_MAGIC_FACE_DISABLE = 326,
|
||||
SC_RENDERING_MAGIC_FACE_ENABLE = 327,
|
||||
SC_RED_PACK_FEED = 330,
|
||||
SC_LIVE_WATCHING_LIST = 340,
|
||||
SC_LIVE_QUIZ_QUESTION_ASKED = 350,
|
||||
SC_LIVE_QUIZ_QUESTION_REVIEWED = 351,
|
||||
SC_LIVE_QUIZ_SYNC = 352,
|
||||
SC_LIVE_QUIZ_ENDED = 353,
|
||||
SC_LIVE_QUIZ_WINNERS = 354,
|
||||
SC_SUSPECTED_VIOLATION = 355,
|
||||
SC_SHOP_OPENED = 360,
|
||||
SC_SHOP_CLOSED = 361,
|
||||
SC_GUESS_OPENED = 370,
|
||||
SC_GUESS_CLOSED = 371,
|
||||
SC_PK_INVITATION = 380,
|
||||
SC_PK_STATISTIC = 381,
|
||||
SC_RIDDLE_OPENED = 390,
|
||||
SC_RIDDLE_CLOESED = 391,
|
||||
SC_RIDE_CHANGED = 412,
|
||||
SC_BET_CHANGED = 441,
|
||||
SC_BET_CLOSED = 442,
|
||||
SC_LIVE_SPECIAL_ACCOUNT_CONFIG_STATE = 645
|
||||
}
|
||||
|
||||
[ProtoContract]
|
||||
public class KsSCWebFeedPush
|
||||
{
|
||||
[ProtoMember(1)]
|
||||
public string DisplayWatchingCount { get; set; }
|
||||
|
||||
[ProtoMember(2)]
|
||||
public string DisplayLikeCount { get; set; }
|
||||
|
||||
[ProtoMember(3)]
|
||||
public ulong PendingLikeCount { get; set; }
|
||||
|
||||
[ProtoMember(4)]
|
||||
public ulong PushInterval { get; set; }
|
||||
|
||||
[ProtoMember(5)]
|
||||
public List<KsWebCommentFeed> CommentFeeds { get; } = new List<KsWebCommentFeed>();
|
||||
|
||||
[ProtoMember(6)]
|
||||
public string CommentCursor { get; set; }
|
||||
|
||||
[ProtoMember(7)]
|
||||
public List<KsWebComboCommentFeed> ComboCommentFeed { get; } = new List<KsWebComboCommentFeed>();
|
||||
|
||||
[ProtoMember(8)]
|
||||
public List<KsWebLikeFeed> LikeFeeds { get; } = new List<KsWebLikeFeed>();
|
||||
|
||||
[ProtoMember(9)]
|
||||
public List<KsWebGiftFeed> GiftFeeds { get; } = new List<KsWebGiftFeed>();
|
||||
|
||||
[ProtoMember(10)]
|
||||
public string GiftCursor { get; set; }
|
||||
|
||||
[ProtoMember(11)]
|
||||
public List<KsWebSystemNoticeFeed> SystemNoticeFeeds { get; } = new List<KsWebSystemNoticeFeed>();
|
||||
|
||||
[ProtoMember(12)]
|
||||
public List<KsWebShareFeed> ShareFeeds { get; } = new List<KsWebShareFeed>();
|
||||
}
|
||||
|
||||
[ProtoContract]
|
||||
public class KsWebCommentFeed
|
||||
{
|
||||
[ProtoMember(1)]
|
||||
public string Id { get; set; }
|
||||
|
||||
[ProtoMember(2)]
|
||||
public KsSimpleUserInfo User { get; set; }
|
||||
|
||||
[ProtoMember(3)]
|
||||
public string Content { get; set; }
|
||||
|
||||
[ProtoMember(4)]
|
||||
public string DeviceHash { get; set; }
|
||||
|
||||
[ProtoMember(5)]
|
||||
public ulong SortRank { get; set; }
|
||||
|
||||
[ProtoMember(6)]
|
||||
public string Color { get; set; }
|
||||
|
||||
[ProtoMember(7)]
|
||||
public KsWebCommentFeedShowType ShowType { get; set; }
|
||||
}
|
||||
|
||||
public enum KsWebCommentFeedShowType
|
||||
{
|
||||
FEED_SHOW_UNKNOWN = 0,
|
||||
FEED_SHOW_NORMAL = 1,
|
||||
FEED_HIDDEN = 2
|
||||
}
|
||||
|
||||
[ProtoContract]
|
||||
public class KsWebComboCommentFeed
|
||||
{
|
||||
[ProtoMember(1)]
|
||||
public string Id { get; set; }
|
||||
|
||||
[ProtoMember(2)]
|
||||
public string Content { get; set; }
|
||||
|
||||
[ProtoMember(3)]
|
||||
public uint ComboCount { get; set; }
|
||||
}
|
||||
|
||||
[ProtoContract]
|
||||
public class KsWebLikeFeed
|
||||
{
|
||||
[ProtoMember(1)]
|
||||
public string Id { get; set; }
|
||||
|
||||
[ProtoMember(2)]
|
||||
public KsSimpleUserInfo User { get; set; }
|
||||
|
||||
[ProtoMember(3)]
|
||||
public ulong SortRank { get; set; }
|
||||
|
||||
[ProtoMember(4)]
|
||||
public string DeviceHash { get; set; }
|
||||
}
|
||||
|
||||
[ProtoContract]
|
||||
public class KsWebGiftFeed
|
||||
{
|
||||
[ProtoMember(1)]
|
||||
public string Id { get; set; }
|
||||
|
||||
[ProtoMember(2)]
|
||||
public KsSimpleUserInfo User { get; set; }
|
||||
|
||||
[ProtoMember(3)]
|
||||
public ulong Time { get; set; }
|
||||
|
||||
[ProtoMember(4)]
|
||||
public uint GiftId { get; set; }
|
||||
|
||||
[ProtoMember(5)]
|
||||
public ulong SortRank { get; set; }
|
||||
|
||||
[ProtoMember(6)]
|
||||
public string MergeKey { get; set; }
|
||||
|
||||
[ProtoMember(7)]
|
||||
public uint BatchSize { get; set; }
|
||||
|
||||
[ProtoMember(8)]
|
||||
public uint ComboCount { get; set; }
|
||||
|
||||
[ProtoMember(9)]
|
||||
public uint Rank { get; set; }
|
||||
|
||||
[ProtoMember(10)]
|
||||
public ulong ExpireDuration { get; set; }
|
||||
|
||||
[ProtoMember(11)]
|
||||
public ulong ClientTimestamp { get; set; }
|
||||
|
||||
[ProtoMember(12)]
|
||||
public ulong SlotDisplayDuration { get; set; }
|
||||
|
||||
[ProtoMember(13)]
|
||||
public uint StarLevel { get; set; }
|
||||
|
||||
[ProtoMember(14)]
|
||||
public KsGiftStyleType StyleType { get; set; }
|
||||
|
||||
[ProtoMember(15)]
|
||||
public KsWebLiveAssistantType LiveAssistantType { get; set; }
|
||||
|
||||
[ProtoMember(16)]
|
||||
public string DeviceHash { get; set; }
|
||||
|
||||
[ProtoMember(17)]
|
||||
public bool DanmakuDisplay { get; set; }
|
||||
}
|
||||
|
||||
public enum KsGiftStyleType
|
||||
{
|
||||
UNKNOWN_STYLE = 0,
|
||||
BATCH_STAR_0 = 1,
|
||||
BATCH_STAR_1 = 2,
|
||||
BATCH_STAR_2 = 3,
|
||||
BATCH_STAR_3 = 4,
|
||||
BATCH_STAR_4 = 5,
|
||||
BATCH_STAR_5 = 6,
|
||||
BATCH_STAR_6 = 7
|
||||
}
|
||||
|
||||
public enum KsWebLiveAssistantType
|
||||
{
|
||||
UNKNOWN_ASSISTANT_TYPE = 0,
|
||||
SUPER = 1,
|
||||
JUNIOR = 2
|
||||
}
|
||||
|
||||
[ProtoContract]
|
||||
public class KsWebSystemNoticeFeed
|
||||
{
|
||||
[ProtoMember(1)]
|
||||
public string Id { get; set; }
|
||||
|
||||
[ProtoMember(2)]
|
||||
public KsSimpleUserInfo User { get; set; }
|
||||
|
||||
[ProtoMember(3)]
|
||||
public ulong Time { get; set; }
|
||||
|
||||
[ProtoMember(4)]
|
||||
public string Content { get; set; }
|
||||
|
||||
[ProtoMember(5)]
|
||||
public ulong DisplayDuration { get; set; }
|
||||
|
||||
[ProtoMember(6)]
|
||||
public ulong SortRank { get; set; }
|
||||
|
||||
[ProtoMember(7)]
|
||||
public KsDisplayType DisplayType { get; set; }
|
||||
}
|
||||
|
||||
public enum KsDisplayType
|
||||
{
|
||||
UNKNOWN_DISPLAY_TYPE = 0,
|
||||
COMMENT = 1,
|
||||
ALERT = 2,
|
||||
TOAST = 3
|
||||
}
|
||||
|
||||
[ProtoContract]
|
||||
public class KsWebShareFeed
|
||||
{
|
||||
[ProtoMember(1)]
|
||||
public string Id { get; set; }
|
||||
|
||||
[ProtoMember(2)]
|
||||
public KsSimpleUserInfo User { get; set; }
|
||||
|
||||
[ProtoMember(3)]
|
||||
public ulong Time { get; set; }
|
||||
|
||||
[ProtoMember(4)]
|
||||
public uint ThirdPartyPlatform { get; set; }
|
||||
|
||||
[ProtoMember(5)]
|
||||
public ulong SortRank { get; set; }
|
||||
|
||||
[ProtoMember(6)]
|
||||
public KsWebLiveAssistantType LiveAssistantType { get; set; }
|
||||
|
||||
[ProtoMember(7)]
|
||||
public string DeviceHash { get; set; }
|
||||
}
|
||||
|
||||
[ProtoContract]
|
||||
public class KsSimpleUserInfo
|
||||
{
|
||||
[ProtoMember(1)]
|
||||
public string PrincipalId { get; set; }
|
||||
|
||||
[ProtoMember(2)]
|
||||
public string UserName { get; set; }
|
||||
|
||||
[ProtoMember(3)]
|
||||
public string HeadUrl { get; set; }
|
||||
}
|
||||
|
||||
[ProtoContract]
|
||||
public class KsCSWebEnterRoom
|
||||
{
|
||||
[ProtoMember(1)]
|
||||
public string Token { get; set; }
|
||||
|
||||
[ProtoMember(2)]
|
||||
public string LiveStreamId { get; set; }
|
||||
|
||||
[ProtoMember(3)]
|
||||
public uint ReconnectCount { get; set; }
|
||||
|
||||
[ProtoMember(4)]
|
||||
public uint LastErrorCode { get; set; }
|
||||
|
||||
[ProtoMember(5)]
|
||||
public string ExpTag { get; set; }
|
||||
|
||||
[ProtoMember(6)]
|
||||
public string Attach { get; set; }
|
||||
|
||||
[ProtoMember(7)]
|
||||
public string PageId { get; set; }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user