Create & Init Project...

This commit is contained in:
2019-04-22 18:49:16 +08:00
commit fc4fa37393
25440 changed files with 4054998 additions and 0 deletions

View File

@@ -0,0 +1,23 @@
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/interface/live/app-interface/api/http/v1:all-srcs",
"//app/interface/live/app-interface/api/http/v2:all-srcs",
"//app/interface/live/app-interface/cmd:all-srcs",
"//app/interface/live/app-interface/conf:all-srcs",
"//app/interface/live/app-interface/dao:all-srcs",
"//app/interface/live/app-interface/model:all-srcs",
"//app/interface/live/app-interface/server/http:all-srcs",
"//app/interface/live/app-interface/service:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,56 @@
# v1.1.4
1. 添加移动端配置接口
# v1.1.3
1. 直播推荐改为和天马推荐逻辑一致
2. 蓝版取消app首页的大航海续费提醒
# v1.1.2
1. app536TAPD#1104961/app5.36适配视频云清晰度选项
2. 统一build为int64
3. 修改.pb到.proto
4. 添加bro
# v1.1.1
1. 首页V2版本接口重构
2. 优化代码结构
3. 减少循环调用
4. 规避安卓我的关注大卡自动播放5.34弹幕问题
5. v2版本压测优化
# v1.0.9
1. 新增大分区我的标签兼容新增全部标签元素及link字段
2. 修复个人认证标识
3. 关注串行改并行
4. 修复关注暂未开播数量问题
5. 修复panic
6. 修复分页bug
7. 修复return处理
# v1.0.8
1. 添加live-check我要直播接口
2. 优化relation代码结构
3. 更新room client
# v1.0.7
1.无法找到根源问题,对线上报错加些日志
2.fix lint
3.修复特别关注bug
4.使用account.cards替换getMultiple
# v1.0.6
1.fix天马强推展示逻辑
# v1.0.5
1. 更新CONTRIBUTORS.md格式
2. App534关注需求,优化排序
# v1.0.4
1. App534关注需求,优化错误日志
# v1.0.3
1. App534关注需求合入,修复golint
# v1.0.2
1. App534关注需求合入
# v1.0.1
1. 适配App534关注卡片需求
# v1.0.0
1. 上线功能app-interface

View File

@@ -0,0 +1,17 @@
# Owner
weixuan
fuyu01
lidongyang
# Author
yangbaibing
lidongyang
xiehaishen
weixuan
fuyu01
# Reviewer
liuzhen
yangbaibing
lidongyang
xiehaishen

View File

@@ -0,0 +1,21 @@
# See the OWNERS docs at https://go.k8s.io/owners
approvers:
- fuyu01
- lidongyang
- weixuan
- xiehaishen
- yangbaibing
labels:
- interface
- interface/live/app-interface
- live
options:
no_parent_owners: true
reviewers:
- fuyu01
- lidongyang
- liuzhen
- weixuan
- xiehaishen
- yangbaibing

View File

@@ -0,0 +1,12 @@
# AppIndex-interface
# 项目简介
1.
# 编译环境
# 依赖包
# 编译执行

View File

@@ -0,0 +1 @@
# HTTP API文档

View File

@@ -0,0 +1,64 @@
load(
"@io_bazel_rules_go//proto:def.bzl",
"go_proto_library",
)
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"app_conf.bm.go",
"index.bm.go",
"relation.bm.go",
"relation.pbg.go",
],
embed = [":v1_go_proto"],
importpath = "go-common/app/interface/live/app-interface/api/http/v1",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/net/http/blademaster:go_default_library",
"//library/net/http/blademaster/binding:go_default_library",
"@com_github_gogo_protobuf//gogoproto:go_default_library",
"@com_github_gogo_protobuf//proto:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
proto_library(
name = "v1_proto",
srcs = [
"app_conf.proto",
"index.proto",
],
tags = ["automanaged"],
deps = ["@gogo_special_proto//github.com/gogo/protobuf/gogoproto"],
)
go_proto_library(
name = "v1_go_proto",
compilers = ["@io_bazel_rules_go//proto:gogofast_grpc"],
importpath = "go-common/app/interface/live/app-interface/api/http/v1",
proto = ":v1_proto",
tags = ["automanaged"],
deps = ["@com_github_gogo_protobuf//gogoproto:go_default_library"],
)

View File

@@ -0,0 +1,57 @@
// Code generated by protoc-gen-bm v0.1, DO NOT EDIT.
// source: app_conf.proto
/*
Package v1 is a generated blademaster stub package.
This code was generated with go-common/app/tool/bmgen/protoc-gen-bm v0.1.
It is generated from these files:
app_conf.proto
*/
package v1
import (
"context"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/binding"
)
// to suppressed 'imported but not used warning'
var _ *bm.Context
var _ context.Context
var _ binding.StructValidator
var PathConfigGetConf = "/live.appinterface.v1.config/getConf"
// ================
// Config Interface
// ================
type ConfigBMServer interface {
GetConf(ctx context.Context, req *GetConfReq) (resp *GetConfResp, err error)
}
var v1ConfigSvc ConfigBMServer
func configGetConf(c *bm.Context) {
p := new(GetConfReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1ConfigSvc.GetConf(c, p)
c.JSON(resp, err)
}
// RegisterV1ConfigService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV1ConfigService(e *bm.Engine, svc ConfigBMServer, midMap map[string]bm.HandlerFunc) {
v1ConfigSvc = svc
e.GET("/xlive/app-interface/v1/config/getConf", configGetConf)
}
// RegisterConfigBMServer Register the blademaster route
func RegisterConfigBMServer(e *bm.Engine, server ConfigBMServer) {
v1ConfigSvc = server
e.GET("/live.appinterface.v1.config/getConf", configGetConf)
}

View File

@@ -0,0 +1,26 @@
<!-- package=live.appinterface.v1 -->
- [/xlive/app-interface/v1/config/getConf](#xliveapp-interfacev1configgetConf)
## /xlive/app-interface/v1/config/getConf
### 无标题
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|key|是|string||
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"value": ""
}
}
```

View File

@@ -0,0 +1,515 @@
// Code generated by protoc-gen-gogo. DO NOT EDIT.
// source: app_conf.proto
package v1
import proto "github.com/gogo/protobuf/proto"
import fmt "fmt"
import math "math"
import _ "github.com/gogo/protobuf/gogoproto"
import io "io"
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package
type GetConfReq struct {
Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty" form:"key" validate:"required"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *GetConfReq) Reset() { *m = GetConfReq{} }
func (m *GetConfReq) String() string { return proto.CompactTextString(m) }
func (*GetConfReq) ProtoMessage() {}
func (*GetConfReq) Descriptor() ([]byte, []int) {
return fileDescriptor_app_conf_3aa11f6a51d393db, []int{0}
}
func (m *GetConfReq) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *GetConfReq) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_GetConfReq.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalTo(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (dst *GetConfReq) XXX_Merge(src proto.Message) {
xxx_messageInfo_GetConfReq.Merge(dst, src)
}
func (m *GetConfReq) XXX_Size() int {
return m.Size()
}
func (m *GetConfReq) XXX_DiscardUnknown() {
xxx_messageInfo_GetConfReq.DiscardUnknown(m)
}
var xxx_messageInfo_GetConfReq proto.InternalMessageInfo
func (m *GetConfReq) GetKey() string {
if m != nil {
return m.Key
}
return ""
}
type GetConfResp struct {
Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty" form:"value"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *GetConfResp) Reset() { *m = GetConfResp{} }
func (m *GetConfResp) String() string { return proto.CompactTextString(m) }
func (*GetConfResp) ProtoMessage() {}
func (*GetConfResp) Descriptor() ([]byte, []int) {
return fileDescriptor_app_conf_3aa11f6a51d393db, []int{1}
}
func (m *GetConfResp) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *GetConfResp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_GetConfResp.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalTo(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (dst *GetConfResp) XXX_Merge(src proto.Message) {
xxx_messageInfo_GetConfResp.Merge(dst, src)
}
func (m *GetConfResp) XXX_Size() int {
return m.Size()
}
func (m *GetConfResp) XXX_DiscardUnknown() {
xxx_messageInfo_GetConfResp.DiscardUnknown(m)
}
var xxx_messageInfo_GetConfResp proto.InternalMessageInfo
func (m *GetConfResp) GetValue() string {
if m != nil {
return m.Value
}
return ""
}
func init() {
proto.RegisterType((*GetConfReq)(nil), "live.appinterface.v1.GetConfReq")
proto.RegisterType((*GetConfResp)(nil), "live.appinterface.v1.GetConfResp")
}
func (m *GetConfReq) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalTo(dAtA)
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *GetConfReq) MarshalTo(dAtA []byte) (int, error) {
var i int
_ = i
var l int
_ = l
if len(m.Key) > 0 {
dAtA[i] = 0xa
i++
i = encodeVarintAppConf(dAtA, i, uint64(len(m.Key)))
i += copy(dAtA[i:], m.Key)
}
if m.XXX_unrecognized != nil {
i += copy(dAtA[i:], m.XXX_unrecognized)
}
return i, nil
}
func (m *GetConfResp) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalTo(dAtA)
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *GetConfResp) MarshalTo(dAtA []byte) (int, error) {
var i int
_ = i
var l int
_ = l
if len(m.Value) > 0 {
dAtA[i] = 0xa
i++
i = encodeVarintAppConf(dAtA, i, uint64(len(m.Value)))
i += copy(dAtA[i:], m.Value)
}
if m.XXX_unrecognized != nil {
i += copy(dAtA[i:], m.XXX_unrecognized)
}
return i, nil
}
func encodeVarintAppConf(dAtA []byte, offset int, v uint64) int {
for v >= 1<<7 {
dAtA[offset] = uint8(v&0x7f | 0x80)
v >>= 7
offset++
}
dAtA[offset] = uint8(v)
return offset + 1
}
func (m *GetConfReq) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
l = len(m.Key)
if l > 0 {
n += 1 + l + sovAppConf(uint64(l))
}
if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized)
}
return n
}
func (m *GetConfResp) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
l = len(m.Value)
if l > 0 {
n += 1 + l + sovAppConf(uint64(l))
}
if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized)
}
return n
}
func sovAppConf(x uint64) (n int) {
for {
n++
x >>= 7
if x == 0 {
break
}
}
return n
}
func sozAppConf(x uint64) (n int) {
return sovAppConf(uint64((x << 1) ^ uint64((int64(x) >> 63))))
}
func (m *GetConfReq) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowAppConf
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: GetConfReq: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: GetConfReq: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowAppConf
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthAppConf
}
postIndex := iNdEx + intStringLen
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Key = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipAppConf(dAtA[iNdEx:])
if err != nil {
return err
}
if skippy < 0 {
return ErrInvalidLengthAppConf
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *GetConfResp) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowAppConf
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: GetConfResp: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: GetConfResp: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowAppConf
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthAppConf
}
postIndex := iNdEx + intStringLen
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Value = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipAppConf(dAtA[iNdEx:])
if err != nil {
return err
}
if skippy < 0 {
return ErrInvalidLengthAppConf
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func skipAppConf(dAtA []byte) (n int, err error) {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return 0, ErrIntOverflowAppConf
}
if iNdEx >= l {
return 0, io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
wireType := int(wire & 0x7)
switch wireType {
case 0:
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return 0, ErrIntOverflowAppConf
}
if iNdEx >= l {
return 0, io.ErrUnexpectedEOF
}
iNdEx++
if dAtA[iNdEx-1] < 0x80 {
break
}
}
return iNdEx, nil
case 1:
iNdEx += 8
return iNdEx, nil
case 2:
var length int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return 0, ErrIntOverflowAppConf
}
if iNdEx >= l {
return 0, io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
length |= (int(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
iNdEx += length
if length < 0 {
return 0, ErrInvalidLengthAppConf
}
return iNdEx, nil
case 3:
for {
var innerWire uint64
var start int = iNdEx
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return 0, ErrIntOverflowAppConf
}
if iNdEx >= l {
return 0, io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
innerWire |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
innerWireType := int(innerWire & 0x7)
if innerWireType == 4 {
break
}
next, err := skipAppConf(dAtA[start:])
if err != nil {
return 0, err
}
iNdEx = start + next
}
return iNdEx, nil
case 4:
return iNdEx, nil
case 5:
iNdEx += 4
return iNdEx, nil
default:
return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
}
}
panic("unreachable")
}
var (
ErrInvalidLengthAppConf = fmt.Errorf("proto: negative length found during unmarshaling")
ErrIntOverflowAppConf = fmt.Errorf("proto: integer overflow")
)
func init() { proto.RegisterFile("app_conf.proto", fileDescriptor_app_conf_3aa11f6a51d393db) }
var fileDescriptor_app_conf_3aa11f6a51d393db = []byte{
// 245 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x4b, 0x2c, 0x28, 0x88,
0x4f, 0xce, 0xcf, 0x4b, 0xd3, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0xc9, 0xc9, 0x2c, 0x4b,
0xd5, 0x4b, 0x2c, 0x28, 0xc8, 0xcc, 0x2b, 0x49, 0x2d, 0x4a, 0x4b, 0x4c, 0x4e, 0xd5, 0x2b, 0x33,
0x94, 0xd2, 0x4d, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xcf, 0x4f,
0xcf, 0xd7, 0x07, 0x2b, 0x4e, 0x2a, 0x4d, 0x03, 0xf3, 0xc0, 0x1c, 0x30, 0x0b, 0x62, 0x88, 0x92,
0x13, 0x17, 0x97, 0x7b, 0x6a, 0x89, 0x73, 0x7e, 0x5e, 0x5a, 0x50, 0x6a, 0xa1, 0x90, 0x09, 0x17,
0x73, 0x76, 0x6a, 0xa5, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0xa7, 0x93, 0xd2, 0xa7, 0x7b, 0xf2, 0x72,
0x69, 0xf9, 0x45, 0xb9, 0x56, 0x4a, 0xd9, 0xa9, 0x95, 0x4a, 0x0a, 0x65, 0x89, 0x39, 0x99, 0x29,
0x89, 0x25, 0xa9, 0x56, 0x4a, 0x45, 0xa9, 0x85, 0xa5, 0x99, 0x45, 0xa9, 0x29, 0x4a, 0x41, 0x20,
0xe5, 0x4a, 0xa6, 0x5c, 0xdc, 0x70, 0x33, 0x8a, 0x0b, 0x84, 0xd4, 0xb8, 0x58, 0xcb, 0x12, 0x73,
0x4a, 0x53, 0xa1, 0xc6, 0x08, 0x7c, 0xba, 0x27, 0xcf, 0x03, 0x31, 0x06, 0x2c, 0xac, 0x14, 0x04,
0x91, 0x36, 0x8a, 0xe0, 0x62, 0x03, 0xf9, 0x26, 0x33, 0x5d, 0xc8, 0x8f, 0x8b, 0x3d, 0x1d, 0x62,
0x80, 0x90, 0x82, 0x1e, 0x36, 0x5f, 0xe9, 0x21, 0xdc, 0x28, 0xa5, 0x48, 0x40, 0x45, 0x71, 0x81,
0x93, 0xc0, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, 0x31, 0x3e, 0x78, 0x24, 0xc7, 0x18, 0xc5,
0x54, 0x66, 0x98, 0xc4, 0x06, 0xf6, 0xad, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0x86, 0xd3, 0x42,
0x4e, 0x44, 0x01, 0x00, 0x00,
}

View File

@@ -0,0 +1,19 @@
syntax = "proto3";
package live.appinterface.v1;
option go_package = "v1";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
service config {
rpc getConf (GetConfReq) returns (GetConfResp);
}
message GetConfReq {
string key = 1 [(gogoproto.moretags) = 'form:"key" validate:"required"'];
}
message GetConfResp {
string value = 1 [(gogoproto.moretags) = 'form:"value"'];
}

View File

@@ -0,0 +1,71 @@
// Code generated by protoc-gen-bm v0.1, DO NOT EDIT.
// source: api/http/v1/index.proto
/*
Package v1 is a generated blademaster stub package.
This code was generated with go-common/app/tool/bmgen/protoc-gen-bm v0.1.
It is generated from these files:
api/http/v1/index.proto
*/
package v1
import (
"context"
bm "go-common/library/net/http/blademaster"
)
// to suppressed 'imported but not used warning'
var _ *bm.Context
var _ context.Context
// ===============
// Index Interface
// ===============
// Index 相关服务
type Index interface {
// 首页大接口
// 首页换一换接口
// `dynamic_resp:"true" midware:"guest"`
GetAllList(ctx context.Context, req *GetAllListReq) (resp interface{}, err error)
// `midware:"guest"`
Change(ctx context.Context, req *ChangeReq) (resp *ChangeResp, err error)
}
var v1IndexSvc Index
// @params GetAllListReq
// @router GET /xlive/app-interface/v1/index/getAllList
// @response GetAllListResp
func indexGetAllList(c *bm.Context) {
p := new(GetAllListReq)
if err := c.Bind(p); err != nil {
return
}
resp, err := v1IndexSvc.GetAllList(c, p)
c.JSON(resp, err)
}
// @params ChangeReq
// @router GET /xlive/app-interface/v1/index/change
// @response ChangeResp
func indexChange(c *bm.Context) {
p := new(ChangeReq)
if err := c.Bind(p); err != nil {
return
}
resp, err := v1IndexSvc.Change(c, p)
c.JSON(resp, err)
}
// RegisterV1IndexService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV1IndexService(e *bm.Engine, svc Index, midMap map[string]bm.HandlerFunc) {
guest := midMap["guest"]
v1IndexSvc = svc
e.GET("/xlive/app-interface/v1/index/getAllList", guest, indexGetAllList)
e.GET("/xlive/app-interface/v1/index/change", guest, indexChange)
}

View File

@@ -0,0 +1,96 @@
## 首页大接口
首页换一换接口
`GET http://api.live.bilibili.com/xlive/app-interface/v1/index/getAllList`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|platform|是|string|平台|
|device|是|string|设备|
|scale|是|string|分辨率|
|build|是|integer|版本号|
|relation_page|是|integer|关注页码|
|module_id|否|integer|模块id可选|
```json
{
"code": 0,
"message": "ok",
"data": {
}
}
```
##
`GET http://api.live.bilibili.com/xlive/app-interface/v1/index/change`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|module_id|是|integer| 模块id|
|attention_room_id|是|string||
|platform|否|string| 平台|
|device|否|string|设备|
|scale|否|string|分辨率|
|build|否|integer|版本号|
```json
{
"code": 0,
"message": "ok",
"data": {
"module_list": [
{
"module_info": {
// 模块id
"id": 0,
// 标题
"title": "",
// 图标
"pic": "",
// list数据类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
"type": 0,
// 跳转链接
"link": "",
// 该模块数据总数
"count": 0,
"is_sky_horse_gray": 0
},
// 注意:可能是 PicList{id,pic,link,title}需要根据ModuleInfo里的type判断
"list": [
{
"roomid": 0,
"title": "",
"uname": "",
"online": 0,
"cover": "",
"link": "",
"face": "",
"area_v2_parent_id": 0,
"area_v2_parent_name": "",
"area_v2_id": 0,
"area_v2_name": "",
"play_url,omitempty": "",
"play_url_h265,omitempty": "",
"current_quality,omitempty": 0,
"broadcast_type": 0,
"pendent_ru": "",
"pendent_ru_pic": "",
"pendent_ru_color": "",
"rec_type": 0,
"pk_id": 0,
"accept_quality,omitempty": [
0
]
}
]
}
]
}
}
```

View File

@@ -0,0 +1,96 @@
## 首页大接口
首页换一换接口
`GET http://api.live.bilibili.com/xlive/app-interface/v1/index/getAllList`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|platform|否|string| 平台|
|device|否|string|设备|
|scale|否|string|分辨率|
|build|否|string|版本号|
|relation_page|否|integer|关注页码|
|module_id|否|integer|模块id可选|
```json
{
"code": 0,
"message": "ok",
"data": {
}
}
```
##
`GET http://api.live.bilibili.com/xlive/app-interface/v1/index/change`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|module_id|否|integer| 模块id|
|attention_room_id|否|string||
|platform|否|string| 平台|
|device|否|string|设备|
|scale|否|string|分辨率|
|build|否|string|版本号|
```json
{
"code": 0,
"message": "ok",
"data": {
"module_list": [
{
"module_info": {
// 模块id
"id": 0,
// 标题
"title": "",
// 图标
"pic": "",
// list数据类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
"type": 0,
// 跳转链接
"link": "",
// 该模块数据总数
"count": 0,
"is_sky_horse_gray": 0
},
// 注意:可能是 PicList{id,pic,link,title}需要根据ModuleInfo里的type判断
"list": [
{
"roomid": 0,
"title": "",
"uname": "",
"online": 0,
"cover": "",
"link": "",
"face": "",
"area_v2_parent_id": 0,
"area_v2_parent_name": "",
"area_v2_id": 0,
"area_v2_name": "",
"play_url": "",
"play_url_h265": "",
"current_quality": 0,
"broadcast_type": 0,
"pendent_ru": "",
"pendent_ru_pic": "",
"pendent_ru_color": "",
"rec_type": 0,
"pk_id": 0,
"accept_quality": [
0
]
}
]
}
]
}
}
```

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,106 @@
syntax = "proto3";
package live.appinterface.v1;
option go_package = "v1";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
// Index 相关服务
service Index {
// 首页大接口
// 首页换一换接口
// `dynamic_resp:"true" midware:"guest"`
rpc getAllList (GetAllListReq) returns (GetAllListResp);
// `midware:"guest"`
rpc change (ChangeReq) returns (ChangeResp);
}
message GetAllListResp {
}
// GetAllList请求
message GetAllListReq {
//平台
string platform = 1 [(gogoproto.moretags) = 'form:"platform" validate:"required"'];
//设备
string device = 2 [(gogoproto.moretags) = 'form:"device" validate:"required"'];
//分辨率
string scale = 3 [(gogoproto.moretags) = 'form:"scale" validate:"required"'];
//版本号
int64 build = 4 [(gogoproto.moretags) = 'form:"build" validate:"required"'];
//关注页码
int64 relation_page = 5 [(gogoproto.moretags) = 'form:"relation_page" validate:"required"'];
//模块id可选
int64 module_id = 6 [(gogoproto.moretags) = 'form:"module_id"'];
}
// 换一换
message ChangeReq {
// 模块id
// `mock:"1"`
int64 module_id = 1 [(gogoproto.moretags) = 'form:"module_id" validate:"required"'];
string attention_room_id = 2 [(gogoproto.moretags) = 'form:"attention_room_id" validate:"required"'];
// 平台
string platform = 3 [(gogoproto.moretags) = 'form:"platform"'];
//设备
string device = 4 [(gogoproto.moretags) = 'form:"device"'];
//分辨率
string scale = 5 [(gogoproto.moretags) = 'form:"scale"'];
//版本号
int64 build = 6 [(gogoproto.moretags) = 'form:"build"'];
}
// 换一换响应
message ChangeResp {
// 返回码
message List {
int64 roomid = 1 [(gogoproto.jsontag) = 'roomid'];
string title = 2 [(gogoproto.jsontag) = 'title'];
string uname = 3 [(gogoproto.jsontag) = 'uname'];
int64 online = 4 [(gogoproto.jsontag) = 'online'];
string cover = 5 [(gogoproto.jsontag) = 'cover'];
string link = 6 [(gogoproto.jsontag) = 'link'];
string face = 7 [(gogoproto.jsontag) = 'face'];
int64 area_v2_parent_id = 8 [(gogoproto.jsontag) = 'area_v2_parent_id'];
string area_v2_parent_name = 9 [(gogoproto.jsontag) = 'area_v2_parent_name'];
int64 area_v2_id = 10 [(gogoproto.jsontag) = 'area_v2_id'];
string area_v2_name = 11 [(gogoproto.jsontag) = 'area_v2_name'];
string play_url = 12 [(gogoproto.jsontag) = 'play_url,omitempty'];
string play_url_h265 = 13 [(gogoproto.jsontag) = 'play_url_h265,omitempty'];
int64 current_quality = 14 [(gogoproto.jsontag) = 'current_quality,omitempty'];
int64 broadcast_type = 15 [(gogoproto.jsontag) = 'broadcast_type'];
string pendent_ru = 16 [(gogoproto.jsontag) = 'pendent_ru'];
string pendent_ru_pic = 17 [(gogoproto.jsontag) = 'pendent_ru_pic'];
string pendent_ru_color = 18 [(gogoproto.jsontag) = 'pendent_ru_color'];
int64 rec_type = 19 [(gogoproto.jsontag) = 'rec_type'];
int64 pk_id = 20 [(gogoproto.jsontag) = 'pk_id'];
repeated int64 accept_quality = 21 [(gogoproto.jsontag) = 'accept_quality,omitempty'];
}
message ModuleInfo {
// 模块id
int64 id = 1 [(gogoproto.jsontag) = 'id'];
// 标题
string title = 2 [(gogoproto.jsontag) = 'title'];
// 图标
string pic = 3 [(gogoproto.jsontag) = 'pic'];
// list数据类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
int64 type = 4 [(gogoproto.jsontag) = 'type'];
// 跳转链接
string link = 5 [(gogoproto.jsontag) = 'link'];
// 该模块数据总数
int64 count = 6 [(gogoproto.jsontag) = 'count'];
int64 is_sky_horse_gray = 7 [(gogoproto.jsontag) = 'is_sky_horse_gray'];
}
message ModuleList {
//
ModuleInfo module_info = 1 [(gogoproto.jsontag) = 'module_info'];
// 注意:可能是 PicList{id,pic,link,title}需要根据ModuleInfo里的type判断
repeated List list = 2 [(gogoproto.jsontag) = 'list'];
}
repeated ModuleList module_list = 1 [(gogoproto.jsontag) = 'module_list'];
}

View File

