using System; using System.ComponentModel; using Newtonsoft.Json.Linq; using Newtonsoft.Json; using Org.BouncyCastle.Asn1.Crmf; namespace BarrageGrab.Modles.JsonEntity { /// /// 直播平台 /// public enum LivePlatform { /// /// 抖音 /// Douyin = 0, /// /// 快手 /// Kuaishou = 1, /// /// 哔哩哔哩 /// Bilibili = 2 } /// /// 弹幕消息类型 /// public enum PackMsgType { [Description("无")] 无 = 0, [Description("消息")] 弹幕消息 = 1, [Description("点赞")] 点赞消息 = 2, [Description("进房")] 进直播间 = 3, [Description("关注")] 关注消息 = 4, [Description("礼物")] 礼物消息 = 5, [Description("统计")] 直播间统计 = 6, [Description("粉团")] 粉丝团消息 = 7, [Description("分享")] 直播间分享 = 8, [Description("下播")] 下播 = 9, [Description("伴侣开播")] 直播伴侣开播 = 101, [Description("伴侣下播")] 直播伴侣下播 = 102 } /// /// 粉丝团消息类型 /// public enum FansclubType { 无 = 0, 粉丝团升级 = 1, 加入粉丝团 = 2 } /// /// 直播间分享目标 /// public enum ShareType { 未知 = 0, 微信 = 1, 朋友圈 = 2, 微博 = 3, QQ空间 = 4, QQ = 5, 抖音好友 = 112 } /// /// 观众的进入方式 /// public enum EnterType { 正常进入 = 0, 通过分享进入 = 6, //...其他暂时未知 } /// /// 直播伴侣操作事件 /// public enum LiveCompanAction { 开播 = 0, 下播 = 1 } /// /// 数据包装器 /// public class BarrageMsgPack { /// /// 消息类型 /// public PackMsgType Type { get; set; } /// /// 进程名 /// public string ProcessName { get; set; } /// /// 直播平台 /// public LivePlatform Platform { get; set; } = LivePlatform.Douyin; /// /// 消息对象 /// public string Data { get; set; } public BarrageMsgPack() { } public BarrageMsgPack(string data, PackMsgType type, string processName, LivePlatform platform = LivePlatform.Douyin) { Data = data; Type = type; ProcessName = processName; Platform = platform; } /// /// 当收到弹幕消息时执行回调 /// public void IfChatMsg(Action action) => IfTypedMsg(PackMsgType.弹幕消息, action); /// /// 当收到点赞消息时执行回调 /// public void IfLikeMsg(Action action) => IfTypedMsg(PackMsgType.点赞消息, action); /// /// 当收到进直播间消息时执行回调 /// public void IfMemberMsg(Action action) => IfTypedMsg(PackMsgType.进直播间, action); /// /// 当收到关注消息时执行回调 /// public void IfFollowMsg(Action action) => IfTypedMsg(PackMsgType.关注消息, action); /// /// 当收到礼物消息时执行回调 /// public void IfGiftMsg(Action action) => IfTypedMsg(PackMsgType.礼物消息, action); /// /// 当收到直播间统计消息时执行回调 /// public void IfUserSeqMsg(Action action) => IfTypedMsg(PackMsgType.直播间统计, action); /// /// 当收到粉丝团消息时执行回调 /// public void IfFansclubMsg(Action action) => IfTypedMsg(PackMsgType.粉丝团消息, action); /// /// 当收到直播间分享消息时执行回调 /// public void IfShareMsg(Action action) => IfTypedMsg(PackMsgType.直播间分享, action); /// /// 当收到下播消息 /// public void IfLiveEndMsg(Action action) => IfTypedMsg(PackMsgType.下播, action); /// /// 解析所有未知类型的消息 /// public void IfAnyMsg(Action action) { // 将 Data 转换为 JObject JObject jObject = null; try { jObject = JObject.Parse(this.Data); } catch (Exception) { // 解析失败,忽略错误 return; } // 如果成功解析为 JObject,转换为 Msg 对象 if (jObject != null) { var msg = jObject.ToObject(); if (msg != null) { action(msg); } } } /// /// 泛型方法,根据 PackMsgType 解析消息对象并执行回调 /// private void IfTypedMsg(PackMsgType expectedType, Action action) where T : Msg { if (this.Type != expectedType) return; if (this.Data == null) return; // 尝试将 Data 直接作为 T 类型使用 T msg = null; try { // 如果 Data 是字符串类型 if (this.Data is string) { // 先尝试解析为 JObject try { JObject jObject = JObject.Parse(this.Data); msg = jObject.ToObject(); } catch { // 如果解析 JObject 失败,尝试直接反序列化 msg = JsonConvert.DeserializeObject(this.Data); } } } catch (Exception) { // 解析失败,忽略错误 } // 如果成功解析消息,执行回调 if (msg != null) { action(msg); } } } /// /// 消息 /// public class Msg { /// /// 弹幕ID /// public long MsgId { get; set; } /// /// 用户数据 /// public MsgUser User { get; set; } /// /// 主播简要信息 /// public RoomAnchorInfo Owner { get; set; } public string Onwer { get; set; } = "该字段存在拼写错误,请修正为 ‘Owner’ 后使用"; /// /// 消息内容 /// public string Content { get; set; } /// /// 房间号 /// public string RoomId { get; set; } /// /// web直播间ID /// public string WebRoomId { get; set; } /// /// 房间标题 /// public string RoomTitle { get; set; } /// /// 是否是匿名直播间 /// public bool IsAnonymous { get; set; } /// /// 用户使用的 Appid ,已知 1128,8663,2329 等 /// public string Appid { get; set; } } /// /// 粉丝团信息 /// public class FansClubInfo { /// /// 粉丝团名称 /// public string ClubName { get; set; } /// /// 粉丝团等级,没加入则0 /// public int Level { get; set; } } /// /// 直播间主播信息 /// public class RoomAnchorInfo { /// /// 用户ID /// public string UserId { get; set; } /// /// SecUid /// public string SecUid { get; set; } /// /// 昵称 /// public string Nickname { get; set; } /// /// 头像地址 /// public string HeadUrl { get; set; } /// /// 关注状态 0未关注,1已关注,... /// public int FollowStatus { get; set; } } /// /// 用户弹幕信息 /// public class MsgUser { /// /// 真实ID /// public long Id { get; set; } /// /// 是否是直播间管理员 /// public bool IsAdmin { get; set; } = false; /// /// 是否是主播自己 /// public bool IsAnchor { get; set; } = false; /// /// ShortId /// public long ShortId { get; set; } /// /// 自定义ID /// public string DisplayId { get; set; } /// /// 昵称 /// public string Nickname { get; set; } /// /// 未知 /// public int Level { get; set; } /// /// 支付等级 /// public int PayLevel { get; set; } /// /// 性别 1男 2女 /// public int Gender { get; set; } /// /// 头像地址 /// public string HeadImgUrl { get; set; } /// /// 用户主页地址 /// public string SecUid { get; set; } /// /// 粉丝团信息 /// public FansClubInfo FansClub { get; set; } /// /// 粉丝数 /// public long FollowerCount { get; set; } /// /// 关注状态 0 未关注 1 已关注 2,不明 /// public long FollowStatus { get; set; } /// /// 关注数 /// public long FollowingCount; public string GenderToString() { return Gender == 1 ? "男" : Gender == 2 ? "女" : "妖"; } } /// /// 礼物消息 /// public class GiftMsg : Msg { /// /// 礼物ID /// public long GiftId { get; set; } /// /// 礼物名称 /// public string GiftName { get; set; } /// /// 礼物分组ID /// public long GroupId { get; set; } /// /// 本次(增量)礼物数量 /// public long GiftCount { get; set; } /// /// 礼物数量(连续的) /// public long RepeatCount { get; set; } /// /// 抖币价格 /// public int DiamondCount { get; set; } /// /// 该礼物是否可连击 /// public bool Combo { get; set; } /// /// 礼物图片地址 /// public string ImgUrl { get; set; } /// /// 送礼目标(连麦直播间有用) /// public MsgUser ToUser { get; set; } } /// /// 点赞消息 /// public class LikeMsg : Msg { /// /// 点赞数量 /// public long Count { get; set; } /// /// 总共点赞数量 /// public long Total { get; set; } } /// /// 直播间统计消息 /// public class UserSeqMsg : Msg { /// /// 当前直播间用户数量 /// public long OnlineUserCount { get; set; } /// /// 累计直播间用户数量 /// public long TotalUserCount { get; set; } /// /// 累计直播间用户数量 显示文本 /// public string TotalUserCountStr { get; set; } /// /// 当前直播间用户数量 显示文本 /// public string OnlineUserCountStr { get; set; } } /// /// 粉丝团消息 /// public class FansclubMsg : Msg { /// /// 粉丝团消息类型,升级1,加入2 /// public int Type { get; set; } /// /// 粉丝团等级 /// public int Level { get; set; } } /// /// 来了消息 /// public class MemberMessage : Msg { /// /// 当前直播间人数 /// public long CurrentCount { get; set; } /// /// 直播间进入方式,目前已知 0 正常进入,6 通过分享进入 /// public long EnterTipType { get; set; } } /// /// 直播间分享 /// public class ShareMessage : Msg { /// /// 分享目标 /// public ShareType ShareType { get; set; } } /// /// 直播伴侣操作消息 /// public class LiveCompanActionMsg : Msg { public LiveCompanAction Action { get; set; } public object Data { get; set; } = null; } }