You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
2.6 KiB
Go

package msg_handler
import (
"encoding/json"
"git.noahlan.cn/northlan/ntools-go/kafka"
"git.noahlan.cn/northlan/ntools-go/logger"
"live-gateway/config"
pbMq "live-gateway/pb"
kfk "live-gateway/pkg/kafka"
"strconv"
)
//var _ bilibili.MsgHandler = (*DanmakuHandler)(nil)
// DanmakuOfficial 弹幕结构 官方
type DanmakuOfficial struct {
Uname string `json:"uname"` // 用户昵称
UID int64 `json:"uid"` // 用户ID
UFace string `json:"uface"` // 用户头像
Timestamp int64 `json:"timestamp"` // 弹幕发送时间秒级时间戳
RoomId int64 `json:"room_id"` // 用户模式
Msg string `json:"msg"` // 弹幕内容
MsgId string `json:"msg_id"` // 消息唯一ID
GuardLevel int64 `json:"guard_level"` // 对应房间大航海等级
FansMedalWearingStatus bool `json:"fans_medal_wearing_status"` // 当前佩戴粉丝勋章佩戴状态
FansMedalName string `json:"fans_medal_name"` // 粉丝勋章名
FansMedalLevel int64 `json:"fans_medal_level"` // 粉丝勋章等级
}
type DanmakuOfficialHandler struct {
producer *kafka.Producer
liveRoomId int64
}
func NewDanmakuOfficialHandler(liveRoomId int64) *DanmakuOfficialHandler {
cfg := config.Config.Kafka.Danmaku
return &DanmakuOfficialHandler{
producer: kafka.NewKafkaProducer(kfk.DefaultProducerConfig, cfg.Addr, cfg.Topic),
liveRoomId: liveRoomId,
}
}
func (d *DanmakuOfficialHandler) CMD() string {
return "LIVE_OPEN_PLATFORM_DM"
}
func (d *DanmakuOfficialHandler) HandlerMessage(data []byte) {
var baseMsg struct {
CMD string `json:"cmd"`
Data *DanmakuOfficial `json:"data"`
}
if err := json.Unmarshal(data, &baseMsg); err != nil {
return
}
dm := baseMsg.Data
logger.SLog.Debugf("%s 说: %s", dm.Uname, dm.Msg)
logger.SLog.Debugf("%+v", dm)
dmMsg := &pbMq.MqDanmaku{
Platform: pbMq.Platform_name[int32(pbMq.Platform_bilibili)],
LiveRoomId: d.liveRoomId,
Uid: dm.UID,
Uname: dm.Uname,
Avatar: dm.UFace,
Msg: dm.Msg,
MsgId: dm.MsgId,
Timestamp: dm.Timestamp,
NobilityLevel: dm.GuardLevel,
FansMedalWearingStatus: dm.FansMedalWearingStatus,
FansMedalName: dm.FansMedalName,
FansMedalLevel: dm.FansMedalLevel,
}
_ = d.producer.SendMessageAsync(dmMsg, strconv.FormatInt(dm.UID, 10))
}