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;
}
}