|
|
package msg_handler
|
|
|
|
|
|
import (
|
|
|
"git.noahlan.cn/northlan/ntools-go/kafka"
|
|
|
"git.noahlan.cn/northlan/ntools-go/logger"
|
|
|
"live-gateway/config"
|
|
|
"live-gateway/douyu/stt"
|
|
|
pbMq "live-gateway/pb/mq"
|
|
|
pbVars "live-gateway/pb/vars"
|
|
|
kfk "live-gateway/pkg/kafka"
|
|
|
"strconv"
|
|
|
)
|
|
|
|
|
|
// MsgDanmaku 用户在房间发送弹幕时,服务端发此消息给客户端,完整的数据部分应包含的字段如下(挑选有用的)
|
|
|
type (
|
|
|
MsgDanmaku struct {
|
|
|
RoomId int64 `stt:"rid"` // 房间ID
|
|
|
Uid int64 `stt:"uid"` // 用户ID
|
|
|
Nickname string `stt:"nn"` // 昵称
|
|
|
Txt string `stt:"txt"` // 弹幕
|
|
|
Level int32 `stt:"level"` // 用户等级
|
|
|
Rg int32 `stt:"rg"` // 房间权限组,默认值1(表示普通权限用户) UP:5
|
|
|
Avatar string `stt:"ic"` // 头像地址,后需要添加 _big.jpg 或 _small.jpg 头像获取 https://apic.douyucdn.cn/upload/
|
|
|
FansMedal // 粉丝勋章
|
|
|
Ol int32 `stt:"ol"` // 主播等级
|
|
|
Cid string `stt:"cid"` // 弹幕唯一ID
|
|
|
Cst int64 `stt:"cst"` // 时间戳 ms
|
|
|
Ct int32 `stt:"ct"` // 客户端类型,默认值0
|
|
|
Sahf string `stt:"sahf"` // 扩展字段,一般不用
|
|
|
}
|
|
|
MsgDanmakuHandler struct {
|
|
|
producer *kafka.Producer
|
|
|
liveRoomId int64
|
|
|
}
|
|
|
)
|
|
|
|
|
|
func NewMsgDanmakuHandler(liveRoomId int64) *MsgDanmakuHandler {
|
|
|
cfg := config.Config.Kafka.Danmaku
|
|
|
return &MsgDanmakuHandler{
|
|
|
producer: kafka.NewKafkaProducer(kfk.DefaultProducerConfig, cfg.Addr, cfg.Topic),
|
|
|
liveRoomId: liveRoomId,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
func (m *MsgDanmakuHandler) DataType() string {
|
|
|
return "chatmsg"
|
|
|
}
|
|
|
|
|
|
func (m *MsgDanmakuHandler) HandlerMessage(data []byte) {
|
|
|
var ret MsgDanmaku
|
|
|
err := stt.Unmarshal(data, &ret)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
logger.SLog.Debugf("%s 说: %s", ret.Nickname, ret.Txt)
|
|
|
|
|
|
dmMsg := &pbMq.MqDanmaku{
|
|
|
Platform: pbVars.Platform_name[int32(pbVars.Platform_Douyu)],
|
|
|
LiveRoomId: m.liveRoomId,
|
|
|
Uid: ret.Uid,
|
|
|
Uname: ret.Nickname,
|
|
|
Avatar: "https://apic.douyucdn.cn/upload/" + ret.Avatar + "_small.jpg", // TODO 暂时组合,应该保留原始,然后客户端配置
|
|
|
Msg: ret.Txt,
|
|
|
MsgId: ret.Cid,
|
|
|
Timestamp: ret.Cst,
|
|
|
|
|
|
FansMedalWearingStatus: ret.FansMedal.MedalRoomId == m.liveRoomId,
|
|
|
FansMedalName: ret.FansMedal.MedalName,
|
|
|
FansMedalLevel: ret.FansMedal.MedalLevel,
|
|
|
}
|
|
|
_ = m.producer.SendMessageAsync(dmMsg, strconv.FormatInt(ret.Uid, 10))
|
|
|
}
|