package rpc import ( "encoding/json" "errors" "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" "git.hilo.cn/hilo-common/utils" "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] } // 上麦 func MicIn(model *domain.Model, groupId, token string) error { defer utils.CheckGoPanic() type MicInResp struct { Code int `json:"code"` Data struct { MicIndex int `json:"micIndex"` } `json:"data"` } _url := fmt.Sprintf("%v://%v/v1/imGroup/mic/in", defaultGroupServerScheme, getGroupHost()) header := map[string]string{ "token": token, } resp, err := HttpPostForm(model, _url, header, map[string]string{ "groupUuid": groupId, "i": "", // 空则随意上一个空位置 }) if err != nil { model.Log.Errorf("MicIn fail:%v", err) return err } response := new(MicInResp) if err = json.Unmarshal(resp, response); err != nil { model.Log.Errorf("MicIn json fail:%v", err) return err } if response.Code != 200 { model.Log.Errorf(fmt.Sprintf("Mic In Not 200:%v,groupId:%v", response, groupId)) return errors.New(fmt.Sprintf("Mic In Not 200:%v", response)) } return nil }