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,6 @@
# Owner
liuzhen
lidongyang
xiehaishen
zhaohailin
yangbaibing

12
app/interface/live/OWNERS Normal file
View File

@@ -0,0 +1,12 @@
# See the OWNERS docs at https://go.k8s.io/owners
approvers:
- lidongyang
- liuzhen
- xiehaishen
- yangbaibing
- zhaohailin
labels:
- interface
- live
- new-project

View File

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

View File

@@ -0,0 +1,3 @@
# v1.0.0
1. 上线功能xxx
2. 加个字段

View File

@@ -0,0 +1,11 @@
# Owner
liuzhen
wangyao
# Author
# Reviewer
liuzhen
yangbaibing

View File

@@ -0,0 +1,14 @@
# See the OWNERS docs at https://go.k8s.io/owners
approvers:
- liuzhen
- wangyao
labels:
- interface
- interface/live/app-blink
- live
options:
no_parent_owners: true
reviewers:
- liuzhen
- yangbaibing

View File

@@ -0,0 +1,16 @@
# app-blink
# 项目简介
1.项目规范:
(1) dao层 封装各个service层调用代码可公用
(2) service层 封装输出数据,实现接口本身业务逻辑
(3) model层 封装cache/db等基础组件
(4) 示例代码service/v1/room.go
# 编译环境
# 依赖包
# 编译执行

View File

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

View File

@@ -0,0 +1,56 @@
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 = ["appBlink.bm.go"],
embed = [":v1_go_proto"],
importpath = "go-common/app/interface/live/app-blink/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 = ["appBlink.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-blink/api/http/v1",
proto = ":v1_proto",
tags = ["automanaged"],
deps = ["@com_github_gogo_protobuf//gogoproto:go_default_library"],
)

View File