@@ -0,0 +1,73 @@
// Code generated by protoc-gen-bm v0.1, DO NOT EDIT.
// source: api/http/v1/relation.pb
/*
Package v1 is a generated blademaster stub package.
This code was generated with go-common/app/tool/bmgen/protoc-gen-bm v0.1.
It is generated from these files:
api/http/v1/relation.pb
*/
package v1
import (
"context"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/binding"
)
// to suppressed 'imported but not used warning'
var _ *bm.Context
var _ context.Context
var _ binding.StructValidator
// ==================
// Relation Interface
// ==================
// Index 相关服务
type Relation interface {
// [app端关注二级页][全量]正在直播接口
// `midware:"guest"`
LiveAnchor(ctx context.Context, req *LiveAnchorReq) (resp *LiveAnchorResp, err error)
// [app端关注二级页][分页]暂未开播接口
// `midware:"guest"`
UnliveAnchor(ctx context.Context, req *UnLiveAnchorReq) (resp *UnLiveAnchorResp, err error)
}
var v1RelationSvc Relation
// @params LiveAnchorReq
// @router GET /xlive/app-interface/v1/relation/liveAnchor
// @response LiveAnchorResp
func relationLiveAnchor(c *bm.Context) {
p := new(LiveAnchorReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1RelationSvc.LiveAnchor(c, p)
c.JSON(resp, err)
}
// @params UnLiveAnchorReq
// @router GET /xlive/app-interface/v1/relation/unliveAnchor
// @response UnLiveAnchorResp
func relationUnliveAnchor(c *bm.Context) {
p := new(UnLiveAnchorReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1RelationSvc.UnliveAnchor(c, p)
c.JSON(resp, err)
}
// RegisterV1RelationService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV1RelationService(e *bm.Engine, svc Relation, midMap map[string]bm.HandlerFunc) {
guest := midMap["guest"]
v1RelationSvc = svc
e.GET("/xlive/app-interface/v1/relation/liveAnchor", guest, relationLiveAnchor)
e.GET("/xlive/app-interface/v1/relation/unliveAnchor", guest, relationUnliveAnchor)
}

View File

@@ -0,0 +1,151 @@
## [app端关注二级页][全量]正在直播接口
`GET http://api.live.bilibili.com/xlive/app-interface/v1/relation/liveAnchor`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|buyaofangqizhiliao|否|string| 调试咒语
|
|platform|否|string| 平台
|
|device|否|string| 设备
|
|build|否|string| 版本号
|
|sortRule|否|integer| 排序类型
|
|filterRule|否|integer| 筛选类型
|
```json
{
"code": 0,
"message": "ok",
"data": {
"rooms": [
{
// 房间id
"roomid": 0,
// 用户id
"uid": 0,
// 用户昵称
"uname": "",
// 用户头像
"face": "",
// 直播间标题
"title": "",
// 直播间标签
"live_tag_name": "",
// 开始直播时间
"live_time": 0,
// 人气值
"online": 0,
// 秒开url
"playurl": "",
// 可选清晰度
"accept_quality": [
0
],
// 当前清晰度
"current_quality": 0,
// pk_id
"pk_id": 0,
// 特别关注标志
"special_attention": 0,
// 老的分区id
"area": 0,
// 老的分区名
"area_name": "",
// 子分区id
"area_v2_id": 0,
// 子分区名
"area_v2_name": "",
// 父分区名
"area_v2_parent_name": "",
// 父分区id
"area_v2_parent_id": 0,
// 广播适配标志
"broadcast_type": 0,
// 官方认证标志
"official_verify": 0,
// 直播间跳转链接
"link": "",
// 直播间封面
"cover": "",
// 角标文字
"pendent_ru": "",
// 角标颜色
"pendent_ru_color": "",
// 角标背景图
"pendent_ru_pic": ""
}
],
"total_count": 0,
"card_type": 0,
"big_card_type": 0
}
}
```
## [app端关注二级页][分页]暂未开播接口
`GET http://api.live.bilibili.com/xlive/app-interface/v1/relation/unliveAnchor`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|buyaofangqizhiliao|否|string| 调试咒语
|
|page|否|integer| 分页号
|
|pagesize|否|integer| 页大小
|
```json
{
"code": 0,
"message": "ok",
"data": {
"rooms": [
{
// 上次开播描述
"live_desc": "",
// 房间id
"roomid": 0,
// 用户id
"uid": 0,
// 用户昵称
"uname": "",
// 用户头像
"face": "",
// 特别关注标志
"special_attention": 0,
// 官方认证标志
"official_verify": 0,
// 直播状态标志
"live_status": 0,
// 广播适配标志
"broadcast_type": 0,
// 老的分区id
"area": 0,
// 粉丝数
"attentions": 0,
// 老的分区名
"area_name": "",
// 子分区id
"area_v2_id": 0,
// 子分区名
"area_v2_name": "",
// 父分区名
"area_v2_parent_name": "",
// 父分区id
"area_v2_parent_id": 0,
// 直播间跳转链接
"link": "",
// 房间页公告
"announcement_content": "",
// 房间页公告发布时间
"announcement_time": ""

View File

@@ -0,0 +1,157 @@
syntax = "proto3";
package live.appinterface.v1;
option go_package = "v1";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
// Index 相关服务
service Relation {
// [app端关注二级页][全量]正在直播接口
// `midware:"guest"`
rpc liveAnchor (LiveAnchorReq) returns (LiveAnchorResp);
// [app端关注二级页][分页]暂未开播接口
// `midware:"guest"`
rpc unliveAnchor (UnLiveAnchorReq) returns (UnLiveAnchorResp);
}
// liveAnchor请求
message LiveAnchorReq {
// 调试咒语
string buyaofangqizhiliao = 1;
// 平台
string platform = 2;
// 设备
string device = 3;
// 版本号
string build = 4;
// 排序类型
int64 sortRule = 5;
// 筛选类型
int64 filterRule = 6;
// 清晰度
int64 quality = 7;
}
// liveAnchor响应
message LiveAnchorResp {
repeated Rooms rooms = 1;
message Rooms {
// 房间id
int64 roomid = 1;
// 用户id
int64 uid = 2;
// 用户昵称
string uname = 3;
// 用户头像
string face = 4;
// 直播间标题
string title = 5;
// 直播间标签
string live_tag_name = 6;
// 开始直播时间
int64 live_time = 7;
// 人气值
int64 online = 8;
// 秒开url
string playurl = 9;
// 可选清晰度
repeated int64 accept_quality = 10;
// 当前清晰度
int64 current_quality = 11;
// pk_id
int64 pk_id = 12;
// 特别关注标志
int64 special_attention = 13;
// 老的分区id
int64 area = 14;
// 老的分区名
string area_name = 15;
// 子分区id
int64 area_v2_id = 16;
// 子分区名
string area_v2_name = 17;
// 父分区名
string area_v2_parent_name = 18;
// 父分区id
int64 area_v2_parent_id = 19;
// 广播适配标志
int64 broadcast_type = 20;
// 官方认证标志
int64 official_verify = 21;
// 直播间跳转链接
string link = 22;
// 直播间封面
string cover = 23;
// 角标文字
string pendent_ru = 24;
// 角标颜色
string pendent_ru_color = 25;
// 角标背景图
string pendent_ru_pic = 26;
string play_url_h265 = 27;
}
int64 total_count = 2;
int64 card_type = 3;
int64 big_card_type = 4;
}
// unLiveAnchor请求
message UnLiveAnchorReq {
// 调试咒语
string buyaofangqizhiliao = 1;
// 分页号
int64 page = 2;
// 页大小
int64 pagesize = 3;
}
// unLiveAnchor响应
message UnLiveAnchorResp {
repeated Rooms rooms = 1;
message Rooms {
// 上次开播描述
string live_desc = 1;
// 房间id
int64 roomid = 2;
// 用户id
int64 uid = 3;
// 用户昵称
string uname = 4;
// 用户头像
string face = 5;
// 特别关注标志
int64 special_attention = 6;
// 官方认证标志
int64 official_verify = 7;
// 直播状态标志
int64 live_status = 8;
// 广播适配标志
int64 broadcast_type = 9;
// 老的分区id
int64 area = 10;
// 粉丝数
int64 attentions = 11;
// 老的分区名
string area_name = 12;
// 子分区id
int64 area_v2_id = 13;
// 子分区名
string area_v2_name = 14;
// 父分区名
string area_v2_parent_name = 15;
// 父分区id
int64 area_v2_parent_id = 16;
// 直播间跳转链接
string link = 17;
// 房间页公告
string announcement_content = 18;
// 房间页公告发布时间
string announcement_time = 19;
}
int64 total_count = 2;
int64 no_room_count = 3;
int64 has_more = 4;
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,153 @@
## [app端关注二级页][全量]正在直播接口
`GET http://api.live.bilibili.com/xlive/app-interface/v1/relation/liveAnchor`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|buyaofangqizhiliao|否|string| 调试咒语
|
|platform|否|string| 平台
|
|device|否|string| 设备
|
|build|否|string| 版本号
|
|sortRule|否|integer| 排序类型
|
|filterRule|否|integer| 筛选类型
|
|quality|否|integer| 清晰度
|
```json
{
"code": 0,
"message": "ok",
"data": {
"rooms": [
{
// 房间id
"roomid": 0,
// 用户id
"uid": 0,
// 用户昵称
"uname": "",
// 用户头像
"face": "",
// 直播间标题
"title": "",
// 直播间标签
"live_tag_name": "",
// 开始直播时间
"live_time": 0,
// 人气值
"online": 0,
// 秒开url
"playurl": "",
// 可选清晰度
"accept_quality": [
0
],
// 当前清晰度
"current_quality": 0,
// pk_id
"pk_id": 0,
// 特别关注标志
"special_attention": 0,
// 老的分区id
"area": 0,
// 老的分区名
"area_name": "",
// 子分区id
"area_v2_id": 0,
// 子分区名
"area_v2_name": "",
// 父分区名
"area_v2_parent_name": "",
// 父分区id
"area_v2_parent_id": 0,
// 广播适配标志
"broadcast_type": 0,
// 官方认证标志
"official_verify": 0,
// 直播间跳转链接
"link": "",
// 直播间封面
"cover": "",
// 角标文字
"pendent_ru": "",
// 角标颜色
"pendent_ru_color": "",
// 角标背景图
"pendent_ru_pic": "",
"play_url_h265": ""
}
],
"total_count": 0,
"card_type": 0,
"big_card_type": 0
}
}
```
## [app端关注二级页][分页]暂未开播接口
`GET http://api.live.bilibili.com/xlive/app-interface/v1/relation/unliveAnchor`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|buyaofangqizhiliao|否|string| 调试咒语
|
|page|否|integer| 分页号
|
|pagesize|否|integer| 页大小
|
```json
{
"code": 0,
"message": "ok",
"data": {
"rooms": [
{
// 上次开播描述
"live_desc": "",
// 房间id
"roomid": 0,
// 用户id
"uid": 0,
// 用户昵称
"uname": "",
// 用户头像
"face": "",
// 特别关注标志
"special_attention": 0,
// 官方认证标志
"official_verify": 0,
// 直播状态标志
"live_status": 0,
// 广播适配标志
"broadcast_type": 0,
// 老的分区id
"area": 0,
// 粉丝数
"attentions": 0,
// 老的分区名
"area_name": "",
// 子分区id
"area_v2_id": 0,
// 子分区名
"area_v2_name": "",
// 父分区名
"area_v2_parent_name": "",
// 父分区id
"area_v2_parent_id": 0,
// 直播间跳转链接
"link": "",
// 房间页公告
"announcement_content": "",
// 房间页公告发布时间

View File

@@ -0,0 +1,55 @@
load(
"@io_bazel_rules_go//proto:def.bzl",
"go_proto_library",
)
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
proto_library(
name = "v2_proto",
srcs = ["index.proto"],
tags = ["automanaged"],
deps = ["@gogo_special_proto//github.com/gogo/protobuf/gogoproto"],
)
go_proto_library(
name = "v2_go_proto",
compilers = ["@io_bazel_rules_go//proto:gogofast_grpc"],
importpath = "go-common/app/interface/live/app-interface/api/http/v2",
proto = ":v2_proto",
tags = ["automanaged"],
deps = ["@com_github_gogo_protobuf//gogoproto:go_default_library"],
)
go_library(
name = "go_default_library",
srcs = ["index.bm.go"],
embed = [":v2_go_proto"],
importpath = "go-common/app/interface/live/app-interface/api/http/v2",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/net/http/blademaster:go_default_library",
"@com_github_gogo_protobuf//gogoproto:go_default_library",
"@com_github_gogo_protobuf//proto:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,72 @@
// Code generated by protoc-gen-bm v0.1, DO NOT EDIT.
// source: api/http/v2/index.proto
/*
Package v2 is a generated blademaster stub package.
This code was generated with go-common/app/tool/bmgen/protoc-gen-bm v0.1.
It is generated from these files:
api/http/v2/index.proto
*/
package v2
import (
"context"
bm "go-common/library/net/http/blademaster"
)
// to suppressed 'imported but not used warning'
var _ *bm.Context
var _ context.Context
// ===============
// Index Interface
// ===============
// Index 相关服务
type Index interface {
// 首页大接口
// `midware:"guest,verify"`
GetAllList(ctx context.Context, req *GetAllListReq) (resp *GetAllListResp, err error)
// 换一换接口
// `midware:"guest,verify"`
Change(ctx context.Context, req *ChangeReq) (resp *ChangeResp, err error)
}
var v2IndexSvc Index
// @params GetAllListReq
// @router GET /xlive/app-interface/v2/index/getAllList
// @response GetAllListResp
func indexGetAllList(c *bm.Context) {
p := new(GetAllListReq)
if err := c.Bind(p); err != nil {
return
}
resp, err := v2IndexSvc.GetAllList(c, p)
c.JSON(resp, err)
}
// @params ChangeReq
// @router GET /xlive/app-interface/v2/index/change
// @response ChangeResp
func indexChange(c *bm.Context) {
p := new(ChangeReq)
if err := c.Bind(p); err != nil {
return
}
resp, err := v2IndexSvc.Change(c, p)
c.JSON(resp, err)
}
// RegisterV2IndexService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV2IndexService(e *bm.Engine, svc Index, midMap map[string]bm.HandlerFunc) {
guest := midMap["guest"]
verify := midMap["verify"]
v2IndexSvc = svc
e.GET("/xlive/app-interface/v2/index/getAllList", guest, verify, indexGetAllList)
e.GET("/xlive/app-interface/v2/index/change", guest, verify, indexChange)
}

View File

@@ -0,0 +1,532 @@
## 首页大接口
`GET http://api.live.bilibili.com/xlive/app-interface/v2/index/getAllList`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|platform|是|string| 平台
|
|device|是|string| 设备
|
|scale|是|string| 分辨率
|
|build|是|integer| 版本号
|
|relation_page|是|integer|关注页码
|
|rec_page|否|integer|推荐页码 当前推荐页用于天马强推不传默认按1处理
|
|quality|否|integer||
```json
{
"code": 0,
"message": "ok",
"data": {
// 刷新重新请求间隔
"interval": 0,
// 是否命中天马灰度
"is_sky_horse_gray": 0,
// banner类型
"banner": [
{
// 模块信息
"module_info": {
// 模块id
"id": 0,
// 模块跳转链接
"link": "",
// 模块图标
"pic": "",
// 模块标题
"title": "",
// 模块类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
"type": 0,
// 模块排序值
"sort": 0,
// 模块数据源数量按需、目前只有推荐有其它模块都是默认值0
"count": 0
},
// 模块列表
"list": [
{
// 唯一标识id
"id": 0,
// 跳转url
"link": "",
// 图片url
"pic": "",
// 标题
"title": "",
// 内容
"content": ""
}
]
}
],
// 常用标签类型
"my_tag": [
{
"module_info": {
// 模块id
"id": 0,
// 模块跳转链接
"link": "",
// 模块图标
"pic": "",
// 模块标题
"title": "",
// 模块类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
"type": 0,
// 模块排序值
"sort": 0,
// 模块数据源数量按需、目前只有推荐有其它模块都是默认值0
"count": 0
},
"extra_info": {
// 是否命中常用标签灰度
"is_gray": 0,
// offline已下线标签
"offline": [
{
"id": 0,
"area_v2_name": ""
}
]
},
"list": [
{
"area_v2_id": 0,
"area_v2_name": "",
"area_v2_parent_id": 0,
"area_v2_parent_name": "",
"pic": "",
"link": "",
"is_advice": 0
}
]
}
],
// 分区入口类型
"area_entrance": [
{
"module_info": {
// 模块id
"id": 0,
// 模块跳转链接
"link": "",
// 模块图标
"pic": "",
// 模块标题
"title": "",
// 模块类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
"type": 0,
// 模块排序值
"sort": 0,
// 模块数据源数量按需、目前只有推荐有其它模块都是默认值0
"count": 0
},
"list": [
{
// 唯一标识id
"id": 0,
// 跳转url
"link": "",
// 图片url
"pic": "",
// 标题
"title": "",
// 内容
"content": ""
}
]
}
],
// 大航海提示类型
"sea_patrol": [
{
"module_info": {
// 模块id
"id": 0,
// 模块跳转链接
"link": "",
// 模块图标
"pic": "",
// 模块标题
"title": "",
// 模块类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
"type": 0,
// 模块排序值
"sort": 0,
// 模块数据源数量按需、目前只有推荐有其它模块都是默认值0
"count": 0
},
"extra_info": {
// 唯一标识id
"id": 0,
// 跳转url
"link": "",
// 图片url
"pic": "",
// 标题
"title": "",
// 内容
"content": ""
}
}
],
// 我的关注类型
"my_idol": [
{
"module_info": {
// 模块id
"id": 0,
// 模块跳转链接
"link": "",
// 模块图标
"pic": "",
// 模块标题
"title": "",
// 模块类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
"type": 0,
// 模块排序值
"sort": 0,
// 模块数据源数量按需、目前只有推荐有其它模块都是默认值0
"count": 0
},
"extra_info": {
"total_count": 0,
"time_desc": "",
"uname_desc": "",
"tags_desc": "",
"card_type": 0,
"relation_page": 0
},
"list": [
{
"roomid": 0,
"uid": 0,
"uname": "",
"face": "",
"cover": "",
"title": "",
"area": 0,
"live_time": 0,
"area_name": "",
"area_v2_id": 0,
"area_v2_name": "",
"area_v2_parent_name": "",
"area_v2_parent_id": 0,
"live_tag_name": "",
"online": 0,
"play_url": "",
"play_url_h265": "",
"accept_quality": [
0
],
"current_quality": 0,
"pk_id": 0,
"link": "",
"special_attention": 0,
"broadcast_type": 0,
"pendent_ru": "",
"pendent_ru_color": "",
"pendent_ru_pic": "",
"official_verify": 0
}
]
}
],
// 通用房间列表类型
"room_list": [
{
"module_info": {
// 模块id
"id": 0,
// 模块跳转链接
"link": "",
// 模块图标
"pic": "",
// 模块标题
"title": "",
// 模块类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
"type": 0,
// 模块排序值
"sort": 0,
// 模块数据源数量按需、目前只有推荐有其它模块都是默认值0
"count": 0
},
"list": [
{
// 当前拥有清晰度列表
"accept_quality": [
0
],
// 二级分区id
"area_v2_id": 0,
// 一级分区id
"area_v2_parent_id": 0,
// 二级分区名称
"area_v2_name": "",
// 一级分区名称
"area_v2_parent_name": "",
// 横竖屏 0:横屏 1:竖屏 -1:异常情况
"broadcast_type": 0,
// 封面封面现在有3种关键帧、封面图、秀场封面正方形的返回哪个由后端决定
"cover": "",
// 当前清晰度,清晰度((0)) 0:默认码率, 2:800 3:1500 4:原画
"current_quality": 0,
// 主播头像
"face": "",
// 跳转链接
"link": "",
// 人气值
"online": 0,
// 新版角标-右上 默认为空 只能是文字!!!@古月 【5.29显示更新】服务端还是吐右上兼容老版5.29显示在左上
"pendent_ru": "",
// 【5.29显示更新】服务端还是吐右上5.29客户端显示在左上,对应的背景图片
"pendent_ru_color": "",
// 新版移动端角标色值-右上
"pendent_ru_pic": "",
// pk_id
"pk_id": 0,
// 秒开播放串 h264
"play_url": "",
// 推荐类型 1人气 2营收 3运营强推 4天马推荐暂定用于客户端打点
"rec_type": 0,
// 房间id
"roomid": 0,
// 房间标题
"title": "",
// 主播uname
"uname": "",
// 秒开播放串 h265
"play_url_h265": ""
}
]
}
],
// 小时榜类型
"hour_rank": [
{
"module_info": {
// 模块id
"id": 0,
// 模块跳转链接
"link": "",
// 模块图标
"pic": "",
// 模块标题
"title": "",
// 模块类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
"type": 0,
// 模块排序值
"sort": 0,
// 模块数据源数量按需、目前只有推荐有其它模块都是默认值0
"count": 0
},
"extra_info": {
// 14:00-15:00榜单
"sub_title": ""
},
"list": [
{
// 排名
"rank": 0,
// 用户uid
"uid": 0,
// 房间id
"roomid": 0,
// 用户昵称
"uname": "",
// 用户头像
"face": "",
// 直播状态
"live_status": 0,
// 父分区id
"area_v2_parent_id": 0,
// 父分区名称
"area_v2_parent_name": "",
// 子分区id
"area_v2_id": 0,
// 子分区名称
"area_v2_name": ""
}
]
}
],
// 活动卡
"activity_card": [
{
"module_info": {
// 模块id
"id": 0,
// 模块跳转链接
"link": "",
// 模块图标
"pic": "",
// 模块标题
"title": "",
// 模块类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
"type": 0,
// 模块排序值
"sort": 0,
// 模块数据源数量按需、目前只有推荐有其它模块都是默认值0
"count": 0
},
"list": [
{
"card": {
// 活动id
"aid": 0,
// 活动图片
"pic": "",
// 活动标题
"title": "",
// 活动文案
"text": "",
// 图片链接
"pic_link": "",
// 围观链接
"go_link": "",
// 三种:去围观,预约,已预约
"button_text": "",
// 代表卡片所处于的状态 0可以去围观,1用户可以点击去预约,2用户可以点击取消预约
"status": 0,
// card,room和av排序值
"sort": 0
},
"room": [
{
// 是否开播
"is_live": 0,
// 房间id
"room_id": 0,
// 房间标题
"title": "",
// 主播名
"u_name": "",
// 人气值
"online": 0,
// 封面
"cover": "",
// 父一级分区id
"area_v2_parent_id": 0,
// 二级分区id
"area_v2_id": 0,
// card,room和av排序值
"sort": 0
}
],
"av": [
{
// 视频
"avid": 0,
// avid
"title": "",
// 视频标题
"view_count": 0,
// 浏览
"dan_ma_ku": 0,
// 弹幕
"duration": 0,
// 时长
"cover": "",
// card,room和av排序值
"sort": 0
}
]
}
]
}
]
}
}
```
## 换一换接口
`GET http://api.live.bilibili.com/xlive/app-interface/v2/index/change`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|module_id|是|integer|模块id
|
|attention_room_id|否|string|关注的room ids
|
|page|是|integer|换一换的当前页数
|
|platform|是|string||
|build|是|integer||
|device|是|string||
|quality|否|integer||
```json
{
"code": 0,
"message": "ok",
"data": {
"module_info": {
// 模块id
"id": 0,
// 模块跳转链接
"link": "",
// 模块图标
"pic": "",
// 模块标题
"title": "",
// 模块类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
"type": 0,
// 模块排序值
"sort": 0,
// 模块数据源数量按需、目前只有推荐有其它模块都是默认值0
"count": 0
},
"is_sky_horse_gray": 0,
"list": [
{
// 当前拥有清晰度列表
"accept_quality": [
0
],
// 二级分区id
"area_v2_id": 0,
// 一级分区id
"area_v2_parent_id": 0,
// 二级分区名称
"area_v2_name": "",
// 一级分区名称
"area_v2_parent_name": "",
// 横竖屏 0:横屏 1:竖屏 -1:异常情况
"broadcast_type": 0,
// 封面封面现在有3种关键帧、封面图、秀场封面正方形的返回哪个由后端决定
"cover": "",
// 当前清晰度,清晰度((0)) 0:默认码率, 2:800 3:1500 4:原画
"current_quality": 0,
// 主播头像
"face": "",
// 跳转链接
"link": "",
// 人气值
"online": 0,
// 新版角标-右上 默认为空 只能是文字!!!@古月 【5.29显示更新】服务端还是吐右上兼容老版5.29显示在左上
"pendent_ru": "",
// 【5.29显示更新】服务端还是吐右上5.29客户端显示在左上,对应的背景图片
"pendent_ru_color": "",
// 新版移动端角标色值-右上
"pendent_ru_pic": "",
// pk_id
"pk_id": 0,
// 秒开播放串 h264
"play_url": "",
// 推荐类型 1人气 2营收 3运营强推 4天马推荐暂定用于客户端打点
"rec_type": 0,
// 房间id
"roomid": 0,
// 房间标题
"title": "",
// 主播uname

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,363 @@
syntax = "proto3";
package live.appinterface.v2;
option go_package = "v2";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
// Index 相关服务
service Index {
// 首页大接口
// `midware:"guest,verify"`
rpc getAllList (GetAllListReq) returns (GetAllListResp);
// 换一换接口
// `midware:"guest,verify"`
rpc change (ChangeReq) returns (ChangeResp);
}
// 接口1GetAllList
message GetAllListReq {
// 平台
string platform = 1 [(gogoproto.moretags) = 'form:"platform" validate:"required"'];
// 设备
string device = 2 [(gogoproto.moretags) = 'form:"device" validate:"required"'];
// 分辨率
string scale = 3 [(gogoproto.moretags) = 'form:"scale" validate:"required"'];
// 版本号
int64 build = 4 [(gogoproto.moretags) = 'form:"build" validate:"required"'];
//关注页码
int64 relation_page = 5 [(gogoproto.moretags) = 'form:"relation_page" validate:"required"'];
//推荐页码 当前推荐页用于天马强推不传默认按1处理
int64 rec_page = 6 [(gogoproto.moretags) = 'form:"rec_page"'];
int64 quality = 7 [(gogoproto.moretags) = 'form:"quality"'];
}
// GetAllList响应
message GetAllListResp {
//刷新重新请求间隔
int64 interval = 1 [(gogoproto.jsontag) = 'interval'];
//是否命中天马灰度
int64 is_sky_horse_gray = 2 [(gogoproto.jsontag) = 'is_sky_horse_gray'];
//banner类型
repeated MBanner banner = 3 [(gogoproto.jsontag) = 'banner'];
//常用标签类型
repeated MMyTag my_tag = 4 [(gogoproto.jsontag) = 'my_tag'];
//分区入口类型
repeated MAreaEntrance area_entrance = 5 [(gogoproto.jsontag) = 'area_entrance'];
//大航海提示类型
repeated MSeaPatrol sea_patrol = 6 [(gogoproto.jsontag) = 'sea_patrol'];
//我的关注类型
repeated MMyIdol my_idol = 7 [(gogoproto.jsontag) = 'my_idol'];
//通用房间列表类型
repeated MRoomBlock room_list = 8 [(gogoproto.jsontag) = 'room_list'];
//小时榜类型
repeated MHourRank hour_rank = 9 [(gogoproto.jsontag) = 'hour_rank'];
//活动卡
repeated MActivityCard activity_card = 10 [(gogoproto.jsontag) = 'activity_card'];
}
// module define begin
// banner banner位
message MBanner {
// 模块信息
ModuleInfo module_info = 1 [(gogoproto.jsontag) = 'module_info'];
// 模块列表
repeated PicItem list = 2 [(gogoproto.jsontag) = 'list'];
}
// MyTag 常用标签
message MMyTag {
ModuleInfo module_info = 1 [(gogoproto.jsontag) = 'module_info'];
MyTagExtra extra_info = 2 [(gogoproto.jsontag) = 'extra_info'];
repeated MyTagItem list = 3 [(gogoproto.jsontag) = 'list'];
}
// AreaEntrance 分区入口
message MAreaEntrance {
ModuleInfo module_info = 1 [(gogoproto.jsontag) = 'module_info'];
repeated PicItem list = 2 [(gogoproto.jsontag) = 'list'];
}
// SeaPatrol 大航海提示
message MSeaPatrol {
ModuleInfo module_info = 1 [(gogoproto.jsontag) = 'module_info'];
PicItem extra_info = 2 [(gogoproto.jsontag) = 'extra_info'];
}
// MyIdol 我的关注
message MMyIdol {
ModuleInfo module_info = 1 [(gogoproto.jsontag) = 'module_info'];
MyIdolExtra extra_info = 2 [(gogoproto.jsontag) = 'extra_info'];
repeated MyIdolItem list = 3 [(gogoproto.jsontag) = 'list'];
}
// RoomList 房间列表
message MRoomBlock {
ModuleInfo module_info = 1 [(gogoproto.jsontag) = 'module_info'];
repeated CommonRoomItem list = 3 [(gogoproto.jsontag) = 'list'];
}
// MHourRank 小时榜
message MHourRank {
ModuleInfo module_info = 1 [(gogoproto.jsontag) = 'module_info'];
HourRankExtra extra_info = 2 [(gogoproto.jsontag) = 'extra_info'];
repeated HourRankItem list = 3 [(gogoproto.jsontag) = 'list'];
}
// MActivityCard 活动卡
message MActivityCard {
ModuleInfo module_info = 1 [(gogoproto.jsontag) = 'module_info'];
repeated ActivityCardItem list = 2 [(gogoproto.jsontag) = 'list'];
}
// ...
// ModuleInfo
message ModuleInfo {
// 模块id
int64 id = 1 [(gogoproto.jsontag) = 'id'];
// 模块跳转链接
string link = 2 [(gogoproto.jsontag) = 'link'];
// 模块图标
string pic = 3 [(gogoproto.jsontag) = 'pic'];
// 模块标题
string title = 4 [(gogoproto.jsontag) = 'title'];
// 模块类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
int64 type = 5 [(gogoproto.jsontag) = 'type'];
// 模块排序值
int64 sort = 6 [(gogoproto.jsontag) = 'sort'];
// 模块数据源数量按需、目前只有推荐有其它模块都是默认值0
int64 count = 7 [(gogoproto.jsontag) = 'count'];
}
// PicItem 比如banner、分区入口、大航海提示等等
message PicItem {
//唯一标识id
int64 id = 1 [(gogoproto.jsontag) = 'id'];
//跳转url
string link = 2 [(gogoproto.jsontag) = 'link'];
//图片url
string pic = 3 [(gogoproto.jsontag) = 'pic'];
//标题
string title = 4 [(gogoproto.jsontag) = 'title'];
//内容
string content = 5 [(gogoproto.jsontag) = 'content'];
}
// MyTagItem
message MyTagItem {
int64 area_v2_id = 1 [(gogoproto.jsontag) = 'area_v2_id'];
string area_v2_name = 2 [(gogoproto.jsontag) = 'area_v2_name'];
int64 area_v2_parent_id = 3 [(gogoproto.jsontag) = 'area_v2_parent_id'];
string area_v2_parent_name = 4 [(gogoproto.jsontag) = 'area_v2_parent_name'];
string pic = 5 [(gogoproto.jsontag) = 'pic'];
string link = 6 [(gogoproto.jsontag) = 'link'];
int64 is_advice = 7 [(gogoproto.jsontag) = 'is_advice'];
}
// MyTagExtra
message MyTagExtra {
//是否命中常用标签灰度
int64 is_gray = 1 [(gogoproto.jsontag) = 'is_gray'];
//offline已下线标签
repeated OfflineTag offline = 2 [(gogoproto.jsontag) = 'offline'];
}
// OfflineTag
message OfflineTag {
int64 id = 1 [(gogoproto.jsontag) = 'id'];
string area_v2_name = 2 [(gogoproto.jsontag) = 'area_v2_name'];
}
// MyIdolExtra
message MyIdolExtra {
int64 total_count = 1 [(gogoproto.jsontag) = 'total_count'];
string time_desc = 2 [(gogoproto.jsontag) = 'time_desc'];
string uname_desc = 3 [(gogoproto.jsontag) = 'uname_desc'];
string tags_desc = 4 [(gogoproto.jsontag) = 'tags_desc'];
int64 card_type = 5 [(gogoproto.jsontag) = 'card_type'];
int64 relation_page = 6 [(gogoproto.jsontag) = 'relation_page'];
}
// MyIdolItem
message MyIdolItem {
int64 roomid = 1 [(gogoproto.jsontag) = 'roomid'];
int64 uid = 2 [(gogoproto.jsontag) = 'uid'];
string uname = 3 [(gogoproto.jsontag) = 'uname'];
string face = 4 [(gogoproto.jsontag) = 'face'];
string cover = 5 [(gogoproto.jsontag) = 'cover'];
string title = 6 [(gogoproto.jsontag) = 'title'];
int64 area = 7 [(gogoproto.jsontag) = 'area'];
int64 live_time = 8 [(gogoproto.jsontag) = 'live_time'];
string area_name = 9 [(gogoproto.jsontag) = 'area_name'];
int64 area_v2_id = 10 [(gogoproto.jsontag) = 'area_v2_id'];
string area_v2_name = 11 [(gogoproto.jsontag) = 'area_v2_name'];
string area_v2_parent_name = 12 [(gogoproto.jsontag) = 'area_v2_parent_name'];
int64 area_v2_parent_id = 13 [(gogoproto.jsontag) = 'area_v2_parent_id'];
string live_tag_name = 14 [(gogoproto.jsontag) = 'live_tag_name'];
int64 online = 15 [(gogoproto.jsontag) = 'online'];
string play_url = 16 [(gogoproto.jsontag) = 'play_url'];
string play_url_h265 = 17 [(gogoproto.jsontag) = 'play_url_h265'];
repeated int64 accept_quality = 18 [(gogoproto.jsontag) = 'accept_quality'];
int64 current_quality = 19 [(gogoproto.jsontag) = 'current_quality'];
int64 pk_id = 20 [(gogoproto.jsontag) = 'pk_id'];
string link = 21 [(gogoproto.jsontag) = 'link'];
int64 special_attention = 22 [(gogoproto.jsontag) = 'special_attention'];
int64 broadcast_type = 23 [(gogoproto.jsontag) = 'broadcast_type'];
string pendent_ru = 24 [(gogoproto.jsontag) = 'pendent_ru'];
string pendent_ru_color = 25 [(gogoproto.jsontag) = 'pendent_ru_color'];
string pendent_ru_pic = 26 [(gogoproto.jsontag) = 'pendent_ru_pic'];
int64 official_verify = 27 [(gogoproto.jsontag) = 'official_verify'];
}
// ActivityCardItem
message ActivityCardItem {
BannerCardItem card = 1 [(gogoproto.jsontag) = 'card'];
repeated RoomCardItem room = 2 [(gogoproto.jsontag) = 'room'];
repeated AvCardItem av = 3 [(gogoproto.jsontag) = 'av'];
}
// BannerCardItem
message BannerCardItem {
//活动id
int64 aid = 1 [(gogoproto.jsontag) = 'aid'];
//活动图片
string pic = 2 [(gogoproto.jsontag) = 'pic'];
//活动标题
string title = 3 [(gogoproto.jsontag) = 'title'];
//活动文案
string text = 4 [(gogoproto.jsontag) = 'text'];
//图片链接
string pic_link = 5 [(gogoproto.jsontag) = 'pic_link'];
//围观链接
string go_link = 6 [(gogoproto.jsontag) = 'go_link'];
//三种:去围观,预约,已预约
string button_text = 7 [(gogoproto.jsontag) = 'button_text'];
//代表卡片所处于的状态 0可以去围观,1用户可以点击去预约,2用户可以点击取消预约
int64 status = 8 [(gogoproto.jsontag) = 'status'];
//card,room和av排序值
int64 sort = 9 [(gogoproto.jsontag) = 'sort'];
}
// RoomCardItem
message RoomCardItem {
//是否开播
int64 is_live = 1 [(gogoproto.jsontag) = 'is_live'];
//房间id
int64 room_id = 2 [(gogoproto.jsontag) = 'room_id'];
//房间标题
string title = 3 [(gogoproto.jsontag) = 'title'];
//主播名
string u_name = 4 [(gogoproto.jsontag) = 'u_name'];
//人气值
int64 online = 5 [(gogoproto.jsontag) = 'online'];
//封面
string cover = 6 [(gogoproto.jsontag) = 'cover'];
//父一级分区id
int64 area_v2_parent_id = 7 [(gogoproto.jsontag) = 'area_v2_parent_id'];
//二级分区id
int64 area_v2_id = 8 [(gogoproto.jsontag) = 'area_v2_id'];
//card,room和av排序值
int64 sort = 9 [(gogoproto.jsontag) = 'sort'];
}
// AvCardItem
message AvCardItem {
//视频
int64 avid = 1 [(gogoproto.jsontag) = 'avid'];
//avid
string title = 2 [(gogoproto.jsontag) = 'title'];
//视频标题
int64 view_count = 3 [(gogoproto.jsontag) = 'view_count'];
//浏览
int64 dan_ma_ku = 4 [(gogoproto.jsontag) = 'dan_ma_ku'];
//弹幕
int64 duration = 5 [(gogoproto.jsontag) = 'duration'];
//时长
string cover = 6 [(gogoproto.jsontag) = 'cover'];
//card,room和av排序值
int64 sort = 7 [(gogoproto.jsontag) = 'sort'];
}
// CommonRoomItem
message CommonRoomItem {
//当前拥有清晰度列表
repeated int64 accept_quality = 1 [(gogoproto.jsontag) = 'accept_quality'];
//二级分区id
int64 area_v2_id = 2 [(gogoproto.jsontag) = 'area_v2_id'];
//一级分区id
int64 area_v2_parent_id = 3 [(gogoproto.jsontag) = 'area_v2_parent_id'];
//二级分区名称
string area_v2_name = 4 [(gogoproto.jsontag) = 'area_v2_name'];
//一级分区名称
string area_v2_parent_name = 5 [(gogoproto.jsontag) = 'area_v2_parent_name'];
//横竖屏 0:横屏 1:竖屏 -1:异常情况
int64 broadcast_type = 6 [(gogoproto.jsontag) = 'broadcast_type'];
//封面封面现在有3种关键帧、封面图、秀场封面正方形的返回哪个由后端决定
string cover = 7 [(gogoproto.jsontag) = 'cover'];
//当前清晰度,清晰度((0)) 0:默认码率, 2:800 3:1500 4:原画
int64 current_quality = 8 [(gogoproto.jsontag) = 'current_quality'];
//主播头像
string face = 9 [(gogoproto.jsontag) = 'face'];
//跳转链接
string link = 10 [(gogoproto.jsontag) = 'link'];
//人气值
int64 online = 11 [(gogoproto.jsontag) = 'online'];
//新版角标-右上 默认为空 只能是文字!!!@古月 【5.29显示更新】服务端还是吐右上兼容老版5.29显示在左上
string pendent_ru = 12 [(gogoproto.jsontag) = 'pendent_ru'];
//【5.29显示更新】服务端还是吐右上5.29客户端显示在左上,对应的背景图片
string pendent_ru_color = 13 [(gogoproto.jsontag) = 'pendent_ru_color'];
//新版移动端角标色值-右上
string pendent_ru_pic = 14 [(gogoproto.jsontag) = 'pendent_ru_pic'];
//pk_id
int64 pk_id = 15 [(gogoproto.jsontag) = 'pk_id'];
//秒开播放串 h264
string play_url = 16 [(gogoproto.jsontag) = 'play_url'];
//推荐类型 1人气 2营收 3运营强推 4天马推荐暂定用于客户端打点
int64 rec_type = 17 [(gogoproto.jsontag) = 'rec_type'];
//房间id
int64 roomid = 18 [(gogoproto.jsontag) = 'roomid'];
//房间标题
string title = 19 [(gogoproto.jsontag) = 'title'];
//主播uname
string uname = 20 [(gogoproto.jsontag) = 'uname'];
//秒开播放串 h265
string play_url_h265 = 21 [(gogoproto.jsontag) = 'play_url_h265'];
}
// HourRankItem
message HourRankItem {
//排名
int64 rank = 1 [(gogoproto.jsontag) = 'rank'];
//用户uid
int64 uid = 2 [(gogoproto.jsontag) = 'uid'];
//房间id
int64 roomid = 3 [(gogoproto.jsontag) = 'roomid'];
//用户昵称
string uname = 4 [(gogoproto.jsontag) = 'uname'];
//用户头像
string face = 5 [(gogoproto.jsontag) = 'face'];
//直播状态
int64 live_status = 6 [(gogoproto.jsontag) = 'live_status'];
//父分区id
int64 area_v2_parent_id = 7 [(gogoproto.jsontag) = 'area_v2_parent_id'];
//父分区名称
string area_v2_parent_name = 8 [(gogoproto.jsontag) = 'area_v2_parent_name'];
//子分区id
int64 area_v2_id = 9 [(gogoproto.jsontag) = 'area_v2_id'];
//子分区名称
string area_v2_name = 10 [(gogoproto.jsontag) = 'area_v2_name'];
}
message HourRankExtra {
//14:00-15:00榜单
string sub_title = 1 [(gogoproto.jsontag) = 'sub_title'];
}
// 接口2换一换
message ChangeReq {
//模块id
int64 module_id = 1 [(gogoproto.moretags) = 'form:"module_id" validate:"required"'];
//关注的room ids
string attention_room_id = 2 [(gogoproto.moretags) = 'form:"attention_room_id"'];
//换一换的当前页数
int64 page = 3 [(gogoproto.moretags) = 'form:"page" validate:"required"'];
string platform = 4 [(gogoproto.moretags) = 'form:"platform" validate:"required"'];
int64 build = 5 [(gogoproto.moretags) = 'form:"build" validate:"required"'];
string device = 6 [(gogoproto.moretags) = 'form:"device" validate:"required"'];
int64 quality = 7 [(gogoproto.moretags) = 'form:"quality"'];
}
// 换一换响应
message ChangeResp {
ModuleInfo module_info = 1;
int64 is_sky_horse_gray = 2 [(gogoproto.jsontag) = 'is_sky_horse_gray'];
repeated CommonRoomItem list = 3;
}

View File

@@ -0,0 +1,43 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_binary",
"go_library",
)
go_binary(
name = "cmd",
embed = [":go_default_library"],
tags = ["automanaged"],
)
go_library(
name = "go_default_library",
srcs = ["main.go"],
data = ["test.toml"],
importpath = "go-common/app/interface/live/app-interface/cmd",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/app-interface/conf:go_default_library",
"//app/interface/live/app-interface/server/http:go_default_library",
"//library/ecode/tip:go_default_library",
"//library/log:go_default_library",
"//library/net/trace:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,44 @@
package main
import (
"flag"
"os"
"os/signal"
"syscall"
"time"
"go-common/app/interface/live/app-interface/conf"
"go-common/app/interface/live/app-interface/server/http"
eCode "go-common/library/ecode/tip"
"go-common/library/log"
"go-common/library/net/trace"
)
func main() {
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
log.Init(conf.Conf.Log)
defer log.Close()
log.Info("App-interface start")
trace.Init(conf.Conf.Tracer)
defer trace.Close()
eCode.Init(conf.Conf.ECode)
http.Init(conf.Conf)
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
for {
s := <-c
log.Info("get a signal %s", s.String())
switch s {
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
log.Info("App-interface exit")
time.Sleep(time.Second)
return
case syscall.SIGHUP:
default:
return
}
}
}

View File

@@ -0,0 +1,95 @@
SkyHorseStatus = true
[log]
stdout = true
[rpctimeout]
relation = 200
allList = 100
getMyTag = 100
getMultiRoomList = 100
seaPatrol = 50
activityQuery = 100
clientRecStrong = 100
getByIds = 50
getPendantByIds = 50
"room/v2/Room/room_id_by_uid_multi" = 100
"room/v1/Room/get_status_info_by_uids" = 100
"user/v3/User/getMultiple" = 100
"live_data/v1/Record/get" = 100
"/room_ex/v1/RoomNews/multiGet" = 100
"/room_ex/v1/Banner/getNewBanner" = 50
"/room/v1/RoomPendant/getPendantMulti" = 100
"av/v1/Pk/getPkIdsByRoomIds" = 100
"fans_medal/v1/FansMedal/targetsWithMedal" = 100
[httpClient]
key = "fb06a25c6338edbc"
secret = "fd10bd177559780c2e4a44f1fa47fa83"
dial = "100ms"
timeout = "100ms"
keepAlive = "60s"
[httpClient.breaker]
window = "3s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[httpClient.Host]
[httpClient.Host."172.18.33.110:12250"]
dial = "100ms"
timeout = "200ms"
[liverpc]
[liverpc.room]
AppID = "live.room"
ConnTimeout = "50ms"
[liverpc.user]
AppID = "live.user"
ConnTimeout = "50ms"
[liverpc.userext]
AppID = "live.userext"
ConnTimeout = "50ms"
[liverpc.relation]
AppID = "live.relation"
ConnTimeout = "50ms"
[liverpc.live_user]
AppID = "live.live_user"
ConnTimeout = "50ms"
[liverpc.av]
AppID = "live.av"
ConnTimeout = "50ms"
[liverpc.roomex]
AppID = "live.roomex"
ConnTimeout = "50ms"
[liverpc.livedata]
AppID = "live.livedata"
ConnTimeout = "50ms"
[liverpc.fansmedal]
AppID = "live.fansmedal"
ConnTimeout = "50ms"
[liverpc.rankdb]
AppID = "live.rankdb"
ConnTimeout = "50ms"
[SkyHorseGray]
07 = true
27 = true
47 = true
67 = true
29 = true
31 = true
[bvc]
host = "uat-live-playurl.bilibili.co"
[DummyUid]
enable = 1
[ChunkSize]
"room/v2/Room/room_id_by_uid_multi" = 30
"room/v1/Room/get_status_info_by_uids" = 30
"user/v3/User/getMultiple" = 30
"live_data/v1/Record/get" = 20
"/room_ex/v1/RoomNews/multiGet" = 20
"/room/v1/RoomPendant/getPendantMulti" = 20
"av/v1/Pk/getPkIdsByRoomIds" = 20
"fans_medal/v1/FansMedal/targetsWithMedal" = 20
[AppConf]
roomAttention = '{"isShowAttentionBubble": 1,"attentionBubbleWaitTime": 120,"isShowAttentionBubbleWithMedal": 1,"isShowAttentionAlert": 1,"attentionAlertWaitTime": 1500 }'

View File

@@ -0,0 +1,43 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["conf.go"],
importpath = "go-common/app/interface/live/app-interface/conf",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/cache/memcache:go_default_library",
"//library/cache/redis:go_default_library",
"//library/conf:go_default_library",
"//library/database/sql:go_default_library",
"//library/ecode/tip:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/http/blademaster/middleware/verify:go_default_library",
"//library/net/rpc:go_default_library",
"//library/net/rpc/liverpc:go_default_library",
"//library/net/rpc/warden:go_default_library",
"//library/net/trace:go_default_library",
"//vendor/github.com/BurntSushi/toml:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,217 @@
package conf
import (
"errors"
"flag"
"go-common/library/net/rpc/warden"
"go-common/library/cache/memcache"
"go-common/library/cache/redis"
"go-common/library/conf"
"go-common/library/database/sql"
eCode "go-common/library/ecode/tip"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/verify"
"go-common/library/net/rpc"
"go-common/library/net/rpc/liverpc"
"go-common/library/net/trace"
"github.com/BurntSushi/toml"
)
var (
confPath string
client *conf.Client
// Conf config
Conf = &Config{}
)
// Config .
type Config struct {
Log *log.Config
BM *bm.ServerConfig
Verify *verify.Config
Tracer *trace.Config
Redis *redis.Config
MemCache *memcache.Config
MySQL *sql.Config
ECode *eCode.Config
LiveRpc map[string]*liverpc.ClientConfig
HttpClient *bm.ClientConfig
SkyHorseGray map[string]bool
SkyHorseStatus bool
RpcTimeout map[string]int64
Bvc map[string]string
ChunkSize map[string]int64
DummyUid map[string]int64
AccountRPC *rpc.ClientConfig
XuserClient *warden.ClientConfig
LiveGray map[string]bool
Warden *warden.ClientConfig
AppConf map[string]string
}
// ErrLogStrut ...
// 自定义ErrLog结构
type ErrLogStrut struct {
Code int64
Msg string
ErrDesc string
ErrType string
URLName string
RPCTimeout int64
ChunkSize int64
ChunkNum int64
ErrorPtr *error
}
// ChunkCallInfo rpc调用配置
type ChunkCallInfo struct {
ParamsName string
URLName string
ChunkSize int64
ChunkNum int64
RPCTimeout int64
}
const (
// EmptyResultEn 返回结果集为空
EmptyResultEn = "got_empty_result"
// EmptyResult 返回结果集为空
EmptyResult = "调用直播服务返回data为空"
// GetStatusInfoByUfos 获取房间信息
GetStatusInfoByUfos = "room/v1/Room/get_status_info_by_uids"
// TargetsWithMedal 获取房间信息
TargetsWithMedal = "fans_medal/v1/FansMedal/targetsWithMedal"
// GetRoomID 获取房间信息
GetRoomID = "room/v2/Room/room_id_by_uid_multi"
// Record 获取房间信息
Record = "live_data/v1/Record/get"
// GetPkIdsByRoomIds 获取房间信息
GetPkIdsByRoomIds = "av/v1/Pk/getPkIdsByRoomIds"
// RoomPendent 获取房间信息
RoomPendent = "room/v1/RoomPendant/getPendantByIds"
// RoomNews 获取房间信息
RoomNews = "/room_ex/v1/RoomNews/multiGet"
// RelationGiftInfo 获取房间信息
// RelationGiftInfo = "/relation/v1/BaseInfo/getGiftInfo"
// AccountGRPC ... 主站grpc用户信息
AccountGRPC = "Cards3"
// LiveUserExpGRPC ...
// 直播用户经验grpc
LiveUserExpGRPC = "xuserExp"
)
func init() {
flag.StringVar(&confPath, "conf", "", "default config path")
}
// Init init conf
func Init() error {
if confPath != "" {
return local()
}
return remote()
}
func local() (err error) {
_, err = toml.DecodeFile(confPath, &Conf)
return
}
func remote() (err error) {
if client, err = conf.New(); err != nil {
return
}
if err = load(); err != nil {
return
}
client.Watch("app-interface.toml")
go func() {
for range client.Event() {
log.Info("config reload")
if load() != nil {
log.Error("config reload error (%v)", err)
}
}
}()
return
}
func load() (err error) {
var (
s string
ok bool
tmpConf *Config
)
if s, ok = client.Toml2(); !ok {
return errors.New("load config center error")
}
if _, err = toml.Decode(s, &tmpConf); err != nil {
return errors.New("could not decode config")
}
*Conf = *tmpConf
return
}
// GetTimeout implementation
// 获取超时
func GetTimeout(k string, def int64) (timeout int64) {
if t, ok := Conf.RpcTimeout[k]; ok {
timeout = t
} else {
timeout = def
}
return
}
// GetDummyUidConf implementation
// 获取模拟配置开关
func GetDummyUidConf() (config int64) {
if t, ok := Conf.DummyUid["enable"]; ok {
config = t
} else {
config = 0
}
return
}
// GetChunkSize implementation
// 获取模GetChunkSize
func GetChunkSize(k string, def int64) (timeout int64) {
if t, ok := Conf.ChunkSize[k]; ok {
timeout = t
} else {
timeout = def
}
return
}
// CheckReturn ...
// 检查返回
func CheckReturn(err error, code int64, msg string, urlName string,
rpcTimeout int64, chunkSize int64, chunkNum int64) (errLog *ErrLogStrut, success bool) {
errInfo := ErrLogStrut{}
errInfo.URLName = urlName
errInfo.RPCTimeout = rpcTimeout
errInfo.ChunkSize = chunkSize
errInfo.ChunkNum = chunkNum
success = true
if err != nil {
errInfo.Code = 1003000
errInfo.Msg = ""
errInfo.ErrDesc = "liveRpc调用失败"
errInfo.ErrType = "LiveRpcFrameWorkCallError"
errInfo.ErrorPtr = &err
success = false
} else if code != 0 {
errInfo.Code = code
errInfo.Msg = msg
errInfo.ErrDesc = "调用直播服务" + urlName + "出错"
errInfo.ErrType = "CallLiveRpcCodeError"
success = false
}
errLog = &errInfo
return
}

View File

@@ -0,0 +1,60 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"api.go",
"dao.go",
],
importpath = "go-common/app/interface/live/app-interface/dao",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/app-interface/conf:go_default_library",
"//app/service/live/av/api/liverpc:go_default_library",
"//app/service/live/fans_medal/api/liverpc:go_default_library",
"//app/service/live/live_data/api/liverpc:go_default_library",
"//app/service/live/live_user/api/liverpc:go_default_library",
"//app/service/live/rankdb/api/liverpc:go_default_library",
"//app/service/live/relation/api/liverpc:go_default_library",
"//app/service/live/room/api/liverpc:go_default_library",
"//app/service/live/room_ex/api/liverpc:go_default_library",
"//app/service/live/third_api/bvc:go_default_library",
"//app/service/live/third_api/skyhorse:go_default_library",
"//app/service/live/userext/api/liverpc:go_default_library",
"//app/service/live/xuser/api/grpc/v1:go_default_library",
"//library/net/rpc/liverpc:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/interface/live/app-interface/dao/account:all-srcs",
"//app/interface/live/app-interface/dao/av:all-srcs",
"//app/interface/live/app-interface/dao/fans_medal:all-srcs",
"//app/interface/live/app-interface/dao/live_data:all-srcs",
"//app/interface/live/app-interface/dao/live_user:all-srcs",
"//app/interface/live/app-interface/dao/rankdb:all-srcs",
"//app/interface/live/app-interface/dao/relation:all-srcs",
"//app/interface/live/app-interface/dao/room:all-srcs",
"//app/interface/live/app-interface/dao/room_ex:all-srcs",
"//app/interface/live/app-interface/dao/user_ext:all-srcs",
"//app/interface/live/app-interface/dao/xuser:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,40 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"dao.go",
"userInfo.go",
],
importpath = "go-common/app/interface/live/app-interface/dao/account",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/app-interface/conf:go_default_library",
"//app/service/main/account/api:go_default_library",
"//app/service/main/account/model:go_default_library",
"//app/service/main/account/rpc/client:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//vendor/github.com/pkg/errors:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,35 @@
package account
import (
"context"
"go-common/app/interface/live/app-interface/conf"
account "go-common/app/service/main/account/rpc/client"
)
// Dao dao
type Dao struct {
c *conf.Config
accountRPC *account.Service3
}
// New init mysql db
func New(c *conf.Config) (dao *Dao) {
dao = &Dao{
c: c,
accountRPC: account.New3(nil),
}
return
}
// Close close the resource.
func (d *Dao) Close() {
return
}
// Ping dao ping
func (d *Dao) Ping(c context.Context) error {
// TODO: if you need use mc,redis, please add
// check
return nil
}

View File

@@ -0,0 +1,47 @@
package account
import (
"context"
"github.com/pkg/errors"
"go-common/app/service/main/account/api"
accountM "go-common/app/service/main/account/model"
actmdl "go-common/app/service/main/account/model"
"go-common/library/ecode"
"go-common/library/log"
)
// GetUserInfoData ...
// 调用account grpc接口cards获取用户信息
func (d *Dao) GetUserInfoData(c context.Context, UIDs []int64) (userResult map[int64]*accountM.Card, err error) {
userResult = make(map[int64]*accountM.Card)
lens := len(UIDs)
if lens <= 0 {
return
}
ret, err := d.accountRPC.Cards3(c, &actmdl.ArgMids{Mids: UIDs})
if err != nil {
err = errors.WithMessage(ecode.AccountGRPCError, "GET SEA PATROL FAIL")
log.Error("Call main.Account.Cards Error.Infos(%+v) error(%+v)", UIDs, err)
}
// 整理数据
for _, item := range ret {
if item != nil {
userResult[item.Mid] = item
}
}
return
}
func (d *Dao) GetUserInfos(c context.Context, uids []int64) (userResult map[int64]*api.Info, err error) {
userResult = make(map[int64]*api.Info)
if len(uids) <= 0 {
return
}
ret, err := d.accountRPC.Infos3(c, &actmdl.ArgMids{Mids: uids})
if err != nil {
err = errors.WithMessage(ecode.AccountGRPCError, "GET USER INFO FAIL")
log.Error("Call main.Account.Info3 Error.Infos(%+v) error(%+v)", uids, err)
}
userResult = ret
return
}

View File

@@ -0,0 +1,92 @@
package dao
import (
"go-common/app/interface/live/app-interface/conf"
avApi "go-common/app/service/live/av/api/liverpc"
fansMedalApi "go-common/app/service/live/fans_medal/api/liverpc"
liveDataApi "go-common/app/service/live/live_data/api/liverpc"
liveUserApi "go-common/app/service/live/live_user/api/liverpc"
rankdbApi "go-common/app/service/live/rankdb/api/liverpc"
relationApi "go-common/app/service/live/relation/api/liverpc"
roomApi "go-common/app/service/live/room/api/liverpc"
roomExApi "go-common/app/service/live/room_ex/api/liverpc"
bvcApi "go-common/app/service/live/third_api/bvc"
skyHorseApi "go-common/app/service/live/third_api/skyhorse"
userExtApi "go-common/app/service/live/userext/api/liverpc"
xuserApi "go-common/app/service/live/xuser/api/grpc/v1"
"go-common/library/net/rpc/liverpc"
)
// RoomApi liveRpc room-service api
var RoomApi *roomApi.Client
// AvApi liveRpc room-service api
var AvApi *avApi.Client
// RoomRawApi liveRpc room-service api
var RoomRawApi *liverpc.Client
// LiveUserApi liveRpc room-service api
var LiveUserApi *liveUserApi.Client
// RelationApi liveRpc room-service api
var RelationApi *relationApi.Client
// BvcApi liveRpc room-service api
var BvcApi *bvcApi.Client
// SkyHorseApi ... liveRpc room-service api
var SkyHorseApi *skyHorseApi.Client
// UserExtApi liveRpc room-service api
var UserExtApi *userExtApi.Client
// LiveDataApi liveRpc room-service api
var LiveDataApi *liveDataApi.Client
// RoomExtApi liveRpc room-service api
var RoomExtApi *roomExApi.Client
// FansMedalApi liveRpc room-service api
var FansMedalApi *fansMedalApi.Client
// RankdbApi liveRpc rankdb-service api
var RankdbApi *rankdbApi.Client
// RankdbApi liveRpc rankdb-service api
var XuserApi *xuserApi.Client
// InitAPI init all service APIs
func InitAPI() {
RoomApi = roomApi.New(getConf("room"))
AvApi = avApi.New(getConf("av"))
RoomExtApi = roomExApi.New(getConf("roomex"))
LiveUserApi = liveUserApi.New(getConf("live_user"))
RelationApi = relationApi.New(getConf("relation"))
BvcApi = bvcApi.New(conf.Conf.HttpClient, getBvcConf("host"), getBvcConf("mock"))
SkyHorseApi = skyHorseApi.New(conf.Conf.HttpClient)
RoomRawApi = liverpc.NewClient(getConf("room"))
UserExtApi = userExtApi.New(getConf("userext"))
LiveDataApi = liveDataApi.New(getConf("livedata"))
FansMedalApi = fansMedalApi.New(getConf("fansmedal"))
RankdbApi = rankdbApi.New(getConf("rankdb"))
}
func getConf(appName string) *liverpc.ClientConfig {
c := conf.Conf.LiveRpc
if c != nil {
return c[appName]
}
return nil
}
func getBvcConf(name string) string {
c := conf.Conf.Bvc
if c == nil {
return ""
}
if _, ok := c[name]; ok {
return c[name]
}
return ""
}

View File

@@ -0,0 +1,40 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"dao.go",
"pk_id.go",
],
importpath = "go-common/app/interface/live/app-interface/dao/av",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/app-interface/conf:go_default_library",
"//app/interface/live/app-interface/dao:go_default_library",
"//app/service/live/av/api/liverpc/v1:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/rpc/liverpc/context:go_default_library",
"//vendor/github.com/pkg/errors:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,32 @@
package av
import (
"context"
"go-common/app/interface/live/app-interface/conf"
)
// Dao dao
type Dao struct {
c *conf.Config
}
// New init mysql db
func New(c *conf.Config) (dao *Dao) {
dao = &Dao{
c: c,
}
return
}
// Close close the resource.
func (d *Dao) Close() {
return
}
// Ping dao ping
func (d *Dao) Ping(c context.Context) error {
// TODO: if you need use mc,redis, please add
// check
return nil
}

View File

@@ -0,0 +1,45 @@
package av
import (
"context"
"github.com/pkg/errors"
ServiceConf "go-common/app/interface/live/app-interface/conf"
"go-common/app/interface/live/app-interface/dao"
avV1 "go-common/app/service/live/av/api/liverpc/v1"
"go-common/library/ecode"
"go-common/library/log"
rpcCtx "go-common/library/net/rpc/liverpc/context"
"time"
)
// GetPkID ...
// 获取PkId信息
func (d *Dao) GetPkID(ctx context.Context, req *avV1.PkGetPkIdsByRoomIdsReq, params ServiceConf.ChunkCallInfo) (avResult *avV1.PkGetPkIdsByRoomIdsResp, err error) {
avResult = &avV1.PkGetPkIdsByRoomIdsResp{}
ret, err := dao.AvApi.V1Pk.GetPkIdsByRoomIds(rpcCtx.WithTimeout(ctx, time.Duration(params.RPCTimeout)*time.Millisecond), &avV1.PkGetPkIdsByRoomIdsReq{RoomIds: req.RoomIds, Platform: req.Platform})
if err != nil {
return
}
erelongInfo, success := ServiceConf.CheckReturn(err, ret.Code, ret.Msg, ServiceConf.GetPkIdsByRoomIds, params.RPCTimeout, params.ChunkSize, params.ChunkNum)
if !success {
if err != nil {
err = errors.WithMessage(ecode.PkIDRecordFrameWorkCallError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, req.RoomIds)
} else {
err = errors.WithMessage(ecode.PkIDLiveRPCCodeError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, req.RoomIds)
}
return
}
if ret.Data == nil || len(ret.Data) <= 0 {
erelongInfo.ErrType = ServiceConf.EmptyResultEn
erelongInfo.ErrDesc = ServiceConf.EmptyResult
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, req.RoomIds)
return
}
avResult = ret
return
}

View File

@@ -0,0 +1,32 @@
package dao
import (
"context"
"go-common/app/interface/live/app-interface/conf"
)
// Dao dao
type Dao struct {
c *conf.Config
}
// New init mysql db
func New(c *conf.Config) (dao *Dao) {
dao = &Dao{
c: c,
}
return
}
// Close close the resource.
func (d *Dao) Close() {
return
}
// Ping dao ping
func (d *Dao) Ping(c context.Context) error {
// TODO: if you need use mc,redis, please add
// check
return nil
}

View File

@@ -0,0 +1,40 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"TargetsWithMedal.go",
"dao.go",
],
importpath = "go-common/app/interface/live/app-interface/dao/fans_medal",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/app-interface/conf:go_default_library",
"//app/interface/live/app-interface/dao:go_default_library",
"//app/service/live/fans_medal/api/liverpc/v1:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/rpc/liverpc/context:go_default_library",
"//vendor/github.com/pkg/errors:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,48 @@
package fans_medal
import (
"context"
"time"
"github.com/pkg/errors"
ServiceConf "go-common/app/interface/live/app-interface/conf"
"go-common/app/interface/live/app-interface/dao"
fansMedalV1 "go-common/app/service/live/fans_medal/api/liverpc/v1"
"go-common/library/ecode"
"go-common/library/log"
rpcCtx "go-common/library/net/rpc/liverpc/context"
)
// GetFansMedal ...
// 获取粉丝勋章佩戴信息
func (d *Dao) GetFansMedal(ctx context.Context, req *fansMedalV1.FansMedalTargetsWithMedalReq, params ServiceConf.ChunkCallInfo) (fansResult *fansMedalV1.FansMedalTargetsWithMedalResp, err error) {
fansResult = &fansMedalV1.FansMedalTargetsWithMedalResp{}
ret, err := dao.FansMedalApi.V1FansMedal.TargetsWithMedal(rpcCtx.WithTimeout(ctx, time.Duration(params.RPCTimeout)*time.Millisecond),
&fansMedalV1.FansMedalTargetsWithMedalReq{Uid: req.Uid, TargetIds: req.TargetIds})
if err != nil {
return
}
erelongInfo, success := ServiceConf.CheckReturn(err, ret.Code, ret.Msg, ServiceConf.TargetsWithMedal, params.RPCTimeout, params.ChunkSize, params.ChunkNum)
if !success {
if err != nil {
err = errors.WithMessage(ecode.FansMedalFrameWorkCallError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, req.TargetIds)
} else {
err = errors.WithMessage(ecode.FansMedalLiveRPCCodeError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, req.TargetIds)
}
return
}
if ret.Data == nil || len(ret.Data) <= 0 {
erelongInfo.ErrType = ServiceConf.EmptyResultEn
erelongInfo.ErrDesc = ServiceConf.EmptyResult
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, req.TargetIds)
return
}
fansResult = ret
return
}

View File

@@ -0,0 +1,32 @@
package fans_medal
import (
"context"
"go-common/app/interface/live/app-interface/conf"
)
// Dao dao
type Dao struct {
c *conf.Config
}
// New init mysql db
func New(c *conf.Config) (dao *Dao) {
dao = &Dao{
c: c,
}
return
}
// Close close the resource.
func (d *Dao) Close() {
return
}
// Ping dao ping
func (d *Dao) Ping(c context.Context) error {
// TODO: if you need use mc,redis, please add
// check
return nil
}

View File

@@ -0,0 +1,40 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"dao.go",
"record.go",
],
importpath = "go-common/app/interface/live/app-interface/dao/live_data",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/app-interface/conf:go_default_library",
"//app/interface/live/app-interface/dao:go_default_library",
"//app/service/live/live_data/api/liverpc/v1:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/rpc/liverpc/context:go_default_library",
"//vendor/github.com/pkg/errors:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,32 @@
package live_data
import (
"context"
"go-common/app/interface/live/app-interface/conf"
)
// Dao dao
type Dao struct {
c *conf.Config
}
// New init mysql db
func New(c *conf.Config) (dao *Dao) {
dao = &Dao{
c: c,
}
return
}
// Close close the resource.
func (d *Dao) Close() {
return
}
// Ping dao ping
func (d *Dao) Ping(c context.Context) error {
// TODO: if you need use mc,redis, please add
// check
return nil
}

View File

@@ -0,0 +1,48 @@
package live_data
import (
"context"
"time"
"github.com/pkg/errors"
ServiceConf "go-common/app/interface/live/app-interface/conf"
"go-common/app/interface/live/app-interface/dao"
liveDataV1 "go-common/app/service/live/live_data/api/liverpc/v1"
"go-common/library/ecode"
"go-common/library/log"
rpcCtx "go-common/library/net/rpc/liverpc/context"
)
// GetLastLiveTime ...
// 获取Record信息
func (d *Dao) GetLastLiveTime(ctx context.Context, req *liveDataV1.RecordGetReq, params ServiceConf.ChunkCallInfo) (resp map[string]*liveDataV1.RecordGetResp_TimeInfo, err error) {
resp = make(map[string]*liveDataV1.RecordGetResp_TimeInfo)
ret, err := dao.LiveDataApi.V1Record.Get(rpcCtx.WithTimeout(ctx, time.Duration(params.RPCTimeout)*time.Millisecond),
&liveDataV1.RecordGetReq{Roomids: req.Roomids})
if err != nil {
return
}
erelongInfo, success := ServiceConf.CheckReturn(err, ret.Code, ret.Msg, ServiceConf.Record, params.RPCTimeout, params.ChunkSize, params.ChunkNum)
if !success {
if err != nil {
err = errors.WithMessage(ecode.RecordRecordFrameWorkCallError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, req.Roomids)
} else {
err = errors.WithMessage(ecode.RecordLiveRPCCodeError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, req.Roomids)
}
return
}
if ret.Data == nil || len(ret.Data) <= 0 {
erelongInfo.ErrType = ServiceConf.EmptyResultEn
erelongInfo.ErrDesc = ServiceConf.EmptyResult
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, req.Roomids)
return
}
resp = ret.Data
return
}

View File

@@ -0,0 +1,41 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"dahanghai.go",
"dao.go",
"get_tag.go",
],
importpath = "go-common/app/interface/live/app-interface/dao/live_user",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/app-interface/conf:go_default_library",
"//app/interface/live/app-interface/dao:go_default_library",
"//app/service/live/live_user/api/liverpc/v1:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/rpc/liverpc/context:go_default_library",
"//vendor/github.com/pkg/errors:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,40 @@
package live_user
import (
"context"
"fmt"
"github.com/pkg/errors"
"go-common/app/interface/live/app-interface/conf"
cDao "go-common/app/interface/live/app-interface/dao"
liveUserV1 "go-common/app/service/live/live_user/api/liverpc/v1"
"go-common/library/ecode"
"go-common/library/log"
rpcCtx "go-common/library/net/rpc/liverpc/context"
"time"
)
func (d *Dao) GetDaHangHai(ctx context.Context, req *liveUserV1.NoteGetReq) (rep *liveUserV1.NoteGetResp_Data, err error) {
// TODO 添加DaHangHai超时配置
getTagTimeout := time.Duration(conf.GetTimeout("DaHangHai", 50)) * time.Millisecond
dahanghai, err := cDao.LiveUserApi.V1Note.Get(rpcCtx.WithTimeout(ctx, getTagTimeout), req)
rep = &liveUserV1.NoteGetResp_Data{}
if err != nil {
log.Error("[GetDaHangHai]live_user.v1.note.get rpc error:%+v", err)
err = errors.WithMessage(ecode.UserDHHRPCError, fmt.Sprintf("live_user.v1.note.get rpc error:%+v", err))
return
}
if dahanghai.Code != 0 {
log.Error("[GetDaHangHai]live_user.v1.note response error:%+v,code:%d,msg:%s", err, dahanghai.Code, dahanghai.Msg)
err = errors.WithMessage(ecode.UserDHHReturnError, fmt.Sprintf("live_user.v1.note response error,code:%d,msg:%s", dahanghai.Code, dahanghai.Msg))
return
}
if dahanghai.Data == nil {
log.Error("[GetUserTagList]live_user.v1.note empty error")
err = errors.WithMessage(ecode.UserDHHDataNil, "live_user.v1.note empty error")
return
}
rep = dahanghai.Data
return
}

View File

@@ -0,0 +1,32 @@
package live_user
import (
"context"
"go-common/app/interface/live/app-interface/conf"
)
// Dao dao
type Dao struct {
c *conf.Config
}
// New init mysql db
func New(c *conf.Config) (dao *Dao) {
dao = &Dao{
c: c,
}
return
}
// Close close the resource.
func (d *Dao) Close() {
return
}
// Ping dao ping
func (d *Dao) Ping(c context.Context) error {
// TODO: if you need use mc,redis, please add
// check
return nil
}

View File

@@ -0,0 +1,44 @@
package live_user
import (
"context"
"fmt"
"github.com/pkg/errors"
"go-common/app/interface/live/app-interface/conf"
cDao "go-common/app/interface/live/app-interface/dao"
liveUserV1 "go-common/app/service/live/live_user/api/liverpc/v1"
"go-common/library/ecode"
"go-common/library/log"
rpcCtx "go-common/library/net/rpc/liverpc/context"
"time"
)
func (d *Dao) GetUserTagList(ctx context.Context, req *liveUserV1.UserSettingGetTagReq) (rep *liveUserV1.UserSettingGetTagResp_Data, err error) {
getTagTimeout := time.Duration(conf.GetTimeout("getMyTag", 50)) * time.Millisecond
var tagListRep *liveUserV1.UserSettingGetTagResp
tagListRep, err = cDao.LiveUserApi.V1UserSetting.GetTag(rpcCtx.WithTimeout(ctx, getTagTimeout), req)
rep = &liveUserV1.UserSettingGetTagResp_Data{}
if err != nil {
log.Error("[GetUserTagList]live_user.v1.getTag rpc error:%+v", err)
// 这个是推荐房间列表的基础信息如果失败需要cancel不然返回值会很奇怪
err = errors.WithMessage(ecode.UserTagRPCError, fmt.Sprintf("live_user.v1.getTag rpc error:%+v", err))
return
}
if tagListRep.Code != 0 {
log.Error("[GetUserTagList]live_user.v1.getTag response error:%+v,code:%d,msg:%s", err, tagListRep.Code, tagListRep.Msg)
// 这个是推荐房间列表的基础信息如果失败需要cancel不然返回值会很奇怪
err = errors.WithMessage(ecode.UserTagReturnError, fmt.Sprintf("live_user.v1.getTag response error,code:%d,msg:%s", tagListRep.Code, tagListRep.Msg))
return
}
if tagListRep.Data == nil {
log.Error("[GetUserTagList]live_user.v1.getTag empty error")
// 这个是推荐房间列表的基础信息如果失败需要cancel不然返回值会很奇怪
err = errors.WithMessage(ecode.UserTagReturnError, "live_user.v1.getTag empty error")
return
}
rep = tagListRep.Data
return
}

View File

@@ -0,0 +1,41 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"api.go",
"dao.go",
],
importpath = "go-common/app/interface/live/app-interface/dao/rankdb",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/app-interface/conf:go_default_library",
"//app/interface/live/app-interface/dao:go_default_library",
"//app/service/live/rankdb/api/liverpc/v1:go_default_library",
"//app/service/main/account/model:go_default_library",
"//app/service/main/account/rpc/client:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//vendor/github.com/pkg/errors:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,60 @@
package rankdb
import (
"context"
"github.com/pkg/errors"
"go-common/app/interface/live/app-interface/dao"
"go-common/app/service/live/rankdb/api/liverpc/v1"
accountM "go-common/app/service/main/account/model"
actmdl "go-common/app/service/main/account/model"
"go-common/library/ecode"
"go-common/library/log"
"time"
)
// GetUserInfoData ...
// 调用account grpc接口cards获取用户信息
func (d *Dao) GetUserInfoData(c context.Context, UIDs []int64) (userResult map[int64]*accountM.Card, err error) {
userResult = make(map[int64]*accountM.Card)
lens := len(UIDs)
if lens <= 0 {
return
}
ret, err := d.accountRPC.Cards3(c, &actmdl.ArgMids{Mids: UIDs})
if err != nil {
err = errors.WithMessage(ecode.AccountGRPCError, "GET SEA PATROL FAIL")
log.Error("Call main.Account.Cards Error.Infos(%+v) error(%+v)", UIDs, err)
}
// 整理数据
for _, item := range ret {
if item != nil {
userResult[item.Mid] = item
}
}
return
}
// GetLastHourTop3 ...
// 获取小时榜前三
func (d *Dao) GetLastHourTop3(c context.Context) (uids []int64, err error) {
uids = make([]int64, 0)
lastHour := time.Now().Add(-time.Hour).Format("06010215")
req := &v1.Rank2018GetHourRankReq{
AreaV2ParentId: 0,
AreaV2Id: 0,
Hour: lastHour,
// rankDB begin from 0
Top: 2,
}
resp, err := dao.RankdbApi.V1Rank2018.GetHourRank(c, req)
if err != nil || resp.Data == nil {
log.Error("[app-interface][rankDbItem] liveRpc call rankDb failed")
return
}
if 0 != resp.Code || 0 == len(resp.Data) {
log.Error("[app-interface][rankDbItem] liveRpc call rankDb return error, code:%d, msg:%s", resp.Code, resp.Data)
return
}
uids = resp.Data
return
}

View File

@@ -0,0 +1,33 @@
package rankdb
import (
"context"
"go-common/app/interface/live/app-interface/conf"
account "go-common/app/service/main/account/rpc/client"
)
// Dao dao
type Dao struct {
c *conf.Config
accountRPC *account.Service3
}
// New init mysql db
func New(c *conf.Config) (dao *Dao) {
dao = &Dao{
c: c,
accountRPC: account.New3(nil),
}
return
}
// Close close the resource.
func (d *Dao) Close() {
}
// Ping dao ping
func (d *Dao) Ping(c context.Context) error {
// TODO: if you need use mc,redis, please add
// check
return nil
}

View File

@@ -0,0 +1,41 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"BaseInfo.go",
"Feed.go",
"dao.go",
],
importpath = "go-common/app/interface/live/app-interface/dao/relation",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/app-interface/conf:go_default_library",
"//app/interface/live/app-interface/dao:go_default_library",
"//app/service/live/relation/api/liverpc/v1:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/rpc/liverpc/context:go_default_library",
"//vendor/github.com/pkg/errors:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,59 @@
package relation
import (
"context"
"github.com/pkg/errors"
ServiceConf "go-common/app/interface/live/app-interface/conf"
"go-common/app/interface/live/app-interface/dao"
relationV1 "go-common/app/service/live/relation/api/liverpc/v1"
"go-common/library/ecode"
"go-common/library/log"
rpcCtx "go-common/library/net/rpc/liverpc/context"
"time"
)
// GetGiftInfo 获取给我关注的人送礼(金瓜子)信息
func (d *Dao) GetGiftInfo(ctx context.Context, params ServiceConf.ChunkCallInfo) (giftInfo map[int64]int64, err error) {
relationParams := &relationV1.BaseInfoGetGiftInfoReq{}
ret, err := dao.RelationApi.V1BaseInfo.GetGiftInfo(rpcCtx.WithTimeout(ctx, time.Duration(params.RPCTimeout)*time.Millisecond), relationParams)
if err != nil {
return
}
erelongInfo, success := ServiceConf.CheckReturn(err, ret.Code, ret.Msg, "gift", params.RPCTimeout, params.ChunkSize, params.ChunkNum)
if !success {
if err != nil {
err = errors.WithMessage(ecode.PkIDRecordFrameWorkCallError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName)
} else {
err = errors.WithMessage(ecode.PkIDLiveRPCCodeError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName)
}
return giftInfo, nil
}
if ret.Data == nil || len(ret.Data) < 0 {
erelongInfo.ErrType = ServiceConf.EmptyResultEn
erelongInfo.ErrDesc = ServiceConf.EmptyResult
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d",
erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName)
return giftInfo, nil
}
for _, v := range ret.Data {
giftInfo[v.Mid] = v.Gold
}
return
}
// GetAttentionListGroupBy 获取分组的关注列表
func (d *Dao) GetAttentionListGroupBy(ctx context.Context, params ServiceConf.ChunkCallInfo) (relationInfo map[int64]*relationV1.BaseInfoGetFollowTypeResp_UidInfo, attentionErr error) {
attentionData, attentionErr := dao.RelationApi.V1BaseInfo.GetFollowType(
rpcCtx.WithTimeout(ctx, time.Duration(params.RPCTimeout)*time.Millisecond),
&relationV1.BaseInfoGetFollowTypeReq{})
if attentionErr != nil || attentionData == nil {
attentionErr = ecode.AttentionListRPCError
return
}
relationInfo = attentionData.Data
return
}

View File

@@ -0,0 +1 @@
package relation

View File

@@ -0,0 +1,33 @@
package relation
import (
"context"
"go-common/app/interface/live/app-interface/conf"
)
// Dao dao
type Dao struct {
c *conf.Config
}
// New init mysql db
func New(c *conf.Config) (dao *Dao) {
dao = &Dao{
c: c,
}
return
}
// Close close the resource.
func (d *Dao) Close() {
return
}
// Ping dao ping
func (d *Dao) Ping(c context.Context) error {
// TODO: if you need use mc,redis, please add
// check
return nil
}

View File

@@ -0,0 +1,47 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"app.go",
"appIndex.go",
"dao.go",
"info.go",
"pendant.go",
"recommend.go",
"status.go",
"uid2roomid.go",
],
importpath = "go-common/app/interface/live/app-interface/dao/room",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/app-interface/conf:go_default_library",
"//app/interface/live/app-interface/dao:go_default_library",
"//app/service/live/room/api/liverpc/v1:go_default_library",
"//app/service/live/room/api/liverpc/v2:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/rpc/liverpc/context:go_default_library",
"//vendor/github.com/pkg/errors:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,123 @@
package room
import (
"context"
"time"
"github.com/pkg/errors"
"go-common/app/interface/live/app-interface/conf"
cDao "go-common/app/interface/live/app-interface/dao"
roomV2 "go-common/app/service/live/room/api/liverpc/v2"
"go-common/library/log"
rpcCtx "go-common/library/net/rpc/liverpc/context"
)
// 根据moduleId查common房间列表
func (d *Dao) GetListByIds(ctx context.Context, moduleIds []int64) (respModuleList map[int64]*roomV2.AppIndexGetRoomListByIdsResp_RoomList, err error) {
getModuleListByIdsTimeOut := time.Duration(conf.GetTimeout("getModuleListByIds", 100)) * time.Millisecond
moduleList, err := cDao.RoomApi.V2AppIndex.GetRoomListByIds(rpcCtx.WithTimeout(ctx, getModuleListByIdsTimeOut), &roomV2.AppIndexGetRoomListByIdsReq{
Ids: moduleIds,
})
if err != nil {
log.Error("[GetListByIds]get all module ids rpc error, room.v1.AppIndex.GetModuleIds, error:%+v", err)
err = errors.New("GET Module List Rpc error")
return
}
if moduleList.Code != 0 || moduleList.Data == nil {
log.Error("[GetListByIds]get all module ids return data error, code, %d, msg: %s", moduleList.Code, moduleList.Msg)
err = errors.New("GET Module List return error")
return
}
if len(moduleList.Data) <= 0 {
log.Error("[GetListByIds]get all module ids empty error")
err = errors.New("GET Module List empty error")
return
}
respModuleList = moduleList.Data
return
}
// 获取所有模块基础信息
func (d *Dao) GetAllModuleInfo(ctx context.Context, moduleId int64) (moduleInfoList []*roomV2.AppIndexGetBaseMInfoListResp_ModuleInfo, err error) {
moduleInfoList = make([]*roomV2.AppIndexGetBaseMInfoListResp_ModuleInfo, 0)
param := &roomV2.AppIndexGetBaseMInfoListReq{}
if moduleId != 0 {
param.ModuleId = moduleId
}
moduleInfoListOut, err := cDao.RoomApi.V2AppIndex.GetBaseMInfoList(ctx, param)
if err != nil {
log.Error("[GetAllModuleInfo]RoomApi.V2AppIndex.GetBaseMInfoList rpc error, RoomApi.V2AppIndex.GetBaseMInfoList, error:%+v", err)
err = errors.New("RoomApi.V2AppIndex.GetBaseMInfoList rpc error")
return
}
if moduleInfoListOut.Code != 0 || moduleInfoListOut.Data == nil || len(moduleInfoListOut.Data) <= 0 {
log.Error("[GetAllModuleInfo]RoomApi.V2AppIndex.GetBaseMInfoList return data error, code, %d, msg: %s, error:%+v", moduleInfoListOut.Code, moduleInfoListOut.Msg, err)
err = errors.New("RoomApi.V2AppIndex.GetBaseMInfoList return data error")
return
}
moduleInfoList = moduleInfoListOut.Data
return
}
// 根据模块id获取分区入口信息
func (d *Dao) GetAreaEntrance(ctx context.Context, ids []int64) (result map[int64]*roomV2.AppIndexGetPicListByIdsResp_ItemList, err error) {
result = make(map[int64]*roomV2.AppIndexGetPicListByIdsResp_ItemList, 0)
areaEntranceOut, err := cDao.RoomApi.V2AppIndex.GetPicListByIds(ctx, &roomV2.AppIndexGetPicListByIdsReq{Ids: ids})
if err != nil {
log.Error("[GetAreaEntrance]RoomApi.V2AppIndex.GetPicListByIds rpc error:%+v", err)
err = errors.New("RoomApi.V2AppIndex.GetPicListByIds rpc error")
return
}
if areaEntranceOut.Code != 0 || areaEntranceOut.Data == nil {
log.Error("[GetAreaEntrance]RoomApi.V2AppIndex.GetPicListByIds return data error, code, %d, msg: %s, error:%+v", areaEntranceOut.Code, areaEntranceOut.Msg, err)
err = errors.New("RoomApi.V2AppIndex.GetPicListByIds return data error")
return
}
result = areaEntranceOut.Data
return
}
// 根据分区ids获取房间列表
func (d *Dao) GetMultiRoomList(ctx context.Context, areaIds string, platform string) (result map[int64][]*roomV2.AppIndexGetMultiRoomListResp_RoomList, err error) {
result = make(map[int64][]*roomV2.AppIndexGetMultiRoomListResp_RoomList)
multiRoomListOut, err := cDao.RoomApi.V2AppIndex.GetMultiRoomList(ctx, &roomV2.AppIndexGetMultiRoomListReq{
AreaIds: areaIds,
Platform: platform,
})
if err != nil {
log.Error("[GetMultiRoomList]RoomApi.V2AppIndex.GetMultiRoomList rpc error:%+v", err)
err = errors.New("RoomApi.V2AppIndex.GetMultiRoomList rpc error")
return
}
if multiRoomListOut.Code != 0 || multiRoomListOut.Data == nil {
log.Error("[GetMultiRoomList]RoomApi.V2AppIndex.GetMultiRoomList return data error, code, %d, msg: %s", multiRoomListOut.Code, multiRoomListOut.Msg)
err = errors.New("RoomApi.V2AppIndex.GetMultiRoomList return data error")
return
}
if len(multiRoomListOut.Data) <= 0 {
log.Error("[GetMultiRoomList]RoomApi.V2AppIndex.GetMultiRoomList empty error")
err = errors.New("RoomApi.V2AppIndex.GetMultiRoomList empty error")
return
}
for _, item := range multiRoomListOut.Data {
if item != nil {
result[item.Id] = item.List
}
}
return
}

View File

@@ -0,0 +1,37 @@
package room
import (
"context"
"errors"
"time"
"go-common/app/interface/live/app-interface/conf"
cDao "go-common/app/interface/live/app-interface/dao"
roomV2 "go-common/app/service/live/room/api/liverpc/v2"
"go-common/library/log"
rpcCtx "go-common/library/net/rpc/liverpc/context"
)
func (d *Dao) GetActivityCard(ctx context.Context, ids []int64, logPrefix string) (err error, data map[int64]*roomV2.AppIndexGetActivityCardResp_ActivityCard) {
activityQueryTimeout := time.Duration(conf.GetTimeout("activityQuery", 100)) * time.Millisecond
cardInfo, roomError := cDao.RoomApi.V2AppIndex.GetActivityCard(rpcCtx.WithTimeout(ctx, activityQueryTimeout), &roomV2.AppIndexGetActivityCardReq{Ids: ids})
if roomError != nil {
log.Error("[%s] get activity card info rpc error, room.v2.AppIndex.GetActivityCard, error:%+v", logPrefix, roomError)
err = errors.New("get activity card info rpc error")
return
}
if cardInfo.Code != 0 {
log.Error("[%s] get activity card info response error, code, %d, msg: %s", logPrefix, cardInfo.Code, cardInfo.Msg)
err = errors.New("get activity card info response error")
return
}
if cardInfo.Data.ActivityCard == nil {
log.Error("[%s] get activity card info but on data", logPrefix)
err = errors.New("get activity card info but no data")
return
}
data = cardInfo.Data.ActivityCard
return
}

View File

@@ -0,0 +1,32 @@
package room
import (
"context"
"go-common/app/interface/live/app-interface/conf"
)
// Dao dao
type Dao struct {
c *conf.Config
}
// New init mysql db
func New(c *conf.Config) (dao *Dao) {
dao = &Dao{
c: c,
}
return
}
// Close close the resource.
func (d *Dao) Close() {
return
}
// Ping dao ping
func (d *Dao) Ping(c context.Context) error {
// TODO: if you need use mc,redis, please add
// check
return nil
}

View File

@@ -0,0 +1,52 @@
package room
import (
"context"
"fmt"
"time"
"github.com/pkg/errors"
"go-common/app/interface/live/app-interface/conf"
cDao "go-common/app/interface/live/app-interface/dao"
roomV2 "go-common/app/service/live/room/api/liverpc/v2"
"go-common/library/ecode"
"go-common/library/log"
rpcCtx "go-common/library/net/rpc/liverpc/context"
)
// GetRoomInfoByIds
func (d *Dao) GetRoomInfoByIds(ctx context.Context, roomIds []int64, fields []string, from string) (multiRoomListResp map[int64]*roomV2.RoomGetByIdsResp_RoomInfo, err error) {
multiRoomListResp = make(map[int64]*roomV2.RoomGetByIdsResp_RoomInfo)
getByIdsTimeout := time.Duration(conf.GetTimeout("getByIds", 100)) * time.Millisecond
multiRoomList, getByIdsError := cDao.RoomApi.V2Room.GetByIds(rpcCtx.WithTimeout(ctx, getByIdsTimeout), &roomV2.RoomGetByIdsReq{
Ids: roomIds,
NeedBroadcastType: 1,
NeedUinfo: 1,
Fields: fields,
From: from,
})
if getByIdsError != nil {
log.Error("[GetRoomInfoByIds]room.v2.getByIds rpc error:%+v", getByIdsError)
// 这个是推荐房间列表的基础信息如果失败需要cancel不然返回值会很奇怪
err = errors.WithMessage(ecode.GetRoomError, fmt.Sprintf("room.v2.getByIds rpc error:%+v", getByIdsError))
return
}
if multiRoomList.Code != 0 {
log.Error("[GetRoomInfoByIds]room.v2.getByIds response error,code:%d,msg:%s", multiRoomList.Code, multiRoomList.Msg)
// 这个是推荐房间列表的基础信息如果失败需要cancel不然返回值会很奇怪
err = errors.WithMessage(ecode.GetRoomError, fmt.Sprintf("room.v2.getByIds response error,code:%d,msg:%s", multiRoomList.Code, multiRoomList.Msg))
return
}
if multiRoomList.Data == nil {
log.Error("[GetRoomInfoByIds]room.v2.getByIds empty error")
// 这个是推荐房间列表的基础信息如果失败需要cancel不然返回值会很奇怪
err = errors.WithMessage(ecode.GetRoomEmptyError, "room.v2.getByIds empty error")
return
}
multiRoomListResp = multiRoomList.Data
return
}

View File

@@ -0,0 +1,77 @@
package room
import (
"context"
"fmt"
"time"
"github.com/pkg/errors"
"go-common/app/interface/live/app-interface/conf"
ServiceConf "go-common/app/interface/live/app-interface/conf"
cDao "go-common/app/interface/live/app-interface/dao"
roomV1 "go-common/app/service/live/room/api/liverpc/v1"
"go-common/library/ecode"
"go-common/library/log"
rpcCtx "go-common/library/net/rpc/liverpc/context"
)
// GetRoomPendant
func (d *Dao) GetRoomPendant(ctx context.Context, roomIds []int64, pendantType string, position int64) (pendantRoomListResp map[int64]*roomV1.RoomPendantGetPendantByIdsResp_Result, err error) {
pendantRoomListResp = make(map[int64]*roomV1.RoomPendantGetPendantByIdsResp_Result)
getPendantByIdsTimeout := time.Duration(conf.GetTimeout("getPendantByIds", 50)) * time.Millisecond
pendantRoomList, err := cDao.RoomApi.V1RoomPendant.GetPendantByIds(rpcCtx.WithTimeout(ctx, getPendantByIdsTimeout), &roomV1.RoomPendantGetPendantByIdsReq{
Ids: roomIds,
Type: pendantType,
Position: position, // 历史原因,取右上,但客户端展示在左上
})
if err != nil {
log.Error("[GetRoomPendant]room.v1.getPendantByIds rpc error:%+v", err)
err = errors.WithMessage(ecode.RoomPendantError, fmt.Sprintf("room.v1.getPendantByIds rpc error:%+v", err))
return
}
if pendantRoomList.Code != 0 {
log.Error("[GetRoomPendant]room.v1.getPendantByIds response code:%d,msg:%s", pendantRoomList.Code, pendantRoomList.Msg)
err = errors.WithMessage(ecode.RoomPendantReturnError, fmt.Sprintf("room.v1.getPendantByIds response error, code:%d, msg:%s", pendantRoomList.Code, pendantRoomList.Msg))
return
}
if pendantRoomList.Data == nil || pendantRoomList.Data.Result == nil {
log.Error("[GetRoomPendant]room.v1.getPendantByIds empty error")
err = errors.WithMessage(ecode.RoomPendantReturnError, "")
return
}
pendantRoomListResp = pendantRoomList.Data.Result
return
}
// GetRoomPendantInfo ...
// 获取角标信息
func (d *Dao) GetRoomPendantInfo(ctx context.Context, req *roomV1.RoomPendantGetPendantByIdsReq, params ServiceConf.ChunkCallInfo) (roomNewsResult *roomV1.RoomPendantGetPendantByIdsResp, err error) {
ret, err := cDao.RoomApi.V1RoomPendant.GetPendantByIds(rpcCtx.WithTimeout(ctx, time.Duration(params.RPCTimeout)*time.Millisecond), &roomV1.RoomPendantGetPendantByIdsReq{Ids: req.Ids, Type: req.Type, Position: req.Position})
if err != nil {
return
}
erelongInfo, success := ServiceConf.CheckReturn(err, ret.Code, ret.Msg, ServiceConf.RoomPendent, params.RPCTimeout, params.ChunkSize, params.ChunkNum)
if !success {
if err != nil {
err = errors.WithMessage(ecode.PkIDRecordFrameWorkCallError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, req.Ids)
} else {
err = errors.WithMessage(ecode.PkIDLiveRPCCodeError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, req.Ids)
}
return nil, err
}
if ret.Data == nil {
erelongInfo.ErrType = ServiceConf.EmptyResultEn
erelongInfo.ErrDesc = ServiceConf.EmptyResult
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, req.Ids)
return nil, err
}
roomNewsResult = ret
return
}

View File

@@ -0,0 +1,43 @@
package room
import (
"context"
"fmt"
"time"
"github.com/pkg/errors"
"go-common/app/interface/live/app-interface/conf"
cDao "go-common/app/interface/live/app-interface/dao"
roomV1 "go-common/app/service/live/room/api/liverpc/v1"
"go-common/library/log"
rpcCtx "go-common/library/net/rpc/liverpc/context"
)
// 获取首页推荐强推列表
func (d *Dao) GetStrongRecList(ctx context.Context, recPage int64) (strongRecRoomListResp *roomV1.RoomRecommendClientRecStrongResp, err error) {
strongRecRoomListResp = &roomV1.RoomRecommendClientRecStrongResp{}
clientRecStrongTimeout := time.Duration(conf.GetTimeout("clientRecStrong", 100)) * time.Millisecond
strongRecRoomList, err := cDao.RoomApi.V1RoomRecommend.ClientRecStrong(rpcCtx.WithTimeout(ctx, clientRecStrongTimeout), &roomV1.RoomRecommendClientRecStrongReq{
RecPage: recPage,
})
if err != nil {
log.Error("[GetStrongRecList]room.v1.clientStrongRec rpc error:%+v", err)
err = errors.New(fmt.Sprintf("room.v1.clientStrongRec rpc error:%+v", err))
return
}
if strongRecRoomList.Code != 0 {
log.Error("[GetStrongRecList]room.v1.getPendantByIds response code:%d,msg:%s", strongRecRoomList.Code, strongRecRoomList.Msg)
err = errors.New(fmt.Sprintf("room.v1.getPendantByIds response error, code:%d, msg:%s", strongRecRoomList.Code, strongRecRoomList.Msg))
return
}
if strongRecRoomList.Data == nil || strongRecRoomList.Data.Result == nil {
log.Error("[GetStrongRecList]room.v1.getPendantByIds empty")
err = errors.New("[getSkyHorseRoomList]room.v1.getPendantByIds empty")
return
}
strongRecRoomListResp = strongRecRoomList
return
}

View File

@@ -0,0 +1,47 @@
package room
import (
"context"
"github.com/pkg/errors"
ServiceConf "go-common/app/interface/live/app-interface/conf"
"go-common/app/interface/live/app-interface/dao"
roomV1 "go-common/app/service/live/room/api/liverpc/v1"
"go-common/library/ecode"
"go-common/library/log"
rpcCtx "go-common/library/net/rpc/liverpc/context"
"time"
)
// GetRoomInfo ...
// 获取room信息
func (d *Dao) GetRoomInfo(ctx context.Context, req *roomV1.RoomGetStatusInfoByUidsReq, params ServiceConf.ChunkCallInfo) (resp *roomV1.RoomGetStatusInfoByUidsResp, err error) {
// ret, err := dao.FansMedalApi.V1FansMedal.TargetsWithMedal(rpcCtx.WithTimeout(ctx, time.Duration(params.RPCTimeout)*time.Millisecond),
resp = &roomV1.RoomGetStatusInfoByUidsResp{}
ret, err := dao.RoomApi.V1Room.GetStatusInfoByUids(rpcCtx.WithTimeout(ctx, time.Duration(params.RPCTimeout)*time.Millisecond),
&roomV1.RoomGetStatusInfoByUidsReq{Uids: req.Uids, FilterOffline: req.FilterOffline, NeedBroadcastType: req.NeedBroadcastType})
if err != nil {
return
}
erelongInfo, success := ServiceConf.CheckReturn(err, ret.Code, ret.Msg, ServiceConf.GetStatusInfoByUfos, params.RPCTimeout, params.ChunkSize, params.ChunkNum)
if !success {
if err != nil {
err = errors.WithMessage(ecode.RoomGetStatusInfoRPCError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, req.Uids)
} else {
err = errors.WithMessage(ecode.RoomGetStatusInfoRPCError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, req.Uids)
}
return
}
if ret.Data == nil || len(ret.Data) <= 0 {
erelongInfo.ErrType = ServiceConf.EmptyResultEn
erelongInfo.ErrDesc = ServiceConf.EmptyResult
// log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
// erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, req.Uids)
return
}
resp = ret
return
}

View File

@@ -0,0 +1,39 @@
package room
import (
"context"
"github.com/pkg/errors"
ServiceConf "go-common/app/interface/live/app-interface/conf"
"go-common/app/interface/live/app-interface/dao"
roomV2 "go-common/app/service/live/room/api/liverpc/v2"
"go-common/library/ecode"
"go-common/library/log"
rpcCtx "go-common/library/net/rpc/liverpc/context"
"time"
)
// UIDs2roomIDs ...
// uid转换roomID,每批最大400
func (d *Dao) UIDs2roomIDs(ctx context.Context, req *roomV2.RoomRoomIdByUidMultiReq, params ServiceConf.ChunkCallInfo) (ret *roomV2.RoomRoomIdByUidMultiResp, err error) {
ret, err = dao.RoomApi.V2Room.RoomIdByUidMulti(rpcCtx.WithTimeout(ctx, time.Duration(params.RPCTimeout)*time.Millisecond), &roomV2.RoomRoomIdByUidMultiReq{Uids: req.Uids})
if err != nil {
return
}
erelongInfo, success := ServiceConf.CheckReturn(err, ret.Code, ret.Msg, ServiceConf.GetRoomID, params.RPCTimeout, params.ChunkSize, params.ChunkNum)
if !success {
if err != nil {
err = errors.WithMessage(ecode.FansMedalFrameWorkCallError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, req.Uids)
}
return
}
if ret.Data == nil || len(ret.Data) <= 0 {
erelongInfo.ErrType = ServiceConf.EmptyResultEn
erelongInfo.ErrDesc = ServiceConf.EmptyResult
// log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
// erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, req.Uids)
return
}
return
}

View File

@@ -0,0 +1,41 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"banner.go",
"dao.go",
"news.go",
],
importpath = "go-common/app/interface/live/app-interface/dao/room_ex",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/app-interface/conf:go_default_library",
"//app/interface/live/app-interface/dao:go_default_library",
"//app/service/live/room_ex/api/liverpc/v1:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/rpc/liverpc/context:go_default_library",
"//vendor/github.com/pkg/errors:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,45 @@
package room_ex
import (
"context"
"fmt"
"github.com/pkg/errors"
"go-common/app/interface/live/app-interface/conf"
cDao "go-common/app/interface/live/app-interface/dao"
roomEx "go-common/app/service/live/room_ex/api/liverpc/v1"
"go-common/library/ecode"
"go-common/library/log"
rpcCtx "go-common/library/net/rpc/liverpc/context"
"time"
)
func (d *Dao) GetBanner(ctx context.Context, biz int64, position int64, platform string, device string, build int64) (bannerListResp []*roomEx.BannerGetNewBannerResp_NewBanner, err error) {
timeOut := time.Duration(conf.GetTimeout("/room_ex/v1/Banner/getNewBanner", 50)) * time.Millisecond
bannerListResult, errCode := cDao.RoomExtApi.V1Banner.GetNewBanner(rpcCtx.WithTimeout(ctx, timeOut), &roomEx.BannerGetNewBannerReq{
Platform: biz,
Position: position,
UserPlatform: platform,
UserDevice: device,
Build: build,
})
if errCode != nil {
log.Error("[getBannerFromRoomEx]roomEx.v1.getNewBanner rpc error:%+v", errCode)
err = errors.WithMessage(ecode.GetBannerErr, fmt.Sprintf("roomEx.v1.getNewBanner rpc error:%+v", errCode))
return
}
if bannerListResult.Code != 0 {
log.Error("[getBannerFromRoomEx]roomEx.v1.getNewBanner response error:%+v,code:%d,msg:%s", errCode, bannerListResult.Code, bannerListResult.Msg)
err = errors.WithMessage(ecode.GetBannerErr, fmt.Sprintf("roomEx.v1.getNewBanner response error,code:%d,msg:%s", bannerListResult.Code, bannerListResult.Msg))
return
}
if bannerListResult.Data == nil {
log.Error("[getBannerFromRoomEx]roomEx.v1.getNewBanner empty error")
err = errors.WithMessage(ecode.GetBannerErr, "roomEx.v1.getNewBanner empty error")
return
}
bannerListResp = bannerListResult.Data
return
}

View File

@@ -0,0 +1,32 @@
package room_ex
import (
"context"
"go-common/app/interface/live/app-interface/conf"
)
// Dao dao
type Dao struct {
c *conf.Config
}
// New init mysql db
func New(c *conf.Config) (dao *Dao) {
dao = &Dao{
c: c,
}
return
}
// Close close the resource.
func (d *Dao) Close() {
return
}
// Ping dao ping
func (d *Dao) Ping(c context.Context) error {
// TODO: if you need use mc,redis, please add
// check
return nil
}

View File

@@ -0,0 +1,44 @@
package room_ex
import (
"context"
"github.com/pkg/errors"
ServiceConf "go-common/app/interface/live/app-interface/conf"
cDao "go-common/app/interface/live/app-interface/dao"
roomExV1 "go-common/app/service/live/room_ex/api/liverpc/v1"
"go-common/library/ecode"
"go-common/library/log"
rpcCtx "go-common/library/net/rpc/liverpc/context"
"time"
)
func (d *Dao) GetRoomNewsInfo(ctx context.Context, req *roomExV1.RoomNewsMultiGetReq, params ServiceConf.ChunkCallInfo) (roomNewsResult *roomExV1.RoomNewsMultiGetResp, err error) {
roomNewsResult = &roomExV1.RoomNewsMultiGetResp{}
ret, err := cDao.RoomExtApi.V1RoomNews.MultiGet(rpcCtx.WithTimeout(ctx, time.Duration(params.RPCTimeout)*time.Millisecond),
&roomExV1.RoomNewsMultiGetReq{RoomIds: req.RoomIds, IsDecoded: req.IsDecoded})
if err != nil {
return
}
erelongInfo, success := ServiceConf.CheckReturn(err, ret.Code, ret.Msg, ServiceConf.RoomNews, params.RPCTimeout, params.ChunkSize, params.ChunkNum)
if !success {
if err != nil {
err = errors.WithMessage(ecode.RoomNewsRecordFrameWorkCallError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, req.RoomIds)
} else {
err = errors.WithMessage(ecode.RoomNewsLiveRPCCodeError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, req.RoomIds)
}
return nil, err
}
if ret.Data == nil {
erelongInfo.ErrType = ServiceConf.EmptyResultEn
erelongInfo.ErrDesc = ServiceConf.EmptyResult
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, req.RoomIds)
return nil, err
}
roomNewsResult = ret
return
}

View File

@@ -0,0 +1,39 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"dao.go",
"get.go",
],
importpath = "go-common/app/interface/live/app-interface/dao/user_ext",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/app-interface/conf:go_default_library",
"//app/interface/live/app-interface/dao:go_default_library",
"//app/service/live/userext/api/liverpc/v1:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//vendor/github.com/pkg/errors:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,31 @@
package user_ext
import (
"context"
"go-common/app/interface/live/app-interface/conf"
)
// Dao dao
type Dao struct {
c *conf.Config
}
// New init mysql db
func New(c *conf.Config) (dao *Dao) {
dao = &Dao{
c: c,
}
return
}
// Close close the resource.
func (d *Dao) Close() {
return
}
// Ping dao ping
func (d *Dao) Ping(c context.Context) error {
// check
return nil
}

View File

@@ -0,0 +1,26 @@
package user_ext
import (
"context"
"github.com/pkg/errors"
"go-common/app/interface/live/app-interface/dao"
userExV1 "go-common/app/service/live/userext/api/liverpc/v1"
"go-common/library/ecode"
"go-common/library/log"
)
// GetGrayRule 获取灰度配置
func (d *Dao) GetGrayRule(ctx context.Context, req *userExV1.GrayRuleGetByMarkReq) (extResult *userExV1.GrayRuleGetByMarkResp, err error) {
extResult = &userExV1.GrayRuleGetByMarkResp{}
if req == nil {
return nil, nil
}
ret, err := dao.UserExtApi.V1GrayRule.GetByMark(ctx, req)
if err != nil {
log.Error("call_userExt_grayRule error,err:%v", err)
err = errors.WithMessage(ecode.GetGrayRuleError, "GET SEA PATROL FAIL")
return
}
extResult = ret
return
}

View File

@@ -0,0 +1,38 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"dao.go",
"userExp.go",
],
importpath = "go-common/app/interface/live/app-interface/dao/xuser",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/app-interface/conf:go_default_library",
"//app/service/live/xuser/api/grpc/v1:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//vendor/github.com/pkg/errors:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,41 @@
package xuser
import (
"context"
"go-common/app/interface/live/app-interface/conf"
xuser "go-common/app/service/live/xuser/api/grpc/v1"
)
// Dao dao
type Dao struct {
c *conf.Config
xuserGRPC *xuser.Client
}
var _rsCli *xuser.Client
// New init mysql db
func New(c *conf.Config) (dao *Dao) {
var err error
if _rsCli, err = xuser.NewClient(c.XuserClient); err != nil {
panic(err)
}
dao = &Dao{
c: c,
xuserGRPC: _rsCli,
}
return
}
// Close close the resource.
func (d *Dao) Close() {
return
}
// Ping dao ping
func (d *Dao) Ping(c context.Context) error {
// TODO: if you need use mc,redis, please add
// check
return nil
}

View File

@@ -0,0 +1,31 @@
package xuser
import (
"context"
"github.com/pkg/errors"
xuserM "go-common/app/service/live/xuser/api/grpc/v1"
"go-common/library/ecode"
"go-common/library/log"
)
// GetUserExpData ...
// 调用account grpc接口cards获取用户信息
func (d *Dao) GetUserExpData(c context.Context, UIDs []int64) (userResult map[int64]*xuserM.LevelInfo, err error) {
userResult = make(map[int64]*xuserM.LevelInfo)
lens := len(UIDs)
if lens <= 0 {
return
}
ret, err := d.xuserGRPC.GetUserExp(c, &xuserM.GetUserExpReq{Uids: UIDs})
if err != nil {
err = errors.WithMessage(ecode.AccountGRPCError, "GET SEA PATROL FAIL")
log.Error("Call main.Account.Cards Error.Infos(%+v) error(%+v)", UIDs, err)
}
// 整理数据
for _, item := range ret.Data {
if item != nil {
userResult[item.Uid] = item
}
}
return
}

View File

@@ -0,0 +1,31 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["model.go"],
importpath = "go-common/app/interface/live/app-interface/model",
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/interface/live/app-interface/model/index:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,28 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["room.go"],
importpath = "go-common/app/interface/live/app-interface/model/index",
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1 @@
package index

View File

@@ -0,0 +1,9 @@
package model
type ExtraRecInfo struct{
UName string
Face string
PendentRu string
PendentRuPic string
PendentRuColor string
}

View File

@@ -0,0 +1,42 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["http.go"],
importpath = "go-common/app/interface/live/app-interface/server/http",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/app-interface/api/http/v1:go_default_library",
"//app/interface/live/app-interface/api/http/v2:go_default_library",
"//app/interface/live/app-interface/conf:go_default_library",
"//app/interface/live/app-interface/dao:go_default_library",
"//app/interface/live/app-interface/service:go_default_library",
"//app/interface/live/app-interface/service/v1:go_default_library",
"//app/interface/live/app-interface/service/v1/app_conf:go_default_library",
"//app/interface/live/app-interface/service/v2:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/http/blademaster/middleware/auth:go_default_library",
"//library/net/http/blademaster/middleware/verify:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,91 @@
package http
import (
"net/http"
apiV1 "go-common/app/interface/live/app-interface/api/http/v1"
apiV2 "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"
"go-common/app/interface/live/app-interface/service"
v1index "go-common/app/interface/live/app-interface/service/v1"
v1appConf "go-common/app/interface/live/app-interface/service/v1/app_conf"
v2index "go-common/app/interface/live/app-interface/service/v2"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/auth"
"go-common/library/net/http/blademaster/middleware/verify"
)
var (
srv *service.Service
indexV2Srv *v2index.IndexService
vfy *verify.Verify
midAuth *auth.Auth
)
// Init init
func Init(c *conf.Config) {
srv = service.New(c)
dao.InitAPI()
initMiddleware(c)
engine := bm.DefaultServer(c.BM)
route(engine)
if err := engine.Start(); err != nil {
log.Error("bm Start error(%v)", err)
panic(err)
}
}
func initMiddleware(c *conf.Config) {
vfy = verify.New(c.Verify)
midAuth = auth.New(nil)
}
func route(e *bm.Engine) {
e.Ping(ping)
e.Register(register)
// 上线后注释掉,方便调试代码
e.GET("/test", test)
g := e.Group("/x/app-interface")
{
g.GET("/start", vfy.Verify, howToStart)
}
midMap := map[string]bm.HandlerFunc{"auth": midAuth.User, "guest": midAuth.Guest, "verify": vfy.Verify}
apiV1.RegisterV1IndexService(e, v1index.New(conf.Conf), midMap)
apiV1.RegisterV1RelationService(e, v1index.NewRelationService(conf.Conf), midMap)
//移动端获取配置通用接口
apiV1.RegisterV1ConfigService(e, v1appConf.NewAppConfService(conf.Conf), midMap)
// v2 首页
indexV2Srv = v2index.NewIndexService(conf.Conf)
apiV2.RegisterV2IndexService(e, indexV2Srv, midMap)
}
func ping(c *bm.Context) {
if err := srv.Ping(c); err != nil {
log.Error("ping error(%v)", err)
c.AbortWithStatus(http.StatusServiceUnavailable)
}
// some frontend rely logic ping
if indexV2Srv.GetAllModuleInfoMapFromCache(c) == nil {
log.Error("ping error(AllMInfoMap must not nil)")
c.AbortWithStatus(http.StatusServiceUnavailable)
}
}
func test(c *bm.Context) {
if err := srv.Test(c); err != nil {
log.Error("test error(%v)", err)
c.AbortWithStatus(http.StatusServiceUnavailable)
}
}
func register(c *bm.Context) {
c.JSON(map[string]interface{}{}, nil)
}
// example for http request handler
func howToStart(c *bm.Context) {
c.String(0, "Golang 大法好 !!!")
}

View File

@@ -0,0 +1,36 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["service.go"],
importpath = "go-common/app/interface/live/app-interface/service",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/app-interface/conf:go_default_library",
"//app/interface/live/app-interface/dao:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/interface/live/app-interface/service/v1:all-srcs",
"//app/interface/live/app-interface/service/v2:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,41 @@
package service
import (
"context"
"go-common/app/interface/live/app-interface/conf"
"go-common/app/interface/live/app-interface/dao"
)
// Service struct
type Service struct {
c *conf.Config
dao *dao.Dao
}
// New init
func New(c *conf.Config) (s *Service) {
s = &Service{
c: c,
dao: dao.New(c),
}
return s
}
// Ping Service
func (s *Service) Ping(c context.Context) (err error) {
return s.dao.Ping(c)
}
// Close Service
func (s *Service) Close() {
s.dao.Close()
}
// Test ...
func (s *Service) Test(c context.Context) (err error) {
// srv := &v2.IndexService{}
// res, err := srv.GetIndexV2TagList(c, &liveUserV1.UserSettingGetTagReq{})
// res, err := srv.GetIndexV2SeaPatrol(c, &liveUserV1.NoteGetReq{})
// fmt.Printf("%#v \n", res)
return
}

View File

@@ -0,0 +1,77 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
go_library(
name = "go_default_library",
srcs = [
"doc.go",
"index.go",
"relation.go",
],
importpath = "go-common/app/interface/live/app-interface/service/v1",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/app-interface/api/http/v1:go_default_library",
"//app/interface/live/app-interface/conf:go_default_library",
"//app/interface/live/app-interface/dao:go_default_library",
"//app/interface/live/app-interface/service/v1/relation:go_default_library",
"//app/service/live/av/api/liverpc/v1:go_default_library",
"//app/service/live/live_user/api/liverpc/v1:go_default_library",
"//app/service/live/relation/api/liverpc/v1:go_default_library",
"//app/service/live/relation/api/liverpc/v2:go_default_library",
"//app/service/live/room/api/liverpc/v1:go_default_library",
"//app/service/live/room/api/liverpc/v2:go_default_library",
"//app/service/live/room_ex/api/liverpc/v1:go_default_library",
"//app/service/live/third_api/bvc:go_default_library",
"//app/service/live/userext/api/liverpc/v1:go_default_library",
"//app/service/main/account/model:go_default_library",
"//app/service/main/account/rpc/client:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/metadata:go_default_library",
"//library/net/rpc/liverpc:go_default_library",
"//library/net/rpc/liverpc/context:go_default_library",
"//library/sync/errgroup:go_default_library",
"//library/xstr:go_default_library",
"//vendor/github.com/bitly/go-simplejson:go_default_library",
"//vendor/github.com/pkg/errors:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/interface/live/app-interface/service/v1/app_conf:all-srcs",
"//app/interface/live/app-interface/service/v1/relation:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
go_test(
name = "go_default_test",
srcs = ["index_test.go"],
embed = [":go_default_library"],
tags = ["automanaged"],
deps = [
"//app/interface/live/app-interface/api/http/v1:go_default_library",
"//app/interface/live/app-interface/conf:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)

View File

@@ -0,0 +1,35 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["app_conf.go"],
importpath = "go-common/app/interface/live/app-interface/service/v1/app_conf",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/app-interface/api/http/v1:go_default_library",
"//app/interface/live/app-interface/conf:go_default_library",
"//app/service/live/resource/sdk:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,56 @@
package v1
import (
"context"
v1appconfpb "go-common/app/interface/live/app-interface/api/http/v1"
"go-common/app/interface/live/app-interface/conf"
titansSdk "go-common/app/service/live/resource/sdk"
"go-common/library/ecode"
"go-common/library/log"
)
//AppConfService struct
type AppConfService struct {
conf *conf.Config
}
// NewAppConfService init
func NewAppConfService(c *conf.Config) (s *AppConfService) {
s = &AppConfService{
conf: c,
}
InitTitan()
return s
}
//GetConf 获取移动端配置
func (s *AppConfService) GetConf(ctx context.Context, req *v1appconfpb.GetConfReq) (resp *v1appconfpb.GetConfResp, err error) {
value, ok := s.conf.AppConf[req.GetKey()]
if !ok {
log.Error("[AppConf] GetConf Key err: %s", req.GetKey())
return nil, ecode.AppConfKeyErr
}
resp = &v1appconfpb.GetConfResp{
Value: value,
}
conf, terr := titansSdk.Get(req.GetKey())
if terr != nil {
log.Error("[AppConf] GetConf titansSdk.Get err: %+v", err)
}
if conf != "" {
resp.Value = conf
}
return
}
//InitTitan 初始化kv配置
func InitTitan() {
conf := &titansSdk.Config{
TreeId: 61019,
Expire: 1,
}
titansSdk.Init(conf)
}

View File

@@ -0,0 +1,9 @@
// Copyright 2018 The BILLI Live Engineer. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package v1 为粉版App、直播App端提供卡片聚合接口,展示直播首页、关注二级页信息
// 关注模块文档 http://info.bilibili.co/display/live/APP+5.34
// 首页模块文档 http://info.bilibili.co/pages/viewpage.action?pageId=11546573
//
package v1

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,43 @@
package v1
import (
"context"
"flag"
"testing"
. "github.com/smartystreets/goconvey/convey"
api "go-common/app/interface/live/app-interface/api/http/v1"
"go-common/app/interface/live/app-interface/conf"
bm "go-common/library/net/http/blademaster"
)
var (
s *Service
)
func init() {
flag.Set("conf", "../../cmd/test.toml")
var err error
if err = conf.Init(); err != nil {
panic(err)
}
s = New(conf.Conf)
}
// go test -test.v -test.run TestGetAllList
func TestGetAllList(t *testing.T) {
Convey("TestGetAllList", t, func() {
res, err := s.GetAllList(&bm.Context{Context: context.TODO()}, &api.GetAllListReq{})
t.Logf("%v", res)
So(err, ShouldBeNil)
})
}
func TestChange(t *testing.T) {
Convey("TestChange", t, func() {
res, err := s.Change(&bm.Context{Context: context.TODO()}, &api.ChangeReq{})
t.Logf("%v", res)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,928 @@
package v1
import (
"context"
"math"
"strconv"
"time"
"go-common/library/sync/errgroup"
"github.com/pkg/errors"
v1pb "go-common/app/interface/live/app-interface/api/http/v1"
"go-common/app/interface/live/app-interface/conf"
"go-common/app/interface/live/app-interface/dao"
relationT "go-common/app/interface/live/app-interface/service/v1/relation"
avV1 "go-common/app/service/live/av/api/liverpc/v1"
relationV1 "go-common/app/service/live/relation/api/liverpc/v1"
roomV1 "go-common/app/service/live/room/api/liverpc/v1"
roomExV1 "go-common/app/service/live/room_ex/api/liverpc/v1"
playurlbvc "go-common/app/service/live/third_api/bvc"
userExV1 "go-common/app/service/live/userext/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"
"go-common/library/net/rpc/liverpc"
liveConText "go-common/library/net/rpc/liverpc/context"
rpcCtx "go-common/library/net/rpc/liverpc/context"
)
// RelationService struct
type RelationService struct {
conf *conf.Config
accountRPC *account.Service3
// optionally add other properties here, such as dao
// dao *dao.Dao
}
// NewRelationService init
func NewRelationService(c *conf.Config) (s *RelationService) {
s = &RelationService{
conf: c,
accountRPC: account.New3(nil),
}
return s
}
const (
// RoomStatusLive ...
RoomStatusLive = 1
// MobileIndexBadgeColorDefault ...
MobileIndexBadgeColorDefault = "#FB9E60"
)
// UnliveAnchor ... implementation
// 直播二级页暂未开播接口
func (s *RelationService) UnliveAnchor(ctx context.Context, req *v1pb.UnLiveAnchorReq) (resp *v1pb.UnLiveAnchorResp, err error) {
resp = &v1pb.UnLiveAnchorResp{}
config := conf.GetDummyUidConf()
if config == relationT.DummyUIDEnable {
dummyHeader := &liverpc.Header{Uid: relationT.RParseInt(req.Buyaofangqizhiliao, relationT.SelfUID)}
ctx = liveConText.WithHeader(ctx, dummyHeader)
}
MakeUnLiveDefaultResult(resp)
uid := relationT.GetUIDFromHeader(ctx)
if uid <= 0 && config == 0 {
return
}
wg, _ := errgroup.WithContext(ctx)
pass, page, pageSize, uid, err := CheckUnLiveAnchorParams(ctx, req)
if !pass {
log.Error("[UnLiveAnchor]CheckParamsError,page:%d,pageSize:%d,uid:%d", page, pageSize, uid)
return
}
relationInfo, groupList, mapUfos2Rolaids, mapRolaids2Ufos, setRolaids, err := GetAttentionListAndGroup(ctx)
if err != nil {
log.Error("[LiveAnchor]get_attentionList_rpc_error")
return
}
// 获取有效(曾经直播过)主播,剪枝roomIDs
lastLiveTime, _ := relationT.GetLastLiveTime(ctx, setRolaids)
alienableRolaids, liberateInfo, sorted := FilterEverLived(lastLiveTime)
alienableUfos := GetUID(mapRolaids2Ufos, alienableRolaids)
roomExReq := &roomExV1.RoomNewsMultiGetReq{RoomIds: alienableRolaids, IsDecoded: 1}
roomParams := &roomV1.RoomGetStatusInfoByUidsReq{Uids: groupList["all"], FilterOffline: 0}
userInfo := make(map[int64]*accountM.Card)
roomResp := make(map[int64]*roomV1.RoomGetStatusInfoByUidsResp_RoomInfo)
roomExResp := make(map[int64]*roomExV1.RoomNewsMultiGetResp_Data)
userfcResp := make(map[int64]*relationV1.FeedGetUserFcBatchResp_RelationList)
// room
wg.Go(func() error {
roomResp, err = relationT.GetRoomInfo(ctx, roomParams)
return err
})
// user信息
wg.Go(func() error {
userInfo, err = s.GetUserInfoData(ctx, alienableUfos)
return err
})
// roomEx
wg.Go(func() error {
roomExResp, err = relationT.GetRoomNewsInfo(ctx, roomExReq)
return err
})
// fansNum
wg.Go(func() error {
userfcResp, err = GetUserFc(ctx, alienableUfos)
return err
})
waitErr := wg.Wait()
if waitErr != nil {
log.Error("[UnLiveAnchor][step2] rpc error: %s", waitErr)
return
}
mapSp := make(map[int64]bool)
normalSp := make(map[int64]bool)
for _, v := range groupList["special"] {
mapSp[v] = true
}
for _, v := range groupList["normal"] {
normalSp[v] = true
}
specialRoomed, normalRoomed := s.GroupByRule(ctx, mapSp, normalSp, liberateInfo, sorted, mapRolaids2Ufos)
specialUID := GetUID(mapRolaids2Ufos, specialRoomed)
normalUID := GetUID(mapRolaids2Ufos, normalRoomed)
liveDesc, newsDesc := CalcTimeLine(liberateInfo, roomExResp)
LiveCount := CountLiveRooms(roomResp)
resp.Rooms = AdaptField(roomResp, userfcResp, userInfo, roomExResp, relationInfo, specialUID, normalUID, mapUfos2Rolaids, liveDesc, newsDesc)
resp.TotalCount = int64(len(resp.Rooms))
resp.NoRoomCount = int64(len(setRolaids) - int(resp.TotalCount) - int(LiveCount))
resp.Rooms = UnLiveAnchorSlice(resp.Rooms, page, pageSize)
if (page * pageSize) >= resp.TotalCount {
resp.HasMore = 0
} else {
resp.HasMore = 1
}
return
}
// CountLiveRooms 计算正在直播数目
func CountLiveRooms(input map[int64]*roomV1.RoomGetStatusInfoByUidsResp_RoomInfo) (count int) {
if len(input) <= 0 {
count = 0
return
}
for _, v := range input {
if v.LiveStatus == RoomStatusLive {
count++
}
}
return
}
// CheckUnLiveAnchorParams implementation
// 入参校验
func CheckUnLiveAnchorParams(ctx context.Context, req *v1pb.UnLiveAnchorReq) (pass bool, page int64, pageSize int64, uid int64, err error) {
if req == nil {
pass = false
return
}
config := conf.GetDummyUidConf()
uid = relationT.GetUIDFromHeader(ctx)
if uid == 0 && config == 0 {
err = errors.WithMessage(ecode.NeedLogIn, "GET SEA PATROL FAIL")
pass = false
return
}
page = req.Page
pageSize = req.Pagesize
if page <= 0 || pageSize <= 0 {
pass = false
log.Error("CallRelationUnLiveAnchorParamsCheckError|page:%d,pageSize:%d", page, pageSize)
err = errors.WithMessage(ecode.UnliveAnchorReqParamsError, "GET SEA PATROL FAIL")
return
}
pass = true
return
}
// CheckLiveAnchorParams implementation
// 入参校验
func CheckLiveAnchorParams(ctx context.Context, req *v1pb.LiveAnchorReq) (sortRule int64, filterRule int64, uid int64, err error) {
if req == nil {
err = ecode.LiveAnchorReqParamsNil
return
}
sortRule = req.SortRule
filterRule = req.FilterRule
uid = relationT.GetUIDFromHeader(ctx)
config := conf.GetDummyUidConf()
if uid == 0 && config == 0 {
err = errors.WithMessage(ecode.NeedLogIn, "GET SEA PATROL FAIL")
return
}
if sortRule < 0 || filterRule < 0 {
log.Error("CallRelationLiveAnchorParamsCheckError|page:%d,pageSize:%d", sortRule, filterRule)
err = errors.WithMessage(ecode.LiveAnchorReqParamsError, "GET SEA PATROL FAIL")
return
}
return
}
// UnLiveAnchorSlice implementation
// 分页逻辑
func UnLiveAnchorSlice(req []*v1pb.UnLiveAnchorResp_Rooms, page int64, pageSize int64) (resp []*v1pb.UnLiveAnchorResp_Rooms) {
resp = make([]*v1pb.UnLiveAnchorResp_Rooms, 0)
start := (page - 1) * pageSize
end := start + pageSize
length := int64(len(req))
if start >= length {
return
}
if end >= length {
resp = req[start:]
} else {
resp = req[start:end]
}
return
}
// MakeUnLiveDefaultResult implementation
// 缺省返回
func MakeUnLiveDefaultResult(resp *v1pb.UnLiveAnchorResp) {
if resp != nil {
resp.HasMore = 0
resp.NoRoomCount = 0
resp.TotalCount = 0
resp.Rooms = make([]*v1pb.UnLiveAnchorResp_Rooms, 0)
}
}
// GroupByRule implementation
// 按照规则排序,组间按照特别关注优先,组内按照上次关播时间倒序
func (s *RelationService) GroupByRule(ctx context.Context, special map[int64]bool, normal map[int64]bool,
liberate map[int64]int64, sorted relationT.PairList, mapRolaids2Ufos map[int64]int64) (specialRoomed []int64, normalRoomed []int64) {
specialRoomed = make([]int64, 0)
normalRoomed = make([]int64, 0)
if len(liberate) == 0 || liberate == nil {
return
}
for _, v := range sorted {
if _, ok := special[mapRolaids2Ufos[v.Key]]; ok {
specialRoomed = append(specialRoomed, v.Key)
} else {
normalRoomed = append(normalRoomed, v.Key)
}
}
return
}
// AdaptField implementation
// 填充逻辑
func AdaptField(roomInfo map[int64]*roomV1.RoomGetStatusInfoByUidsResp_RoomInfo,
fansInfo map[int64]*relationV1.FeedGetUserFcBatchResp_RelationList,
userResult map[int64]*accountM.Card,
roomedInfo map[int64]*roomExV1.RoomNewsMultiGetResp_Data,
relationInfo map[int64]*relationV1.BaseInfoGetFollowTypeResp_UidInfo,
specialUID []int64, normalUID []int64,
mapUfos2Rolaids map[int64]int64, liveDesc map[int64]string, newsDesc map[int64]string) (resp []*v1pb.UnLiveAnchorResp_Rooms) {
var item []*v1pb.UnLiveAnchorResp_Rooms
resp = make([]*v1pb.UnLiveAnchorResp_Rooms, 0)
if len(specialUID) > 0 {
item = FireField(roomInfo, fansInfo, userResult, roomedInfo, relationInfo, specialUID, mapUfos2Rolaids, liveDesc, newsDesc)
resp = append(resp, item...)
}
if len(normalUID) > 0 {
item = FireField(roomInfo, fansInfo, userResult, roomedInfo, relationInfo, normalUID, mapUfos2Rolaids, liveDesc, newsDesc)
resp = append(resp, item...)
}
return
}
// CalcTimeLine ...
// 计算时间规则
func CalcTimeLine(liberateInfo map[int64]int64,
roomNewsInfo map[int64]*roomExV1.RoomNewsMultiGetResp_Data) (liveDesc map[int64]string, newsDesc map[int64]string) {
liveDesc, newsDesc = TimeLineRule(liberateInfo, roomNewsInfo)
return
}
// TimeLineRule ...
// 计算时间规则
func TimeLineRule(liberateInfo map[int64]int64, roomNewsInfo map[int64]*roomExV1.RoomNewsMultiGetResp_Data) (liveDesc map[int64]string, newsDesc map[int64]string) {
liveDesc = make(map[int64]string)
newsDesc = make(map[int64]string)
if len(liberateInfo) <= 0 {
return
}
for livedRoomed, lastLiveTime := range liberateInfo {
now := time.Now()
currentYear, currentMonth, currentDay := now.Date()
currentLocation := now.Location()
firstOfMonth := time.Date(currentYear, 1, 1, 0, 0, 0, 0, currentLocation)
thisYearUnixTimeStamp := firstOfMonth.Unix()
todayUnixTimeStamp := time.Date(currentYear, currentMonth, currentDay, 0, 0, 0, 0, currentLocation).Unix()
today24 := math.Abs(float64(todayUnixTimeStamp - lastLiveTime))
liveTime := math.Abs(float64(now.Unix() - lastLiveTime))
if lastLiveTime == 0 {
liveDesc[livedRoomed] = "上次"
}
if liveTime < 60 {
liveDesc[livedRoomed] = "刚刚"
} else if liveTime >= 60 && liveTime < 3600 {
text := int(math.Floor(liveTime / 60))
liveDesc[livedRoomed] = strconv.Itoa(text) + "分钟前"
} else if liveTime >= 3600 && liveTime < 86400 {
text := int(math.Floor(liveTime / 3600))
liveDesc[livedRoomed] = strconv.Itoa(text) + "小时前"
} else if liveTime >= 86400 && today24 <= 86400 {
liveDesc[livedRoomed] = "昨天"
} else if liveTime >= 86400 && lastLiveTime >= thisYearUnixTimeStamp {
tm := time.Unix(lastLiveTime, 0)
text := tm.Format("1-2")
liveDesc[livedRoomed] = text
} else {
if lastLiveTime < thisYearUnixTimeStamp && liveTime >= 86400 {
tm := time.Unix(lastLiveTime, 0)
text := tm.Format("2006-1-2")
liveDesc[livedRoomed] = text
} else {
tm := time.Unix(lastLiveTime, 0)
text := tm.Format("2006-1-2")
liveDesc[livedRoomed] = text
}
}
}
if len(roomNewsInfo) <= 0 {
return
}
for livedRoomed, lastNewsTime := range roomNewsInfo {
lastLiveTimeStr := lastNewsTime.Ctime
now := time.Now()
timeFmt, _ := time.ParseInLocation("2006-01-02 15:04:05", lastLiveTimeStr, time.Local)
lastLiveTime := timeFmt.Unix()
currentYear, currentMonth, currentDay := now.Date()
currentLocation := now.Location()
todayUnixTimeStamp := time.Date(currentYear, currentMonth, currentDay, 0, 0, 0, 0, currentLocation).Unix()
today24 := math.Abs(float64(todayUnixTimeStamp - lastLiveTime))
liveTime := math.Abs(float64(now.Unix() - lastLiveTime))
if lastLiveTime == 0 {
newsDesc[livedRoomed] = ""
}
if liveTime < 60 {
newsDesc[livedRoomed] = "刚刚"
} else if liveTime >= 60 && liveTime < 3600 {
text := int(math.Floor(liveTime / 60))
newsDesc[livedRoomed] = strconv.Itoa(text) + "分钟前"
} else if liveTime >= 3600 && liveTime < 86400 {
text := int(math.Floor(liveTime / 3600))
newsDesc[livedRoomed] = strconv.Itoa(text) + "小时前"
} else if liveTime >= 86400 && today24 <= 86400 {
newsDesc[livedRoomed] = "昨天"
}
}
return
}
// FireField ...
// 适配返回值
func FireField(roomInfo map[int64]*roomV1.RoomGetStatusInfoByUidsResp_RoomInfo,
fansInfo map[int64]*relationV1.FeedGetUserFcBatchResp_RelationList,
userResult map[int64]*accountM.Card,
roomedInfo map[int64]*roomExV1.RoomNewsMultiGetResp_Data,
relationInfo map[int64]*relationV1.BaseInfoGetFollowTypeResp_UidInfo,
ufos []int64,
mapUfos2Rolaids map[int64]int64, liveDesc map[int64]string, newsDesc map[int64]string) (resp []*v1pb.UnLiveAnchorResp_Rooms) {
for _, v := range ufos {
item := v1pb.UnLiveAnchorResp_Rooms{}
roomID, roomIDExist := mapUfos2Rolaids[v]
if !roomIDExist {
continue
}
roomItem := roomInfo[v]
userItem := userResult[v]
fansItem := fansInfo[v]
relationItem := relationInfo[v]
roomedItem := roomedInfo[roomID]
roomNewsDesc := newsDesc[roomID]
liveDescItem := liveDesc[roomID]
roomNewsContent := ""
roomNewsDescText := ""
if roomItem == nil || userItem == nil || relationItem == nil {
continue
}
if roomItem.LiveStatus == RoomStatusLive {
continue
}
if roomedItem != nil {
roomNewsContent = roomedItem.NewsContent
roomNewsDescText = roomNewsDesc
}
item.Roomid = roomItem.RoomId
item.Uid = roomItem.Uid
item.Uname = userItem.Name
item.Face = userItem.Face
item.LiveStatus = roomItem.LiveStatus
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(relationT.RoleMap(userItem.Official.Role))
item.Attentions = fansItem.Fc
item.SpecialAttention = relationItem.Special
item.AnnouncementContent = roomNewsContent
item.AnnouncementTime = roomNewsDescText
item.LiveDesc = liveDescItem
resp = append(resp, &item)
}
return
}
// LiveFireField ...
// 适配返回值
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]*playurlbvc.PlayUrlItem,
relationInfo map[int64]*relationV1.BaseInfoGetFollowTypeResp_UidInfo,
ufos []int64, mapUfos2Rolaids map[int64]int64) (resp []*v1pb.LiveAnchorResp_Rooms) {
for _, v := range ufos {
item := v1pb.LiveAnchorResp_Rooms{}
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
}
if PendentRuColor == "" {
PendentRuColor = MobileIndexBadgeColorDefault
}
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.AcceptQuality = PlayURLAcc
item.CurrentQuality = int64(PlayURLCur)
item.PkId = pkItem
item.Area = roomItem.Area
item.AreaName = roomItem.AreaName
item.AreaV2Id = roomItem.AreaV2Id
item.PlayUrlH265 = PlayURL265
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(relationT.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
}
// GroupUfos ...
// 按照关注类型分组
func GroupUfos(input map[int64]*relationV1.BaseInfoGetFollowTypeResp_UidInfo) (resp map[string][]int64, err error) {
if input == nil {
return nil, nil
}
resp = make(map[string][]int64)
for k, v := range input {
if v.Special == 0 {
resp["normal"] = append(resp["normal"], k)
} else {
resp["special"] = append(resp["special"], k)
}
resp["all"] = append(resp["all"], k)
}
return resp, nil
}
// GetUID ...
// 获取uid
func GetUID(idsMap map[int64]int64, input []int64) (resp []int64) {
if idsMap == nil || input == nil {
return nil
}
for _, v := range input {
resp = append(resp, idsMap[int64(v)])
}
return resp
}
// FilterEverLived ...
// 过滤未开播
func FilterEverLived(lastLiveTime map[string]string) (rolaids []int64, lifetime map[int64]int64, sorted relationT.PairList) {
rolaids = make([]int64, 0)
lifetime = make(map[int64]int64)
for roomed, v := range lastLiveTime {
timeFmt, _ := time.ParseInLocation("2006-01-02 15:04:05", v, time.Local)
if !timeFmt.IsZero() {
if mid, err := strconv.ParseInt(roomed, 10, 64); err == nil {
lifetime[mid] = timeFmt.Unix()
rolaids = append(rolaids, mid)
}
}
}
sorted = make([]relationT.Pair, 0)
sorted = relationT.SortMap(lifetime)
return rolaids, lifetime, sorted
}
// GetLastAnchorLiveTime ...
// 获取上一个主播信息
func GetLastAnchorLiveTime(lastLiveTime map[string]string) (rolaids []int64, lifetime map[int64]int64, sorted relationT.PairList) {
rolaids = make([]int64, 0)
lifetime = make(map[int64]int64)
for roomed, v := range lastLiveTime {
timeFmt, _ := time.ParseInLocation("2006-01-02 15:04:05", v, time.Local)
if mid, err := strconv.ParseInt(roomed, 10, 64); err == nil {
lifetime[mid] = timeFmt.Unix()
rolaids = append(rolaids, mid)
}
}
sorted = make([]relationT.Pair, 0)
sorted = relationT.SortMap(lifetime)
return rolaids, lifetime, sorted
}
// MakeLiveAnchorDefaultResult ...
// 正在直播默认返回
func MakeLiveAnchorDefaultResult(resp *v1pb.LiveAnchorResp) {
if resp != nil {
resp.TotalCount = 0
// [历史原因]cardType只能为1,否则客户端报错,见 https://www.tapd.cn/20082211/prong/stories/view/1120082211001086997
resp.CardType = relationT.App533CardType
resp.BigCardType = 0
resp.Rooms = make([]*v1pb.LiveAnchorResp_Rooms, 0)
}
}
// GetAttentionListAndGroup ...
// 关注分组
func GetAttentionListAndGroup(ctx context.Context) (relationInfo map[int64]*relationV1.BaseInfoGetFollowTypeResp_UidInfo, groupList map[string][]int64,
mapUfos2Rolaids map[int64]int64, mapRolaids2Ufos map[int64]int64, setRolaids []int64, attentionErr error) {
relationTimeout := conf.GetTimeout("relation", 200)
attentionErr = nil
attentionData, attentionErr := dao.RelationApi.V1BaseInfo.GetFollowType(
rpcCtx.WithTimeout(ctx, time.Duration(relationTimeout)*time.Millisecond),
&relationV1.BaseInfoGetFollowTypeReq{})
if attentionErr != nil || attentionData == nil {
attentionErr = ecode.AttentionListRPCError
return
}
relationInfo = attentionData.Data
groupList, _ = GroupUfos(attentionData.Data)
// 转换ids
mapUfos2Rolaids, err := relationT.UIDs2roomIDs(ctx, groupList["all"])
if err != nil {
attentionErr = ecode.RoomGetRoomIDCodeRPCError
return
}
mapRolaids2Ufos, setRolaids = TransRoomedUUID(mapUfos2Rolaids)
return
}
// TransRoomedUUID ...
// 转换ids
func TransRoomedUUID(mapUfos2Rolaids map[int64]int64) (mapRolaids2Ufos map[int64]int64, setRolaids []int64) {
mapRolaids2Ufos = make(map[int64]int64)
for k, v := range mapUfos2Rolaids {
mapRolaids2Ufos[v] = k
}
setRolaids = make([]int64, 0)
for _, v := range mapUfos2Rolaids {
setRolaids = append(setRolaids, v)
}
return
}
// AdaptLivingField ...
// 填充逻辑
func AdaptLivingField(roomInfo map[int64]*roomV1.RoomGetStatusInfoByUidsResp_RoomInfo,
roomPendentInfo map[int64]*roomV1.RoomPendantGetPendantByIdsResp_Result,
userResult map[int64]*accountM.Card,
relationInfo map[int64]*relationV1.BaseInfoGetFollowTypeResp_UidInfo,
pkIDInfo map[string]int64, playURLInfo map[int64]*playurlbvc.PlayUrlItem, specialUID []int64, normalUID []int64,
mapUfos2Rolaids map[int64]int64) (resp []*v1pb.LiveAnchorResp_Rooms) {
var item []*v1pb.LiveAnchorResp_Rooms
resp = make([]*v1pb.LiveAnchorResp_Rooms, 0)
normalResp := make([]*v1pb.LiveAnchorResp_Rooms, 0)
if len(specialUID) > 0 {
item = LiveFireField(roomInfo, roomPendentInfo, userResult, pkIDInfo, playURLInfo, relationInfo, specialUID, mapUfos2Rolaids)
tempResp := &v1pb.LiveAnchorResp{}
tempResp.Rooms = item
resp = relationT.AppSortRuleOnline(tempResp)
}
if len(normalUID) > 0 {
item = LiveFireField(roomInfo, roomPendentInfo, userResult, pkIDInfo, playURLInfo, relationInfo, normalUID, mapUfos2Rolaids)
tempResp := &v1pb.LiveAnchorResp{}
tempResp.Rooms = item
normalResp = relationT.AppSortRuleOnline(tempResp)
}
if len(normalResp) > 0 {
resp = append(resp, normalResp...)
}
return
}
// LiveAnchor implementation
// [app端关注二级页][全量]正在直播接口
func (s *RelationService) LiveAnchor(ctx context.Context, req *v1pb.LiveAnchorReq) (resp *v1pb.LiveAnchorResp, err error) {
resp = &v1pb.LiveAnchorResp{}
MakeLiveAnchorDefaultResult(resp)
sortRule, filterRule, uid, err := CheckLiveAnchorParams(ctx, req)
wg, _ := errgroup.WithContext(ctx)
if err != nil {
log.Error("[LiveAnchor]CheckParamsError,page:%d,pageSize:%d,uid:%d", sortRule, filterRule, uid)
return
}
relationInfo, groupList, mapUfos2Rolaids, _, _, err := GetAttentionListAndGroup(ctx)
if err != nil {
log.Error("[LiveAnchor]get_attentionList_rpc_error")
return
}
// 获取有效(正在直播中)主播,剪枝roomIDs
roomParams := &roomV1.RoomGetStatusInfoByUidsReq{Uids: groupList["all"], FilterOffline: 1, NeedBroadcastType: 1}
// room
roomResp, err := relationT.GetRoomInfo(ctx, roomParams)
if err != nil {
log.Error("[LiveAnchor]get_room_rpc_error")
return
}
livingUfos := make([]int64, 0)
livingRolaids := make([]int64, 0)
// 没有人直播
if len(roomResp) == 0 {
return
}
for k, v := range roomResp {
livingUfos = append(livingUfos, k)
livingRolaids = append(livingRolaids, v.RoomId)
}
userResp := make(map[int64]*accountM.Card)
roomCornerResp := make(map[int64]*roomV1.RoomPendantGetPendantByIdsResp_Result)
pkResp := make(map[string]int64)
attentionRoomListPlayURLMap := make(map[int64]*playurlbvc.PlayUrlItem)
build, _ := strconv.ParseInt(req.Build, 10, 64)
roomPendentParams := &roomV1.RoomPendantGetPendantByIdsReq{Ids: livingRolaids, Type: relationT.PendentMobileBadge, Position: relationT.PendentPosition}
pkParams := &avV1.PkGetPkIdsByRoomIdsReq{RoomIds: livingRolaids, Platform: req.Platform}
if err != nil {
log.Error("[LiveAnchor]get_roomPendant_rpc_error")
return
}
// user信息
wg.Go(func() error {
userResp, err = s.GetUserInfoData(ctx, livingUfos)
return err
})
// room
wg.Go(func() error {
roomCornerResp, err = relationT.GetRoomPendantInfo(ctx, roomPendentParams)
return err
})
// pk_id
wg.Go(func() error {
pkResp, err = relationT.GetPkID(ctx, pkParams)
return err
})
quality := req.Quality
if quality <= 0 {
quality = 4
}
// playurl
wg.Go(func() error {
attentionRoomListPlayURLMap = dao.BvcApi.GetPlayUrlMulti(ctx, livingRolaids, 0, quality, build, req.Platform)
return err
})
waitErr := wg.Wait()
if waitErr != nil {
log.Error("[LiveAnchor][step2] rpc error: %s", waitErr)
return
}
// 下游数据收集完成
mapSp := make([]int64, 0)
normalSp := make([]int64, 0)
mapSp = append(mapSp, groupList["special"]...)
normalSp = append(normalSp, groupList["normal"]...)
resp.Rooms = AdaptLivingField(roomResp, roomCornerResp, userResp, relationInfo, pkResp, attentionRoomListPlayURLMap, mapSp, normalSp, mapUfos2Rolaids)
resp.TotalCount = int64(len(resp.Rooms))
userExtParams := &userExV1.GrayRuleGetByMarkReq{Mark: relationT.App531GrayRule}
grayRule, err := relationT.GetGrayRule(ctx, userExtParams)
if err != nil {
log.Error("[LiveAnchor]get_GrayRule_rpc_error")
resp.BigCardType = 0
} else if grayRule != nil {
resp.BigCardType = relationT.App531ABTest(ctx, grayRule.Content, req.Build, req.Platform)
}
FilterType(ctx, livingUfos, resp, filterRule)
SortType(ctx, resp, sortRule)
return
}
// FilterType implementation
// [app端关注二级页]按照规则过滤结果集
func FilterType(ctx context.Context, targetUIDs []int64, originResult *v1pb.LiveAnchorResp, filterType int64) {
if originResult == nil || len(originResult.Rooms) == 0 {
return
}
switch filterType {
case relationT.AppFilterDefault:
{
}
case relationT.AppFilterFansMedal:
{
filteredRooms, _ := relationT.AppFilterRuleFansMedal(ctx, originResult, targetUIDs)
originResult.Rooms = filteredRooms
originResult.TotalCount = int64(len(originResult.Rooms))
}
case relationT.AppFilterGoldType:
{
filteredRooms, _ := relationT.AppFilterGold(ctx, originResult)
originResult.Rooms = filteredRooms
originResult.TotalCount = int64(len(originResult.Rooms))
}
}
}
// SortType implementation
// [app端关注二级页]按照规则排序结果集
// 规则见https://www.tapd.cn/20082211/prong/stories/view/1120082211001067961
func SortType(ctx context.Context, originResult *v1pb.LiveAnchorResp, sortType int64) (resp *v1pb.LiveAnchorResp, err error) {
if originResult == nil || len(originResult.Rooms) == 0 {
return
}
switch sortType {
// 组间特别关注、组内人气值
case relationT.AppSortDefaultT:
{
}
case relationT.AppSortRuleLiveTimeT:
{
originResult.Rooms = relationT.AppSortRuleLiveTime(originResult)
}
case relationT.AppSortRuleOnlineT:
{
originResult.Rooms = relationT.AppSortRuleOnline(originResult)
}
case relationT.AppSortRuleGoldT:
{
originResult.Rooms = relationT.AppSortRuleGold(ctx, originResult)
}
default:
}
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
}
// GetUserFc ...
// 获取用户粉丝
func GetUserFc(ctx context.Context, UIDs []int64) (userResult map[int64]*relationV1.FeedGetUserFcBatchResp_RelationList, err error) {
rpcChunkSize, RPCTimeout, err := relationT.GetChunkInfo(relationT.FansNum)
params := relationT.ChunkCallInfo{ParamsName: "ufos", URLName: relationT.FansNum, ChunkSize: rpcChunkSize, RPCTimeout: RPCTimeout}
userResult = make(map[int64]*relationV1.FeedGetUserFcBatchResp_RelationList)
lens := len(UIDs)
if lens <= 0 {
return
}
// 批次
params.ChunkNum = int64(math.Ceil(float64(lens) / float64(params.ChunkSize)))
chunkResult := make([]map[int64]*relationV1.FeedGetUserFcBatchResp_RelationList, 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 := dao.RelationApi.V1Feed.GetUserFcBatch(ctx, &relationV1.FeedGetUserFcBatchReq{Uids: 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.Data
return nil
})
}
if err := wg.Wait(); err != nil {
erelongInfo := relationT.ErrLogStrut{}
erelongInfo.ErrType = "GoRoutingWaitError"
erelongInfo.URLName = relationT.FansNum
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.Uid] = item
}
}
}
return
}

View File

@@ -0,0 +1,64 @@
package relation
import (
"context"
v1pb "go-common/app/interface/live/app-interface/api/http/v1"
fansMedalV1 "go-common/app/service/live/fans_medal/api/liverpc/v1"
"go-common/library/log"
)
const (
// AppFilterDefault implementation
// 默认排序
AppFilterDefault = 0
// AppFilterFansMedal implementation
// 只看我有粉丝勋章的
AppFilterFansMedal = 1
// AppFilterGoldType implementation
// 按照金瓜子排序
AppFilterGoldType = 2
)
// AppFilterRuleFansMedal implementation
// [app端关注二级页]过滤粉丝勋章
func AppFilterRuleFansMedal(ctx context.Context, originResult *v1pb.LiveAnchorResp, targetUIDs []int64) (resp []*v1pb.LiveAnchorResp_Rooms, err error) {
uid := GetUIDFromHeader(ctx)
resp = make([]*v1pb.LiveAnchorResp_Rooms, 0)
if originResult == nil || len(originResult.Rooms) == 0 {
return
}
fansParams := &fansMedalV1.FansMedalTargetsWithMedalReq{Uid: uid, TargetIds: targetUIDs}
hasMedalUIDs, err := GetFansMedal(ctx, fansParams)
if err != nil {
log.Error("[LiveAnchor][FilterType]get_FansMedal_rpc_error")
resp = originResult.Rooms
return
}
for _, v := range originResult.Rooms {
if _, exist := hasMedalUIDs[v.Uid]; exist {
resp = append(resp, v)
}
}
return
}
// AppFilterGold implementation
// [app端关注二级页]过滤送礼
func AppFilterGold(ctx context.Context, originResult *v1pb.LiveAnchorResp) (resp []*v1pb.LiveAnchorResp_Rooms, err error) {
giftInfo, err := GetGiftInfo(ctx)
resp = make([]*v1pb.LiveAnchorResp_Rooms, 0)
if originResult == nil || len(originResult.Rooms) == 0 {
return
}
if err != nil {
log.Error("[LiveAnchor][FilterType]get_RelationGift_rpc_error")
resp = originResult.Rooms
return
}
for _, v := range originResult.Rooms {
if _, exist := giftInfo[v.Uid]; exist {
resp = append(resp, v)
}
}
return
}

View File

@@ -0,0 +1,233 @@
package relation
import (
"context"
v1pb "go-common/app/interface/live/app-interface/api/http/v1"
"go-common/library/log"
"sort"
)
const (
// AppSortDefaultT ...
// 默认排序
AppSortDefaultT = 0
// AppSortRuleLiveTimeT ...
// 开播时间倒序
AppSortRuleLiveTimeT = 1
// AppSortRuleOnlineT ...
// 人气值倒序
AppSortRuleOnlineT = 2
// AppSortRuleGoldT ...
// 金瓜子倒序
AppSortRuleGoldT = 3
)
// SendGift ...
// [app端关注二级页]按照金瓜子排序结构
type SendGift struct {
Mid int64
gold int64
}
// SortLiveTime ... implementation
// [app端关注二级页]按照开播时间排序
type SortLiveTime []*v1pb.LiveAnchorResp_Rooms
// SortOnlineTime ... implementation
// [app端关注二级页]按照开播时间排序
type SortOnlineTime []*v1pb.LiveAnchorResp_Rooms
// // AddGoldRoomInfo ... implementation
// // [app端关注二级页]按照开播时间排序
// type AddGoldRoomInfo []*LiveAnchorRespRoomsAddGold
// SortUIDGift ... implementation
// [app端关注二级页]按照开播时间排序
type SortUIDGift []SendGift
// AppSortRuleLiveTime implementation
// [app端关注二级页]按照开播时间排序
func (p SortLiveTime) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
// AppSortRuleLiveTime implementation
// [app端关注二级页]按照开播时间排序
func (p SortLiveTime) Len() int { return len(p) }
// AppSortRuleLiveTime implementation
// [app端关注二级页]按照开播时间排序
func (p SortLiveTime) Less(i, j int) bool { return p[i].LiveTime > p[j].LiveTime }
// AppSortRuleLiveTime implementation
// [app端关注二级页]按照开播时间排序
func (p SortOnlineTime) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
// AppSortRuleLiveTime implementation
// [app端关注二级页]按照开播时间排序
func (p SortOnlineTime) Len() int { return len(p) }
// AppSortRuleLiveTime implementation
// [app端关注二级页]按照开播时间排序
func (p SortOnlineTime) Less(i, j int) bool { return p[i].Online > p[j].Online }
// Swap
// [app端关注二级页]自定义排序结构
func (p SortUIDGift) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
// Len
// [app端关注二级页]自定义排序结构
func (p SortUIDGift) Len() int { return len(p) }
// Less
// [app端关注二级页]自定义排序结构
func (p SortUIDGift) Less(i, j int) bool { return p[i].gold > p[j].gold }
// AppSortRuleLiveTime implementation
// [app端关注二级页]按照开播时间排序
func AppSortRuleLiveTime(originResult *v1pb.LiveAnchorResp) (resp []*v1pb.LiveAnchorResp_Rooms) {
resp = make([]*v1pb.LiveAnchorResp_Rooms, 0)
if originResult == nil {
return
}
p := make(SortLiveTime, len(originResult.Rooms))
i := 0
for _, v := range originResult.Rooms {
p[i] = &v1pb.LiveAnchorResp_Rooms{
Roomid: v.Roomid,
Uid: v.Uid,
Uname: v.Uname,
Face: v.Face,
Title: v.Title,
LiveTagName: v.LiveTagName,
LiveTime: v.LiveTime,
Online: v.Online,
Playurl: v.Playurl,
AcceptQuality: v.AcceptQuality,
CurrentQuality: v.CurrentQuality,
PkId: v.PkId,
SpecialAttention: v.SpecialAttention,
Area: v.Area,
AreaName: v.AreaName,
AreaV2Id: v.AreaV2Id,
AreaV2Name: v.AreaV2Name,
AreaV2ParentName: v.AreaV2ParentName,
AreaV2ParentId: v.AreaV2ParentId,
BroadcastType: v.BroadcastType,
OfficialVerify: v.OfficialVerify,
Link: v.Link,
Cover: v.Cover,
PendentRu: v.PendentRu,
PendentRuColor: v.PendentRuColor,
PendentRuPic: v.PendentRuPic}
i++
}
sort.Sort(p)
resp = p
return
}
// AppSortRuleOnline implementation
// [app端关注二级页]按照人气值排序
func AppSortRuleOnline(originResult *v1pb.LiveAnchorResp) (resp []*v1pb.LiveAnchorResp_Rooms) {
resp = make([]*v1pb.LiveAnchorResp_Rooms, 0)
if originResult == nil {
return
}
p := make(SortOnlineTime, len(originResult.Rooms))
i := 0
for _, v := range originResult.Rooms {
p[i] = &v1pb.LiveAnchorResp_Rooms{
Roomid: v.Roomid,
Uid: v.Uid,
Uname: v.Uname,
Face: v.Face,
Title: v.Title,
LiveTagName: v.LiveTagName,
LiveTime: v.LiveTime,
Online: v.Online,
Playurl: v.Playurl,
AcceptQuality: v.AcceptQuality,
CurrentQuality: v.CurrentQuality,
PkId: v.PkId,
SpecialAttention: v.SpecialAttention,
Area: v.Area,
AreaName: v.AreaName,
AreaV2Id: v.AreaV2Id,
AreaV2Name: v.AreaV2Name,
AreaV2ParentName: v.AreaV2ParentName,
AreaV2ParentId: v.AreaV2ParentId,
BroadcastType: v.BroadcastType,
OfficialVerify: v.OfficialVerify,
Link: v.Link,
Cover: v.Cover,
PendentRu: v.PendentRu,
PendentRuColor: v.PendentRuColor,
PlayUrlH265: v.PlayUrlH265,
PendentRuPic: v.PendentRuPic}
i++
}
sort.Sort(p)
resp = p
return
}
// AppSortRuleGold implementation
// [app端关注二级页]按照送礼排序
func AppSortRuleGold(ctx context.Context, originResult *v1pb.LiveAnchorResp) (resp []*v1pb.LiveAnchorResp_Rooms) {
resp = make([]*v1pb.LiveAnchorResp_Rooms, 0)
if originResult == nil {
return
}
giftInfo, err := GetGiftInfo(ctx)
if err != nil {
log.Error("[LiveAnchor][FilterType][AppSortRuleGold]get_RelationGift_rpc_error")
resp = originResult.Rooms
return
}
if len(giftInfo) == 0 {
resp = AppSortRuleOnline(originResult)
return
}
respHasGold := make([]*v1pb.LiveAnchorResp_Rooms, 0)
respNoGold := make([]*v1pb.LiveAnchorResp_Rooms, 0)
GiftRank := make(map[int64]int64)
GiftNoGold := make([]int64, 0)
// 计算金瓜子排行榜,uid分key
for _, v := range originResult.Rooms {
roomUID := v.Uid
if _, exist := giftInfo[roomUID]; exist {
GiftRank[roomUID] += giftInfo[roomUID]
}
}
sorted := SortMap(GiftRank)
// 没有送礼的用户
for _, v := range originResult.Rooms {
if _, exist := GiftRank[v.Uid]; !exist {
GiftNoGold = append(GiftNoGold, v.Uid)
}
}
for _, vv := range sorted {
for _, v := range originResult.Rooms {
if v.Uid == vv.Key {
respHasGold = append(respHasGold, v)
}
}
}
for _, v := range originResult.Rooms {
for _, vv := range GiftNoGold {
if v.Uid == vv {
respNoGold = append(respNoGold, v)
}
}
}
tempLiveAnchor := &v1pb.LiveAnchorResp{}
tempLiveAnchor.Rooms = respNoGold
respNoGoldSorted := AppSortRuleOnline(tempLiveAnchor)
resp = append(resp, respHasGold...)
resp = append(resp, respNoGoldSorted...)
return
}

View File

@@ -0,0 +1,52 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"AppRelationFilterStrategy.go",
"AppRelationSortStrategy.go",
"Tools.go",
"rpcWraper.go",
],
importpath = "go-common/app/interface/live/app-interface/service/v1/relation",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/app-interface/api/http/v1:go_default_library",
"//app/interface/live/app-interface/conf:go_default_library",
"//app/interface/live/app-interface/dao:go_default_library",
"//app/service/live/av/api/liverpc/v1:go_default_library",
"//app/service/live/fans_medal/api/liverpc/v1:go_default_library",
"//app/service/live/live_data/api/liverpc/v1:go_default_library",
"//app/service/live/relation/api/liverpc/v1:go_default_library",
"//app/service/live/room/api/liverpc/v1:go_default_library",
"//app/service/live/room/api/liverpc/v2:go_default_library",
"//app/service/live/room_ex/api/liverpc/v1:go_default_library",
"//app/service/live/userext/api/liverpc/v1:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/metadata:go_default_library",
"//library/net/rpc/liverpc/context:go_default_library",
"//library/sync/errgroup:go_default_library",
"//vendor/github.com/pkg/errors:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,256 @@
package relation
import (
"context"
"encoding/json"
"go-common/library/net/metadata"
"sort"
"strconv"
)
// Pair ...
// 自定义map排序结构
type Pair struct {
Key int64
Value int64
}
// Gray ...
// 自定义灰度策略结构
type Gray struct {
Key string
Value int
}
// ErrLogStrut ...
// 自定义ErrLog结构
type ErrLogStrut struct {
Code int64
Msg string
ErrDesc string
ErrType string
URLName string
RPCTimeout int64
ChunkSize int64
ChunkNum int64
ErrorPtr *error
}
// GrayRule ...
// 自定义灰度策略
type GrayRule struct {
Name string `json:"name"`
Mark string `json:"mark"`
Value string `json:"value"`
}
// PairList ...
// 自定义灰度策略
type PairList []Pair
// GrayList ...
// 自定义灰度策略
type GrayList []Gray
// Swap
// 自定义排序
func (p PairList) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
// Len
// 自定义排序
func (p PairList) Len() int { return len(p) }
// Less
// 自定义排序
func (p PairList) Less(i, j int) bool { return p[i].Value > p[j].Value }
// Swap
// 自定义排序
func (p GrayList) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
// Len
// 自定义排序
func (p GrayList) Len() int { return len(p) }
// Less
// 自定义排序
func (p GrayList) Less(i, j int) bool { return p[i].Value < p[j].Value }
// SortMap ...
// 自定义排序
func SortMap(input map[int64]int64) (sorted PairList) {
p := make(PairList, len(input))
i := 0
for k, v := range input {
p[i] = Pair{k, v}
i++
}
sort.Sort(p)
sorted = p
return
}
const (
_androidBugBuildLeft = 5332000
_androidBugBuildRight = 5341000
)
// SortMapByValue ...
// 自定义排序
func SortMapByValue(m map[string]int) GrayList {
p := make(GrayList, len(m))
i := 0
for k, v := range m {
p[i] = Gray{k, v}
i++
}
sort.Sort(p)
return p
}
// RParseInt ...
// 转int
func RParseInt(inputStr string, defaultValue int64) (output int64) {
if mid, err := strconv.ParseInt(inputStr, 10, 64); err == nil {
output = mid
} else {
output = defaultValue
}
return
}
func RoleMap(role int8) (changeType int64) {
switch role {
case 0:
{
changeType = -1
}
case 1, 2:
{
changeType = 0
}
case 3, 4, 5, 6:
{
changeType = 1
}
default:
{
changeType = -1
}
}
return
}
// CheckReturn ...
// 检查返回
func CheckReturn(err error, code int64, msg string, urlName string,
rpcTimeout int64, chunkSize int64, chunkNum int64) (errLog *ErrLogStrut, success bool) {
errInfo := ErrLogStrut{}
errInfo.URLName = urlName
errInfo.RPCTimeout = rpcTimeout
errInfo.ChunkSize = chunkSize
errInfo.ChunkNum = chunkNum
success = true
if err != nil {
errInfo.Code = 1003000
errInfo.Msg = ""
errInfo.ErrDesc = "liveRpc调用失败"
errInfo.ErrType = "LiveRpcFrameWorkCallError"
errInfo.ErrorPtr = &err
success = false
} else if code != 0 {
errInfo.Code = code
errInfo.Msg = msg
errInfo.ErrDesc = "调用直播服务" + urlName + "出错"
errInfo.ErrType = "CallLiveRpcCodeError"
success = false
}
errLog = &errInfo
return
}
// App531ABTest ...
// ABTest
func App531ABTest(ctx context.Context, content string, build string, platform string) (grayType int64) {
buildIntValue := RParseInt(build, 534000)
if platform == "android" && buildIntValue > _androidBugBuildLeft && buildIntValue <= _androidBugBuildRight {
grayType = 0
return
}
if len(content) == 0 {
grayType = 0
return
}
resultMap := make(map[string]int64)
resultMap["double_small_card"] = 0
resultMap["card_not_auto_play"] = 1
resultMap["card_auto_play"] = 2
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 := scoreEnd[0] + scoreEnd[1]
score3 := 100
section1 := make(map[int]bool)
section2 := make(map[int]bool)
section3 := make(map[int]bool)
for section1Loop := 0; section1Loop < score1; section1Loop++ {
section1[section1Loop] = true
}
for sectionLoop2 := score1; sectionLoop2 < score2; sectionLoop2++ {
section2[sectionLoop2] = true
}
for sectionLoop3 := score2; sectionLoop3 < score3; sectionLoop3++ {
section3[sectionLoop3] = true
}
mid := GetUIDFromHeader(ctx)
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
}
}
if scoreEnd[2] != 0 {
if _, exist := section3[result]; exist {
grayType = resultMap[typeMap[2]]
return
}
}
grayType = 0
return
}
// GetUIDFromHeader ...
// 获取uid
func GetUIDFromHeader(ctx context.Context) (uid int64) {
midInterface, isUIDSet := metadata.Value(ctx, metadata.Mid).(int64) // 大多使用header里的mid解析, 框架已封装请求的header
mid := int64(0)
if isUIDSet {
mid = midInterface
}
uid = mid
return
}

View File

@@ -0,0 +1,704 @@
package relation
import (
"context"
"math"
"strconv"
"time"
"go-common/app/interface/live/app-interface/conf"
"go-common/app/interface/live/app-interface/dao"
avV1 "go-common/app/service/live/av/api/liverpc/v1"
fansMedalV1 "go-common/app/service/live/fans_medal/api/liverpc/v1"
liveDataV1 "go-common/app/service/live/live_data/api/liverpc/v1"
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"
roomExV1 "go-common/app/service/live/room_ex/api/liverpc/v1"
userExV1 "go-common/app/service/live/userext/api/liverpc/v1"
"go-common/library/ecode"
"go-common/library/log"
rpcCtx "go-common/library/net/rpc/liverpc/context"
"go-common/library/sync/errgroup"
"github.com/pkg/errors"
)
// ChunkCallInfo ...
// 日志结构体
type ChunkCallInfo struct {
ParamsName string
URLName string
ChunkSize int64
ChunkNum int64
RPCTimeout int64
}
const (
getStatusInfoByUfos = "room/v1/Room/get_status_info_by_uids"
targetsWithMedal = "fans_medal/v1/FansMedal/targetsWithMedal"
uuid2roomed = "room/v2/Room/room_id_by_uid_multi"
record = "live_data/v1/Record/get"
getPkIdsByRoomIds = "av/v1/Pk/getPkIdsByRoomIds"
roomPendent = "room/v1/RoomPendant/getPendantByIds"
roomNews = "/room_ex/v1/RoomNews/multiGet"
relationGiftInfo = "/relation/v1/BaseInfo/getGiftInfo"
// AccountGRPC ...
// 主站grpc用户信息
AccountGRPC = "Cards3"
// LiveUserExpGRPC ...
// 直播用户经验grpc
LiveUserExpGRPC = "xuserExp"
// FansNum ...
// 直播粉丝
FansNum = "GetUserFcBatch"
// LiveDomain implementation
// 域名
LiveDomain = "http://live.bilibili.com/"
// BoastURL implementation
// 秒开url
BoastURL = "?broadcast_type="
emptyResult = "调用直播服务返回data为空"
emptyResultEn = "got_empty_result"
// GoRoutingErr ...
// 协程wait错误
GoRoutingErr = "协程等待数据错误"
// App533CardType implementation
// 大卡类型
App533CardType = 1
// PendentMobileBadge implementation
// 角标类型
PendentMobileBadge = "mobile_index_badge"
// PendentPosition implementation
// 角标位置
PendentPosition = 2
// App531GrayRule implementation
// 灰度策略
App531GrayRule = "r_big_card"
// App536GrayRule implementation
// 灰度策略
App536GrayRule = "r_homepage_card536"
// SelfUID implementation
// 调试UID
SelfUID = 22973824
// DummyUIDEnable implementation
// 调试开
DummyUIDEnable = 1
)
// UIDs2roomIDs ...
// uid转换roomID,每批最大400
func UIDs2roomIDs(ctx context.Context, ufos []int64) (rolaids map[int64]int64, err error) {
rpcChunkSize, RPCTimeout, err := GetChunkInfo(uuid2roomed)
params := ChunkCallInfo{ParamsName: "ufos", URLName: uuid2roomed, ChunkSize: rpcChunkSize, RPCTimeout: RPCTimeout}
rolaids = make(map[int64]int64)
lens := len(ufos)
if lens <= 0 {
return
}
// 批次
params.ChunkNum = int64(math.Ceil(float64(lens) / float64(params.ChunkSize)))
chunkResult := make([]map[string]string, 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 = ufos[(x-1)*params.ChunkSize:]
} else {
chunkUfosIds = ufos[(x-1)*params.ChunkSize : x*params.ChunkSize]
}
ret, err := dao.RoomApi.V2Room.RoomIdByUidMulti(rpcCtx.WithTimeout(ctx, time.Duration(params.RPCTimeout)*time.Millisecond), &roomV2.RoomRoomIdByUidMultiReq{Uids: chunkUfosIds})
if err != nil {
ret = &roomV2.RoomRoomIdByUidMultiResp{}
ret.Code = -1
ret.Msg = "liveprc_error"
}
erelongInfo, success := CheckReturn(err, ret.Code, ret.Msg, uuid2roomed, params.RPCTimeout, params.ChunkSize, params.ChunkNum)
if !success {
if err != nil {
err = errors.WithMessage(ecode.PkIDRecordFrameWorkCallError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, chunkUfosIds)
}
return nil
}
if ret.Data == nil || len(ret.Data) <= 0 {
erelongInfo.ErrType = emptyResultEn
erelongInfo.ErrDesc = emptyResult
// log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
// erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, chunkUfosIds)
return nil
}
chunkResult[x-1] = ret.Data
return nil
})
}
if err := wg.Wait(); err != nil {
erelongInfo := ErrLogStrut{}
erelongInfo.ErrType = "GoRoutingWaitError"
erelongInfo.URLName = uuid2roomed
erelongInfo.ErrDesc = 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.RelationFrameWorkGoRoutingError, "GET SEA PATROL FAIL")
return nil, err
}
// 整理数据
for _, chunkItemList := range chunkResult {
for k, item := range chunkItemList {
if item != "" {
Index := RParseInt(k, 1)
itemInt := RParseInt(item, 1)
rolaids[Index] = itemInt
}
}
}
return
}
// GetRoomInfo ...
// 获取room信息
func GetRoomInfo(ctx context.Context, input *roomV1.RoomGetStatusInfoByUidsReq) (roomResult map[int64]*roomV1.RoomGetStatusInfoByUidsResp_RoomInfo, err error) {
rpcChunkSize, RPCTimeout, err := GetChunkInfo(getStatusInfoByUfos)
params := ChunkCallInfo{ParamsName: "uids", URLName: getStatusInfoByUfos, ChunkSize: rpcChunkSize, RPCTimeout: RPCTimeout}
roomResult = make(map[int64]*roomV1.RoomGetStatusInfoByUidsResp_RoomInfo)
lens := len(input.Uids)
if lens <= 0 {
return
}
// 批次
params.ChunkNum = int64(math.Ceil(float64(lens) / float64(params.ChunkSize)))
chunkResult := make([]map[int64]*roomV1.RoomGetStatusInfoByUidsResp_RoomInfo, 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 = input.Uids[(x-1)*params.ChunkSize:]
} else {
chunkUfosIds = input.Uids[(x-1)*params.ChunkSize : x*params.ChunkSize]
}
ret, err := dao.RoomApi.V1Room.GetStatusInfoByUids(rpcCtx.WithTimeout(ctx, time.Duration(params.RPCTimeout)*time.Millisecond), &roomV1.RoomGetStatusInfoByUidsReq{Uids: chunkUfosIds, FilterOffline: input.FilterOffline, NeedBroadcastType: input.NeedBroadcastType})
if err != nil {
if err != nil {
ret = &roomV1.RoomGetStatusInfoByUidsResp{}
ret.Code = -1
ret.Msg = "liveprc_error"
}
}
erelongInfo, success := CheckReturn(err, ret.Code, ret.Msg, getStatusInfoByUfos, params.RPCTimeout, params.ChunkSize, params.ChunkNum)
if !success {
if err != nil {
err = errors.WithMessage(ecode.PkIDRecordFrameWorkCallError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, chunkUfosIds)
} else {
err = errors.WithMessage(ecode.PkIDLiveRPCCodeError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, chunkUfosIds)
}
return nil
}
if ret.Data == nil || len(ret.Data) <= 0 {
erelongInfo.ErrType = emptyResultEn
erelongInfo.ErrDesc = emptyResult
// log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
// erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, chunkUfosIds)
return nil
}
chunkResult[x-1] = ret.Data
return nil
})
}
if err := wg.Wait(); err != nil {
erelongInfo := ErrLogStrut{}
erelongInfo.ErrType = "GoRoutingWaitError"
erelongInfo.URLName = getStatusInfoByUfos
erelongInfo.ErrDesc = 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.RoomFrameWorkGoRoutingError, "GET SEA PATROL FAIL")
return nil, err
}
// 整理数据
for _, chunkItemList := range chunkResult {
for _, item := range chunkItemList {
if item != nil {
roomResult[item.Uid] = item
}
}
}
return
}
// GetLastLiveTime ...
// 获取Record信息
func GetLastLiveTime(ctx context.Context, rolaids []int64) (literature map[string]string, err error) {
rpcChunkSize, RPCTimeout, err := GetChunkInfo(record)
params := ChunkCallInfo{ParamsName: "rolaids", URLName: record, ChunkSize: rpcChunkSize, RPCTimeout: RPCTimeout}
literature = make(map[string]string)
lens := len(rolaids)
if lens <= 0 {
return
}
// 批次
params.ChunkNum = int64(math.Ceil(float64(lens) / float64(params.ChunkSize)))
chunkResult := make([]map[string]*liveDataV1.RecordGetResp_TimeInfo, params.ChunkNum)
wg, _ := errgroup.WithContext(ctx)
for i := int64(1); i <= params.ChunkNum; i++ {
x := i
wg.Go(func() error {
chunkRoomIds := make([]int64, 20)
if x == params.ChunkNum {
chunkRoomIds = rolaids[(x-1)*params.ChunkSize:]
} else {
chunkRoomIds = rolaids[(x-1)*params.ChunkSize : x*params.ChunkSize]
}
ret, err := dao.LiveDataApi.V1Record.Get(rpcCtx.WithTimeout(ctx, time.Duration(params.RPCTimeout)*time.Millisecond), &liveDataV1.RecordGetReq{Roomids: chunkRoomIds})
if err != nil {
if err != nil {
ret = &liveDataV1.RecordGetResp{}
ret.Code = -1
ret.Msg = "liveprc_error"
}
}
erelongInfo, success := CheckReturn(err, ret.Code, ret.Msg, record, params.RPCTimeout, params.ChunkSize, params.ChunkNum)
if !success {
if err != nil {
err = errors.WithMessage(ecode.PkIDRecordFrameWorkCallError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, chunkRoomIds)
} else {
err = errors.WithMessage(ecode.PkIDLiveRPCCodeError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, chunkRoomIds)
}
return nil
}
if ret.Data == nil || len(ret.Data) <= 0 {
erelongInfo.ErrType = emptyResultEn
erelongInfo.ErrDesc = emptyResult
// log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
// erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, chunkRoomIds)
return nil
}
// chunkResult = append(chunkResult, ret.Data)
chunkResult[x-1] = ret.Data
return nil
})
}
if err := wg.Wait(); err != nil {
erelongInfo := ErrLogStrut{}
erelongInfo.ErrType = "GoRoutingWaitError"
erelongInfo.URLName = record
erelongInfo.ErrDesc = 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.RecordFrameWorkGoRoutingError, "GET SEA PATROL FAIL")
return nil, err
}
// 整理数据
for _, chunkItemList := range chunkResult {
for k, item := range chunkItemList {
if item != nil {
literature[k] = item.RecentEndTime
}
}
}
return
}
// GetRoomNewsInfo ...
// 获取公告信息
func GetRoomNewsInfo(ctx context.Context, rolaids *roomExV1.RoomNewsMultiGetReq) (roomNewsResult map[int64]*roomExV1.RoomNewsMultiGetResp_Data, err error) {
rpcChunkSize, RPCTimeout, err := GetChunkInfo(roomNews)
params := ChunkCallInfo{ParamsName: "rolaids", URLName: roomNews, ChunkSize: rpcChunkSize, RPCTimeout: RPCTimeout}
roomNewsResult = make(map[int64]*roomExV1.RoomNewsMultiGetResp_Data)
lens := len(rolaids.RoomIds)
if lens <= 0 {
return
}
// 批次
params.ChunkNum = int64(math.Ceil(float64(lens) / float64(params.ChunkSize)))
chunkResult := make([][]*roomExV1.RoomNewsMultiGetResp_Data, params.ChunkNum)
wg, _ := errgroup.WithContext(ctx)
for i := int64(1); i <= params.ChunkNum; i++ {
x := i
wg.Go(func() error {
chunkRoomIds := make([]int64, 20)
if x == params.ChunkNum {
chunkRoomIds = rolaids.RoomIds[(x-1)*params.ChunkSize:]
} else {
chunkRoomIds = rolaids.RoomIds[(x-1)*params.ChunkSize : x*params.ChunkSize]
}
ret, err := dao.RoomExtApi.V1RoomNews.MultiGet(rpcCtx.WithTimeout(ctx, time.Duration(params.RPCTimeout)*time.Millisecond), &roomExV1.RoomNewsMultiGetReq{RoomIds: chunkRoomIds, IsDecoded: rolaids.IsDecoded})
if err != nil {
if err != nil {
ret = &roomExV1.RoomNewsMultiGetResp{}
ret.Code = -1
ret.Msg = "liveprc_error"
}
}
erelongInfo, success := CheckReturn(err, ret.Code, ret.Msg, roomNews, params.RPCTimeout, params.ChunkSize, params.ChunkNum)
if !success {
if err != nil {
err = errors.WithMessage(ecode.PkIDRecordFrameWorkCallError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, chunkRoomIds)
} else {
err = errors.WithMessage(ecode.PkIDLiveRPCCodeError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, chunkRoomIds)
}
return nil
}
if ret.Data == nil {
erelongInfo.ErrType = emptyResultEn
erelongInfo.ErrDesc = emptyResult
// log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
// erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, chunkRoomIds)
return nil
}
chunkResult[x-1] = ret.Data
return nil
})
}
if err := wg.Wait(); err != nil {
erelongInfo := ErrLogStrut{}
erelongInfo.ErrType = "GoRoutingWaitError"
erelongInfo.URLName = roomNews
erelongInfo.ErrDesc = 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.RoomNewsFrameWorkGoRoutingError, "GET SEA PATROL FAIL")
return nil, err
}
// 整理数据
for _, chunkItemList := range chunkResult {
for _, item := range chunkItemList {
if item != nil {
if mid, err := strconv.ParseInt(item.Roomid, 10, 64); err == nil {
roomNewsResult[mid] = item
}
}
}
}
return
}
// GetRoomPendantInfo ...
// 获取角标信息
func GetRoomPendantInfo(ctx context.Context, req *roomV1.RoomPendantGetPendantByIdsReq) (roomNewsResult map[int64]*roomV1.RoomPendantGetPendantByIdsResp_Result, err error) {
rpcChunkSize, RPCTimeout, err := GetChunkInfo(roomPendent)
params := ChunkCallInfo{ParamsName: "ids", URLName: roomPendent, ChunkSize: rpcChunkSize, RPCTimeout: RPCTimeout}
roomNewsResult = make(map[int64]*roomV1.RoomPendantGetPendantByIdsResp_Result)
lens := len(req.Ids)
if lens <= 0 {
return
}
// 批次
params.ChunkNum = int64(math.Ceil(float64(lens) / float64(params.ChunkSize)))
chunkResult := make([]map[int64]*roomV1.RoomPendantGetPendantByIdsResp_Result, params.ChunkNum)
wg, _ := errgroup.WithContext(ctx)
for i := int64(1); i <= params.ChunkNum; i++ {
x := i
wg.Go(func() error {
chunkRoomIds := make([]int64, 20)
if x == params.ChunkNum {
chunkRoomIds = req.Ids[(x-1)*params.ChunkSize:]
} else {
chunkRoomIds = req.Ids[(x-1)*params.ChunkSize : x*params.ChunkSize]
}
ret, err := dao.RoomApi.V1RoomPendant.GetPendantByIds(rpcCtx.WithTimeout(ctx, time.Duration(params.RPCTimeout)*time.Millisecond), &roomV1.RoomPendantGetPendantByIdsReq{Ids: chunkRoomIds, Type: req.Type, Position: req.Position})
if err != nil {
if err != nil {
ret = &roomV1.RoomPendantGetPendantByIdsResp{}
ret.Code = -1
ret.Msg = "liveprc_error"
}
}
erelongInfo, success := CheckReturn(err, ret.Code, ret.Msg, roomPendent, params.RPCTimeout, params.ChunkSize, params.ChunkNum)
if !success {
if err != nil {
err = errors.WithMessage(ecode.PkIDRecordFrameWorkCallError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, chunkRoomIds)
} else {
err = errors.WithMessage(ecode.PkIDLiveRPCCodeError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, chunkRoomIds)
}
return nil
}
if ret.Data == nil {
erelongInfo.ErrType = emptyResultEn
erelongInfo.ErrDesc = emptyResult
return nil
}
chunkResult[x-1] = ret.Data.Result
return nil
})
}
if err := wg.Wait(); err != nil {
erelongInfo := ErrLogStrut{}
erelongInfo.ErrType = "GoRoutingWaitError"
erelongInfo.URLName = roomPendent
erelongInfo.ErrDesc = 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.RoomPendentFrameWorkGoRoutingError, "GET SEA PATROL FAIL")
return nil, err
}
// 整理数据
for _, chunkItemList := range chunkResult {
for k, item := range chunkItemList {
if item != nil {
roomNewsResult[k] = item
}
}
}
return
}
// GetPkID ...
// 获取PkId信息
func GetPkID(ctx context.Context, req *avV1.PkGetPkIdsByRoomIdsReq) (avResult map[string]int64, err error) {
rpcChunkSize, RPCTimeout, err := GetChunkInfo(getPkIdsByRoomIds)
params := ChunkCallInfo{ParamsName: "roomids", URLName: getPkIdsByRoomIds, ChunkSize: rpcChunkSize, RPCTimeout: RPCTimeout}
avResult = make(map[string]int64)
lens := len(req.RoomIds)
if lens <= 0 {
return
}
// 批次
params.ChunkNum = int64(math.Ceil(float64(lens) / float64(params.ChunkSize)))
chunkResult := make([]map[string]int64, params.ChunkNum)
wg, _ := errgroup.WithContext(ctx)
for i := int64(1); i <= params.ChunkNum; i++ {
x := i
wg.Go(func() error {
chunkRoomIds := make([]int64, 20)
if x == params.ChunkNum {
chunkRoomIds = req.RoomIds[(x-1)*params.ChunkSize:]
} else {
chunkRoomIds = req.RoomIds[(x-1)*params.ChunkSize : x*params.ChunkSize]
}
ret, err := dao.AvApi.V1Pk.GetPkIdsByRoomIds(rpcCtx.WithTimeout(ctx, time.Duration(params.RPCTimeout)*time.Millisecond), &avV1.PkGetPkIdsByRoomIdsReq{RoomIds: chunkRoomIds, Platform: req.Platform})
if err != nil {
if err != nil {
ret = &avV1.PkGetPkIdsByRoomIdsResp{}
ret.Code = -1
ret.Msg = "liveprc_error"
}
}
erelongInfo, success := CheckReturn(err, ret.Code, ret.Msg, getPkIdsByRoomIds, params.RPCTimeout, params.ChunkSize, params.ChunkNum)
if !success {
if err != nil {
err = errors.WithMessage(ecode.PkIDRecordFrameWorkCallError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, chunkRoomIds)
} else {
err = errors.WithMessage(ecode.PkIDLiveRPCCodeError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, chunkRoomIds)
}
return nil
}
if ret.Data == nil || len(ret.Data) <= 0 {
erelongInfo.ErrType = emptyResultEn
erelongInfo.ErrDesc = emptyResult
// log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
// erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, chunkRoomIds)
return nil
}
chunkResult[x-1] = ret.Data
return nil
})
}
if err := wg.Wait(); err != nil {
erelongInfo := ErrLogStrut{}
erelongInfo.ErrType = "GoRoutingWaitError"
erelongInfo.URLName = getPkIdsByRoomIds
erelongInfo.ErrDesc = 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.PkIDFrameWorkGoRoutingError, "GET SEA PATROL FAIL")
return nil, err
}
// 整理数据
for _, chunkItemList := range chunkResult {
for k, item := range chunkItemList {
avResult[k] = item
}
}
return
}
// GetFansMedal ...
// 获取粉丝勋章佩戴信息
func GetFansMedal(ctx context.Context, req *fansMedalV1.FansMedalTargetsWithMedalReq) (fansResult map[int64]bool, err error) {
rpcChunkSize, RPCTimeout, err := GetChunkInfo(targetsWithMedal)
params := ChunkCallInfo{ParamsName: "target_ids", URLName: targetsWithMedal, ChunkSize: rpcChunkSize, RPCTimeout: RPCTimeout}
fansResult = make(map[int64]bool)
lens := len(req.TargetIds)
if lens <= 0 {
return
}
// 批次
params.ChunkNum = int64(math.Ceil(float64(lens) / float64(params.ChunkSize)))
chunkResult := make([][]int64, params.ChunkNum)
wg, _ := errgroup.WithContext(ctx)
for i := int64(1); i <= params.ChunkNum; i++ {
x := i
wg.Go(func() error {
chunkRoomIds := make([]int64, 20)
if x == params.ChunkNum {
chunkRoomIds = req.TargetIds[(x-1)*params.ChunkSize:]
} else {
chunkRoomIds = req.TargetIds[(x-1)*params.ChunkSize : x*params.ChunkSize]
}
ret, err := dao.FansMedalApi.V1FansMedal.TargetsWithMedal(rpcCtx.WithTimeout(ctx, time.Duration(params.RPCTimeout)*time.Millisecond), &fansMedalV1.FansMedalTargetsWithMedalReq{Uid: req.Uid, TargetIds: chunkRoomIds})
if err != nil {
if err != nil {
ret = &fansMedalV1.FansMedalTargetsWithMedalResp{}
ret.Code = -1
ret.Msg = "liveprc_error"
}
}
erelongInfo, success := CheckReturn(err, ret.Code, ret.Msg, targetsWithMedal, params.RPCTimeout, params.ChunkSize, params.ChunkNum)
if !success {
if err != nil {
err = errors.WithMessage(ecode.PkIDRecordFrameWorkCallError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, chunkRoomIds)
} else {
err = errors.WithMessage(ecode.PkIDLiveRPCCodeError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, chunkRoomIds)
}
return nil
}
if ret.Data == nil || len(ret.Data) <= 0 {
erelongInfo.ErrType = emptyResultEn
erelongInfo.ErrDesc = emptyResult
// log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s"+"|Params:%v",
// erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName, chunkRoomIds)
return nil
}
chunkResult[x-1] = ret.Data
return nil
})
}
if err := wg.Wait(); err != nil {
erelongInfo := ErrLogStrut{}
erelongInfo.ErrType = "GoRoutingWaitError"
erelongInfo.URLName = targetsWithMedal
erelongInfo.ErrDesc = 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.FansMedalFrameWorkGoRoutingError, "GET SEA PATROL FAIL")
return nil, err
}
// 整理数据
for _, chunkItemList := range chunkResult {
for _, item := range chunkItemList {
fansResult[item] = true
}
}
return
}
// GetGrayRule ...
// 获取灰度规则信息
func GetGrayRule(ctx context.Context, req *userExV1.GrayRuleGetByMarkReq) (extResult *userExV1.GrayRuleGetByMarkResp_Data, err error) {
extResult = &userExV1.GrayRuleGetByMarkResp_Data{}
if req == nil {
return nil, nil
}
ret, err := dao.UserExtApi.V1GrayRule.GetByMark(ctx, req)
if err != nil {
log.Error("call_userExt_grayRule error,err:%v", err)
err = errors.WithMessage(ecode.GetGrayRuleError, "GET SEA PATROL FAIL")
return
}
extResult = ret.Data
return
}
// GetGiftInfo ...
// 获取送礼信息
func GetGiftInfo(ctx context.Context) (giftInfo map[int64]int64, err error) {
_, RPCTimeout, _ := GetChunkInfo(relationGiftInfo)
relationParams := &relationV1.BaseInfoGetGiftInfoReq{}
giftInfo = make(map[int64]int64)
ret, err := dao.RelationApi.V1BaseInfo.GetGiftInfo(ctx, relationParams)
if err != nil {
if err != nil {
ret = &relationV1.BaseInfoGetGiftInfoResp{}
ret.Code = -1
ret.Msg = "liveprc_error"
}
}
params := ChunkCallInfo{ParamsName: "", URLName: relationGiftInfo, ChunkSize: 1, RPCTimeout: RPCTimeout}
erelongInfo, success := CheckReturn(err, ret.Code, ret.Msg, "gift", params.RPCTimeout, params.ChunkSize, params.ChunkNum)
if !success {
if err != nil {
err = errors.WithMessage(ecode.PkIDRecordFrameWorkCallError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName)
} else {
err = errors.WithMessage(ecode.PkIDLiveRPCCodeError, "GET SEA PATROL FAIL")
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s",
err, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName)
}
return giftInfo, nil
}
if ret.Data == nil || len(ret.Data) < 0 {
erelongInfo.ErrType = emptyResultEn
erelongInfo.ErrDesc = emptyResult
// log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d",
// erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName)
return giftInfo, nil
}
for _, v := range ret.Data {
giftInfo[v.Mid] = v.Gold
}
return
}
// GetChunkInfo ...
// 获取分块信息
func GetChunkInfo(rpcName string) (rpcChunkSize int64, RPCTimeout int64, err error) {
rpcChunkSize = conf.GetChunkSize(rpcName, 20)
RPCTimeout = conf.GetTimeout(rpcName, 100)
return
}

View File

@@ -0,0 +1,97 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
go_library(
name = "go_default_library",
srcs = [
"activity_card.go",
"apprelationfilterstrategy.go",
"apprelationsortstrategy.go",
"common.go",
"daowrapper.go",
"index.go",
"live_rec.go",
"live_user.go",
"livehomepage.go",
"pic_list.go",
"rank.go",
"rec_pool.go",
"room_ex.go",
"room_list.go",
"sky_horse.go",
"tools.go",
],
importpath = "go-common/app/interface/live/app-interface/service/v2",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/app-interface/api/http/v1:go_default_library",
"//app/interface/live/app-interface/api/http/v2:go_default_library",
"//app/interface/live/app-interface/conf:go_default_library",
"//app/interface/live/app-interface/dao:go_default_library",
"//app/interface/live/app-interface/dao/account:go_default_library",
"//app/interface/live/app-interface/dao/av:go_default_library",
"//app/interface/live/app-interface/dao/fans_medal:go_default_library",
"//app/interface/live/app-interface/dao/live_data:go_default_library",
"//app/interface/live/app-interface/dao/live_user:go_default_library",
"//app/interface/live/app-interface/dao/rankdb:go_default_library",
"//app/interface/live/app-interface/dao/relation:go_default_library",
"//app/interface/live/app-interface/dao/room:go_default_library",
"//app/interface/live/app-interface/dao/room_ex:go_default_library",
"//app/interface/live/app-interface/dao/user_ext:go_default_library",
"//app/interface/live/app-interface/dao/xuser:go_default_library",
"//app/interface/live/app-interface/model:go_default_library",
"//app/interface/live/app-interface/service/v1:go_default_library",
"//app/interface/live/app-interface/service/v1/relation:go_default_library",
"//app/service/live/av/api/liverpc/v1:go_default_library",
"//app/service/live/fans_medal/api/liverpc/v1:go_default_library",
"//app/service/live/live_data/api/liverpc/v1:go_default_library",
"//app/service/live/live_user/api/liverpc/v1:go_default_library",
"//app/service/live/recommend/api/grpc/v1:go_default_library",
"//app/service/live/relation/api/liverpc/v1:go_default_library",
"//app/service/live/room/api/liverpc/v1:go_default_library",
"//app/service/live/room/api/liverpc/v2:go_default_library",
"//app/service/live/room_ex/api/liverpc/v1:go_default_library",
"//app/service/live/third_api/bvc:go_default_library",
"//app/service/live/userext/api/liverpc/v1:go_default_library",
"//app/service/live/xroom-feed/api:go_default_library",
"//app/service/live/xuser/api/grpc/v1:go_default_library",
"//app/service/main/account/api:go_default_library",
"//app/service/main/account/model:go_default_library",
"//app/service/main/account/rpc/client:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/metadata:go_default_library",
"//library/sync/errgroup:go_default_library",
"//library/xstr:go_default_library",
"//vendor/github.com/pkg/errors:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
go_test(
name = "go_default_test",
srcs = ["room_list_test.go"],
embed = [":go_default_library"],
tags = ["automanaged"],
deps = ["//app/interface/live/app-interface/conf:go_default_library"],
)

View File

@@ -0,0 +1,76 @@
package v2
import (
"context"
v2pb "go-common/app/interface/live/app-interface/api/http/v2"
)
// getActivityCard 活动模块
func (s *IndexService) getActivityCard(ctx context.Context) (resp []*v2pb.MActivityCard) {
resp = []*v2pb.MActivityCard{}
ids := s.getIdsFromModuleMap(ctx, []int64{_activityType})
if len(ids) <= 0 {
return
}
err, activityCardMap := s.roomDao.GetActivityCard(ctx, ids, "GetAllList")
if err != nil {
return
}
listMap := make(map[int64][]*v2pb.ActivityCardItem)
for i, ac := range activityCardMap {
respAc := &v2pb.ActivityCardItem{Room: []*v2pb.RoomCardItem{}, Av: []*v2pb.AvCardItem{}}
respAc.Card = &v2pb.BannerCardItem{
Aid: ac.Card.Aid,
Pic: ac.Card.Pic,
Title: ac.Card.Title,
Text: ac.Card.Text,
PicLink: ac.Card.PicLink,
GoLink: ac.Card.GoLink,
ButtonText: ac.Card.ButtonText,
Status: ac.Card.Status,
Sort: ac.Card.Sort,
}
if len(ac.Room) > 0 {
for _, room := range ac.Room {
roomCard := &v2pb.RoomCardItem{
IsLive: room.IsLive,
RoomId: room.Roomid,
Title: room.Title,
UName: room.Uname,
Online: room.Online,
Cover: room.Cover,
AreaV2ParentId: room.AreaV2ParentId,
AreaV2Id: room.AreaV2Id,
Sort: room.Sort,
}
respAc.Room = append(respAc.Room, roomCard)
}
}
if len(ac.Av) > 0 {
for _, av := range ac.Av {
avCard := &v2pb.AvCardItem{
Avid: av.Avid,
Title: av.Title,
ViewCount: av.ViewCount,
DanMaKu: av.Danmaku,
Duration: av.Duration,
Cover: av.Cover,
Sort: av.Sort,
}
respAc.Av = append(respAc.Av, avCard)
}
}
listMap[i] = append(listMap[i], respAc)
}
moduleInfoMap := s.getAllModuleInfoMap(ctx)
for _, m := range moduleInfoMap[_activityType] {
if l, ok := listMap[m.Id]; ok {
resp = append(resp, &v2pb.MActivityCard{
ModuleInfo: m,
List: l,
})
}
}
return
}

View File

@@ -0,0 +1,64 @@
package v2
import (
"context"
v1pb "go-common/app/interface/live/app-interface/api/http/v1"
fansMedalV1 "go-common/app/service/live/fans_medal/api/liverpc/v1"
"go-common/library/log"
)
// const (
// // AppFilterDefault implementation
// // 默认排序
// AppFilterDefault = 0
// // AppFilterFansMedal implementation
// // 只看我有粉丝勋章的
// AppFilterFansMedal = 1
// // AppFilterGoldType implementation
// // 按照金瓜子排序
// AppFilterGoldType = 2
// )
// AppFilterRuleFansMedal implementation
// [app端关注二级页]过滤粉丝勋章
func (s *IndexService) AppFilterRuleFansMedal(ctx context.Context, originResult *v1pb.LiveAnchorResp, targetUIDs []int64) (resp []*v1pb.LiveAnchorResp_Rooms, err error) {
uid := GetUIDFromHeader(ctx)
resp = make([]*v1pb.LiveAnchorResp_Rooms, 0)
if originResult == nil || len(originResult.Rooms) == 0 {
return
}
fansParams := &fansMedalV1.FansMedalTargetsWithMedalReq{Uid: uid, TargetIds: targetUIDs}
hasMedalUIDs, err := s.GetFansMedal(ctx, fansParams)
if err != nil {
log.Error("[LiveAnchor][FilterType]get_FansMedal_rpc_error")
resp = originResult.Rooms
return
}
for _, v := range originResult.Rooms {
if _, exist := hasMedalUIDs[v.Uid]; exist {
resp = append(resp, v)
}
}
return
}
// AppFilterGold implementation
// [app端关注二级页]过滤送礼
func (s *IndexService) AppFilterGold(ctx context.Context, originResult *v1pb.LiveAnchorResp) (resp []*v1pb.LiveAnchorResp_Rooms, err error) {
giftInfo, err := GetGiftInfo(ctx)
resp = make([]*v1pb.LiveAnchorResp_Rooms, 0)
if originResult == nil || len(originResult.Rooms) == 0 {
return
}
if err != nil {
log.Error("[LiveAnchor][FilterType]get_RelationGift_rpc_error")
resp = originResult.Rooms
return
}
for _, v := range originResult.Rooms {
if _, exist := giftInfo[v.Uid]; exist {
resp = append(resp, v)
}
}
return
}

View File

@@ -0,0 +1,229 @@
package v2
import (
"context"
v2pb "go-common/app/interface/live/app-interface/api/http/v2"
"go-common/library/log"
"sort"
)
// const (
// // AppSortDefaultT ...
// // 默认排序
// AppSortDefaultT = 0
// // AppSortRuleLiveTimeT ...
// // 开播时间倒序
// AppSortRuleLiveTimeT = 1
// // AppSortRuleOnlineT ...
// // 人气值倒序
// AppSortRuleOnlineT = 2
// // AppSortRuleGoldT ...
// // 金瓜子倒序
// AppSortRuleGoldT = 3
// )
// SendGift ...
// [app端关注二级页]按照金瓜子排序结构
type SendGift struct {
Mid int64
gold int64
}
// SortLiveTime ... implementation
// [app端关注二级页]按照开播时间排序
type SortLiveTime []*v2pb.MyIdolItem
// SortOnlineTime ... implementation
// [app端关注二级页]按照房间人气值排序
type SortOnlineTime []*v2pb.MyIdolItem
// SortUIDGift ... implementation
// [app端关注二级页]按照送礼排序
type SortUIDGift []SendGift
// AppSortRuleLiveTime implementation
// [app端关注二级页]按照开播时间排序
func (p SortLiveTime) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
// AppSortRuleLiveTime implementation
// [app端关注二级页]按照开播时间排序
func (p SortLiveTime) Len() int { return len(p) }
// AppSortRuleLiveTime implementation
// [app端关注二级页]按照开播时间排序
func (p SortLiveTime) Less(i, j int) bool { return p[i].LiveTime > p[j].LiveTime }
// AppSortRuleLiveTime implementation
// [app端关注二级页]按照开播时间排序
func (p SortOnlineTime) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
// AppSortRuleLiveTime implementation
// [app端关注二级页]按照开播时间排序
func (p SortOnlineTime) Len() int { return len(p) }
// AppSortRuleLiveTime implementation
// [app端关注二级页]按照开播时间排序
func (p SortOnlineTime) Less(i, j int) bool { return p[i].Online > p[j].Online }
// Swap
// [app端关注二级页]自定义排序结构
func (p SortUIDGift) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
// Len
// [app端关注二级页]自定义排序结构
func (p SortUIDGift) Len() int { return len(p) }
// Less
// [app端关注二级页]自定义排序结构
func (p SortUIDGift) Less(i, j int) bool { return p[i].gold > p[j].gold }
// AppSortRuleLiveTime implementation
// [app端关注二级页]按照开播时间排序
func (s *IndexService) AppSortRuleLiveTime(originResult []*v2pb.MyIdolItem) (resp []*v2pb.MyIdolItem) {
resp = make([]*v2pb.MyIdolItem, 0)
if originResult == nil {
return
}
p := make(SortLiveTime, len(originResult))
i := 0
for _, v := range originResult {
p[i] = &v2pb.MyIdolItem{
Roomid: v.Roomid,
Uid: v.Uid,
Uname: v.Uname,
Face: v.Face,
Title: v.Title,
LiveTagName: v.LiveTagName,
LiveTime: v.LiveTime,
Online: v.Online,
PlayUrl: v.PlayUrl,
AcceptQuality: v.AcceptQuality,
CurrentQuality: v.CurrentQuality,
PkId: v.PkId,
SpecialAttention: v.SpecialAttention,
Area: v.Area,
AreaName: v.AreaName,
AreaV2Id: v.AreaV2Id,
AreaV2Name: v.AreaV2Name,
AreaV2ParentName: v.AreaV2ParentName,
AreaV2ParentId: v.AreaV2ParentId,
BroadcastType: v.BroadcastType,
OfficialVerify: v.OfficialVerify,
Link: v.Link,
Cover: v.Cover,
PendentRu: v.PendentRu,
PendentRuColor: v.PendentRuColor,
PendentRuPic: v.PendentRuPic}
i++
}
sort.Sort(p)
resp = p
return
}
// AppSortRuleOnline implementation
// [app端关注二级页]按照人气值排序
func AppSortRuleOnline(originResult []*v2pb.MyIdolItem) (resp []*v2pb.MyIdolItem) {
resp = make([]*v2pb.MyIdolItem, 0)
if originResult == nil {
return
}
p := make(SortOnlineTime, len(originResult))
i := 0
for _, v := range originResult {
p[i] = &v2pb.MyIdolItem{
Roomid: v.Roomid,
Uid: v.Uid,
Uname: v.Uname,
Face: v.Face,
Title: v.Title,
LiveTagName: v.LiveTagName,
LiveTime: v.LiveTime,
Online: v.Online,
PlayUrl: v.PlayUrl,
AcceptQuality: v.AcceptQuality,
CurrentQuality: v.CurrentQuality,
PkId: v.PkId,
SpecialAttention: v.SpecialAttention,
Area: v.Area,
AreaName: v.AreaName,
AreaV2Id: v.AreaV2Id,
AreaV2Name: v.AreaV2Name,
AreaV2ParentName: v.AreaV2ParentName,
AreaV2ParentId: v.AreaV2ParentId,
BroadcastType: v.BroadcastType,
OfficialVerify: v.OfficialVerify,
Link: v.Link,
Cover: v.Cover,
PendentRu: v.PendentRu,
PlayUrlH265: v.PlayUrlH265,
PendentRuColor: v.PendentRuColor,
PendentRuPic: v.PendentRuPic}
i++
}
sort.Sort(p)
resp = p
return
}
// AppSortRuleGold implementation
// [app端关注二级页]按照送礼排序
func (s *IndexService) AppSortRuleGold(ctx context.Context, originResult *v2pb.MMyIdol) (resp []*v2pb.MyIdolItem) {
resp = make([]*v2pb.MyIdolItem, 0)
if originResult == nil {
return
}
giftInfo, err := GetGiftInfo(ctx)
if err != nil {
log.Error("[LiveAnchor][FilterType][AppSortRuleGold]get_RelationGift_rpc_error")
resp = originResult.List
return
}
if len(giftInfo) == 0 {
resp = AppSortRuleOnline(originResult.List)
return
}
respHasGold := make([]*v2pb.MyIdolItem, 0)
respNoGold := make([]*v2pb.MyIdolItem, 0)
GiftRank := make(map[int64]int64)
GiftNoGold := make([]int64, 0)
// 计算金瓜子排行榜,uid分key
for _, v := range originResult.List {
roomUID := v.Uid
if _, exist := giftInfo[roomUID]; exist {
GiftRank[roomUID] += giftInfo[roomUID]
}
}
sorted := SortMap(GiftRank)
// 没有送礼的用户
for _, v := range originResult.List {
if _, exist := GiftRank[v.Uid]; !exist {
GiftNoGold = append(GiftNoGold, v.Uid)
}
}
for _, vv := range sorted {
for _, v := range originResult.List {
if v.Uid == vv.Key {
respHasGold = append(respHasGold, v)
}
}
}
for _, v := range originResult.List {
for _, vv := range GiftNoGold {
if v.Uid == vv {
respNoGold = append(respNoGold, v)
}
}
}
tempLiveAnchor := &v2pb.MMyIdol{}
tempLiveAnchor.List = respNoGold
respNoGoldSorted := AppSortRuleOnline(tempLiveAnchor.List)
resp = append(resp, respHasGold...)
resp = append(resp, respNoGoldSorted...)
return
}

Some files were not shown because too many files have changed in this diff Show More