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