@@ -0,0 +1,32 @@
<!-- package=live.appblink.v1 -->
- [/xlive/app-blink/v1/banner/GetBlinkBanner](#xliveapp-blinkv1bannerGetBlinkBanner) 获取banner配置
## /xlive/app-blink/v1/banner/GetBlinkBanner
###获取banner配置
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|platform|是|string||
|build|是|string||
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"id": 0,
"title": "",
"jumpPath": "",
"jumpTime": 0,
"jumpPathType": 0,
"imageUrl": ""
}
}
```

View File

@@ -0,0 +1,161 @@
// Code generated by protoc-gen-bm v0.1, DO NOT EDIT.
// source: appBlink.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:
appBlink.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 PathSplashGetInfo = "/live.appblink.v1.Splash/GetInfo"
var PathBannerGetBlinkBanner = "/live.appblink.v1.Banner/GetBlinkBanner"
var PathRoomGetInfo = "/live.appblink.v1.Room/GetInfo"
var PathRoomCreate = "/live.appblink.v1.Room/Create"
var PathTopicGetTopicList = "/live.appblink.v1.Topic/GetTopicList"
var PathTopicCheckTopic = "/live.appblink.v1.Topic/CheckTopic"
// ================
// Splash Interface
// ================
type SplashBMServer interface {
}
var v1SplashSvc SplashBMServer
// RegisterSplashBMServer Register the blademaster route
func RegisterSplashBMServer(e *bm.Engine, server SplashBMServer) {
v1SplashSvc = server
}
// ================
// Banner Interface
// ================
type BannerBMServer interface {
}
var v1BannerSvc BannerBMServer
// RegisterBannerBMServer Register the blademaster route
func RegisterBannerBMServer(e *bm.Engine, server BannerBMServer) {
v1BannerSvc = server
}
// ==============
// Room Interface
// ==============
type RoomBMServer interface {
// 获取房间基本信息
// `method:"GET" midware:"auth"`
GetInfo(ctx context.Context, req *GetRoomInfoReq) (resp *GetRoomInfoResp, err error)
// 创建房间
// `method:"POST" midware:"auth"`
Create(ctx context.Context, req *CreateReq) (resp *CreateResp, err error)
}
var v1RoomSvc RoomBMServer
func roomGetInfo(c *bm.Context) {
p := new(GetRoomInfoReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1RoomSvc.GetInfo(c, p)
c.JSON(resp, err)
}
func roomCreate(c *bm.Context) {
p := new(CreateReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1RoomSvc.Create(c, p)
c.JSON(resp, err)
}
// RegisterV1RoomService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV1RoomService(e *bm.Engine, svc RoomBMServer, midMap map[string]bm.HandlerFunc) {
auth := midMap["auth"]
v1RoomSvc = svc
e.GET("/xlive/app-blink/v1/room/GetInfo", auth, roomGetInfo)
e.POST("/xlive/app-blink/v1/room/Create", auth, roomCreate)
}
// RegisterRoomBMServer Register the blademaster route
func RegisterRoomBMServer(e *bm.Engine, server RoomBMServer) {
v1RoomSvc = server
e.GET("/live.appblink.v1.Room/GetInfo", roomGetInfo)
e.POST("/live.appblink.v1.Room/Create", roomCreate)
}
// ===============
// Topic Interface
// ===============
type TopicBMServer interface {
// 获取话题列表
// `method:"GET" midware:"auth"`
GetTopicList(ctx context.Context, req *GetTopicListReq) (resp *GetTopicListResp, err error)
// 检验话题是否有效
// `method:"GET" midware:"auth"`
CheckTopic(ctx context.Context, req *CheckTopicReq) (resp *CheckTopicResp, err error)
}
var v1TopicSvc TopicBMServer
func topicGetTopicList(c *bm.Context) {
p := new(GetTopicListReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1TopicSvc.GetTopicList(c, p)
c.JSON(resp, err)
}
func topicCheckTopic(c *bm.Context) {
p := new(CheckTopicReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1TopicSvc.CheckTopic(c, p)
c.JSON(resp, err)
}
// RegisterV1TopicService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV1TopicService(e *bm.Engine, svc TopicBMServer, midMap map[string]bm.HandlerFunc) {
auth := midMap["auth"]
v1TopicSvc = svc
e.GET("/xlive/app-blink/v1/topic/GetTopicList", auth, topicGetTopicList)
e.GET("/xlive/app-blink/v1/topic/CheckTopic", auth, topicCheckTopic)
}
// RegisterTopicBMServer Register the blademaster route
func RegisterTopicBMServer(e *bm.Engine, server TopicBMServer) {
v1TopicSvc = server
e.GET("/live.appblink.v1.Topic/GetTopicList", topicGetTopicList)
e.GET("/live.appblink.v1.Topic/CheckTopic", topicCheckTopic)
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,107 @@
syntax = "proto3";
package live.appblink.v1;
option go_package = "v1";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
// 获取当前有效闪屏配置(客户端)
message GetInfoReq {
string platform = 1 [(gogoproto.moretags) = 'form:"platform" validate:"required"'];;
string build = 2 [(gogoproto.moretags) = 'form:"build" validate:"required"'];;
}
message GetInfoResp {
int64 id = 1 [(gogoproto.jsontag) = "id"];
string title = 2 [(gogoproto.jsontag) = "title"];
string jumpPath = 3 [(gogoproto.jsontag) = "jumpPath"];
int64 jumpTime = 4 [(gogoproto.jsontag) = "jumpTime"];
int64 jumpPathType = 5 [(gogoproto.jsontag) = "jumpPathType"];
string imageUrl = 6 [(gogoproto.jsontag) = "imageUrl"];
}
message GetRoomInfoResp {
int64 room_id = 1 [(gogoproto.jsontag) = 'room_id'];
int64 uid = 2 [(gogoproto.jsontag) = 'uid'];
string uname = 3 [(gogoproto.jsontag) = 'uname'];
string title = 4 [(gogoproto.jsontag) = 'title'];
string face = 5 [(gogoproto.jsontag) = 'face'];
string try_time = 7 [(gogoproto.jsontag) = 'try_time'];
int64 live_status = 8 [(gogoproto.jsontag) = 'live_status'];
string area_v2_name = 9 [(gogoproto.jsontag) = 'area_v2_name'];
int64 area_v2_id = 10 [(gogoproto.jsontag) = 'area_v2_id'];
int64 master_level = 11 [(gogoproto.jsontag) = 'master_level'];
int64 master_level_color = 12 [(gogoproto.jsontag) = 'master_level_color'];
int64 master_score = 13 [(gogoproto.jsontag) = 'master_score'];
int64 master_next_level = 14 [(gogoproto.jsontag) = 'master_next_level'];
int64 max_level = 15 [(gogoproto.jsontag) = 'max_level'];
int64 fc_num = 16 [(gogoproto.jsontag) = 'fc_num'];
int64 rcost = 17 [(gogoproto.jsontag) = 'rcost'];
int64 medal_status = 18 [(gogoproto.jsontag) = 'medal_status'];
string medal_name = 19 [(gogoproto.jsontag) = 'medal_name'];
int64 medal_rename_status = 20 [(gogoproto.jsontag) = 'medal_rename_status'];
int64 is_medal = 21 [(gogoproto.jsontag) = 'is_medal'];
string full_text = 22 [(gogoproto.jsontag) = 'full_text'];
int64 identify_status = 23 [(gogoproto.jsontag) = 'identify_status'];
int64 lock_status = 24 [(gogoproto.jsontag) = 'lock_status'];
string lock_time = 25 [(gogoproto.jsontag) = 'lock_time'];
int64 open_medal_level = 26 [(gogoproto.jsontag) = 'open_medal_level'];
int64 master_next_level_score = 27 [(gogoproto.jsontag) = 'master_next_level_score'];
int64 parent_id = 28 [(gogoproto.jsontag) = 'parent_id'];
string parent_name = 29 [(gogoproto.jsontag) = 'parent_name'];
}
message GetRoomInfoReq {
string platform = 1 [(gogoproto.moretags) = 'form:"platform" validate:"required"'];
}
message CreateResp {
string room_id = 1 [(gogoproto.jsontag) = 'room_id'];
}
message CreateReq {
string platform = 1 [(gogoproto.moretags) = 'form:"platform" validate:"required"'];
}
message GetTopicListReq {
string platform = 1 [(gogoproto.moretags) = 'form:"platform" validate:"required"'];
}
message GetTopicListResp {
repeated string topic_list = 1 [(gogoproto.jsontag) = 'topic_list'];
}
message CheckTopicReq {
string platform = 1 [(gogoproto.moretags) = 'form:"platform" validate:"required"'];
string topic = 2 [(gogoproto.moretags) = 'form:"topic" validate:"required"'];
}
message CheckTopicResp {
}
service Splash {
//获取有效闪屏配置
//`dynamic:"true"`
rpc GetInfo(GetInfoReq) returns (GetInfoResp);
}
service Banner {
//获取banner配置
//`dynamic:"true"`
rpc GetBlinkBanner(GetInfoReq) returns (GetInfoResp);
}
service Room {
//获取房间基本信息
//`method:"GET" midware:"auth"`
rpc GetInfo(GetRoomInfoReq) returns (GetRoomInfoResp);
//创建房间
//`method:"POST" midware:"auth"`
rpc Create(CreateReq) returns (CreateResp);
}
service Topic {
//获取话题列表
//`method:"GET" midware:"auth"`
rpc GetTopicList(GetTopicListReq) returns (GetTopicListResp);
//检验话题是否有效
//`method:"GET" midware:"auth"`
rpc CheckTopic(CheckTopicReq) returns (CheckTopicResp);
}

View File

@@ -0,0 +1,82 @@
<!-- package=live.appblink.v1 -->
- [/xlive/app-blink/v1/room/GetInfo](#xliveapp-blinkv1roomGetInfo) 获取房间基本信息
- [/xlive/app-blink/v1/room/Create](#xliveapp-blinkv1roomCreate) 创建房间
## /xlive/app-blink/v1/room/GetInfo
###获取房间基本信息
> 需要登录
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|platform|是|string||
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"room_id": 0,
"uid": 0,
"uname": "",
"title": "",
"face": "",
"try_time": "",
"live_status": 0,
"area_v2_name": "",
"area_v2_id": 0,
"master_level": 0,
"master_level_color": 0,
"master_score": 0,
"master_next_level": 0,
"max_level": 0,
"fc_num": 0,
"rcost": 0,
"medal_status": 0,
"medal_name": "",
"medal_rename_status": 0,
"is_medal": 0,
"full_text": "",
"identify_status": 0,
"lock_status": 0,
"lock_time": "",
"open_medal_level": 0,
"master_next_level_score": 0,
"parent_id": 0,
"parent_name": ""
}
}
```
## /xlive/app-blink/v1/room/Create
###创建房间
> 需要登录
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|platform|是|string||
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"room_id": ""
}
}
```

View File

@@ -0,0 +1,32 @@
<!-- package=live.appblink.v1 -->
- [/xlive/app-blink/v1/splash/GetInfo](#xliveapp-blinkv1splashGetInfo) 获取有效闪屏配置
## /xlive/app-blink/v1/splash/GetInfo
###获取有效闪屏配置
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|platform|是|string||
|build|是|string||
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"id": 0,
"title": "",
"jumpPath": "",
"jumpTime": 0,
"jumpPathType": 0,
"imageUrl": ""
}
}
```

