package service import ( "context" "errors" "fmt" "go-common/app/job/live/push-search/dao" "go-common/app/job/live/push-search/model" relationV1 "go-common/app/service/live/relation/api/liverpc/v1" roomV1 "go-common/app/service/live/room/api/liverpc/v1" roomV2 "go-common/app/service/live/room/api/liverpc/v2" userV3 "go-common/app/service/live/user/api/liverpc/v3" accountApi "go-common/app/service/main/account/api" "go-common/library/log" rpccontext "go-common/library/net/rpc/liverpc/context" "strconv" "time" ) var ( hbaseTable = "live:PushSearch" hbaseFamily = "search" fields = []string{ "roomid", "short_id", "uid", "uname", "area", "title", "tags", "try_time", "cover", "user_cover", "lock_status", "hidden_status", "attentions", "online", "live_time", "area_v2_id", "area_v2_parent_id", "virtual", "round_status", "on_flag", "area_v2_name", "ctime", "mtime", } ) func (s *Service) getBaseRoomInfo(uid int64) (roomInfo *roomV2.RoomGetByIdsResp_RoomInfo, err error) { roomIdResp, err := dao.RoomApi.V2Room.RoomIdByUid(rpccontext.WithTimeout(context.TODO(), 50*time.Millisecond), &roomV2.RoomRoomIdByUidReq{ Uid: uid, }) if err != nil { log.Error("[getBaseRoomInfo]RoomIdByUid rpc error, error:%+v", err) return } if roomIdResp.Code != 0 { log.Error("[getBaseRoomInfo]RoomIdByUid return error, code:%d, msg:%s", roomIdResp.Code, roomIdResp.Msg) err = errors.New("getRoomId return error") return } if roomIdResp.Data == nil { log.Error("[getBaseRoomInfo]GetMultiple empty data") err = errors.New("getRoomId empty error") return } if roomIdResp.Data.RoomId == 0 { log.Error("[getBaseRoomInfo]GetMultiple empty data") err = errors.New("roomId not found error") return } roomInfoResp := &roomV2.RoomGetByIdsResp{} roomInfoResp, err = dao.RoomApi.V2Room.GetByIds(rpccontext.WithTimeout(context.TODO(), 50*time.Millisecond), &roomV2.RoomGetByIdsReq{ Ids: []int64{roomIdResp.Data.RoomId}, From: "push-search", Fields: fields, }) if err != nil { log.Error("[getBaseRoomInfo]GetByIds rpc error, error:%+v", err) return } if roomInfoResp.Code != 0 { log.Error("[getBaseRoomInfo]GetByIds return error, code:%d, msg:%s", roomInfoResp.Code, roomInfoResp.Msg) err = errors.New("GetByIds return error") return } if roomInfoResp.Data == nil { log.Error("[getBaseRoomInfo]GetByIds empty data") err = errors.New("GetByIds empty error") return } info, ok := roomInfoResp.Data[roomIdResp.Data.RoomId] if !ok { log.Error("[getBaseRoomInfo]GetByIds not found") err = errors.New("roomId not found error") return } roomInfo = info return } func (s *Service) getMultiUserInfo(uid int64) (userInfo *userV3.UserGetMultipleResp_Info, err error) { userInfo = &userV3.UserGetMultipleResp_Info{} pr, err := s.AccountClient.Profile3(context.TODO(), &accountApi.MidReq{Mid: uid}) if err != nil { log.Error("[getMultiUserInfo]Profile3 rpc error, error:%+v", err) return } if pr == nil { log.Error("[getMultiUserInfo]Profile3 empty data") err = errors.New("user empty error") return } userInfo.Uid = uid userInfo.Uname = pr.GetProfile().GetName() userInfo.Face = pr.GetProfile().GetFace() if userInfo.Uname != "" { return } err = errors.New("user not found") log.Error("[getMultiUserInfo]GetMultiple no user, data:%+v", userInfo) return } func (s *Service) getFc(uid int64) (fc int, err error) { fcResp := &relationV1.FeedGetUserFcResp{} fcResp, err = dao.RelationApi.V1Feed.GetUserFc(rpccontext.WithTimeout(context.TODO(), 50*time.Millisecond), &relationV1.FeedGetUserFcReq{ Follow: uid, }) if err != nil { log.Error("[getFc]GetFc rpc error, error:%+v", err) return } if fcResp.Code != 0 { log.Error("[getFc]GetFc return error, code:%d, msg:%s", fcResp.Code, fcResp.Msg) err = errors.New("fc return error") return } if fcResp.Data == nil { log.Error("[getFc]GetFc empty data") err = errors.New("fc empty error") return } fc = int(fcResp.Data.Fc) return } func (s *Service) saveHBase(c context.Context, key string, columnInfo map[string][]byte) (err error) { var ctx, cancel = context.WithTimeout(c, time.Duration(s.c.SearchHBase.WriteTimeout)*time.Millisecond) defer cancel() values := map[string]map[string][]byte{hbaseFamily: columnInfo} if _, err = s.dao.SearchHBase.PutStr(ctx, hbaseTable, key, values); err != nil { log.Error("SearchHBase.PutStr error(%v), table(%s), values(%+v)", err, hbaseTable, values) } return } func (s *Service) getLockStatus(lockStatus string) int { status := 0 if lockStatus != "0000-00-00 00:00:00" { status = 1 } return status } func (s *Service) getHiddenStatus(HiddenStatus string) int { status := 0 if HiddenStatus != "0000-00-00 00:00:00" { status = 1 } return status } //hbase key roomID md5 func (s *Service) rowKey(roomId int) string { key := fmt.Sprintf("%d_%d", roomId%10, roomId) return key } func (s *Service) generateSearchInfo(action string, table string, new *model.TableField, old *model.TableField) (ret map[string]interface{}, retByte map[string][]byte) { ret = make(map[string]interface{}) ret["action"] = action ret["table"] = table //搜索字段转换 newMap := make(map[string]interface{}) newMap["id"] = new.RoomId newMap["short_id"] = new.ShortId newMap["uid"] = new.Uid newMap["uname"] = new.UName newMap["category"] = new.Area newMap["title"] = new.Title newMap["tag"] = new.Tag newMap["try_time"] = new.TryTime newMap["cover"] = new.Cover newMap["user_cover"] = new.UserCover newMap["lock_status"] = s.getLockStatus(new.LockStatus) newMap["hidden_status"] = s.getHiddenStatus(new.HiddenStatus) newMap["attentions"] = new.Attentions newMap["attention"] = new.Attentions newMap["online"] = new.Online newMap["live_time"] = new.LiveTime newMap["area_v2_id"] = new.AreaV2Id newMap["ord"] = new.AreaV2ParentId newMap["arcrank"] = new.Virtual newMap["lastupdate"] = s.getLastUpdate(new) newMap["is_live"] = s.getLiveStatus(new) newMap["s_category"] = new.AreaV2Name ret["new"] = newMap oldMap := make(map[string]interface{}) if old != nil { oldMap["id"] = old.RoomId oldMap["short_id"] = old.ShortId oldMap["uid"] = old.Uid oldMap["uname"] = old.UName oldMap["category"] = old.Area oldMap["title"] = old.Title oldMap["tag"] = old.Tag oldMap["try_time"] = old.TryTime oldMap["cover"] = old.Cover oldMap["user_cover"] = old.UserCover oldMap["lock_status"] = s.getLockStatus(old.LockStatus) oldMap["hidden_status"] = s.getHiddenStatus(old.HiddenStatus) oldMap["attentions"] = old.Attentions oldMap["attention"] = old.Attentions oldMap["online"] = old.Online oldMap["live_time"] = old.LiveTime oldMap["area_v2_id"] = old.AreaV2Id oldMap["area_v2_name"] = old.AreaV2Name oldMap["ord"] = old.AreaV2ParentId oldMap["arcrank"] = old.Virtual oldMap["lastupdate"] = s.getLastUpdate(old) oldMap["is_live"] = s.getLiveStatus(old) } if action != "insert" && old == nil { oldMap["id"] = new.RoomId oldMap["short_id"] = new.ShortId oldMap["uid"] = new.Uid oldMap["uname"] = new.UName oldMap["category"] = new.Area oldMap["title"] = new.Title oldMap["tag"] = new.Tag oldMap["try_time"] = new.TryTime oldMap["cover"] = new.Cover oldMap["user_cover"] = new.UserCover oldMap["lock_status"] = s.getLockStatus(new.LockStatus) oldMap["hidden_status"] = s.getHiddenStatus(new.HiddenStatus) oldMap["attentions"] = new.Attentions oldMap["attention"] = new.Attentions oldMap["online"] = new.Online oldMap["live_time"] = new.LiveTime oldMap["area_v2_id"] = new.AreaV2Id oldMap["area_v2_name"] = new.AreaV2Name oldMap["ord"] = new.AreaV2ParentId oldMap["arcrank"] = new.Virtual oldMap["lastupdate"] = s.getLastUpdate(new) oldMap["is_live"] = s.getLiveStatus(new) } ret["old"] = oldMap newByteMap := make(map[string][]byte) newByteMap["id"] = []byte(strconv.Itoa(new.RoomId)) newByteMap["short_id"] = []byte(strconv.Itoa(new.ShortId)) newByteMap["uid"] = []byte(strconv.FormatInt(new.Uid, 10)) newByteMap["uname"] = []byte(new.UName) newByteMap["category"] = []byte(strconv.Itoa(new.Area)) newByteMap["title"] = []byte(new.Title) newByteMap["tag"] = []byte(new.Tag) newByteMap["try_time"] = []byte(new.TryTime) newByteMap["cover"] = []byte(new.Cover) newByteMap["user_cover"] = []byte(new.UserCover) newByteMap["lock_status"] = []byte(strconv.Itoa(s.getLockStatus(new.LockStatus))) newByteMap["hidden_status"] = []byte(strconv.Itoa(s.getHiddenStatus(new.HiddenStatus))) newByteMap["attentions"] = []byte(strconv.Itoa(new.Attentions)) newByteMap["attention"] = []byte(strconv.Itoa(new.Attentions)) newByteMap["online"] = []byte(strconv.Itoa(new.Online)) newByteMap["live_time"] = []byte(new.LiveTime) newByteMap["area_v2_id"] = []byte(strconv.Itoa(new.AreaV2Id)) newByteMap["ord"] = []byte(strconv.Itoa(new.AreaV2ParentId)) newByteMap["arcrank"] = []byte(strconv.Itoa(new.Virtual)) newByteMap["lastupdate"] = []byte(s.getLastUpdate(new)) newByteMap["is_live"] = []byte(strconv.Itoa(s.getLiveStatus(new))) newByteMap["s_category"] = []byte(new.AreaV2Name) return ret, newByteMap } //获取直播状态 func (s *Service) getLiveStatus(roomInfo *model.TableField) int { if roomInfo.LiveTime != "0000-00-00 00:00:00" { return 1 } if roomInfo.RoundStatus == 1 && roomInfo.OnFlag == 1 { return 2 } return 0 } //获取房间最后更新时间 func (s *Service) getLastUpdate(roomInfo *model.TableField) string { if roomInfo.MTime != "0000-00-00 00:00:00" { return roomInfo.MTime } return roomInfo.CTime } func (s *Service) getAreaV2Detail(areaV2Id int) (areaInfo *roomV1.AreaGetDetailResp_AreaInfo, err error) { areaResp, err := dao.RoomApi.V1Area.GetDetail(rpccontext.WithTimeout(context.TODO(), 50*time.Millisecond), &roomV1.AreaGetDetailReq{ Id: int64(areaV2Id), }) if err != nil { log.Error("[getAreaV2Detail]GetMultiple rpc error, error:%+v", err) return } if areaResp.Code != 0 { log.Error("[getAreaV2Detail]GetMultiple return error, code:%d, msg:%s", areaResp.Code, areaResp.Msg) err = errors.New("user return error") return } if areaResp.Data == nil { log.Error("[getAreaV2Detail]GetMultiple empty data") err = errors.New("area detail empty error") return } return areaResp.Data, err }