Files
DanMuRead/Demos/NodeJS/parsers.js
T
2025-04-30 22:53:19 +08:00

215 lines
7.0 KiB
JavaScript

const {
MsgUser, FansClubInfo, Msg, LikeMsg, MemberMessage, UserSeqMsg,
Gender, GiftMsg, FansclubMsg, ShareMessage, RoomAnchorInfo, ShareType
} = require('./entities');
/**
* 消息解析器类
*/
class MessageParser {
/**
* 解析用户数据
* @param {Object} userData - 用户数据对象
* @returns {MsgUser} - 解析后的用户对象
*/
static parseUser(userData) {
const user = new MsgUser();
if (!userData) {
return user;
}
user.Id = userData.Id || 0;
user.IsAdmin = userData.IsAdmin || false;
user.IsAnchor = userData.IsAnchor || false;
user.ShortId = userData.ShortId || 0;
user.DisplayId = userData.DisplayId || "";
user.Nickname = userData.Nickname || "匿名用户";
user.Level = userData.Level || 0;
user.PayLevel = userData.PayLevel || 0;
user.Gender = userData.Gender || 0;
user.HeadImgUrl = userData.HeadImgUrl || "";
user.SecUid = userData.SecUid || "";
user.FollowerCount = userData.FollowerCount || 0;
user.FollowStatus = userData.FollowStatus || 0;
user.FollowingCount = userData.FollowingCount || 0;
// 解析粉丝团信息
if (userData.FansClub) {
const fansClubData = userData.FansClub;
user.FansClub = new FansClubInfo({
ClubName: fansClubData.ClubName || "",
Level: fansClubData.Level || 0
});
}
return user;
}
/**
* 解析主播信息
* @param {Object} ownerData - 主播数据对象
* @returns {RoomAnchorInfo|null} - 解析后的主播信息对象或null
*/
static parseAnchorInfo(ownerData) {
if (!ownerData) {
return null;
}
const owner = new RoomAnchorInfo({
UserId: ownerData.UserId || "",
SecUid: ownerData.SecUid || "",
Nickname: ownerData.Nickname || "",
HeadUrl: ownerData.HeadUrl || "",
FollowStatus: ownerData.FollowStatus || 0
});
return owner;
}
/**
* 解析通用消息字段
* @param {Object} data - 消息数据对象
* @param {Msg} msg - 消息对象
* @returns {Msg} - 解析后的消息对象
*/
static parseCommonMsgFields(data, msg) {
msg.MsgId = data.MsgId || 0;
msg.Content = data.Content || "";
msg.RoomId = data.RoomId || "";
msg.WebRoomId = data.WebRoomId || "";
msg.Appid = data.Appid || "";
// 解析用户数据
if (data.User) {
msg.User = MessageParser.parseUser(data.User);
}
// 解析主播数据,优先使用正确拼写的"Owner"
if (data.Owner) {
msg.Owner = MessageParser.parseAnchorInfo(data.Owner);
}
// 如果没有"Owner"字段才考虑拼写错误的"Onwer"字段,并且确保不是字符串
else if (data.Onwer && typeof data.Onwer !== 'string') {
msg.Owner = MessageParser.parseAnchorInfo(data.Onwer);
}
return msg;
}
/**
* 解析弹幕消息
* @param {Object} data - 弹幕消息数据
* @returns {Msg} - 解析后的弹幕消息对象
*/
static parseDanmaku(data) {
const msg = new Msg();
return MessageParser.parseCommonMsgFields(data, msg);
}
/**
* 解析点赞消息
* @param {Object} data - 点赞消息数据
* @returns {LikeMsg} - 解析后的点赞消息对象
*/
static parseLike(data) {
const likeMsg = new LikeMsg();
MessageParser.parseCommonMsgFields(data, likeMsg);
likeMsg.Count = data.Count || 0;
likeMsg.Total = data.Total || 0;
return likeMsg;
}
/**
* 解析进入直播间消息
* @param {Object} data - 进入直播间消息数据
* @returns {MemberMessage} - 解析后的进入直播间消息对象
*/
static parseMember(data) {
const memberMsg = new MemberMessage();
MessageParser.parseCommonMsgFields(data, memberMsg);
memberMsg.CurrentCount = data.CurrentCount || 0;
memberMsg.EnterTipType = data.EnterTipType || 0;
return memberMsg;
}
/**
* 解析礼物消息
* @param {Object} data - 礼物消息数据
* @returns {GiftMsg} - 解析后的礼物消息对象
*/
static parseGift(data) {
const giftMsg = new GiftMsg();
MessageParser.parseCommonMsgFields(data, giftMsg);
giftMsg.GiftId = data.GiftId || 0;
giftMsg.GiftName = data.GiftName || "";
giftMsg.GroupId = data.GroupId || 0;
giftMsg.GiftCount = data.GiftCount || 0;
giftMsg.RepeatCount = data.RepeatCount || 0;
giftMsg.DiamondCount = data.DiamondCount || 0;
giftMsg.GiftValue = data.GiftValue || 0; // 兼容原有代码
giftMsg.Combo = data.Combo || false;
giftMsg.ImgUrl = data.ImgUrl || "";
// 解析接收礼物的用户
if (data.ToUser) {
giftMsg.ToUser = MessageParser.parseUser(data.ToUser);
}
return giftMsg;
}
/**
* 解析直播间统计消息
* @param {Object} data - 直播间统计消息数据
* @returns {UserSeqMsg} - 解析后的直播间统计消息对象
*/
static parseStatistics(data) {
const statsMsg = new UserSeqMsg();
MessageParser.parseCommonMsgFields(data, statsMsg);
statsMsg.OnlineUserCount = data.OnlineUserCount || 0;
statsMsg.TotalUserCount = data.TotalUserCount || 0;
statsMsg.TotalUserCountStr = data.TotalUserCountStr || "0";
statsMsg.OnlineUserCountStr = data.OnlineUserCountStr || "0";
return statsMsg;
}
/**
* 解析粉丝团消息
* @param {Object} data - 粉丝团消息数据
* @returns {FansclubMsg} - 解析后的粉丝团消息对象
*/
static parseFansclub(data) {
const fansclubMsg = new FansclubMsg();
MessageParser.parseCommonMsgFields(data, fansclubMsg);
fansclubMsg.Type = data.Type || 0;
fansclubMsg.Level = data.Level || 0;
fansclubMsg.FansClubName = data.FansClubName || "";
return fansclubMsg;
}
/**
* 解析直播间分享消息
* @param {Object} data - 直播间分享消息数据
* @returns {ShareMessage} - 解析后的直播间分享消息对象
*/
static parseShare(data) {
const shareMsg = new ShareMessage();
MessageParser.parseCommonMsgFields(data, shareMsg);
shareMsg.ShareType = data.ShareType || ShareType.未知;
return shareMsg;
}
/**
* 解析关注消息
* @param {Object} data - 关注消息数据
* @returns {Msg} - 解析后的关注消息对象
*/
static parseFollow(data) {
const followMsg = new Msg();
return MessageParser.parseCommonMsgFields(data, followMsg);
}
}
module.exports = {
MessageParser
};