View File

@@ -0,0 +1,57 @@
<!-- package=live.appblink.v1 -->
- [/xlive/app-blink/v1/topic/GetTopicList](#xliveapp-blinkv1topicGetTopicList) 获取话题列表
- [/xlive/app-blink/v1/topic/CheckTopic](#xliveapp-blinkv1topicCheckTopic) 检验话题是否有效
## /xlive/app-blink/v1/topic/GetTopicList
###获取话题列表
> 需要登录
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|platform|是|string||
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"topic_list": [
""
]
}
}
```
## /xlive/app-blink/v1/topic/CheckTopic
###检验话题是否有效
> 需要登录
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|platform|是|string||
|topic|是|string||
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
}
}
```

View File

@@ -0,0 +1,44 @@
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-blink/cmd",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/app-blink/conf:go_default_library",
"//app/interface/live/app-blink/server/http:go_default_library",
"//app/interface/live/app-blink/service: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,47 @@
package main
import (
"flag"
"os"
"os/signal"
"syscall"
"time"
"go-common/app/interface/live/app-blink/conf"
"go-common/app/interface/live/app-blink/server/http"
"go-common/app/interface/live/app-blink/service"
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-blink-interface start")
trace.Init(conf.Conf.Tracer)
defer trace.Close()
ecode.Init(conf.Conf.Ecode)
svc := service.New(conf.Conf)
http.Init(conf.Conf, svc)
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:
svc.Close()
log.Info("app-blink-interface exit")
time.Sleep(time.Second)
return
case syscall.SIGHUP:
default:
return
}
}
}

View File

@@ -0,0 +1,17 @@
[blink]
[httpClient]
key = "fb06a25c6338edbc"
secret = "fd10bd177559780c2e4a44f1fa47fa83"
dial = "100ms"
timeout = "5s"
keepAlive = "60s"
[httpClient.breaker]
window = "3s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[warden]
dial = "1s"
timeout = "1s"

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 = ["conf.go"],
importpath = "go-common/app/interface/live/app-blink/conf",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/conf: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/auth:go_default_library",
"//library/net/http/blademaster/middleware/verify: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,95 @@
package conf
import (
"errors"
"flag"
"github.com/BurntSushi/toml"
"go-common/library/conf"
ecode "go-common/library/ecode/tip"
"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"
"go-common/library/net/rpc/liverpc"
"go-common/library/net/rpc/warden"
"go-common/library/net/trace"
)
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
Ecode *ecode.Config
ResourceClient *warden.ClientConfig
LiveRpc map[string]*liverpc.ClientConfig
GrpcCli *warden.ClientConfig
Auth *auth.Config
HttpClient *bm.ClientConfig
}
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
}
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
}
const (
// APPKey to call main site api
APPKey = "fb06a25c6338edbc"
)

View File

