group.go 5.46 KB
package rpc

import (
	"encoding/json"
	"fmt"
	"git.hilo.cn/hilo-common/_const/enum/timezone_e"
	"git.hilo.cn/hilo-common/domain"
	"git.hilo.cn/hilo-common/mylogrus"
	"git.hilo.cn/hilo-common/resource/consul"
	"git.hilo.cn/hilo-common/resource/mysql"
	"math/rand"
)

const (
	defaultGroupConsulName   = "hiloGroup"
	defaultGroupServerScheme = "http"
	defaultGroupServerAddr   = "127.0.0.1:9050" // 默认内网转发,本地回环
)

var groupServerHost = []string{defaultGroupServerAddr}

func init() {
	go func() {
		consul.RegisterWatcher(defaultGroupConsulName, func(addr []string) {
			if len(addr) > 0 {
				groupServerHost = addr
			}
		})
	}()
}

// 家族信息
type CvGroupPowerInfo struct {
	CvGroupPowerBase   `json:",inline"`
	CvGroupPowerMember `json:",inline"`
	CvGroupPowerGrade  `json:",inline"`
}

// 家族基本信息
type CvGroupPowerBase struct {
	Id        mysql.ID `json:"id"`        // 家族id
	Icon      string   `json:"icon"`      // 家族图片
	Name      string   `json:"name"`      // 家族名
	Nameplate string   `json:"nameplate"` // 铭牌
}

// 家族成员
type CvGroupPowerMember struct {
	MemberNum mysql.Num `json:"memberNum"` // 当前成员数
	MemberMax mysql.Num `json:"memberMax"` // 成员上限
}

// 家族等级
type CvGroupPowerGrade struct {
	Grade    int    `json:"grade"`              // 等级 0:无 1:青铜 2:白银 3:黄金 4:黑金
	Exp      uint32 `json:"exp"`                // 经验值
	NextExp  uint32 `json:"nextExp,omitempty"`  // 升级所需经验值
	ExpireAt string `json:"expireAt,omitempty"` // 有效期
	ShowExp  bool   `json:"showExp"`            // 是否展示经验值
}

// 获取家族
func GetGroupPower(model *domain.Model, groupPowerId mysql.ID) (CvGroupPowerInfo, error) {
	infos, err := MGetGroupPower(model, []mysql.ID{groupPowerId})
	if err != nil {
		return CvGroupPowerInfo{}, nil
	}
	return infos[groupPowerId], nil
}

// 批量获取家族
func MGetGroupPower(model *domain.Model, groupPowerIds []mysql.ID) (map[mysql.ID]CvGroupPowerInfo, error) {
	type Response struct {
		Code    int    `json:"code"`
		Message string `json:"message"`
		Data    map[mysql.ID]CvGroupPowerInfo
	}
	var res = make(map[mysql.ID]CvGroupPowerInfo)
	if len(groupPowerIds) <= 0 {
		return res, nil
	}
	var idsStr []string
	for _, userId := range groupPowerIds {
		idsStr = append(idsStr, fmt.Sprintf("%d", userId))
	}
	_url := fmt.Sprintf("%v://%v/inner/groupPower/infos", defaultGroupServerScheme, getGroupHost())
	resp, err := HttpGet(model, _url, nil, map[string][]string{
		"ids": idsStr,
	})
	if err != nil {
		model.Log.Errorf("MGetGroupPower fail:%v", err)
		return res, err
	}
	response := new(Response)
	if err = json.Unmarshal(resp, response); err != nil {
		model.Log.Errorf("MGetUserSvip json fail:%v", err)
		return res, err
	}
	res = response.Data
	return res, nil
}

// 批量获取用户天上麦时长
// param day 获取的天,格式 2006-01-02
// param tz 时区,0:北京时间 1:沙特时间
// return userId->seconds
func MGetUserOnMic(model *domain.Model, day string, userIds []mysql.ID, tz ...timezone_e.Timezone) (map[mysql.ID]mysql.Num, error) {
	type Response struct {
		Code    int    `json:"code"`
		Message string `json:"message"`
		Data    map[mysql.ID]mysql.Num
	}
	var res = make(map[mysql.ID]mysql.Num)
	if len(userIds) <= 0 {
		return res, nil
	}
	var userIdsStr []string
	for _, userId := range userIds {
		userIdsStr = append(userIdsStr, fmt.Sprintf("%d", userId))
	}
	_url := fmt.Sprintf("%v://%v/inner/mic/onMicSeconds", defaultGroupServerScheme, getGroupHost())
	_tz := timezone_e.TimezoneBeijing
	if len(tz) > 0 {
		_tz = tz[0]
	}
	resp, err := HttpGet(model, _url, nil, map[string][]string{
		"ids": userIdsStr,
		"day": {day},
		"tz":  {fmt.Sprintf("%d", _tz)},
	})
	if err != nil {
		model.Log.Errorf("MGetUserOnMic fail:%v", err)
		return res, err
	}
	response := new(Response)
	if err = json.Unmarshal(resp, response); err != nil {
		model.Log.Errorf("MGetUserOnMic json fail:%v", err)
		return res, err
	}
	res = response.Data
	return res, nil
}

// 批量获取用户范围上麦时长
// param beginDate 获取的天,格式 2006-01-02
// param endDate 获取的天,格式 2006-01-02
// param tz 时区,0:北京时间 1:沙特时间
// return userId->seconds
func MGetUserOnMicRange(model *domain.Model, beginDate, endDate string, userIds []mysql.ID, tz ...timezone_e.Timezone) (map[mysql.ID]mysql.Num, error) {
	type Response struct {
		Code    int    `json:"code"`
		Message string `json:"message"`
		Data    map[mysql.ID]mysql.Num
	}
	var res = make(map[mysql.ID]mysql.Num)
	if len(userIds) <= 0 {
		return res, nil
	}
	var userIdsStr []string
	for _, userId := range userIds {
		userIdsStr = append(userIdsStr, fmt.Sprintf("%d", userId))
	}
	_url := fmt.Sprintf("%v://%v/inner/mic/onMicSeconds/range", defaultGroupServerScheme, getGroupHost())
	_tz := timezone_e.TimezoneBeijing
	if len(tz) > 0 {
		_tz = tz[0]
	}
	resp, err := HttpGet(model, _url, nil, map[string][]string{
		"ids":       userIdsStr,
		"beginDate": {beginDate},
		"endDate":   {endDate},
		"tz":        {fmt.Sprintf("%d", _tz)},
	})
	if err != nil {
		model.Log.Errorf("MGetUserOnMic fail:%v", err)
		return res, err
	}
	response := new(Response)
	if err = json.Unmarshal(resp, response); err != nil {
		model.Log.Errorf("MGetUserOnMic json fail:%v", err)
		return res, err
	}
	res = response.Data
	return res, nil
}

func getGroupHost() string {
	l := len(groupServerHost)
	r := rand.Intn(l) // 随机一个
	mylogrus.MyLog.Infof("getHostGroup:%v---%v", r, groupServerHost[r])
	return groupServerHost[r]
}