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.

99 lines
3.2 KiB
Go

package msg_handler
import (
"encoding/json"
"git.noahlan.cn/northlan/ntools-go/kafka"
"git.noahlan.cn/northlan/ntools-go/logger"
"github.com/jinzhu/now"
"live-gateway/config"
"live-gateway/pb"
kfk "live-gateway/pkg/kafka"
"live-gateway/pkg/timex"
"strconv"
)
type GuardBuyOfficial struct {
UserInfo userInfo `json:"user_info"` // 用户信息
GuardLevel int64 `json:"guard_level"` // 大航海等级 1总督 2提督 3舰长
GuardNum int64 `json:"guard_num"` // 大航海数量
GuardUnit string `json:"guard_unit"` // 大航海单位 (个月)
FansMedalLevel int64 `json:"fans_medal_level"` // 粉丝勋章等级
FansMedalName string `json:"fans_medal_name"` // 粉丝勋章名
FansMedalWearingStatus bool `json:"fans_medal_wearing_status"` // 佩戴的粉丝勋章佩戴状态
RoomId int64 `json:"room_id"` // 房间号
MsgId string `json:"msg_id"` // 消息唯一id
Timestamp int64 `json:"timestamp"` // 上舰时间秒级时间戳
}
type userInfo struct {
Uid int64 `json:"uid"` // 用户uid
Uname string `json:"uname"` // 用户昵称
Uface string `json:"uface"` // 用户头像
}
type GuardBuyOfficialHandler struct {
producer *kafka.Producer
liveRoomId int64
}
func NewGuardBuyOfficialHandler(liveRoomId int64) *GuardBuyOfficialHandler {
cfg := config.Config.Kafka.GuardBuy
return &GuardBuyOfficialHandler{
producer: kafka.NewKafkaProducer(kfk.DefaultProducerConfig, cfg.Addr, cfg.Topic),
liveRoomId: liveRoomId,
}
}
func (h *GuardBuyOfficialHandler) CMD() string {
return "GUARD_BUY"
}
func (h *GuardBuyOfficialHandler) HandlerMessage(data []byte) {
var baseMsg struct {
CMD string `json:"cmd"`
Data *GuardBuyOfficial `json:"data"`
}
if err := json.Unmarshal(data, &baseMsg); err != nil {
return
}
d := baseMsg.Data
logger.SLog.Infof("%s 购买 %d %d%s", d.UserInfo.Uname, d.GuardLevel, d.GuardNum, d.GuardUnit)
dmMsg := &pbMq.MqNobilityBuy{
Platform: pbMq.Platform_name[int32(pbMq.Platform_bilibili)],
LiveRoomId: h.liveRoomId,
Uid: d.UserInfo.Uid,
Uname: d.UserInfo.Uname,
Avatar: d.UserInfo.Uface,
MsgId: d.MsgId,
NobilityLevel: d.GuardLevel,
Price: 0, // 自己算
StartTime: d.Timestamp,
EndTime: 0, // 自己算
FansMedalWearingStatus: d.FansMedalWearingStatus,
FansMedalName: d.FansMedalName,
FansMedalLevel: d.FansMedalLevel,
}
switch d.GuardLevel {
case 1:
dmMsg.Price = 19998 * 1000 // 金瓜子
case 2:
dmMsg.Price = 1998 * 1000
case 3:
dmMsg.Price = 138 * 1000 // 应该没有人会不用连续包月然后取消吧?
}
// 计算时间
switch d.GuardUnit {
case "月":
dmMsg.EndTime = now.With(timex.TimestampToTime(d.Timestamp)).
AddDate(0, 1, 0).Unix()
case "年":
dmMsg.EndTime = now.With(timex.TimestampToTime(d.Timestamp)).
AddDate(1, 0, 0).Unix()
}
_ = h.producer.SendMessageAsync(dmMsg, strconv.FormatInt(dmMsg.Uid, 10))
}