@@ -0,0 +1,56 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"dao.go",
"fansMedal.go",
"mainAccount.go",
"mainFilter.go",
"relation.go",
"resource.go",
"room.go",
"user.go",
],
importpath = "go-common/app/interface/live/app-blink/dao",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/app-blink/conf:go_default_library",
"//app/service/live/fans_medal/api/liverpc:go_default_library",
"//app/service/live/fans_medal/api/liverpc/v1:go_default_library",
"//app/service/live/relation/api/liverpc:go_default_library",
"//app/service/live/relation/api/liverpc/v1:go_default_library",
"//app/service/live/resource/api/grpc/v1:go_default_library",
"//app/service/live/room/api/liverpc:go_default_library",
"//app/service/live/room/api/liverpc/v1:go_default_library",
"//app/service/live/user/api/liverpc:go_default_library",
"//app/service/live/user/api/liverpc/v3:go_default_library",
"//app/service/main/member/api: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",
"//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,69 @@
package dao
import (
"context"
"go-common/app/interface/live/app-blink/conf"
fans_medal_api "go-common/app/service/live/fans_medal/api/liverpc"
relation_api "go-common/app/service/live/relation/api/liverpc"
resource_cli "go-common/app/service/live/resource/api/grpc/v1"
room_api "go-common/app/service/live/room/api/liverpc"
user_api "go-common/app/service/live/user/api/liverpc"
member_cli "go-common/app/service/main/member/api"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/rpc/liverpc"
)
// Dao dao
type Dao struct {
c *conf.Config
RoomApi *room_api.Client
UserApi *user_api.Client
RelationApi *relation_api.Client
FansMedalApi *fans_medal_api.Client
memberCli member_cli.MemberClient
titansCli resource_cli.TitansClient
HttpCli *bm.Client
}
// New init mysql db
func New(c *conf.Config) (dao *Dao) {
dao = &Dao{
c: c,
RoomApi: room_api.New(getConf("room")),
UserApi: user_api.New(getConf("user")),
RelationApi: relation_api.New(getConf("relation")),
FansMedalApi: fans_medal_api.New(getConf("fans_medal")),
HttpCli: bm.NewClient(c.HttpClient),
}
MemberCli, err := member_cli.NewClient(c.GrpcCli)
if err != nil {
panic(err)
}
dao.memberCli = MemberCli
TitansCli, errTitans := resource_cli.NewClient(c.GrpcCli)
if errTitans != nil {
panic(err)
}
dao.titansCli = TitansCli
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
return nil
}
func getConf(appName string) *liverpc.ClientConfig {
c := conf.Conf.LiveRpc
if c != nil {
return c[appName]
}
return nil
}

View File

@@ -0,0 +1,30 @@
package dao
import (
"context"
"go-common/app/service/live/fans_medal/api/liverpc/v1"
"go-common/library/log"
)
//OpenFansMealLevel 开启粉丝勋章的主播等级
const OpenFansMealLevel = 10
// GetFansMedalInfo 获取粉丝勋章信息
func (d *Dao) GetFansMedalInfo(c context.Context, uid int64) (resp *v1.MedalQueryResp_Data, err error) {
reply, err := d.FansMedalApi.V1Medal.Query(c, &v1.MedalQueryReq{Uid: uid, Source: 1})
if err != nil {
log.Error("fansMedal_getFansMedalInfo_error:%v", err)
return
}
if reply.Code != 0 {
log.Error("fansMedal_getFansMedalInfo_error:%d,%s,%v", reply.Code, reply.Msg, reply.Data)
return
}
log.Info("fansMedal_getFansMedalInfo:%d,%s,$v", reply.Code, reply.Msg, reply.Data)
if reply.Data.IsNull {
resp = nil
}
resp = reply.Data
return
}

View File

@@ -0,0 +1,20 @@
package dao
import (
"context"
v12 "go-common/app/service/main/member/api"
"go-common/library/log"
)
// GetIdentityStatus 获取身份申请信息
func (d *Dao) GetIdentityStatus(c context.Context, mid int64) (resp int8, err error) {
reply, err := d.memberCli.RealnameApplyStatus(c, &v12.MemberMidReq{Mid: mid})
if err != nil {
log.Error("main_member_GetIdentityStatus_error:%v", err)
return
}
log.Info("main_member_GetIdentityStatus:%v", reply)
resp = reply.Status
return
}

View File

@@ -0,0 +1,91 @@
package dao
import (
"context"
"net/url"
"strconv"
"time"
"go-common/app/interface/live/app-blink/conf"
"go-common/app/service/live/room/api/liverpc/v1"
"go-common/library/ecode"
"go-common/library/log"
"go-common/library/net/metadata"
)
//FILTER_MPOST_URL 主站屏蔽词url
const FILTER_MPOST_URL = "http://api.bilibili.co/x/internal/filter/mpost"
//CheckMsgIsLegal ...
//area值:"live_danmu";"live_biaoti";"live_tag";"live_jianjie",;"live_xuyuanping"
func (d *Dao) CheckMsgIsLegal(c context.Context, msg string, area string, roomId int64) (resp bool, err error) {
if msg == "" || area == "" {
log.Error("checkMsgIsLegal_params_error:msg=%s;area=%s", msg, area)
return
}
uid, _ := metadata.Value(c, metadata.Mid).(int64)
filterReply, err := d.FilterSite(c, msg, area)
if err != nil {
err = ecode.CallMainFilterError
return
}
areaMap := map[string]int{"live_biaoti": 2, "live_tag": 3, "live_jianjie": 4, "live_xuyuanping": 5}
historyData := &v1.RoomMngSaveHistoryReq_List{}
historyDatas := &v1.RoomMngSaveHistoryReq{}
resp = false
for _, filterInfo := range filterReply {
level := filterInfo.Level
hit := filterInfo.Hit
msg := filterInfo.Msg
if level >= 20 {
resp = true
}
if roomId > 0 && level == 15 && hit != nil && areaMap[area] > 0 {
historyData.Area = int64(areaMap[area])
historyData.Uid = uid
historyData.Roomid = roomId
historyData.Content = msg
historyData.Status = 0
historyData.Oname = ""
}
historyDatas.List = append(historyDatas.List, historyData)
}
//保存命中审核的数据
d.RoomApi.V1RoomMng.SaveHistory(c, historyDatas)
return
}
type mpostData struct {
Level int `json:"level"`
Limit int `json:"limit"`
Hit map[string]interface{} `json:"hit"`
Msg string `json:"msg"`
}
//FilterSite 主站12月初grpc接口上线可以替换
func (d *Dao) FilterSite(c context.Context, msg string, area string) (resp []*mpostData, err error) {
var (
params = url.Values{}
ip = metadata.String(c, metadata.RemoteIP)
)
params.Set("appkey", conf.APPKey)
params.Set("msg", msg)
params.Set("ts", strconv.FormatInt(time.Now().Unix(), 10))
params.Set("area", area)
var res struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data []*mpostData `json:"data"`
}
if d.HttpCli.Post(c, FILTER_MPOST_URL, ip, params, &res); err != nil {
log.Error("filterSite:%v;params:%v;code:%d;msg:%s", err, params, res.Code, res.Msg)
return
}
if res.Code != 0 {
log.Error("filterSite:%v;code:%d;msg:%s", err, res.Code, res.Msg)
}
//接入sla
resp = res.Data
return
}

