123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578 |
- package v2
- import (
- "context"
- "math"
- "strconv"
- "go-common/app/service/live/third_api/bvc"
- "go-common/library/sync/errgroup"
- "github.com/pkg/errors"
- v2pb "go-common/app/interface/live/app-interface/api/http/v2"
- "go-common/app/interface/live/app-interface/conf"
- "go-common/app/interface/live/app-interface/dao"
- relationV1 "go-common/app/interface/live/app-interface/service/v1"
- relationT "go-common/app/interface/live/app-interface/service/v1/relation"
- avV1 "go-common/app/service/live/av/api/liverpc/v1"
- relationRpcV1 "go-common/app/service/live/relation/api/liverpc/v1"
- roomV1 "go-common/app/service/live/room/api/liverpc/v1"
- accountM "go-common/app/service/main/account/model"
- actmdl "go-common/app/service/main/account/model"
- account "go-common/app/service/main/account/rpc/client"
- "go-common/library/ecode"
- "go-common/library/log"
- )
- // RelationService struct
- type RelationService struct {
- conf *conf.Config
- accountRPC *account.Service3
- }
- const (
- relationPageSize = 4
- app536relationPageSize = 2
- )
- // CheckLiveAnchorParams ... implementation
- // [app端关注首页]入参校验
- func CheckLiveAnchorParams(ctx context.Context, page int64) (uid int64, relationPage int64, err error) {
- mid := relationT.GetUIDFromHeader(ctx)
- relationPage = page
- err = nil
- if mid == 0 {
- err = errors.WithMessage(ecode.NeedLogIn, "GET SEA PATROL FAIL")
- return
- }
- if page <= 0 {
- err = errors.WithMessage(ecode.ResourceParamErr, "GET SEA PATROL FAIL")
- return
- }
- return mid, relationPage, err
- }
- // LiveAnchorHomePage ... implementation
- // [app端关注首页]正在直播接口
- func (s *IndexService) LiveAnchorHomePage(ctx context.Context, relationPage int64, build int64, platform string, quality int64) (Resp []*v2pb.MMyIdol) {
- List := make([]*v2pb.MyIdolItem, 0)
- ExtraInfo := &v2pb.MyIdolExtra{CardType: relationT.App533CardType}
- Resp = make([]*v2pb.MMyIdol, 0)
- s.MakeLiveAnchorDefaultResult(Resp, ExtraInfo)
- uid, relationPage, err := CheckLiveAnchorParams(ctx, relationPage)
- if err != nil && uid != 0 {
- log.Error("[LiveAnchorHomePage]CheckParamsError,uid:%d,relationPage:%d", uid, relationPage)
- return
- }
- wg, _ := errgroup.WithContext(ctx)
- relationInfo, groupList, mapUfos2Rolaids, mapRoomID2UID, AllRoomID, err := relationV1.GetAttentionListAndGroup(ctx)
- if err != nil {
- log.Error("[LiveAnchorHomePage]get_attentionList_rpc_error")
- return
- }
- // 获取全量room信息,不过滤
- roomParams := &roomV1.RoomGetStatusInfoByUidsReq{Uids: groupList["all"], FilterOffline: 0, NeedBroadcastType: 1}
- // room
- roomResp := make(map[int64]*roomV1.RoomGetStatusInfoByUidsResp_RoomInfo)
- userResp := make(map[int64]*accountM.Card)
- roomCornerResp := make(map[int64]*roomV1.RoomPendantGetPendantByIdsResp_Result)
- pkResp := make(map[string]int64)
- wg.Go(func() error {
- roomResp, err = s.GetRoomInfo(ctx, roomParams)
- return err
- })
- if err = wg.Wait(); nil != err {
- log.Error("[LiveAnchorHomePage][first_step]get_room_rpc_error")
- return
- }
- livingUfos := make([]int64, 0)
- livingRolaids := make([]int64, 0)
- livingRoomInfo := GetLivingRooms(roomResp)
- // 没有人直播
- if len(livingRoomInfo) == 0 {
- GetLastLiveAnchorInfo(ctx, roomResp, AllRoomID, mapRoomID2UID, ExtraInfo)
- moduleInfoMap := s.GetAllModuleInfoMapFromCache(ctx)
- for _, m := range moduleInfoMap[_feedType] {
- Resp = append(Resp, &v2pb.MMyIdol{ModuleInfo: m, List: List, ExtraInfo: ExtraInfo})
- }
- return
- }
- wgHasLive := &errgroup.Group{}
- wgHasLive, _ = errgroup.WithContext(ctx)
- for k, v := range livingRoomInfo {
- livingUfos = append(livingUfos, k)
- livingRolaids = append(livingRolaids, v.RoomId)
- }
- // user信息
- wgHasLive.Go(func() error {
- userResp, err = s.GetUserInfo(ctx, livingUfos)
- return err
- })
- // room
- roomPendentParams := &roomV1.RoomPendantGetPendantByIdsReq{Ids: livingRolaids, Type: relationT.PendentMobileBadge, Position: relationT.PendentPosition}
- wgHasLive.Go(func() error {
- roomCornerResp, err = s.GetRoomPendantInfo(ctx, roomPendentParams)
- return err
- })
- // pk_id
- pkParams := &avV1.PkGetPkIdsByRoomIdsReq{RoomIds: livingRolaids, Platform: platform}
- wgHasLive.Go(func() error {
- pkResp, err = s.GetPkID(ctx, pkParams)
- return err
- })
- if err = wgHasLive.Wait(); nil != err {
- log.Error("[LiveAnchorHomePage][second_step]room/main.account/pkID/rpc_error")
- return
- }
- attentionRoomListPlayURLMap := dao.BvcApi.GetPlayUrlMulti(ctx, livingRolaids, 0, quality, build, platform)
- // 下游数据收集完成
- mapSp := make([]int64, 0)
- normalSp := make([]int64, 0)
- mapSp = append(mapSp, groupList["special"]...)
- normalSp = append(normalSp, groupList["normal"]...)
- List = AdaptLivingField(livingRoomInfo, roomCornerResp, userResp, relationInfo, pkResp, attentionRoomListPlayURLMap, mapSp, normalSp, mapUfos2Rolaids)
- ExtraInfo.TotalCount = int64(len(List))
- // 注释原因:app536灰度策略,需要恢复2卡样式(之前在535已全量4卡,但是需求变了)产品:古月
- // https://www.tapd.cn/20082211/prong/stories/view/1120082211001104459
- // userExtParams := &userExV1.GrayRuleGetByMarkReq{Mark: relationT.App536GrayRule}
- // grayRule, err := relationT.GetGrayRule(ctx, userExtParams)
- // var UserExApp536Rule string
- // if err != nil {
- // log.Error("[LiveAnchorHomePage]get_GrayRule_rpc_error")
- // UserExApp536Rule = ""
- // } else if grayRule != nil {
- // UserExApp536Rule = grayRule.Content
- // }
- SliceList, page := s.SliceForHomePage(List, relationPage, uid, platform)
- ExtraInfo.RelationPage = page
- var result v2pb.MMyIdol
- result.ExtraInfo = ExtraInfo
- result.List = SliceList
- moduleInfoMap := s.GetAllModuleInfoMapFromCache(ctx)
- for _, m := range moduleInfoMap[_feedType] {
- Resp = append(Resp, &v2pb.MMyIdol{ModuleInfo: m, List: result.List, ExtraInfo: result.ExtraInfo})
- }
- return
- }
- // AdaptLivingField ... implementation
- // [app端关注首页]填充数据
- func AdaptLivingField(roomInfo map[int64]*roomV1.RoomGetStatusInfoByUidsResp_RoomInfo,
- roomPendentInfo map[int64]*roomV1.RoomPendantGetPendantByIdsResp_Result,
- userResult map[int64]*accountM.Card,
- relationInfo map[int64]*relationRpcV1.BaseInfoGetFollowTypeResp_UidInfo,
- pkIDInfo map[string]int64, playURLInfo map[int64]*bvc.PlayUrlItem, specialUID []int64, normalUID []int64,
- mapUfos2Rolaids map[int64]int64) (resp []*v2pb.MyIdolItem) {
- resp = make([]*v2pb.MyIdolItem, 0)
- normalResp := make([]*v2pb.MyIdolItem, 0)
- resp = make([]*v2pb.MyIdolItem, 0)
- if len(specialUID) > 0 {
- item := LiveFireField(roomInfo, roomPendentInfo, userResult, pkIDInfo, playURLInfo, relationInfo, specialUID, mapUfos2Rolaids)
- resp = AppSortRuleOnline(item)
- }
- if len(normalUID) > 0 {
- tempResp := LiveFireField(roomInfo, roomPendentInfo, userResult, pkIDInfo, playURLInfo, relationInfo, normalUID, mapUfos2Rolaids)
- normalResp = AppSortRuleOnline(tempResp)
- }
- if len(normalResp) > 0 {
- resp = append(resp, normalResp...)
- }
- return
- }
- // SliceForHomePage ... implementation
- // app534规则 [app端关注首页]首页slice逻辑,客户端只显示偶数个数,为兼容推荐去重,当个数为3时返回2
- // https://www.tapd.cn/20082211/prong/stories/view/1120082211001067961
- // https://www.tapd.cn/20082211/prong/stories/view/1120082211001085685
- //
- // app536规则 https://www.tapd.cn/20082211/prong/stories/view/1120082211001104459
- func (s *IndexService) SliceForHomePage(input []*v2pb.MyIdolItem, page int64, uid int64, platform string) (resp []*v2pb.MyIdolItem, relationPage int64) {
- resp = make([]*v2pb.MyIdolItem, 0)
- grayRule := s.App536ABTest(uid, platform)
- relationPage = page
- if len(input) <= 0 {
- return
- }
- count := int64(len(input))
- // 536规则
- if grayRule == 1 {
- switch count {
- case 1:
- {
- resp = input[:]
- relationPage = 1
- return
- }
- case 2:
- {
- resp = input[:]
- relationPage = 1
- return
- }
- }
- var pageSize int64
- pageSize = page
- if page < 1 {
- pageSize = 1
- }
- start := (pageSize - 1) * app536relationPageSize
- end := int64(start + app536relationPageSize)
- // 正常slice
- if end <= count {
- resp = input[start:end]
- } else {
- // 回环逻辑,最后一页不足pagesize时返回第一页
- relationPage = 1
- startIndex := 0
- var startCount int64
- if count > app536relationPageSize {
- startCount = app536relationPageSize
- } else {
- startCount = count
- }
- resp = input[startIndex:startCount]
- }
- return
- }
- // 536之前4卡逻辑
- switch count {
- case 1:
- {
- resp = input[:]
- relationPage = 1
- return
- }
- case 2:
- {
- resp = input[:]
- relationPage = 1
- return
- }
- case 3:
- {
- resp = input[0:2]
- relationPage = 1
- return
- }
- }
- var pageSize int64
- pageSize = page
- if page < 1 {
- pageSize = 1
- }
- start := (pageSize - 1) * relationPageSize
- end := int64(start + relationPageSize)
- if end <= count {
- resp = input[start:end]
- } else {
- relationPage = 1
- startIndex := 0
- var startCount int64
- if count > relationPageSize {
- startCount = relationPageSize
- } else {
- startCount = count
- }
- resp = input[startIndex:startCount]
- }
- return
- }
- // LiveFireField ... implementation
- // [app端关注首页]填充数据
- func LiveFireField(roomInfo map[int64]*roomV1.RoomGetStatusInfoByUidsResp_RoomInfo,
- roomPendentInfo map[int64]*roomV1.RoomPendantGetPendantByIdsResp_Result,
- userResult map[int64]*accountM.Card,
- pkIDInfo map[string]int64, playURLInfo map[int64]*bvc.PlayUrlItem,
- relationInfo map[int64]*relationRpcV1.BaseInfoGetFollowTypeResp_UidInfo,
- ufos []int64, mapUfos2Rolaids map[int64]int64) (resp []*v2pb.MyIdolItem) {
- for _, v := range ufos {
- item := v2pb.MyIdolItem{}
- roomID, roomIDExist := mapUfos2Rolaids[v]
- if !roomIDExist {
- continue
- }
- roomItem := roomInfo[v]
- roomPendentItem := roomPendentInfo[roomID]
- userItem := userResult[v]
- relationItem := relationInfo[v]
- pkItem := pkIDInfo[strconv.Itoa(int(roomID))]
- playURLItem := playURLInfo[roomID]
- if roomItem == nil || userItem == nil || relationItem == nil {
- continue
- }
- PlayURL := ""
- PlayURL265 := ""
- PlayURLAcc := make([]int64, 0)
- PlayURLCur := 0
- PendentRu := ""
- PendentRuColor := ""
- PendentRuPic := ""
- if playURLItem != nil {
- PlayURL = playURLItem.Url["h264"]
- PlayURL265 = playURLItem.Url["h265"]
- PlayURLAcc = playURLItem.AcceptQuality
- PlayURLCur = int(playURLItem.CurrentQuality)
- }
- if roomPendentItem != nil {
- PendentRu = roomPendentItem.Value
- PendentRuColor = roomPendentItem.BgColor
- PendentRuPic = roomPendentItem.BgPic
- }
- item.Roomid = roomItem.RoomId
- item.Uid = roomItem.Uid
- item.Uname = userItem.Name
- item.Face = userItem.Face
- item.Title = roomItem.Title
- item.LiveTagName = roomItem.AreaV2Name
- item.LiveTime = roomItem.LiveTime
- item.Online = roomItem.Online
- item.PlayUrl = PlayURL
- item.PlayUrlH265 = PlayURL265
- item.AcceptQuality = PlayURLAcc
- item.CurrentQuality = int64(PlayURLCur)
- item.PkId = pkItem
- item.Area = roomItem.Area
- item.AreaName = roomItem.AreaName
- item.AreaV2Id = roomItem.AreaV2Id
- item.AreaV2Name = roomItem.AreaV2Name
- item.AreaV2ParentId = roomItem.AreaV2ParentId
- item.AreaV2ParentName = roomItem.AreaV2ParentName
- item.BroadcastType = roomItem.BroadcastType
- item.Link = relationT.LiveDomain + strconv.Itoa(int(roomID)) + relationT.BoastURL + strconv.Itoa(int(item.BroadcastType))
- item.OfficialVerify = int64(RoleMap(userItem.Official.Role))
- item.SpecialAttention = relationItem.Special
- item.PendentRu = PendentRu
- item.PendentRuColor = PendentRuColor
- item.PendentRuPic = PendentRuPic
- if len(roomItem.CoverFromUser) == 0 {
- item.Cover = roomItem.Keyframe
- } else {
- item.Cover = roomItem.CoverFromUser
- }
- resp = append(resp, &item)
- }
- return
- }
- // MakeLiveAnchorDefaultResult ...
- // 正在直播默认返回
- func (s *IndexService) MakeLiveAnchorDefaultResult(Resp []*v2pb.MMyIdol, ExtraInfo *v2pb.MyIdolExtra) {
- if ExtraInfo != nil {
- ExtraInfo.TotalCount = 0
- ExtraInfo.TagsDesc = ""
- ExtraInfo.UnameDesc = ""
- ExtraInfo.TimeDesc = ""
- // [历史原因]cardType只能为1,否则客户端报错,见 https://www.tapd.cn/20082211/prong/stories/view/1120082211001086997
- ExtraInfo.CardType = 1
- ExtraInfo.RelationPage = 1
- }
- moduleInfoMap := s.GetAllModuleInfoMapFromCache(context.TODO())
- for _, m := range moduleInfoMap[_feedType] {
- Resp = append(Resp, &v2pb.MMyIdol{ModuleInfo: m, List: []*v2pb.MyIdolItem{}, ExtraInfo: ExtraInfo})
- }
- }
- // GetLivingRooms ... implementation
- // [app端关注首页]获取正在直播房间
- func GetLivingRooms(roomResult map[int64]*roomV1.RoomGetStatusInfoByUidsResp_RoomInfo) (liveRoom map[int64]*roomV1.RoomGetStatusInfoByUidsResp_RoomInfo) {
- liveRoom = make(map[int64]*roomV1.RoomGetStatusInfoByUidsResp_RoomInfo)
- if len(roomResult) == 0 {
- return
- }
- for k, v := range roomResult {
- if v.LiveStatus == relationV1.RoomStatusLive {
- liveRoom[k] = v
- }
- }
- return
- }
- // CheckLiveAnchorParams implementation
- // 入参校验
- func (s *IndexService) CheckLiveAnchorParams(ctx context.Context, req *v2pb.GetAllListReq) (uid int64, relationPage int64, err error) {
- if req == nil {
- err = ecode.LiveAnchorReqV2ParamsNil
- return
- }
- uid = relationT.GetUIDFromHeader(ctx)
- if uid == 0 {
- err = errors.WithMessage(ecode.NeedLogIn, "GET SEA PATROL FAIL")
- return
- }
- if req.RelationPage <= 0 {
- log.Error("CallRelationLiveAnchorV2ParamsCheckError|relationPage:%d", req.RelationPage)
- err = errors.WithMessage(ecode.LiveAnchorReqV2ParamsError, "GET SEA PATROL FAIL")
- return
- }
- return
- }
- // GetLastLiveAnchorInfo ... implementation
- // [app端关注首页]获取最新一次直播信息
- func GetLastLiveAnchorInfo(ctx context.Context, roomResult map[int64]*roomV1.RoomGetStatusInfoByUidsResp_RoomInfo,
- RoomIDs []int64, RoomID2UID map[int64]int64, ExtraInfo *v2pb.MyIdolExtra) (uid int64, relationPage int64, err error) {
- if len(roomResult) == 0 || len(RoomIDs) == 0 || len(RoomID2UID) == 0 {
- return
- }
- lastLiveTime, _ := relationT.GetLastLiveTime(ctx, RoomIDs)
- _, _, sorted := relationV1.GetLastAnchorLiveTime(lastLiveTime)
- var firstRoom int64
- var firstValue int64
- if sorted.Len() > 0 {
- for _, v := range sorted {
- firstRoom = int64(v.Key)
- firstValue = int64(v.Value)
- break
- }
- firstUID := int64(RoomID2UID[firstRoom])
- tempTime := make(map[int64]int64)
- if firstValue > 0 {
- tempTime[firstUID] = firstValue
- if roomItem, exist := roomResult[firstUID]; exist {
- ExtraInfo.UnameDesc = roomItem.Uname
- ExtraInfo.TagsDesc = roomItem.AreaV2Name
- liveDesc, _ := relationV1.TimeLineRule(tempTime, nil)
- ExtraInfo.TimeDesc = liveDesc[firstUID]
- }
- }
- }
- return
- }
- // GetUserInfoData ...
- // 调用account grpc接口cards获取用户信息
- func (s *RelationService) GetUserInfoData(ctx context.Context, UIDs []int64) (userResult map[int64]*accountM.Card, err error) {
- rpcChunkSize, RPCTimeout, err := relationT.GetChunkInfo(relationT.AccountGRPC)
- params := relationT.ChunkCallInfo{ParamsName: "ufos", URLName: relationT.AccountGRPC, ChunkSize: rpcChunkSize, RPCTimeout: RPCTimeout}
- userResult = make(map[int64]*accountM.Card)
- lens := len(UIDs)
- if lens <= 0 {
- return
- }
- // 批次
- params.ChunkNum = int64(math.Ceil(float64(lens) / float64(params.ChunkSize)))
- chunkResult := make([]map[int64]*accountM.Card, params.ChunkNum)
- wg, _ := errgroup.WithContext(ctx)
- for i := int64(1); i <= params.ChunkNum; i++ {
- x := i
- wg.Go(func() error {
- chunkUfosIds := make([]int64, 20)
- if x == params.ChunkNum {
- chunkUfosIds = UIDs[(x-1)*params.ChunkSize:]
- } else {
- chunkUfosIds = UIDs[(x-1)*params.ChunkSize : x*params.ChunkSize]
- }
- ret, err := s.accountRPC.Cards3(ctx, &actmdl.ArgMids{Mids: chunkUfosIds})
- if err != nil {
- err = errors.WithMessage(ecode.AccountGRPCError, "GET SEA PATROL FAIL")
- log.Error("Call main.Account.Cards Error.Infos(%+v) error(%+v)", chunkUfosIds, err)
- }
- chunkResult[x-1] = ret
- return nil
- })
- }
- if err := wg.Wait(); err != nil {
- erelongInfo := relationT.ErrLogStrut{}
- erelongInfo.ErrType = "GoRoutingWaitError"
- erelongInfo.URLName = relationT.AccountGRPC
- erelongInfo.ErrDesc = relationT.GoRoutingErr
- erelongInfo.Code = 1003001
- erelongInfo.RPCTimeout = params.RPCTimeout
- erelongInfo.ErrorPtr = &err
- log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s",
- *erelongInfo.ErrorPtr, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName)
- err = errors.WithMessage(ecode.AccountGRPCFrameError, "GET SEA PATROL FAIL")
- return nil, err
- }
- // 整理数据
- for _, chunkItemList := range chunkResult {
- for _, item := range chunkItemList {
- if item != nil {
- userResult[item.Mid] = item
- }
- }
- }
- return
- }
- // App536ABTest ... hard code配置
- // ABTest
- func (s *IndexService) App536ABTest(mid int64, platform string) (grayType int64) {
- // 因为ipad屏幕尺寸较大,展示2卡会影响体验,故如果是ipad客户端则使用4卡样式,产品:tianyumo
- if platform == "ipad" {
- return 0
- }
- mUID := mid % 100
- if mUID >= 0 && mUID <= 89 {
- // 4卡
- return 0
- }
- return 1
- }
- // 后台配置
- // // App536ABTest ...
- // // ABTest
- // func (s *IndexService) App536ABTest(content string, mid int64) (grayType int64) {
- // if len(content) == 0 {
- // grayType = 0
- // return
- // }
- // resultMap := make(map[string]int64)
- // resultMap["app536_4card_type"] = 0
- // resultMap["app536_2card_type"] = 1
- // typeMap := make([]string, 0)
- // mr := &[]GrayRule{}
- // if err := json.Unmarshal([]byte(content), mr); err != nil {
- // grayType = 0
- // return
- // }
- // ruleArr := *mr
- // scoreMap := make(map[string]int)
- //
- // for _, v := range ruleArr {
- // scoreMap[v.Mark] = int(RParseInt(v.Value, 100))
- // }
- // sortedScore := SortMapByValue(scoreMap)
- // scoreEnd := make([]int, 0)
- // for _, v := range sortedScore {
- // scoreEnd = append(scoreEnd, v.Value)
- // typeMap = append(typeMap, v.Key)
- // }
- // score1 := scoreEnd[0]
- // score2 := 100
- // section1 := make(map[int]bool)
- // section2 := make(map[int]bool)
- // for section1Loop := 0; section1Loop < score1; section1Loop++ {
- // section1[section1Loop] = true
- // }
- // for sectionLoop2 := score1; sectionLoop2 < score2; sectionLoop2++ {
- // section2[sectionLoop2] = true
- // }
- // result := int(mid % 100)
- // if scoreEnd[0] != 0 {
- // if _, exist := section1[result]; exist {
- // grayType = resultMap[typeMap[0]]
- // return
- // }
- // }
- // if scoreEnd[1] != 0 {
- // if _, exist := section2[result]; exist {
- // grayType = resultMap[typeMap[1]]
- // return
- // }
- // }
- // grayType = 0
- // return
- // }
|