View File

@@ -0,0 +1,32 @@
package dao
import (
"context"
"github.com/pkg/errors"
"go-common/app/service/live/relation/api/liverpc/v1"
"go-common/library/log"
)
//GetUserFc 获取用户关注数
func (d *Dao) GetUserFc(c context.Context, uid int64) (res *v1.FeedGetUserFcResp_Data, err error) {
reply, err := d.RelationApi.V1Feed.GetUserFc(c, &v1.FeedGetUserFcReq{Follow: uid})
if err != nil {
log.Error("relation_GetUserFc_error:%v", err)
return
}
if reply.Code != 0 {
err = errors.New("code error")
log.Error("relation_gGetUserFc_error:%d,%s,%v", reply.Code, reply.Msg, reply.Data)
return
}
if reply.Data == nil {
err = errors.New("data error")
log.Error("relation_gGetUserFc_error:%d,%s,%v", reply.Code, reply.Msg, reply.Data)
return
}
log.Info("relation_gGetUserFc:%d,%s,$v", reply.Code, reply.Msg, reply.Data)
res = reply.Data
return
}

View File

@@ -0,0 +1,32 @@
package dao
import (
"context"
"encoding/json"
"go-common/app/service/live/resource/api/grpc/v1"
"go-common/library/log"
)
//TitansTeam 话题team值
const TitansTeam = 40
//TitansKeyword 话题标签值
const TitansKeyword = "topic"
//GetTopicList 获取话题列表
func (d *Dao) GetTopicList(c context.Context) (resp []string, err error) {
reply, err := d.titansCli.GetConfigByKeyword(c, &v1.GetConfigReq{Team: TitansTeam, Keyword: TitansKeyword})
if err != nil {
log.Error("main_member_GetIdentityStatus_error:%v", err)
return
}
log.Info("main_member_GetIdentityStatus:%v", reply)
resp = make([]string, 0)
e := json.Unmarshal([]byte(reply.Value), &resp)
if e != nil {
log.Error("GetTopicList_json_error:%v,res=%v,", e, reply.Value)
return
}
return
}

View File

@@ -0,0 +1,50 @@
package dao
import (
"context"
"go-common/app/service/live/room/api/liverpc/v1"
"go-common/library/log"
)
//PERMANENT_LOCK_TIME 永久封禁时间
const PERMANENT_LOCK_TIME = "2037-01-01 00:00:00"
//GetRoomInfosByUids ...
func (d *Dao) GetRoomInfosByUids(c context.Context, uid []int64) (res map[int64]*v1.RoomGetStatusInfoByUidsResp_RoomInfo, err error) {
reply, err := d.RoomApi.V1Room.GetStatusInfoByUids(c, &v1.RoomGetStatusInfoByUidsReq{
Uids: uid,
FilterOffline: 0,
ShowHidden: 1,
FilterIndexBlack: 0,
FilterVideo: 0,
NeedBroadcastType: 0,
})
if err != nil {
log.Error("room_getRoomInfosByUids_error:%v", err)
return
}
if reply.Code != 0 {
log.Error("room_getRoomInfosByUids_error:%d,%s,%v", reply.Code, reply.Msg, reply.Data)
return
}
log.Info("room_getRoomInfosByUids:%d,%s,%v", reply.Code, reply.Msg, reply.Data)
res = reply.Data
return
}
//CreateRoom ...
func (d *Dao) CreateRoom(c context.Context, uid int64) (res *v1.RoomMngCreateRoomResp_Data, err error) {
reply, err := d.RoomApi.V1RoomMng.CreateRoom(c, &v1.RoomMngCreateRoomReq{Uid: uid})
if err != nil {
log.Error("room_createRoom_error:%v", err)
return
}
if reply.Code != 0 {
log.Error("room_createRoom_error:%d,%s,%v", reply.Code, reply.Msg, reply.Data)
return
}
log.Info("room_createRoom:%d,%s,$v", reply.Code, reply.Msg, reply.Data)
res = reply.Data
return
}

View File

@@ -0,0 +1,27 @@
package dao
import (
"context"
"go-common/app/service/live/user/api/liverpc/v3"
"go-common/library/log"
)
//GetUserInfo 获取用户信息
func (d *Dao) GetUserInfo(c context.Context, uid []int64) (res map[int64]*v3.UserGetMultipleResp_UserInfo, err error) {
reply, err := d.UserApi.V3User.GetMultiple(c, &v3.UserGetMultipleReq{
Uids: uid,
Attributes: []string{"exp", "info"},
})
if err != nil {
log.Error("%v", err)
return
}
if reply.Code != 0 {
log.Error("user_getUserInfo_error:%d,%s,%v", reply.Code, reply.Msg, reply.Data)
return
}
log.Info("user_getUserInfo:%d,%s,%v", reply.Code, reply.Msg, reply.Data)
res = reply.Data
return
}

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 = ["model.go"],
importpath = "go-common/app/interface/live/app-blink/model",
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 model

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 = ["http.go"],
importpath = "go-common/app/interface/live/app-blink/server/http",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/app-blink/api/http/v1:go_default_library",
"//app/interface/live/app-blink/conf:go_default_library",
"//app/interface/live/app-blink/service:go_default_library",
"//app/interface/live/app-blink/service/v1:go_default_library",
"//app/service/live/resource/api/grpc/v1: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,94 @@
package http
import (
"net/http"
"go-common/library/net/http/blademaster/middleware/auth"
"go-common/app/interface/live/app-blink/api/http/v1"
"go-common/app/interface/live/app-blink/conf"
"go-common/app/interface/live/app-blink/service"
spSrv "go-common/app/interface/live/app-blink/service/v1"
resRpc "go-common/app/service/live/resource/api/grpc/v1"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/verify"
)
var (
srv *service.Service
vfy *verify.Verify
slSrv *spSrv.SplashService
bnSrv *spSrv.BannerService
roomSrv *spSrv.RoomService
midAuth *auth.Auth
topicSrv *spSrv.TopicService
)
// Init init
func Init(c *conf.Config, svc *service.Service) {
srv = svc
vfy = verify.New(c.Verify)
initService(c)
engine := bm.DefaultServer(c.BM)
route(engine)
if err := engine.Start(); err != nil {
log.Error("bm Start error(%v)", err)
panic(err)
}
}
func initService(c *conf.Config) {
slSrv = spSrv.NewSplashService(c)
bnSrv = spSrv.NewBannerService(c)
roomSrv = spSrv.NewRoomService(c)
midAuth = auth.New(c.Auth)
topicSrv = spSrv.NewTopicService(c)
}
func getInfo(ctx *bm.Context) {
p := new(resRpc.GetInfoReq)
if err := ctx.Bind(p); err != nil {
return
}
resp, err := slSrv.GetInfo(ctx, p)
ctx.JSON(resp, err)
}
func getBlinkBanner(ctx *bm.Context) {
p := new(resRpc.GetInfoReq)
if err := ctx.Bind(p); err != nil {
return
}
resp, err := bnSrv.GetBlinkBanner(ctx, p)
ctx.JSON(resp, err)
}
func route(e *bm.Engine) {
e.Ping(ping)
e.Register(register)
g := e.Group("/xlive/app-blink/v1")
{
g.GET("/start", vfy.Verify, howToStart)
}
g.GET("/splash/getInfo", getInfo)
g.GET("/banner/getBlinkBanner", getBlinkBanner)
v1.RegisterV1RoomService(e, roomSrv, map[string]bm.HandlerFunc{"auth": midAuth.User})
v1.RegisterV1TopicService(e, topicSrv, map[string]bm.HandlerFunc{"auth": midAuth.User})
}
func ping(c *bm.Context) {
if err := srv.Ping(c); err != nil {
log.Error("ping 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,35 @@
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-blink/service",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/app-blink/conf:go_default_library",
"//app/interface/live/app-blink/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-blink/service/v1:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,33 @@
package service
import (
"context"
"go-common/app/interface/live/app-blink/conf"
"go-common/app/interface/live/app-blink/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()
}

View File

@@ -0,0 +1,63 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
go_library(
name = "go_default_library",
srcs = [
"banner.go",
"room.go",
"splash.go",
"topic.go",
],
importpath = "go-common/app/interface/live/app-blink/service/v1",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/app-blink/api/http/v1:go_default_library",
"//app/interface/live/app-blink/conf:go_default_library",
"//app/interface/live/app-blink/dao:go_default_library",
"//app/service/live/resource/api/grpc/v1:go_default_library",
"//library/ecode:go_default_library",
"//library/net/metadata:go_default_library",
"//library/sync/errgroup: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 = [
"banner_test.go",
"room_test.go",
"splash_test.go",
"topic_test.go",
],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/live/app-blink/api/http/v1:go_default_library",
"//app/interface/live/app-blink/conf:go_default_library",
"//app/service/live/resource/api/grpc/v1:go_default_library",
"//library/net/metadata:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)

View File

@@ -0,0 +1,39 @@
package v1
import (
"context"
"go-common/app/interface/live/app-blink/conf"
rspb "go-common/app/service/live/resource/api/grpc/v1"
)
// BannerService struct
type BannerService struct {
conf *conf.Config
// optionally add other properties here, such as dao
// dao *dao.Dao
rsCli *rspb.Client
}
//NewBannerService init
func NewBannerService(c *conf.Config) (s *BannerService) {
s = &BannerService{
conf: c,
}
var svc *rspb.Client
var err error
if svc, err = rspb.NewClient(s.conf.ResourceClient); err != nil {
panic(err)
}
s.rsCli = svc
return s
}
// GetBlinkBanner implementation
// 获取banner配置
// `dynamic:"true"`
func (s *BannerService) GetBlinkBanner(ctx context.Context, req *rspb.GetInfoReq) (resp *rspb.GetInfoResp, err error) {
resp, err = s.rsCli.GetBlinkBanner(ctx, req)
return
}

View File

@@ -0,0 +1,36 @@
package v1
import (
"context"
"flag"
"fmt"
"testing"
"go-common/app/interface/live/app-blink/conf"
rspb "go-common/app/service/live/resource/api/grpc/v1"
. "github.com/smartystreets/goconvey/convey"
)
var s *BannerService
func init() {
flag.Set("conf", "../../cmd/test.toml")
if err := conf.Init(); err != nil {
panic(err)
}
s = NewBannerService(conf.Conf)
}
// DEPLOY_ENV=uat go test -run TestBannerService_GetBlinkBanner
func TestBannerService_GetBlinkBanner(t *testing.T) {
Convey("TestGetBlinkBanner", t, func() {
res, err := s.GetBlinkBanner(context.TODO(), &rspb.GetInfoReq{
Platform: "android",
Build: 53100,
})
fmt.Println(res, err)
t.Logf("%v,%s", res, err)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,162 @@
package v1
import (
"context"
v1pb "go-common/app/interface/live/app-blink/api/http/v1"
"go-common/app/interface/live/app-blink/conf"
"go-common/app/interface/live/app-blink/dao"
"go-common/library/ecode"
"go-common/library/net/metadata"
"go-common/library/sync/errgroup"
)
// RoomService struct
type RoomService struct {
conf *conf.Config
// optionally add other properties here, such as dao
dao *dao.Dao
}
//NewRoomService init
func NewRoomService(c *conf.Config) (s *RoomService) {
s = &RoomService{
conf: c,
dao: dao.New(c),
}
return s
}
// GetInfo implementation
// 获取房间基本信息
// `method:"GET" midware:"auth"`
func (s *RoomService) GetInfo(ctx context.Context, req *v1pb.GetRoomInfoReq) (resp *v1pb.GetRoomInfoResp, err error) {
uid, ok := metadata.Value(ctx, metadata.Mid).(int64)
if uid <= 0 || !ok {
err = ecode.UidError
return
}
uidArr := make([]int64, 0)
uidArr = append(uidArr, uid)
resp = &v1pb.GetRoomInfoResp{}
resp.Uid = uid
resp.FullText = "V等级5级或UP等级10级才能开通粉丝勋章哦~加油!"
resp.OpenMedalLevel = dao.OpenFansMealLevel
resp.MaxLevel = 40
eg := errgroup.Group{}
eg.Go(func() (err error) {
room, err := s.dao.GetRoomInfosByUids(ctx, uidArr)
if err != nil {
err = ecode.CallRoomError
return
}
roomInfo := room[uid]
if roomInfo == nil {
return
}
LockStatus := 0
//if roomInfo.LockTill >= dao.PERMANENT_LOCK_TIME {
// LockStatus = 1
//}
resp.RoomId = roomInfo.RoomId
resp.Title = roomInfo.Title
resp.LiveStatus = roomInfo.LiveStatus
resp.AreaV2Id = roomInfo.AreaV2Id
resp.AreaV2Name = roomInfo.AreaV2Name
resp.LockTime = roomInfo.LockTill
resp.LockStatus = int64(LockStatus)
resp.ParentId = roomInfo.AreaV2ParentId
resp.ParentName = roomInfo.AreaV2ParentName
return
})
eg.Go(func() (err error) {
user, err := s.dao.GetUserInfo(ctx, uidArr)
if err != nil {
err = ecode.CallUserError
return
}
if user == nil {
err = ecode.UserNotFound
return
}
userInfo, ok := user[uid]
if !ok {
err = ecode.UserNotFound
return
}
resp.Face = userInfo.GetInfo().GetFace()
resp.Uname = userInfo.GetInfo().GetUname()
if userInfo.Exp != nil {
resp.MasterScore = userInfo.Exp.Rcost / 100
if userInfo.Exp.MasterLevel != nil {
masterLevel := userInfo.Exp.MasterLevel.Level
masterNextLevel := masterLevel + 1
if masterNextLevel > 40 {
masterNextLevel = 40
}
resp.MasterLevel = masterLevel
resp.MasterLevelColor = userInfo.Exp.MasterLevel.Color
resp.MasterNextLevel = masterNextLevel
if len(userInfo.Exp.MasterLevel.Next) >= 2 {
resp.MasterNextLevelScore = userInfo.Exp.MasterLevel.Next[1]
}
}
}
return
})
eg.Go(func() (err error) {
relation, err := s.dao.GetUserFc(ctx, uid)
if err != nil {
err = ecode.CallRelationError
return
}
resp.FcNum = relation.Fc
return
})
eg.Go(func() (err error) {
fansMedal, err := s.dao.GetFansMedalInfo(ctx, uid)
if err != nil {
err = ecode.CallFansMedalError
return
}
if fansMedal == nil {
return
}
resp.IsMedal = fansMedal.MasterStatus
resp.MedalName = fansMedal.MedalName
resp.MedalRenameStatus = fansMedal.RenameStatus
resp.MedalStatus = fansMedal.Status
return
})
eg.Go(func() (err error) {
identifyStatus, err := s.dao.GetIdentityStatus(ctx, uid)
if err != nil {
err = ecode.CallMainMemberError
return
}
resp.IdentifyStatus = int64(identifyStatus)
return
})
err = eg.Wait()
return
}
// Create implementation
// 创建房间
// `method:"POST" midware:"auth"`
func (s *RoomService) Create(ctx context.Context, req *v1pb.CreateReq) (resp *v1pb.CreateResp, err error) {
uid, ok := metadata.Value(ctx, metadata.Mid).(int64)
if uid <= 0 || !ok {
err = ecode.UidError
return
}
resp = &v1pb.CreateResp{}
room, err := s.dao.CreateRoom(ctx, uid)
if err != nil {
err = ecode.CallRoomError
return
}
resp.RoomId = room.Roomid
return
}

View File

@@ -0,0 +1,55 @@
package v1
import (
"context"
"flag"
"fmt"
"testing"
"go-common/app/interface/live/app-blink/api/http/v1"
"go-common/library/net/metadata"
. "github.com/smartystreets/goconvey/convey"
"go-common/app/interface/live/app-blink/conf"
)
var room *RoomService
func init() {
flag.Set("conf", "../../cmd/test.toml")
if err := conf.Init(); err != nil {
panic(err)
}
room = NewRoomService(conf.Conf)
}
// group=qa01 DEPLOY_ENV=uat go test -run TestGetRoomInfo
func TestGetRoomInfo(t *testing.T) {
Convey("TestNewRoomService", t, func() {
ctx := metadata.NewContext(context.TODO(), metadata.MD{
metadata.Mid: int64(16299525),
})
res, err := room.GetInfo(ctx, &v1.GetRoomInfoReq{
Platform: "ios",
})
fmt.Println(1111, res, err, 22222)
t.Logf("%v,%s", res, err)
So(err, ShouldBeNil)
})
}
func TestCreate(t *testing.T) {
Convey("TestNewRoomService", t, func() {
ctx := metadata.NewContext(context.TODO(), metadata.MD{
metadata.Mid: int64(16299525),
})
res, err := room.Create(ctx, &v1.CreateReq{
Platform: "ios",
})
fmt.Println(1111, res, err, 22222)
t.Logf("%v,%s", res, err)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,39 @@
package v1
import (
"context"
"go-common/app/interface/live/app-blink/conf"
rspb "go-common/app/service/live/resource/api/grpc/v1"
)
// SplashService struct
type SplashService struct {
conf *conf.Config
// optionally add other properties here, such as dao
// dao *dao.Dao
rsCli *rspb.Client
}
//NewSplashService init
func NewSplashService(c *conf.Config) (s *SplashService) {
s = &SplashService{
conf: c,
}
var svc *rspb.Client
var err error
if svc, err = rspb.NewClient(s.conf.ResourceClient); err != nil {
panic(err)
}
s.rsCli = svc
return s
}
// GetInfo implementation
// 获取有效闪屏配置
// `dynamic:"true"`
func (s *SplashService) GetInfo(ctx context.Context, req *rspb.GetInfoReq) (resp *rspb.GetInfoResp, err error) {
resp, err = s.rsCli.GetInfo(ctx, req)
return
}

View File

@@ -0,0 +1,36 @@
package v1
import (
"context"
"flag"
"fmt"
"testing"
"go-common/app/interface/live/app-blink/conf"
rspb "go-common/app/service/live/resource/api/grpc/v1"
. "github.com/smartystreets/goconvey/convey"
)
var sp *SplashService
func init() {
flag.Set("conf", "../../cmd/test.toml")
if err := conf.Init(); err != nil {
panic(err)
}
sp = NewSplashService(conf.Conf)
}
// DEPLOY_ENV=uat go test -run TestNewSplashService
func TestNewSplashService(t *testing.T) {
Convey("TestNewSplashService", t, func() {
res, err := sp.GetInfo(context.TODO(), &rspb.GetInfoReq{
Platform: "android",
Build: 53100,
})
fmt.Println(res, err)
t.Logf("%v,%s", res, err)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,59 @@
package v1
import (
"context"
v1pb "go-common/app/interface/live/app-blink/api/http/v1"
"go-common/app/interface/live/app-blink/conf"
"go-common/app/interface/live/app-blink/dao"
"go-common/library/ecode"
)
// TopicService struct
type TopicService struct {
conf *conf.Config
// optionally add other properties here, such as dao
dao *dao.Dao
}
//NewTopicService init
func NewTopicService(c *conf.Config) (s *TopicService) {
s = &TopicService{
conf: c,
dao: dao.New(c),
}
return s
}
// GetTopicList implementation
// 获取话题列表
// `method:"GET" midware:"auth"`
func (s *TopicService) GetTopicList(ctx context.Context, req *v1pb.GetTopicListReq) (resp *v1pb.GetTopicListResp, err error) {
reply, err := s.dao.GetTopicList(ctx)
if err != nil {
err = ecode.CallResourceError
return
}
resp = &v1pb.GetTopicListResp{}
resp.TopicList = reply
return
}
// CheckTopic implementation
// 检验话题是否有效
// `method:"GET" midware:"auth"`
func (s *TopicService) CheckTopic(ctx context.Context, req *v1pb.CheckTopicReq) (resp *v1pb.CheckTopicResp, err error) {
msg := req.Topic
area := "live_biaoti"
reply, err := s.dao.CheckMsgIsLegal(ctx, msg, area, 0)
if err != nil {
err = ecode.Error(ecode.CallMainFilterError, "出错啦,再试试吧")
return
}
resp = &v1pb.CheckTopicResp{}
if reply {
err = ecode.Error(ecode.FILTERNOTPASS, "当前输入的话题里面包含敏感内容~请修改~")
return
}
return
}

View File

@@ -0,0 +1,55 @@
package v1
import (
"context"
"flag"
"fmt"
"testing"
"go-common/app/interface/live/app-blink/api/http/v1"
"go-common/library/net/metadata"
. "github.com/smartystreets/goconvey/convey"
"go-common/app/interface/live/app-blink/conf"
)
var topic *TopicService
func init() {
flag.Set("conf", "../../cmd/test.toml")
if err := conf.Init(); err != nil {
panic(err)
}
topic = NewTopicService(conf.Conf)
}
// group=qa01 DEPLOY_ENV=uat go test -run TestGetTopicList
func TestGetTopicList(t *testing.T) {
Convey("TestGetTopicList", t, func() {
ctx := metadata.NewContext(context.TODO(), metadata.MD{
metadata.Mid: int64(16299525),
})
res, err := topic.GetTopicList(ctx, &v1.GetTopicListReq{
Platform: "ios",
})
fmt.Println(1111, res, err, 22222)
t.Logf("%v,%s", res, err)
So(err, ShouldBeNil)
})
}
func TestCheckTopic(t *testing.T) {
Convey("TestCheckTopic", t, func() {
ctx := metadata.NewContext(context.TODO(), metadata.MD{
metadata.Mid: int64(16299525),
})
res, err := topic.CheckTopic(ctx, &v1.CheckTopicReq{
Platform: "ios",
Topic: "我是习",
})
fmt.Println(1111, res, err, 22222)
t.Logf("%v,%s", res, err)
})
}

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
}

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