Initial commit

This commit is contained in:
Donny
2019-04-22 20:46:32 +08:00
commit 49ab8aadd1
25441 changed files with 4055000 additions and 0 deletions

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/web-ucenter/api/http:all-srcs",
"//app/interface/live/web-ucenter/cmd:all-srcs",
"//app/interface/live/web-ucenter/conf:all-srcs",
"//app/interface/live/web-ucenter/dao:all-srcs",
"//app/interface/live/web-ucenter/model:all-srcs",
"//app/interface/live/web-ucenter/server/http:all-srcs",
"//app/interface/live/web-ucenter/service:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,11 @@
# v1.0.3
1.线上panic修复对应房间号没有房间信息
# v1.0.2
1.get_user_info接口获取account.profile.face进行http => https的schema替换
# v1.0.1
1.新增User.get_user_info接口
# v1.0.0
1. 上线功能xxx

View File

@@ -0,0 +1,9 @@
# Owner
wujunchen
kuangxibin
# Author
wujunchen
# Reviewer
xiehaishen

View File

@@ -0,0 +1,14 @@
# See the OWNERS docs at https://go.k8s.io/owners
approvers:
- kuangxibin
- wujunchen
labels:
- interface
- interface/live/web-ucenter
- live
options:
no_parent_owners: true
reviewers:
- wujunchen
- xiehaishen

View File

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

View File

@@ -0,0 +1,59 @@
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 = "http_proto",
srcs = ["user.proto"],
tags = ["automanaged"],
deps = ["@gogo_special_proto//github.com/gogo/protobuf/gogoproto"],
)
go_proto_library(
name = "http_go_proto",
compilers = ["@io_bazel_rules_go//proto:gogofast_grpc"],
importpath = "go-common/app/interface/live/web-ucenter/api/http",
proto = ":http_proto",
tags = ["automanaged"],
deps = ["@com_github_gogo_protobuf//gogoproto:go_default_library"],
)
go_library(
name = "go_default_library",
srcs = ["user.bm.go"],
embed = [":http_go_proto"],
importpath = "go-common/app/interface/live/web-ucenter/api/http",
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",
"//app/interface/live/web-ucenter/api/http/v1:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

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

View File

@@ -0,0 +1,59 @@
// Code generated by protoc-gen-bm v0.1, DO NOT EDIT.
// source: user.proto
/*
Package http 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:
user.proto
*/
package http
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 PathUserGetUserInfo = "/live.webucenter.User/get_user_info"
// ==============
// User Interface
// ==============
type UserBMServer interface {
// 根据uid查询用户信息
// `midware:"auth"`
GetUserInfo(ctx context.Context, req *GetInfoReq) (resp *GetInfoResp, err error)
}
var UserSvc UserBMServer
func userGetUserInfo(c *bm.Context) {
p := new(GetInfoReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := UserSvc.GetUserInfo(c, p)
c.JSON(resp, err)
}
// RegisterUserService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterUserService(e *bm.Engine, svc UserBMServer, midMap map[string]bm.HandlerFunc) {
auth := midMap["auth"]
UserSvc = svc
e.GET("/xlive/web-ucenter/user/get_user_info", auth, userGetUserInfo)
}
// RegisterUserBMServer Register the blademaster route
func RegisterUserBMServer(e *bm.Engine, server UserBMServer) {
e.GET("/live.webucenter.User/get_user_info", userGetUserInfo)
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,55 @@
syntax = "proto3";
package live.webucenter;
option go_package = "http";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
service User {
// 根据uid查询用户信息
// `midware:"auth"`
rpc get_user_info (GetInfoReq) returns (GetInfoResp);
}
// GetInfoReq get user info req, uid and platform get from header.metadata
message GetInfoReq {
// platform in url
string platform = 1 [(gogoproto.moretags) = 'form:"platform"'];
}
// GetInfoResp
message GetInfoResp {
// 用户uid
int64 uid = 1 [(gogoproto.jsontag) = "uid"];
// 用户名
string uname = 2 [(gogoproto.jsontag) = "uname"];
// 头像
string face = 3 [(gogoproto.jsontag) = "face"];
// 主站硬币
double coin = 4 [(gogoproto.jsontag) = "billCoin"];
// 用户银瓜子
int64 silver = 5 [(gogoproto.jsontag) = "silver"];
// 用户金瓜子
int64 gold = 6 [(gogoproto.jsontag) = "gold"];
// 用户成就点
int64 achieve = 7 [(gogoproto.jsontag) = "achieve"];
// 月费姥爷
int32 vip = 8 [(gogoproto.jsontag) = "vip", (gogoproto.casttype) = "int"];
// 年费姥爷
int32 svip = 9 [(gogoproto.jsontag) = "svip", (gogoproto.casttype) = "int"];
// 用户等级
int64 user_level = 10 [(gogoproto.jsontag) = "user_level"];
// 用户下一等级
int64 user_next_level = 11 [(gogoproto.jsontag) = "user_next_level"];
// 用户在当前等级已经获得的经验
int64 user_intimacy = 12 [(gogoproto.jsontag) = "user_intimacy"];
// 用户从当前等级升级到下一级所需总经验
int64 user_next_intimacy = 13 [(gogoproto.jsontag) = "user_next_intimacy"];
// 新增字段,判断用户是否达到满级 0:没有1:满级
int64 is_level_top = 14 [(gogoproto.jsontag) = "is_level_top"];
// 用户等级排名
string user_level_rank = 15 [(gogoproto.jsontag) = "user_level_rank"];
// 年返逻辑,已失效
int32 user_charged = 16 [(gogoproto.jsontag) = "user_charged", (gogoproto.casttype) = "int"];
}

View File

@@ -0,0 +1,59 @@
<!-- package=live.webucenter -->
- [/xlive/web-ucenter/user/get_user_info](#xliveweb-ucenteruserget_user_info) 根据uid查询用户信息
## /xlive/web-ucenter/user/get_user_info
### 根据uid查询用户信息
> 需要登录
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|platform|否|string| platform in url|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
// 用户uid
"uid": 0,
// 用户名
"uname": "",
// 头像
"face": "",
// 主站硬币
"billCoin": 0.1,
// 用户银瓜子
"silver": 0,
// 用户金瓜子
"gold": 0,
// 用户成就点
"achieve": 0,
// 月费姥爷
"vip": 0,
// 年费姥爷
"svip": 0,
// 用户等级
"user_level": 0,
// 用户下一等级
"user_next_level": 0,
// 用户在当前等级已经获得的经验
"user_intimacy": 0,
// 用户从当前等级升级到下一级所需总经验
"user_next_intimacy": 0,
// 新增字段,判断用户是否达到满级 0:没有1:满级
"is_level_top": 0,
// 用户等级排名
"user_level_rank": "",
// 年返逻辑,已失效
"user_charged": 0
}
}
```

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

View File

@@ -0,0 +1,187 @@
## (主播侧)-我的主播奖励(登录态)
> 需要登录
`GET http://api.live.bilibili.com/xlive/web-ucenter/v1/anchorTask/myReward`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|page|否|integer| 页数|
```json
{
"code": 0,
"message": "ok",
"data": {
"data": [
{
// id
"id": 0,
// 奖励类型 1:ss推荐卡 2:s推荐卡、任意门
"reward_type": 0,
// 1:未使用,3:已使用,5:已过期
"status": 0,
// 奖励id
"reward_id": 0,
// 奖励名称
"name": "",
// 奖励图标
"icon": "",
// 获得时间datetime
"achieve_time": "",
// 过期时间datetime
"expire_time": "",
// 来源,1:主播任务,2:小时榜
"source": 0,
// 奖励简介
"reward_intro": ""
}
],
"page": {
// 当前页码
"page": 0,
// 每页大小
"page_size": 0,
// 总页数
"total_page": 0,
// 总记录数
"total_count": 0
},
// 过期奖励数量
"expire_count": 0
}
}
```
## (主播侧)-奖励使用记录(登录态)
> 需要登录
`GET http://api.live.bilibili.com/xlive/web-ucenter/v1/anchorTask/useRecord`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|page|否|integer| 页数|
```json
{
"code": 0,
"message": "ok",
"data": {
"data": [
{
// id
"id": 0,
// 奖励id
"reward_id": 0,
// 1:未使用,3:已使用,5:已过期
"status": 0,
// 奖励名称
"name": "",
// 奖励图标
"icon": "",
// 获得时间datetime
"achieve_time": "",
// 过期时间datetime
"expire_time": "",
// 来源,1:主播任务,2:小时榜
"source": 0,
// 奖励简介
"reward_intro": "",
// 获得时间datetime
"use_time": ""
}
],
"page": {
// 当前页码
"page": 0,
// 每页大小
"page_size": 0,
// 总页数
"total_page": 0,
// 总记录数
"total_count": 0
}
}
}
```
## (主播侧)-使用奖励(登录态)
> 需要登录
`POST http://api.live.bilibili.com/xlive/web-ucenter/v1/anchorTask/useReward`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|id|否|integer| 奖励列表id|
|platform|否|string| 使用平台|
```json
{
"code": 0,
"message": "ok",
"data": {
"result": 0
}
}
```
## (主播侧)-奖励和任务红点(登录态)
> 需要登录
`GET http://api.live.bilibili.com/xlive/web-ucenter/v1/anchorTask/isViewed`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
```json
{
"code": 0,
"message": "ok",
"data": {
// 是否展示任务红点
"task_should_notice": 0,
// 是否展示奖励入口
"show_reward_entry": 0,
// 是否展示奖励红点
"reward_should_notice": 0,
// 任务状态, 0:没有,1:领取, 5:完成
"task_status": 0,
// 是否在首页黑名单中
"is_blacked": 0,
// 点击跳转h5链接
"url": ""
}
}
```
## (主播侧)-添加主播奖励(内部接口)
`POST http://api.live.bilibili.com/xlive/internal/web-ucenter/v1/anchorTask/addReward`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|reward_id|否|integer| 奖励id, 1:任意门|
|roomid|否|integer| 房间号|
|source|否|integer| 来源,1:主播任务,2:小时榜|
|uid|否|integer| 主播uid|
|order_id|否|string| 流水单号|
```json
{
"code": 0,
"message": "ok",
"data": {
"result": 0
}
}
```

View File

@@ -0,0 +1,58 @@
## 根据uid查询直播关键历史记录
> 需要登录
`GET http://api.live.bilibili.com/xlive/web-ucenter/v1/history/get_history_by_uid`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
```json
{
"code": 0,
"message": "ok",
"data": {
"title": "",
"count": 0,
"list": [
{
"roomid": 0,
"uid": 0,
"uname": "",
"user_cover": "",
"title": "",
"face": "",
"tags": "",
"live_status": 0,
"fans_num": 0,
"is_attention": 0,
"area_v2_id": 0,
"area_v2_name": "",
"area_v2_parent_name": "",
"area_v2_parent_id": 0
}
]
}
}
```
## 删除直播历史记录
> 需要登录
`POST http://api.live.bilibili.com/xlive/web-ucenter/v1/history/del_history`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
```json
{
"code": 0,
"message": "ok",
"data": {
}
}
```

View File

@@ -0,0 +1,215 @@
<!-- package=live.webucenter.v1 -->
- [/xlive/web-ucenter/v1/anchorTask/myReward](#xliveweb-ucenterv1anchorTaskmyReward) (主播侧)-我的主播奖励(登录态)
- [/xlive/web-ucenter/v1/anchorTask/useRecord](#xliveweb-ucenterv1anchorTaskuseRecord) (主播侧)-奖励使用记录(登录态)
- [/xlive/web-ucenter/v1/anchorTask/useReward](#xliveweb-ucenterv1anchorTaskuseReward) (主播侧)-使用奖励(登录态)
- [/xlive/web-ucenter/v1/anchorTask/isViewed](#xliveweb-ucenterv1anchorTaskisViewed) (主播侧)-奖励和任务红点(登录态)
- [/xlive/internal/web-ucenter/v1/anchorTask/addReward](#xliveinternalweb-ucenterv1anchorTaskaddReward) (主播侧)-添加主播奖励(内部接口)
## /xlive/web-ucenter/v1/anchorTask/myReward
### (主播侧)-我的主播奖励(登录态)
> 需要登录
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|page|否|integer| 页数|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"data": [
{
// id
"id": 0,
// 奖励类型 1:ss推荐卡 2:s推荐卡、任意门
"reward_type": 0,
// 1:未使用,3:已使用,5:已过期
"status": 0,
// 奖励id
"reward_id": 0,
// 奖励名称
"name": "",
// 奖励图标
"icon": "",
// 获得时间datetime
"achieve_time": "",
// 过期时间datetime
"expire_time": "",
// 来源,1:主播任务,2:小时榜
"source": 0,
// 奖励简介
"reward_intro": ""
}
],
"page": {
// 当前页码
"page": 0,
// 每页大小
"page_size": 0,
// 总页数
"total_page": 0,
// 总记录数
"total_count": 0
},
// 过期奖励数量
"expire_count": 0
}
}
```
## /xlive/web-ucenter/v1/anchorTask/useRecord
### (主播侧)-奖励使用记录(登录态)
> 需要登录
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|page|否|integer| 页数|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"data": [
{
// id
"id": 0,
// 奖励id
"reward_id": 0,
// 1:未使用,3:已使用,5:已过期
"status": 0,
// 奖励名称
"name": "",
// 奖励图标
"icon": "",
// 获得时间datetime
"achieve_time": "",
// 过期时间datetime
"expire_time": "",
// 来源,1:主播任务,2:小时榜
"source": 0,
// 奖励简介
"reward_intro": "",
// 获得时间datetime
"use_time": ""
}
],
"page": {
// 当前页码
"page": 0,
// 每页大小
"page_size": 0,
// 总页数
"total_page": 0,
// 总记录数
"total_count": 0
}
}
}
```
## /xlive/web-ucenter/v1/anchorTask/useReward
### (主播侧)-使用奖励(登录态)
> 需要登录
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|id|是|integer| 奖励列表id|
|platform|否|string| 使用平台|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"result": 0
}
}
```
## /xlive/web-ucenter/v1/anchorTask/isViewed
### (主播侧)-奖励和任务红点(登录态)
> 需要登录
#### 方法GET
#### 请求参数
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
// 是否展示任务红点
"task_should_notice": 0,
// 是否展示奖励入口
"show_reward_entry": 0,
// 是否展示奖励红点
"reward_should_notice": 0,
// 任务状态, 0:没有,1:领取, 5:完成
"task_status": 0,
// 是否在首页黑名单中
"is_blacked": 0,
// 点击跳转h5链接
"url": ""
}
}
```
## /xlive/internal/web-ucenter/v1/anchorTask/addReward
### (主播侧)-添加主播奖励(内部接口)
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|reward_id|是|integer| 奖励id, 1:任意门|
|roomid|是|integer| 房间号|
|source|是|integer| 来源,1:主播任务,2:小时榜|
|uid|是|integer| 主播uid|
|order_id|是|string| 流水单号|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"result": 0
}
}
```

View File

@@ -0,0 +1,257 @@
// Code generated by protoc-gen-bm v0.1, DO NOT EDIT.
// source: service.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:
service.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 PathHistoryGetHistoryByUid = "/live.webucenter.v1.history/get_history_by_uid"
var PathHistoryDelHistory = "/live.webucenter.v1.history/del_history"
var PathCapsuleGetDetail = "/live.webucenter.v1.Capsule/get_detail"
var PathCapsuleOpenCapsule = "/live.webucenter.v1.Capsule/open_capsule"
var PathCapsuleGetCapsuleInfo = "/live.webucenter.v1.Capsule/get_capsule_info"
var PathCapsuleOpenCapsuleByType = "/live.webucenter.v1.Capsule/open_capsule_by_type"
var PathAnchorTaskMyReward = "/live.webucenter.v1.AnchorTask/myReward"
var PathAnchorTaskUseRecord = "/live.webucenter.v1.AnchorTask/useRecord"
var PathAnchorTaskUseReward = "/live.webucenter.v1.AnchorTask/useReward"
var PathAnchorTaskIsViewed = "/live.webucenter.v1.AnchorTask/isViewed"
var PathAnchorTaskAddReward = "/live.webucenter.v1.AnchorTask/addReward"
// =================
// History Interface
// =================
// History 相关服务
type HistoryBMServer interface {
// 根据uid查询直播关键历史记录
// `midware:"auth"`
GetHistoryByUid(ctx context.Context, req *GetHistoryReq) (resp *GetHistoryResp, err error)
// 删除直播历史记录
// `method:"POST" midware:"auth"`
DelHistory(ctx context.Context, req *DelHistoryReq) (resp *DelHistoryResp, err error)
}
var v1HistorySvc HistoryBMServer
func historyGetHistoryByUid(c *bm.Context) {
p := new(GetHistoryReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1HistorySvc.GetHistoryByUid(c, p)
c.JSON(resp, err)
}
func historyDelHistory(c *bm.Context) {
p := new(DelHistoryReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1HistorySvc.DelHistory(c, p)
c.JSON(resp, err)
}
// RegisterV1HistoryService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV1HistoryService(e *bm.Engine, svc HistoryBMServer, midMap map[string]bm.HandlerFunc) {
auth := midMap["auth"]
v1HistorySvc = svc
e.GET("/xlive/web-ucenter/v1/history/get_history_by_uid", auth, historyGetHistoryByUid)
e.POST("/xlive/web-ucenter/v1/history/del_history", auth, historyDelHistory)
}
// RegisterHistoryBMServer Register the blademaster route
func RegisterHistoryBMServer(e *bm.Engine, server HistoryBMServer) {
e.GET("/live.webucenter.v1.history/get_history_by_uid", historyGetHistoryByUid)
e.POST("/live.webucenter.v1.history/del_history", historyDelHistory)
}
// =================
// Capsule Interface
// =================
type CapsuleBMServer interface {
// `midware:"auth"`
GetDetail(ctx context.Context, req *CapsuleGetDetailReq) (resp *CapsuleGetDetailResp, err error)
// `method:"POST" midware:"auth"`
OpenCapsule(ctx context.Context, req *CapsuleOpenCapsuleReq) (resp *CapsuleOpenCapsuleResp, err error)
// `midware:"guest"`
GetCapsuleInfo(ctx context.Context, req *CapsuleGetCapsuleInfoReq) (resp *CapsuleGetCapsuleInfoResp, err error)
// `method:"POST" midware:"auth"`
OpenCapsuleByType(ctx context.Context, req *CapsuleOpenCapsuleByTypeReq) (resp *CapsuleOpenCapsuleByTypeResp, err error)
}
var v1CapsuleSvc CapsuleBMServer
func capsuleGetDetail(c *bm.Context) {
p := new(CapsuleGetDetailReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1CapsuleSvc.GetDetail(c, p)
c.JSON(resp, err)
}
func capsuleOpenCapsule(c *bm.Context) {
p := new(CapsuleOpenCapsuleReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1CapsuleSvc.OpenCapsule(c, p)
c.JSON(resp, err)
}
func capsuleGetCapsuleInfo(c *bm.Context) {
p := new(CapsuleGetCapsuleInfoReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1CapsuleSvc.GetCapsuleInfo(c, p)
c.JSON(resp, err)
}
func capsuleOpenCapsuleByType(c *bm.Context) {
p := new(CapsuleOpenCapsuleByTypeReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1CapsuleSvc.OpenCapsuleByType(c, p)
c.JSON(resp, err)
}
// RegisterV1CapsuleService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV1CapsuleService(e *bm.Engine, svc CapsuleBMServer, midMap map[string]bm.HandlerFunc) {
auth := midMap["auth"]
guest := midMap["guest"]
v1CapsuleSvc = svc
e.GET("/xlive/web-ucenter/v1/capsule/get_detail", auth, capsuleGetDetail)
e.POST("/xlive/web-ucenter/v1/capsule/open_capsule", auth, capsuleOpenCapsule)
e.GET("/xlive/web-ucenter/v1/capsule/get_capsule_info", guest, capsuleGetCapsuleInfo)
e.POST("/xlive/web-ucenter/v1/capsule/open_capsule_by_type", auth, capsuleOpenCapsuleByType)
}
// RegisterCapsuleBMServer Register the blademaster route
func RegisterCapsuleBMServer(e *bm.Engine, server CapsuleBMServer) {
e.GET("/live.webucenter.v1.Capsule/get_detail", capsuleGetDetail)
e.POST("/live.webucenter.v1.Capsule/open_capsule", capsuleOpenCapsule)
e.GET("/live.webucenter.v1.Capsule/get_capsule_info", capsuleGetCapsuleInfo)
e.POST("/live.webucenter.v1.Capsule/open_capsule_by_type", capsuleOpenCapsuleByType)
}
// ====================
// AnchorTask Interface
// ====================
type AnchorTaskBMServer interface {
// (主播侧)-我的主播奖励(登录态)
// `midware:"auth"`
MyReward(ctx context.Context, req *AnchorTaskMyRewardReq) (resp *AnchorTaskMyRewardResp, err error)
// (主播侧)-奖励使用记录(登录态)
// `midware:"auth"`
UseRecord(ctx context.Context, req *AnchorTaskUseRecordReq) (resp *AnchorTaskUseRecordResp, err error)
// (主播侧)-使用奖励(登录态)
// `method:"POST" midware:"auth"`
UseReward(ctx context.Context, req *AnchorTaskUseRewardReq) (resp *AnchorTaskUseRewardResp, err error)
// (主播侧)-奖励和任务红点(登录态)
// `midware:"auth"`
IsViewed(ctx context.Context, req *AnchorTaskIsViewedReq) (resp *AnchorTaskIsViewedResp, err error)
// (主播侧)-添加主播奖励(内部接口)
// `method:"POST" internal:"true"`
AddReward(ctx context.Context, req *AnchorTaskAddRewardReq) (resp *AnchorTaskAddRewardResp, err error)
}
var v1AnchorTaskSvc AnchorTaskBMServer
func anchorTaskMyReward(c *bm.Context) {
p := new(AnchorTaskMyRewardReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1AnchorTaskSvc.MyReward(c, p)
c.JSON(resp, err)
}
func anchorTaskUseRecord(c *bm.Context) {
p := new(AnchorTaskUseRecordReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1AnchorTaskSvc.UseRecord(c, p)
c.JSON(resp, err)
}
func anchorTaskUseReward(c *bm.Context) {
p := new(AnchorTaskUseRewardReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1AnchorTaskSvc.UseReward(c, p)
c.JSON(resp, err)
}
func anchorTaskIsViewed(c *bm.Context) {
p := new(AnchorTaskIsViewedReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1AnchorTaskSvc.IsViewed(c, p)
c.JSON(resp, err)
}
func anchorTaskAddReward(c *bm.Context) {
p := new(AnchorTaskAddRewardReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1AnchorTaskSvc.AddReward(c, p)
c.JSON(resp, err)
}
// RegisterV1AnchorTaskService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV1AnchorTaskService(e *bm.Engine, svc AnchorTaskBMServer, midMap map[string]bm.HandlerFunc) {
auth := midMap["auth"]
v1AnchorTaskSvc = svc
e.GET("/xlive/web-ucenter/v1/anchorTask/myReward", auth, anchorTaskMyReward)
e.GET("/xlive/web-ucenter/v1/anchorTask/useRecord", auth, anchorTaskUseRecord)
e.POST("/xlive/web-ucenter/v1/anchorTask/useReward", auth, anchorTaskUseReward)
e.GET("/xlive/web-ucenter/v1/anchorTask/isViewed", auth, anchorTaskIsViewed)
e.POST("/xlive/internal/web-ucenter/v1/anchorTask/addReward", anchorTaskAddReward)
}
// RegisterAnchorTaskBMServer Register the blademaster route
func RegisterAnchorTaskBMServer(e *bm.Engine, server AnchorTaskBMServer) {
e.GET("/live.webucenter.v1.AnchorTask/myReward", anchorTaskMyReward)
e.GET("/live.webucenter.v1.AnchorTask/useRecord", anchorTaskUseRecord)
e.POST("/live.webucenter.v1.AnchorTask/useReward", anchorTaskUseReward)
e.GET("/live.webucenter.v1.AnchorTask/isViewed", anchorTaskIsViewed)
e.POST("/live.webucenter.v1.AnchorTask/addReward", anchorTaskAddReward)
}

View File

@@ -0,0 +1,364 @@
<!-- package=live.webucenter.v1 -->
- [/xlive/web-ucenter/v1/capsule/get_detail](#xliveweb-ucenterv1capsuleget_detail)
- [/xlive/web-ucenter/v1/capsule/open_capsule](#xliveweb-ucenterv1capsuleopen_capsule)
- [/xlive/web-ucenter/v1/capsule/get_capsule_info](#xliveweb-ucenterv1capsuleget_capsule_info)
- [/xlive/web-ucenter/v1/capsule/open_capsule_by_type](#xliveweb-ucenterv1capsuleopen_capsule_by_type)
## /xlive/web-ucenter/v1/capsule/get_detail
### 无标题
> 需要登录
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|from|否|string| 来源 h5 web room|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
// 普通扭蛋信息
"normal": {
"status": true,
// 扭蛋数量
"coin": 0,
// 变化值
"change": 0,
// 进度
"progress": {
// 当前进度
"now": 0,
// 最大进度
"max": 0
},
// 规则
"rule": "",
// 奖品列表
"gift": [
{
// 礼物名称
"name": "",
// 礼物图片
"image": "",
// 用法
"usage": {
// 用法描述
"text": "",
// 跳转链接
"url": ""
},
// web礼物图片
"web_image": "",
// mobile礼物图片
"mobile_image": ""
}
],
// 历史获奖列表
"list": [
{
// 数量
"num": 0,
// 礼物名称
"gift": "",
// 时间
"date": "",
// 用户名
"name": ""
}
]
},
// 梦幻扭蛋信息若梦幻扭蛋status=false则无coin、change、process、gift、list字段
"colorful": {
"status": true,
// 扭蛋数量
"coin": 0,
// 变化值
"change": 0,
// 进度
"progress": {
// 当前进度
"now": 0,
// 最大进度
"max": 0
},
// 规则
"rule": "",
// 奖品列表
"gift": [
{
// 礼物名称
"name": "",
// 礼物图片
"image": "",
// 用法
"usage": {
// 用法描述
"text": "",
// 跳转链接
"url": ""
},
// web礼物图片
"web_image": "",
// mobile礼物图片
"mobile_image": ""
}
],
// 历史获奖列表
"list": [
{
// 数量
"num": 0,
// 礼物名称
"gift": "",
// 时间
"date": "",
// 用户名
"name": ""
}
]
}
}
}
```
## /xlive/web-ucenter/v1/capsule/open_capsule
### 无标题
> 需要登录
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|type|是|string| 扭蛋类型|
|count|是|integer| 扭的个数|
|platform|否|string||
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
// 扭蛋币扣除状态
"status": true,
// 奖品文案
"text": [
""
],
// 是否包含实物奖品
"isEntity": true,
// 用户扭蛋币拥有状态
"info": {
// 普通扭蛋币
"normal": {
// 拥有的币
"coin": 0,
// 变化值
"change": 0,
// 进度
"progress": {
// 当前进度
"now": 0,
// 最大进度
"max": 0
}
},
// 梦幻扭蛋币
"colorful": {
// 拥有的币
"coin": 0,
// 变化值
"change": 0,
// 进度
"progress": {
// 当前进度
"now": 0,
// 最大进度
"max": 0
}
}
},
// 头衔? 恒为空字符串, 忽略之
"showTitle": "",
// 奖品列表
"awards": [
{
// 奖品名字
"name": "",
// 奖品数量
"num": 0,
// 奖品 X 数量
"text": "",
// 奖品图片
"img": "",
// 奖品用法说明
"usage": {
// 用法描述
"text": "",
// 跳转链接
"url": ""
},
// web礼物图片
"web_image": "",
// mobile礼物图片
"mobile_image": ""
}
]
}
}
```
## /xlive/web-ucenter/v1/capsule/get_capsule_info
### 无标题
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|type|是|string| 扭蛋类型|
|from|是|string| 来源 h5 web room|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
// 扭蛋数量
"coin": 0,
// 规则
"rule": "",
// 奖品列表,包含数量
"gift_list": [
{
// 礼物id
"id": 0,
// 礼物名称
"name": "",
// 礼物数量
"num": 0,
// 礼物图片
"web_url": "",
// 礼物图片
"mobile_url": "",
// 用法
"usage": {
// 用法描述
"text": "",
// 跳转链接
"url": ""
},
// 奖品类型 2 头衔
"type": 0,
// 过期时间
"expire": ""
}
],
// 奖品列表,不包含数量,同一类别只有一条
"gift_filter": [
{
// 礼物id
"id": 0,
// 礼物名称
"name": "",
// 礼物图片
"web_url": "",
// 礼物图片
"mobile_url": "",
// 用法
"usage": {
// 用法描述
"text": "",
// 跳转链接
"url": ""
}
}
]
}
}
```
## /xlive/web-ucenter/v1/capsule/open_capsule_by_type
### 无标题
> 需要登录
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|type|是|string| 扭蛋类型|
|count|是|integer| 扭的个数|
|platform|否|string||
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
// 扭蛋币扣除状态
"status": true,
// 是否包含实物奖品
"isEntity": true,
// 用户扭蛋币拥有状态
"info": {
// 拥有的币
"coin": 0
},
// 奖品列表
"awards": [
{
// 奖品id
"id": 0,
// 奖品名字
"name": "",
// 奖品数量
"num": 0,
// 奖品 X 数量
"text": "",
// 礼物图片
"web_url": "",
// 礼物图片
"mobile_url": "",
// 奖品用法说明
"usage": {
// 用法描述
"text": "",
// 跳转链接
"url": ""
},
// 奖品类型 2 头衔
"type": 0,
// 过期时间
"expire": ""
}
],
// 奖品列表
"text": [
""
]
}
}
```

View File

@@ -0,0 +1,67 @@
<!-- package=live.webucenter.v1 -->
- [/xlive/web-ucenter/v1/history/get_history_by_uid](#xliveweb-ucenterv1historyget_history_by_uid) 根据uid查询直播关键历史记录
- [/xlive/web-ucenter/v1/history/del_history](#xliveweb-ucenterv1historydel_history) 删除直播历史记录
## /xlive/web-ucenter/v1/history/get_history_by_uid
### 根据uid查询直播关键历史记录
> 需要登录
#### 方法GET
#### 请求参数
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"title": "",
"count": 0,
"list": [
{
"roomid": 0,
"uid": 0,
"uname": "",
"user_cover": "",
"title": "",
"face": "",
"tags": "",
"live_status": 0,
"fans_num": 0,
"is_attention": 0,
"area_v2_id": 0,
"area_v2_name": "",
"area_v2_parent_name": "",
"area_v2_parent_id": 0
}
]
}
}
```
## /xlive/web-ucenter/v1/history/del_history
### 删除直播历史记录
> 需要登录
#### 方法POST
#### 请求参数
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
}
}
```

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,474 @@
syntax="proto3";
package live.webucenter.v1;
option go_package ="v1";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
// History 相关服务
service history {
// 根据uid查询直播关键历史记录
// `midware:"auth"`
rpc get_history_by_uid (GetHistoryReq) returns (GetHistoryResp);
// 删除直播历史记录
// `method:"POST" midware:"auth"`
rpc del_history (DelHistoryReq) returns (DelHistoryResp);
}
service Capsule{
// `midware:"auth"`
rpc get_detail(CapsuleGetDetailReq) returns (CapsuleGetDetailResp);
// `method:"POST" midware:"auth"`
rpc open_capsule(CapsuleOpenCapsuleReq) returns (CapsuleOpenCapsuleResp);
// `midware:"guest"`
rpc get_capsule_info (CapsuleGetCapsuleInfoReq) returns (CapsuleGetCapsuleInfoResp);
// `method:"POST" midware:"auth"`
rpc open_capsule_by_type (CapsuleOpenCapsuleByTypeReq) returns (CapsuleOpenCapsuleByTypeResp);
}
// 历史记录请求参数定义
message GetHistoryReq {
}
// 获取接口返回响应
message GetHistoryResp {
string title = 1 [(gogoproto.jsontag) = 'title'];
int32 count = 4 [(gogoproto.jsontag) = 'count'];
repeated List list = 5 [(gogoproto.jsontag) = 'list'];
message List {
int64 roomid = 1 [(gogoproto.jsontag) = 'roomid'];
int32 uid = 2 [(gogoproto.jsontag) = 'uid'];
string uname =3;
string user_cover = 4 [(gogoproto.jsontag) = 'user_cover'];
string title = 5 [(gogoproto.jsontag) = 'title'];
string face = 6 [(gogoproto.jsontag) = 'face'];
string tags = 7 [(gogoproto.jsontag) = 'tags'];
int32 live_status = 9 [(gogoproto.jsontag) = 'live_status'];
int32 fans_num = 10 [(gogoproto.jsontag) = 'fans_num'];
int32 is_attention = 12 [(gogoproto.jsontag) = 'is_attention'];
int32 area_v2_id = 13;
string area_v2_name = 14 [(gogoproto.jsontag) = 'area_v2_name'];
string area_v2_parent_name = 15 [(gogoproto.jsontag) = 'area_v2_parent_name'];
int32 area_v2_parent_id = 16;
}
}
// 删除历史记录参数定义
message DelHistoryReq {
}
// 删除直播历史记录响应
message DelHistoryResp {
}
service AnchorTask {
// (主播侧)-我的主播奖励(登录态)
// `midware:"auth"`
rpc myReward (AnchorTaskMyRewardReq) returns (AnchorTaskMyRewardResp);
// (主播侧)-奖励使用记录(登录态)
// `midware:"auth"`
rpc useRecord (AnchorTaskUseRecordReq) returns (AnchorTaskUseRecordResp);
// (主播侧)-使用奖励(登录态)
// `method:"POST" midware:"auth"`
rpc useReward (AnchorTaskUseRewardReq) returns (AnchorTaskUseRewardResp);
// (主播侧)-奖励和任务红点(登录态)
// `midware:"auth"`
rpc isViewed (AnchorTaskIsViewedReq) returns (AnchorTaskIsViewedResp);
// (主播侧)-添加主播奖励(内部接口)
// `method:"POST" internal:"true"`
rpc addReward (AnchorTaskAddRewardReq) returns (AnchorTaskAddRewardResp);
}
message AnchorTaskAddRewardReq {
// 奖励id, 1:任意门
int64 reward_id = 4 [(gogoproto.moretags) = "form:\"reward_id\" validate:\"required\""];
// 房间号
int64 roomid = 8 [(gogoproto.moretags) = "form:\"roomid\" validate:\"required\""];
// 来源,1:主播任务,2:小时榜
int64 source = 9 [(gogoproto.moretags) = "form:\"source\" validate:\"required\""];
// 主播uid
int64 uid = 10 [(gogoproto.moretags) = "form:\"uid\" validate:\"required\""];
// 流水单号
string order_id = 11 [(gogoproto.moretags) = "form:\"order_id\" validate:\"required\""];
}
message AnchorTaskAddRewardResp {
int64 result = 1 [(gogoproto.jsontag) = 'result'];
}
message AnchorTaskMyRewardReq {
// 页数
int64 page = 1 [(gogoproto.moretags) = "form:\"page\""];
}
message AnchorTaskMyRewardResp {
//
repeated RewardObj data = 1 [(gogoproto.jsontag) = 'data'];
//
Page page = 2 [(gogoproto.jsontag) = 'page'];
// 过期奖励数量
int64 expire_count = 3 [(gogoproto.jsontag) = 'expire_count'];
message RewardObj {
// id
int64 id = 1 [(gogoproto.jsontag) = 'id'];
// 奖励类型 1:ss推荐卡 2:s推荐卡、任意门
int64 reward_type = 2 [(gogoproto.jsontag) = 'reward_type'];
// 1:未使用,3:已使用,5:已过期
int64 status = 3 [(gogoproto.jsontag) = 'status'];
// 奖励id
int64 reward_id = 4 [(gogoproto.jsontag) = 'reward_id'];
// 奖励名称
string name = 5 [(gogoproto.jsontag) = 'name'];
// 奖励图标
string icon = 6 [(gogoproto.jsontag) = 'icon'];
// 获得时间datetime
string achieve_time = 7 [(gogoproto.jsontag) = 'achieve_time'];
// 过期时间datetime
string expire_time = 8 [(gogoproto.jsontag) = 'expire_time'];
// 来源,1:主播任务,2:小时榜
int64 source = 9 [(gogoproto.jsontag) = 'source'];
// 奖励简介
string reward_intro = 10 [(gogoproto.jsontag) = 'reward_intro'];
}
message Page {
// 当前页码
int64 page = 1 [(gogoproto.jsontag) = 'page'];
// 每页大小
int64 page_size = 2 [(gogoproto.jsontag) = 'page_size'];
// 总页数
int64 total_page = 3 [(gogoproto.jsontag) = 'total_page'];
// 总记录数
int64 total_count = 4 [(gogoproto.jsontag) = 'total_count'];
}
}
message AnchorTaskUseRecordReq {
// 页数
int64 page = 1 [(gogoproto.moretags) = "form:\"page\""];
}
message AnchorTaskUseRecordResp {
message RewardObj {
// id
int64 id = 1 [(gogoproto.jsontag) = 'id'];
// 奖励id
int64 reward_id = 2 [(gogoproto.jsontag) = 'reward_id'];
// 1:未使用,3:已使用,5:已过期
int64 status = 3 [(gogoproto.jsontag) = 'status'];
// 奖励名称
string name = 4 [(gogoproto.jsontag) = 'name'];
// 奖励图标
string icon = 5 [(gogoproto.jsontag) = 'icon'];
// 获得时间datetime
string achieve_time = 6 [(gogoproto.jsontag) = 'achieve_time'];
// 过期时间datetime
string expire_time = 7 [(gogoproto.jsontag) = 'expire_time'];
// 来源,1:主播任务,2:小时榜
int64 source = 8 [(gogoproto.jsontag) = 'source'];
// 奖励简介
string reward_intro = 9 [(gogoproto.jsontag) = 'reward_intro'];
// 获得时间datetime
string use_time = 10 [(gogoproto.jsontag) = 'use_time'];
}
message Page {
// 当前页码
int64 page = 1 [(gogoproto.jsontag) = 'page'];
// 每页大小
int64 page_size = 2 [(gogoproto.jsontag) = 'page_size'];
// 总页数
int64 total_page = 3 [(gogoproto.jsontag) = 'total_page'];
// 总记录数
int64 total_count = 4 [(gogoproto.jsontag) = 'total_count'];
}
//
repeated RewardObj data = 1 [(gogoproto.jsontag) = 'data'];
//
Page page = 2 [(gogoproto.jsontag) = 'page'];
}
message AnchorTaskUseRewardReq {
// 奖励列表id
int64 id = 1 [(gogoproto.moretags) = "form:\"id\" validate:\"required\""];
// 使用平台
string platform = 2 [(gogoproto.moretags) = "form:\"platform\""];
}
message AnchorTaskUseRewardResp {
int64 result = 1 [(gogoproto.jsontag) = 'result'];
}
message AnchorTaskIsViewedReq {
}
message AnchorTaskIsViewedResp {
// 是否展示任务红点
int64 task_should_notice = 1 [(gogoproto.jsontag) = 'task_should_notice'];
// 是否展示奖励入口
int64 show_reward_entry = 5 [(gogoproto.jsontag) = 'show_reward_entry'];
// 是否展示奖励红点
int64 reward_should_notice = 2 [(gogoproto.jsontag) = 'reward_should_notice'];
// 任务状态, 0:没有,1:领取, 5:完成
int64 task_status = 3 [(gogoproto.jsontag) = 'task_status'];
// 是否在首页黑名单中
int64 is_blacked = 4 [(gogoproto.jsontag) = 'is_blacked'];
// 点击跳转h5链接
string url = 6 [(gogoproto.jsontag) = 'url'];
}
message CapsuleGetDetailReq {
// 来源 h5 web room
string from = 2 [(gogoproto.moretags) = 'form:"from"'];
}
message Usage {
// 用法描述
string text = 1 [(gogoproto.jsontag) = "text"];
// 跳转链接
string url = 2 [(gogoproto.jsontag) = "url"];
}
message Progress {
// 当前进度
int64 now = 1 [(gogoproto.jsontag) = "now"];
// 最大进度
int64 max = 2 [(gogoproto.jsontag) = "max"];
}
message CapsuleGetDetailResp {
// 普通扭蛋信息
CapsuleInfo normal = 1 [(gogoproto.jsontag) = "normal"];
// 梦幻扭蛋信息若梦幻扭蛋status=false则无coin、change、process、gift、list字段
CapsuleInfo colorful = 2 [(gogoproto.jsontag) = "colorful"];
message Gift {
// 礼物名称
string name = 2 [(gogoproto.jsontag) = "name"];
// 礼物图片
string image = 3 [(gogoproto.jsontag) = "image"];
// 用法
Usage usage = 4 [(gogoproto.jsontag) = "usage"];
// web礼物图片
string web_image = 5 [(gogoproto.jsontag) = "web_image"];
// mobile礼物图片
string mobile_image = 6 [(gogoproto.jsontag) = "mobile_image"];
}
message List {
// 数量
int64 num = 1 [(gogoproto.jsontag) = "num"];
// 礼物名称
string gift = 2 [(gogoproto.jsontag) = "gift"];
// 时间
string date = 3 [(gogoproto.jsontag) = "date"];
// 用户名
string name = 4 [(gogoproto.jsontag) = "name"];
}
message CapsuleInfo {
//
bool status = 1 [(gogoproto.jsontag) = "status"];
// 扭蛋数量
int64 coin = 2 [(gogoproto.jsontag) = "coin"];
// 变化值
int64 change = 3 [(gogoproto.jsontag) = "change"];
// 进度
Progress progress = 4 [(gogoproto.jsontag) = "progress"];
// 规则
string rule = 5 [(gogoproto.jsontag) = "rule"];
// 奖品列表
repeated Gift gift = 6 [(gogoproto.jsontag) = "gift"];
// 历史获奖列表
repeated List list = 7 [(gogoproto.jsontag) = "list"];
}
}
message CapsuleOpenCapsuleReq {
// 扭蛋类型
string type = 2 [(gogoproto.moretags) = 'form:"type" validate:"required"'];
// 扭的个数
int64 count = 3 [(gogoproto.moretags) = 'form:"count" validate:"required"'];
string platform = 4 [(gogoproto.moretags) = 'form:"platform"'];
}
message CapsuleOpenCapsuleResp {
// 扭蛋币扣除状态
bool status = 1 [(gogoproto.jsontag) = "status"];
// 奖品文案
repeated string text = 2 [(gogoproto.jsontag) = "text"];
// 是否包含实物奖品
bool isEntity = 3 [(gogoproto.jsontag) = "isEntity"];
// 用户扭蛋币拥有状态
Info info = 4 [(gogoproto.jsontag) = "info"];
// 头衔? 恒为空字符串, 忽略之
string showTitle = 5 [(gogoproto.jsontag) = "showTitle"];
// 奖品列表
repeated Award awards = 6 [(gogoproto.jsontag) = "awards"];
message CapsuleInfo {
// 拥有的币
int64 coin = 1 [(gogoproto.jsontag) = "coin"];
// 变化值
int64 change = 2 [(gogoproto.jsontag) = "change"];
// 进度
Progress progress = 3 [(gogoproto.jsontag) = "progress"];
}
message Info {
// 普通扭蛋币
CapsuleInfo normal = 1 [(gogoproto.jsontag) = "normal"];
// 梦幻扭蛋币
CapsuleInfo colorful = 2 [(gogoproto.jsontag) = "colorful"];
}
message Award {
// 奖品名字
string name = 2 [(gogoproto.jsontag) = "name"];
// 奖品数量
int64 num = 3 [(gogoproto.jsontag) = "num"];
// 奖品 X 数量
string text = 4 [(gogoproto.jsontag) = "text"];
// 奖品图片
string img = 5 [(gogoproto.jsontag) = "img"];
// 奖品用法说明
Usage usage = 6 [(gogoproto.jsontag) = "usage"];
// web礼物图片
string web_image = 7 [(gogoproto.jsontag) = "web_image"];
// mobile礼物图片
string mobile_image = 8 [(gogoproto.jsontag) = "mobile_image"];
}
}
message CapsuleGetCapsuleInfoReq {
// 扭蛋类型
string type = 2 [(gogoproto.moretags) = 'form:"type" validate:"required"'];
// 来源 h5 web room
string from = 3 [(gogoproto.moretags) = 'form:"from" validate:"required"'];
}
message CapsuleGetCapsuleInfoResp {
message GiftList {
// 礼物id
int64 id = 1 [(gogoproto.jsontag) = "id"];
// 礼物名称
string name = 2 [(gogoproto.jsontag) = "name"];
// 礼物数量
int64 num = 3 [(gogoproto.jsontag) = "num"];
// 礼物图片
string web_url = 5 [(gogoproto.jsontag) = "web_url"];
// 礼物图片
string mobile_url = 6 [(gogoproto.jsontag) = "mobile_url"];
// 用法
Usage usage = 7 [(gogoproto.jsontag) = "usage"];
// 奖品类型 2 头衔
int64 type = 8 [(gogoproto.jsontag) = "type"];
// 过期时间
string expire = 9 [(gogoproto.jsontag) = "expire"];
}
message GiftFilter {
// 礼物id
int64 id = 1 [(gogoproto.jsontag) = "id"];
// 礼物名称
string name = 2 [(gogoproto.jsontag) = "name"];
// 礼物图片
string web_url = 3 [(gogoproto.jsontag) = "web_url"];
// 礼物图片
string mobile_url = 4 [(gogoproto.jsontag) = "mobile_url"];
// 用法
Usage usage = 5 [(gogoproto.jsontag) = "usage"];
}
// 扭蛋数量
int64 coin = 1 [(gogoproto.jsontag) = "coin"];
// 规则
string rule = 2 [(gogoproto.jsontag) = "rule"];
// 奖品列表,包含数量
repeated GiftList gift_list = 3 [(gogoproto.jsontag) = "gift_list"];
// 奖品列表,不包含数量,同一类别只有一条
repeated GiftFilter gift_filter = 4 [(gogoproto.jsontag) = "gift_filter"];
}
message CapsuleOpenCapsuleByTypeReq {
// 扭蛋类型
string type = 2 [(gogoproto.moretags) = 'form:"type" validate:"required"'];
// 扭的个数
int64 count = 3 [(gogoproto.moretags) = 'form:"count" validate:"required"'];
string platform = 4 [(gogoproto.moretags) = 'form:"platform"'];
}
message CapsuleOpenCapsuleByTypeResp {
message CapsuleInfo {
// 拥有的币
int64 coin = 1 [(gogoproto.jsontag) = "coin"];
}
message Award {
// 奖品id
int64 id = 1 [(gogoproto.jsontag) = "id"];
// 奖品名字
string name = 2 [(gogoproto.jsontag) = "name"];
// 奖品数量
int64 num = 3 [(gogoproto.jsontag) = "num"];
// 奖品 X 数量
string text = 4 [(gogoproto.jsontag) = "text"];
// 礼物图片
string web_url = 5 [(gogoproto.jsontag) = "web_url"];
// 礼物图片
string mobile_url = 6 [(gogoproto.jsontag) = "mobile_url"];
// 奖品用法说明
Usage usage = 7 [(gogoproto.jsontag) = "usage"];
// 奖品类型 2 头衔
int64 type = 8 [(gogoproto.jsontag) = "type"];
// 过期时间
string expire = 9 [(gogoproto.jsontag) = "expire"];
}
// 扭蛋币扣除状态
bool status = 1 [(gogoproto.jsontag) = "status"];
// 是否包含实物奖品
bool isEntity = 2 [(gogoproto.jsontag) = "isEntity"];
// 用户扭蛋币拥有状态
CapsuleInfo info = 3 [(gogoproto.jsontag) = "info"];
// 奖品列表
repeated Award awards = 4 [(gogoproto.jsontag) = "awards"];
// 奖品列表
repeated string text = 5 [(gogoproto.jsontag) = "text"];
}

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/web-ucenter/cmd",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/web-ucenter/conf:go_default_library",
"//app/interface/live/web-ucenter/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/web-ucenter/conf"
"go-common/app/interface/live/web-ucenter/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("web-ucenter-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("web-ucenter-interface exit")
time.Sleep(time.Second)
return
case syscall.SIGHUP:
default:
return
}
}
}

View File

@@ -0,0 +1,37 @@
[log]
stdout=true
[host]
liveRpc = "http://rpc.live.bilibili.co"
[httpClient]
key = "fb06a25c6338edbc"
secret = "fd10bd177559780c2e4a44f1fa47fa83"
dial = "100ms"
timeout = "5s"
keepAlive = "60s"
[httpClient.breaker]
window = "3s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[liverpc]
[liverpc.room]
Addr = "172.18.35.12:20200"
[liverpc.rc]
[liverpc.rankdb]
[warden]
dial = "1s"
timeout = "1s"
[accountRPC]
pullInterval = "10s"
[accountRPC.client]
timeout = "1s"
timer = 1000

View File

@@ -0,0 +1,45 @@
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/web-ucenter/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/log/infoc: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: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,123 @@
package conf
import (
"errors"
"flag"
"go-common/library/net/http/blademaster/middleware/auth"
"go-common/library/net/rpc"
"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/liverpc"
"go-common/library/net/trace"
"github.com/BurntSushi/toml"
"go-common/library/log/infoc"
"go-common/library/net/rpc/warden"
)
var (
confPath string
client *conf.Client
// Conf config
Conf = &Config{}
)
const (
// APPKey to call main site api
APPKey = "fb06a25c6338edbc"
)
const (
// MainInnerHostHTTP api host
MainInnerHostHTTP = "http://api.bilibili.co"
)
// 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
HistoryRPC *rpc.ClientConfig
Auth *auth.Config
Warden *warden.ClientConfig
Infoc *Infoc
Host *Host
AccountRPC *rpc.ClientConfig
}
// Infoc .
type Infoc struct {
CapsuleInfoc *infoc.Config
}
// Host prc host
type Host struct {
LiveRpc string
}
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
}

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"],
importpath = "go-common/app/interface/live/web-ucenter/dao",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/web-ucenter/conf:go_default_library",
"//app/service/live/rankdb/api/liverpc:go_default_library",
"//app/service/live/rc/api/liverpc:go_default_library",
"//app/service/live/room/api/liverpc: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/web-ucenter/dao/capsule:all-srcs",
"//app/interface/live/web-ucenter/dao/history:all-srcs",
"//app/interface/live/web-ucenter/dao/user:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,32 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["dao.go"],
importpath = "go-common/app/interface/live/web-ucenter/dao/capsule",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/web-ucenter/conf:go_default_library",
"//app/service/live/xlottery/api/grpc/v1: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 capsule
import (
"context"
"go-common/app/interface/live/web-ucenter/conf"
lotteryApi "go-common/app/service/live/xlottery/api/grpc/v1"
)
// Dao dao
type Dao struct {
client *lotteryApi.Client
}
// New init
func New(c *conf.Config) (dao *Dao) {
dao = &Dao{}
client, err := lotteryApi.NewClient(conf.Conf.Warden)
if err != nil {
panic(err)
}
dao.client = client
return
}
// GetDetail grpc
func (d *Dao) GetDetail(ctx context.Context, uid int64, from string) (*lotteryApi.CapsuleGetDetailResp, error) {
return d.client.CapsuleClient.GetDetail(ctx, &lotteryApi.CapsuleGetDetailReq{Uid: uid, From: from})
}
// OpenCapsule grpc
func (d *Dao) OpenCapsule(ctx context.Context, uid int64, otype string, count int64, platform string) (*lotteryApi.CapsuleOpenCapsuleResp, error) {
return d.client.CapsuleClient.OpenCapsule(ctx, &lotteryApi.CapsuleOpenCapsuleReq{Uid: uid, Type: otype, Count: count, Platform: platform})
}
// GetCapsuleInfo grpc
func (d *Dao) GetCapsuleInfo(ctx context.Context, uid int64, otype, from string) (*lotteryApi.CapsuleGetCapsuleInfoResp, error) {
return d.client.CapsuleClient.GetCapsuleInfo(ctx, &lotteryApi.CapsuleGetCapsuleInfoReq{Uid: uid, Type: otype, From: from})
}
// OpenCapsuleByType grpc
func (d *Dao) OpenCapsuleByType(ctx context.Context, uid int64, otype string, count int64, platform string) (*lotteryApi.CapsuleOpenCapsuleByTypeResp, error) {
return d.client.CapsuleClient.OpenCapsuleByType(ctx, &lotteryApi.CapsuleOpenCapsuleByTypeReq{Uid: uid, Type: otype, Count: count, Platform: platform})
}

View File

@@ -0,0 +1,53 @@
package dao
import (
"crypto/md5"
"encoding/hex"
"go-common/app/interface/live/web-ucenter/conf"
rank_api "go-common/app/service/live/rankdb/api/liverpc"
rc_api "go-common/app/service/live/rc/api/liverpc"
room_api "go-common/app/service/live/room/api/liverpc"
"go-common/library/net/rpc/liverpc"
"net/url"
"strconv"
"time"
)
// RoomAPI liverpc room-service api
var RoomAPI *room_api.Client
// RcApi liverpc rc api
var RcApi *rc_api.Client
// RankdbApi liverpc rankdb api
var RankdbApi *rank_api.Client
// InitAPI init all service APIs
func InitAPI() {
RoomAPI = room_api.New(getConf("room"))
RcApi = rc_api.New(getConf("rc"))
RankdbApi = rank_api.New(getConf("rank"))
}
func getConf(appName string) *liverpc.ClientConfig {
c := conf.Conf.LiveRpc
if c != nil {
return c[appName]
}
return nil
}
// EncodeHttpParams end http params and return encoded string
func EncodeHttpParams(params map[string]string, appKey, appSecret string) string {
v := url.Values{}
for key, value := range params {
v.Set(key, value)
}
v.Set("ts", strconv.FormatInt(time.Now().Unix(), 10))
v.Set("appkey", appKey)
tmp := v.Encode() + appSecret
mh := md5.Sum([]byte(tmp))
sign := hex.EncodeToString(mh[:])
v.Set("sign", sign)
return v.Encode()
}

View File

@@ -0,0 +1,37 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["dao.go"],
importpath = "go-common/app/interface/live/web-ucenter/dao/history",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/web-ucenter/conf:go_default_library",
"//app/interface/live/web-ucenter/model: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",
"//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,96 @@
package history
import (
"context"
"fmt"
"net/url"
"strconv"
"time"
"go-common/library/ecode"
"github.com/pkg/errors"
"go-common/app/interface/live/web-ucenter/conf"
"go-common/app/interface/live/web-ucenter/model"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/metadata"
)
// Dao dao
type Dao struct {
c *conf.Config
client *bm.Client
}
const (
_historyResourceURI = "/x/internal/v2/history/resource"
_historyDeleteURI = "/x/internal/v2/history/clear"
_historyPageSize = 24
)
// New init
func New(c *conf.Config) (dao *Dao) {
dao = &Dao{
client: bm.NewClient(c.HTTPClient),
}
return
}
// GetMainHistory 获取直播历史记录
func (d *Dao) GetMainHistory(c context.Context, mid int32) (data []*model.HistoryData, err error) {
var (
params = url.Values{}
ip = metadata.String(c, metadata.RemoteIP)
)
params.Set("mid", fmt.Sprint(mid))
params.Set("business", "live")
params.Set("pn", fmt.Sprint(1))
params.Set("ps", fmt.Sprint(_historyPageSize))
params.Set("appkey", conf.APPKey)
params.Set("ts", strconv.FormatInt(time.Now().Unix(), 10))
var res struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data []*model.HistoryData `json:"data"`
}
if d.client.Get(c, conf.MainInnerHostHTTP+_historyResourceURI, ip, params, &res); err != nil {
err = errors.WithMessage(err, "调用主站获取观看历史错误")
log.Error("call_history_resource_error:httpCode=%d params=%s", res.Code, params)
return
}
if int(res.Code) != ecode.OK.Code() {
log.Error("call_history_resource_error:%d", res.Code)
}
log.Info("call_history_resource_info:param:%v,%v", mid, res.Data)
data = res.Data
return
}
// DelHistory 删除直播历史记录
func (d *Dao) DelHistory(c context.Context, mid int64) (data int32, err error) {
var (
params = url.Values{}
ip = metadata.String(c, metadata.RemoteIP)
)
params.Set("appkey", conf.APPKey)
params.Set("mid", fmt.Sprint(mid))
params.Set("business", "live")
params.Set("ts", strconv.FormatInt(time.Now().Unix(), 10))
var res struct {
Code int32 `json:"code"`
}
if d.client.Post(c, conf.MainInnerHostHTTP+_historyDeleteURI, ip, params, &res); err != nil {
err = errors.WithMessage(err, "调用主站删除观看历史错误")
log.Error("call_history_delete_error:%s", err)
return
}
if int(res.Code) != ecode.OK.Code() {
log.Error("call_history_delete_code_error:%d", res.Code)
}
data = res.Code
return
}

View File

@@ -0,0 +1,54 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
go_library(
name = "go_default_library",
srcs = ["dao.go"],
importpath = "go-common/app/interface/live/web-ucenter/dao/user",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/web-ucenter/conf:go_default_library",
"//app/interface/live/web-ucenter/dao:go_default_library",
"//app/service/live/rankdb/api/liverpc/v1:go_default_library",
"//app/service/live/rc/api/liverpc/v1:go_default_library",
"//app/service/live/xuser/api/grpc/v1:go_default_library",
"//app/service/main/account/model:go_default_library",
"//app/service/main/account/rpc/client:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//vendor/github.com/pkg/errors:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
go_test(
name = "go_default_test",
srcs = ["dao_test.go"],
embed = [":go_default_library"],
tags = ["automanaged"],
deps = [
"//app/interface/live/web-ucenter/conf:go_default_library",
"//app/interface/live/web-ucenter/dao:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)

View File

@@ -0,0 +1,151 @@
package user
import (
"context"
"github.com/pkg/errors"
"go-common/app/interface/live/web-ucenter/conf"
"go-common/app/interface/live/web-ucenter/dao"
rankdbv1 "go-common/app/service/live/rankdb/api/liverpc/v1"
rcv1 "go-common/app/service/live/rc/api/liverpc/v1"
xuserv1 "go-common/app/service/live/xuser/api/grpc/v1"
accModel "go-common/app/service/main/account/model"
account "go-common/app/service/main/account/rpc/client"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"net/http"
"strconv"
)
var (
_walletApiUrl = "/x/internal/livewallet/wallet/getAll"
)
// Dao user dao, wrap clients
type Dao struct {
c *conf.Config
bmClient *bm.Client
vipClient xuserv1.VipClient
expClient xuserv1.UserExpClient
walletUrl string
accountClient *account.Service3
rankdbClient rankdbv1.UserRank
rcClient rcv1.AchvRPCClient
}
// New new user dao
func New(c *conf.Config) *Dao {
conn, err := xuserv1.NewClient(c.Warden)
if err != nil {
panic(err)
}
d := &Dao{
c: c,
bmClient: bm.NewClient(c.HTTPClient),
walletUrl: c.Host.LiveRpc + _walletApiUrl,
accountClient: account.New3(c.AccountRPC),
rankdbClient: dao.RankdbApi.V1UserRank,
rcClient: dao.RcApi.V1Achv,
}
d.vipClient = conn.VipClient
d.expClient = conn.UserExpClient
return d
}
// GetAccountProfile get account profile
func (d *Dao) GetAccountProfile(ctx context.Context, uid int64) (profile *accModel.ProfileStat, err error) {
arg := &accModel.ArgMid{Mid: uid}
if profile, err = d.accountClient.ProfileWithStat3(ctx, arg); err != nil || profile == nil {
log.Error("[dao.user|GetAccountProfile] get account profile3 error(%v), uid(%d), profile(%v)", err, uid, profile)
return
}
return
}
// GetWallet get silver/gold from go-wallet by http request
func (d *Dao) GetWallet(ctx context.Context, uid int64, platform string) (silver, gold int64, err error) {
m := make(map[string]string)
m["uid"] = strconv.FormatInt(uid, 10)
paramString := dao.EncodeHttpParams(m, d.c.HTTPClient.Key, d.c.HTTPClient.Secret)
req, _ := http.NewRequest("GET", d.walletUrl+"?"+paramString, nil)
req.Header.Set("Content-Type", "application/json")
req.Header.Set("platform", platform)
var wr struct {
Code int `json:"code"`
Message string `json:"message"`
Data struct {
Gold string `json:"gold"`
Silver string `json:"silver"`
} `json:"data"`
}
if err = d.bmClient.Do(ctx, req, &wr); err != nil {
log.Error("[dao.user|GetWallet] connect error(%v), uid(%d), platform(%s)", err, uid, platform)
return
}
if wr.Code != 0 {
err = errors.Wrap(ecode.Int(wr.Code), d.walletUrl+"?"+paramString)
log.Error("[dao.user|GetWallet] request error(%v), uid(%d), platform(%s)", err, uid, platform)
return
}
gold, _ = strconv.ParseInt(wr.Data.Gold, 10, 64)
silver, _ = strconv.ParseInt(wr.Data.Silver, 10, 64)
return
}
// GetLiveVip get live vip/svip from xuser.vip.Info
func (d *Dao) GetLiveVip(ctx context.Context, uid int64) (vipInfo *xuserv1.InfoReply, err error) {
uidReq := &xuserv1.UidReq{
Uid: uid,
}
if vipInfo, err = d.vipClient.Info(ctx, uidReq); err != nil || vipInfo == nil {
log.Error("[dao.user|GetLiveVip] get vip error(%v), uid(%d)", err, uid)
return
}
return
}
// GetLiveExp get live exp from xuser.exp.GetUserExp
func (d *Dao) GetLiveExp(ctx context.Context, uid int64) (expInfo *xuserv1.LevelInfo, err error) {
req := &xuserv1.GetUserExpReq{
Uids: []int64{uid},
}
resp, err := d.expClient.GetUserExp(ctx, req)
if err != nil {
log.Error("[dao.user|GetLiveExp] get exp error(%v), uid(%d)", err, uid)
return
}
var ok bool
if expInfo, ok = resp.Data[uid]; !ok {
log.Error("[dao.user|GetLiveExp] get exp empty, uid(%d)", uid)
return
}
return
}
// GetLiveAchieve get rc achieve by liverpc
func (d *Dao) GetLiveAchieve(ctx context.Context, uid int64) (achieve int64, err error) {
resp, err := d.rcClient.Userstatus(ctx, &rcv1.AchvUserstatusReq{})
if err != nil || resp == nil || resp.Data == nil {
log.Error("[dao.user|GetLiveAchieve] get rc achieve error(%v), uid(%d), resp(%v)", err, uid, resp)
return
}
achieve = resp.Data.Point
return
}
// GetLiveRank get user rank by liverpc
func (d *Dao) GetLiveRank(ctx context.Context, uid int64) (rank string, err error) {
rank = "1000000"
req := &rankdbv1.UserRankGetUserRankReq{
Uid: uid,
Type: "user_level",
}
resp, err := d.rankdbClient.GetUserRank(ctx, req)
if err != nil || resp == nil || resp.Data == nil {
log.Error("[dao.user|GetLiveRank] get rankdb user rank error(%v), uid(%d)", err, uid)
return
}
rank = strconv.FormatInt(resp.Data.Rank, 10)
return
}

View File

@@ -0,0 +1,73 @@
package user
import (
"context"
"flag"
. "github.com/smartystreets/goconvey/convey"
"go-common/app/interface/live/web-ucenter/conf"
"go-common/app/interface/live/web-ucenter/dao"
"testing"
)
var d *Dao
func init() {
flag.Set("conf", "../../cmd/test.toml")
flag.Set("env", "uat")
var err error
if err = conf.Init(); err != nil {
panic(err)
}
dao.InitAPI()
d = New(conf.Conf)
}
var (
uid = int64(110000681)
ctx = context.Background()
)
func TestDao_GetAccountProfile(t *testing.T) {
Convey("test get account profile", t, func() {
profile, err := d.GetAccountProfile(ctx, uid)
So(profile, ShouldNotBeNil)
So(err, ShouldBeNil)
})
}
func TestDao_GetWallet(t *testing.T) {
Convey("test get wallet", t, func() {
_, _, err := d.GetWallet(ctx, uid, "pc")
So(err, ShouldBeNil)
})
}
func TestDao_GetLiveAchieve(t *testing.T) {
Convey("test get rc achieve", t, func() {
_, err := d.GetLiveAchieve(ctx, uid)
So(err, ShouldBeNil)
})
}
func TestDao_GetLiveExp(t *testing.T) {
Convey("test get exp", t, func() {
expInfo, err := d.GetLiveExp(ctx, uid)
So(expInfo, ShouldNotBeNil)
So(err, ShouldBeNil)
})
}
func TestDao_GetLiveVip(t *testing.T) {
Convey("test get vip", t, func() {
vipInfo, err := d.GetLiveVip(ctx, uid)
So(vipInfo, ShouldNotBeNil)
So(err, ShouldBeNil)
})
}
func TestDao_GetLiveRank(t *testing.T) {
Convey("test get rankdb", t, func() {
_, err := d.GetLiveRank(ctx, uid)
So(err, ShouldBeNil)
})
}

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/web-ucenter/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,13 @@
package model
// HistoryData ...
type HistoryData struct {
RoomId int64 `json:"oid"`
}
// user info platform for wallet info
const (
PlatformPc = "pc"
PlatformIos = "ios"
PlatformAndroid = "android"
)

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/web-ucenter/server/http",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/web-ucenter/api/http:go_default_library",
"//app/interface/live/web-ucenter/api/http/v1:go_default_library",
"//app/interface/live/web-ucenter/conf:go_default_library",
"//app/interface/live/web-ucenter/dao:go_default_library",
"//app/interface/live/web-ucenter/service/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,76 @@
package http
import (
"net/http"
webucenter_http "go-common/app/interface/live/web-ucenter/api/http"
"go-common/app/interface/live/web-ucenter/api/http/v1"
"go-common/app/interface/live/web-ucenter/conf"
"go-common/app/interface/live/web-ucenter/dao"
webcenterSvc "go-common/app/interface/live/web-ucenter/service/v1"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/auth"
"go-common/library/net/http/blademaster/middleware/verify"
)
var (
srv *webcenterSvc.Service
vfy *verify.Verify
midAuth *auth.Auth
// AnchorTask .
AnchorTask *webcenterSvc.AnchorTaskService
)
// Init init
func Init(c *conf.Config) {
dao.InitAPI()
initService(c)
initMidWare(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) {
srv = webcenterSvc.New(c)
midAuth = auth.New(c.Auth)
}
func initMidWare(c *conf.Config) {
vfy = verify.New(c.Verify)
}
func route(e *bm.Engine) {
e.Ping(ping)
e.Register(register)
g := e.Group("/xlive/web-ucenter")
{
g.GET("/Auth", midAuth.User, howToStart)
}
v1.RegisterV1HistoryService(e, srv, map[string]bm.HandlerFunc{"auth": midAuth.UserWeb})
midMap := map[string]bm.HandlerFunc{
"auth": midAuth.User,
"guest": midAuth.Guest,
}
v1.RegisterV1CapsuleService(e, webcenterSvc.NewCapsuleService(conf.Conf), midMap)
v1.RegisterV1AnchorTaskService(e, webcenterSvc.NewAnchorTaskService(conf.Conf), midMap)
webucenter_http.RegisterUserService(
e, webcenterSvc.NewUserService(conf.Conf), map[string]bm.HandlerFunc{"auth": midAuth.User})
}
func ping(c *bm.Context) {
c.AbortWithStatus(http.StatusOK)
}
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,23 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/interface/live/web-ucenter/service/v1:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,72 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
go_library(
name = "go_default_library",
srcs = [
"anchorTask.go",
"capsule.go",
"history.go",
"user.go",
],
importpath = "go-common/app/interface/live/web-ucenter/service/v1",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/web-ucenter/api/http:go_default_library",
"//app/interface/live/web-ucenter/api/http/v1:go_default_library",
"//app/interface/live/web-ucenter/conf:go_default_library",
"//app/interface/live/web-ucenter/dao:go_default_library",
"//app/interface/live/web-ucenter/dao/capsule:go_default_library",
"//app/interface/live/web-ucenter/dao/history:go_default_library",
"//app/interface/live/web-ucenter/dao/user:go_default_library",
"//app/interface/live/web-ucenter/model:go_default_library",
"//app/service/live/room/api/liverpc/v2:go_default_library",
"//app/service/live/xrewardcenter/api/grpc/v1:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/log/infoc:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/metadata:go_default_library",
"//library/sync/errgroup:go_default_library",
"//vendor/github.com/pkg/errors:go_default_library",
"@org_golang_google_grpc//status: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 = [
"anchorTask_test.go",
"history_test.go",
],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/live/web-ucenter/api/http/v1:go_default_library",
"//app/interface/live/web-ucenter/conf:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/metadata:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)

View File

@@ -0,0 +1,261 @@
package v1
import (
"context"
v1pb "go-common/app/interface/live/web-ucenter/api/http/v1"
"go-common/app/interface/live/web-ucenter/conf"
"go-common/app/service/live/xrewardcenter/api/grpc/v1"
"go-common/library/ecode"
"go-common/library/log"
"go-common/library/net/metadata"
)
// AnchorTaskService struct
type AnchorTaskService struct {
conf *conf.Config
// optionally add other properties here, such as dao
// dao *dao.Dao
conn v1.AnchorRewardClient
}
//NewAnchorTaskService init
func NewAnchorTaskService(c *conf.Config) (s *AnchorTaskService) {
s = &AnchorTaskService{
conf: c,
}
conn, err := v1.NewClient(conf.Conf.Warden)
if err != nil {
panic(err)
}
s.conn = conn
return s
}
// MyReward implementation
// * (主播侧)-我的主播奖励(登录态)
func (s *AnchorTaskService) MyReward(ctx context.Context, req *v1pb.AnchorTaskMyRewardReq) (resp *v1pb.AnchorTaskMyRewardResp, err error) {
resp = &v1pb.AnchorTaskMyRewardResp{}
mid, _ := metadata.Value(ctx, "mid").(int64)
if mid <= 0 {
err = ecode.NoLogin
return
}
page := req.GetPage()
if page <= 0 {
page = 1
}
ret, err := s.conn.MyReward(ctx, &v1.AnchorTaskMyRewardReq{
Page: page,
Uid: mid,
})
if err != nil {
return
}
resp.Page = &v1pb.AnchorTaskMyRewardResp_Page{
Page: ret.GetPage().GetPage(),
PageSize: ret.GetPage().GetPageSize(),
TotalPage: ret.GetPage().GetTotalPage(),
TotalCount: ret.GetPage().GetTotalCount(),
}
resp.ExpireCount = ret.GetExpireCount()
for _, v := range ret.Data {
resp.Data = append(resp.Data, &v1pb.AnchorTaskMyRewardResp_RewardObj{
Id: v.GetId(),
RewardType: v.GetRewardType(),
Status: v.GetStatus(),
RewardId: v.GetRewardId(),
Name: v.GetName(),
Icon: v.GetIcon(),
AchieveTime: v.GetAchieveTime(),
ExpireTime: v.GetExpireTime(),
Source: v.GetSource(),
RewardIntro: v.GetRewardIntro(),
})
}
return
}
// UseRecord implementation
// (主播侧)-奖励使用记录(登录态)
// `midware:"auth"`
func (s *AnchorTaskService) UseRecord(ctx context.Context, req *v1pb.AnchorTaskUseRecordReq) (resp *v1pb.AnchorTaskUseRecordResp, err error) {
resp = &v1pb.AnchorTaskUseRecordResp{}
mid, _ := metadata.Value(ctx, "mid").(int64)
if mid <= 0 {
err = ecode.NoLogin
return
}
page := req.GetPage()
if page <= 0 {
page = 1
}
ret, err := s.conn.UseRecord(ctx, &v1.AnchorTaskUseRecordReq{
Page: page,
Uid: mid,
})
if err != nil {
return
}
resp.Page = &v1pb.AnchorTaskUseRecordResp_Page{
Page: ret.GetPage().GetPage(),
PageSize: ret.GetPage().GetPageSize(),
TotalPage: ret.GetPage().GetTotalPage(),
TotalCount: ret.GetPage().GetTotalCount(),
}
for _, v := range ret.Data {
resp.Data = append(resp.Data, &v1pb.AnchorTaskUseRecordResp_RewardObj{
Id: v.GetId(),
RewardId: v.GetRewardId(),
Status: v.GetStatus(),
Name: v.GetName(),
Icon: v.GetIcon(),
AchieveTime: v.GetAchieveTime(),
ExpireTime: v.GetExpireTime(),
Source: v.GetSource(),
RewardIntro: v.GetRewardIntro(),
UseTime: v.GetUseTime(),
})
}
return
}
// UseReward implementation
// (主播侧)-使用奖励(登录态)
// `method:"POST" midware:"auth"`
func (s *AnchorTaskService) UseReward(ctx context.Context, req *v1pb.AnchorTaskUseRewardReq) (resp *v1pb.AnchorTaskUseRewardResp, err error) {
resp = &v1pb.AnchorTaskUseRewardResp{}
mid, _ := metadata.Value(ctx, "mid").(int64)
if mid <= 0 {
err = ecode.NoLogin
return
}
id := req.GetId()
if id <= 0 {
err = ecode.ParamInvalid
return
}
platform := req.GetPlatform()
if "" == platform {
platform = "web"
}
request := &v1.AnchorTaskUseRewardReq{
Id: id,
Uid: mid,
UsePlat: platform,
}
ret, err := s.conn.UseReward(ctx, request)
log.Info("useReward req(%v) ret(%v), err(%v)", request, ret, err)
if err != nil {
statusCode := ecode.Cause(err)
log.Info("useReward error statusCode(%v) ret(%v), err(%+v)", statusCode, statusCode.Code(), err)
busCode := statusCode.Code()
msg := ""
switch busCode {
case 1:
msg = "参数错误"
case 2:
msg = "这个奖励已经过期了呢"
case 3:
msg = "这个奖励已经被你使用啦~"
case 4:
msg = "为了更好的使用体验,请在开播状态下使用【任意门】哦"
case 5:
msg = "奖励不存在"
default:
msg = "内部错误"
}
err = ecode.Error(ecode.Code(busCode), msg)
return
}
resp.Result = ret.GetResult()
return
}
// IsViewed implementation
// (主播侧)-奖励和任务红点(登录态)
// `midware:"auth"`
func (s *AnchorTaskService) IsViewed(ctx context.Context, req *v1pb.AnchorTaskIsViewedReq) (resp *v1pb.AnchorTaskIsViewedResp, err error) {
resp = &v1pb.AnchorTaskIsViewedResp{}
mid, _ := metadata.Value(ctx, "mid").(int64)
if mid <= 0 {
err = ecode.NoLogin
return
}
ret, err := s.conn.IsViewed(ctx, &v1.AnchorTaskIsViewedReq{
Uid: mid,
})
log.Info("IsViewed req(%v) ret(%v), err(%v)", mid, ret, err)
if err != nil {
return
}
resp = &v1pb.AnchorTaskIsViewedResp{
TaskShouldNotice: ret.GetTaskShouldNotice(),
ShowRewardEntry: ret.GetShowRewardEntry(),
RewardShouldNotice: ret.GetRewardShouldNotice(),
TaskStatus: ret.GetTaskStatus(),
IsBlacked: ret.GetIsBlacked(),
Url: ret.GetUrl(),
}
return
}
// AddReward implementation
// (主播侧)-添加主播奖励(内部接口)
// `method:"POST" internal:"true"`
func (s *AnchorTaskService) AddReward(ctx context.Context, req *v1pb.AnchorTaskAddRewardReq) (resp *v1pb.AnchorTaskAddRewardResp, err error) {
resp = &v1pb.AnchorTaskAddRewardResp{}
ret, err := s.conn.AddReward(ctx, &v1.AnchorTaskAddRewardReq{
RewardId: req.GetRewardId(),
Roomid: req.GetRoomid(),
Source: req.GetSource(),
Uid: req.GetUid(),
OrderId: req.GetOrderId(),
})
if err != nil {
return
}
resp = &v1pb.AnchorTaskAddRewardResp{
Result: ret.GetResult(),
}
resp.Result = ret.GetResult()
return
}

View File

@@ -0,0 +1,41 @@
package v1
import (
"flag"
. "github.com/smartystreets/goconvey/convey"
api "go-common/app/interface/live/web-ucenter/api/http/v1"
"go-common/app/interface/live/web-ucenter/conf"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/metadata"
"testing"
)
var (
AnchorTask *AnchorTaskService
)
func init() {
flag.Set("conf", "../../cmd/test.toml")
var err error
if err = conf.Init(); err != nil {
panic(err)
}
AnchorTask = NewAnchorTaskService(conf.Conf)
}
// go test -test.v -test.run TestServiceAllowanceList
func TestMyReward(t *testing.T) {
Convey("TestMyReward", t, func() {
ctx := metadata.NewContext(bm.Context{}, metadata.MD{
"mid": 10000,
})
res, err := AnchorTask.MyReward(ctx, &api.AnchorTaskMyRewardReq{
Page: 1,
})
t.Logf("%+v", res)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,321 @@
package v1
import (
"context"
"encoding/json"
"fmt"
"strconv"
"time"
"google.golang.org/grpc/status"
"go-common/library/log"
"github.com/pkg/errors"
v1pb "go-common/app/interface/live/web-ucenter/api/http/v1"
"go-common/app/interface/live/web-ucenter/conf"
capsuledao "go-common/app/interface/live/web-ucenter/dao/capsule"
"go-common/library/log/infoc"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/metadata"
)
// CapsuleService struct
type CapsuleService struct {
conf *conf.Config
// optionally add other properties here, such as dao
dao *capsuledao.Dao
infoc *infoc.Infoc
}
//NewCapsuleService init
func NewCapsuleService(c *conf.Config) (s *CapsuleService) {
s = &CapsuleService{
conf: c,
dao: capsuledao.New(c),
}
if c.Infoc != nil && c.Infoc.CapsuleInfoc != nil {
s.infoc = infoc.New(c.Infoc.CapsuleInfoc)
}
return s
}
// GetDetail implementation
func (s *CapsuleService) GetDetail(ctx context.Context, req *v1pb.CapsuleGetDetailReq) (resp *v1pb.CapsuleGetDetailResp, err error) {
resp = &v1pb.CapsuleGetDetailResp{}
uid, ok := metadata.Value(ctx, metadata.Mid).(int64)
if !ok {
err = errors.Wrap(err, "未取到uid")
return
}
data, err := s.dao.GetDetail(ctx, uid, req.From)
if err != nil {
return
}
if data.Normal != nil {
normal := &v1pb.CapsuleGetDetailResp_CapsuleInfo{}
normal.Status = data.Normal.Status
normal.Coin = data.Normal.Coin
normal.Change = data.Normal.Change
normal.Rule = data.Normal.Rule
if data.Normal.Progress != nil {
normal.Progress = &v1pb.Progress{}
normal.Progress.Now = data.Normal.Progress.Now
normal.Progress.Max = data.Normal.Progress.Max
}
glen := len(data.Normal.Gift)
normal.Gift = make([]*v1pb.CapsuleGetDetailResp_Gift, glen)
for i := 0; i < glen; i++ {
gift := &v1pb.CapsuleGetDetailResp_Gift{}
gift.Name = data.Normal.Gift[i].Name
gift.WebImage = data.Normal.Gift[i].WebImage
gift.MobileImage = data.Normal.Gift[i].MobileImage
gift.Image = data.Normal.Gift[i].Image
if data.Normal.Gift[i].Usage != nil {
gift.Usage = &v1pb.Usage{}
gift.Usage.Text = data.Normal.Gift[i].Usage.Text
gift.Usage.Url = data.Normal.Gift[i].Usage.Url
}
normal.Gift[i] = gift
}
glen = len(data.Normal.List)
normal.List = make([]*v1pb.CapsuleGetDetailResp_List, glen)
for i := 0; i < glen; i++ {
info := &v1pb.CapsuleGetDetailResp_List{}
info.Name = data.Normal.List[i].Name
info.Num = data.Normal.List[i].Num
info.Date = data.Normal.List[i].Date
info.Gift = data.Normal.List[i].Gift
normal.List[i] = info
}
resp.Normal = normal
}
if data.Colorful != nil {
colorful := &v1pb.CapsuleGetDetailResp_CapsuleInfo{}
colorful.Status = data.Colorful.Status
colorful.Coin = data.Colorful.Coin
colorful.Change = data.Colorful.Change
colorful.Rule = data.Colorful.Rule
if data.Colorful.Progress != nil {
colorful.Progress = &v1pb.Progress{}
colorful.Progress.Now = data.Colorful.Progress.Now
colorful.Progress.Max = data.Colorful.Progress.Max
}
glen := len(data.Colorful.Gift)
colorful.Gift = make([]*v1pb.CapsuleGetDetailResp_Gift, glen)
for i := 0; i < glen; i++ {
gift := &v1pb.CapsuleGetDetailResp_Gift{}
gift.Name = data.Colorful.Gift[i].Name
gift.WebImage = data.Colorful.Gift[i].WebImage
gift.MobileImage = data.Colorful.Gift[i].MobileImage
gift.Image = data.Colorful.Gift[i].Image
if data.Colorful.Gift[i].Usage != nil {
gift.Usage = &v1pb.Usage{}
gift.Usage.Text = data.Colorful.Gift[i].Usage.Text
gift.Usage.Url = data.Colorful.Gift[i].Usage.Url
}
colorful.Gift[i] = gift
}
glen = len(data.Colorful.List)
colorful.List = make([]*v1pb.CapsuleGetDetailResp_List, glen)
for i := 0; i < glen; i++ {
info := &v1pb.CapsuleGetDetailResp_List{}
info.Name = data.Colorful.List[i].Name
info.Num = data.Colorful.List[i].Num
info.Date = data.Colorful.List[i].Date
info.Gift = data.Colorful.List[i].Gift
colorful.List[i] = info
}
resp.Colorful = colorful
}
return
}
// OpenCapsule implementation
func (s *CapsuleService) OpenCapsule(ctx context.Context, req *v1pb.CapsuleOpenCapsuleReq) (resp *v1pb.CapsuleOpenCapsuleResp, err error) {
resp = &v1pb.CapsuleOpenCapsuleResp{}
uid, ok := metadata.Value(ctx, metadata.Mid).(int64)
if !ok {
err = errors.Wrap(err, "未取到uid")
return
}
data, err := s.dao.OpenCapsule(ctx, uid, req.Type, req.Count, req.Platform)
if err != nil {
return
}
if data.Info != nil {
resp.Info = &v1pb.CapsuleOpenCapsuleResp_Info{}
if data.Info.Colorful != nil {
resp.Info.Colorful = &v1pb.CapsuleOpenCapsuleResp_CapsuleInfo{}
resp.Info.Colorful.Change = data.Info.Colorful.Change
resp.Info.Colorful.Coin = data.Info.Colorful.Coin
if data.Info.Colorful.Progress != nil {
resp.Info.Colorful.Progress = &v1pb.Progress{}
resp.Info.Colorful.Progress.Max = data.Info.Colorful.Progress.Max
resp.Info.Colorful.Progress.Now = data.Info.Colorful.Progress.Now
}
}
if data.Info.Normal != nil {
resp.Info.Normal = &v1pb.CapsuleOpenCapsuleResp_CapsuleInfo{}
resp.Info.Normal.Change = data.Info.Normal.Change
resp.Info.Normal.Coin = data.Info.Normal.Coin
if data.Info.Normal.Progress != nil {
resp.Info.Normal.Progress = &v1pb.Progress{}
resp.Info.Normal.Progress.Max = data.Info.Normal.Progress.Max
resp.Info.Normal.Progress.Now = data.Info.Normal.Progress.Now
}
}
}
resp.Status = data.Status
resp.IsEntity = data.IsEntity
resp.ShowTitle = data.ShowTitle
resp.Text = data.Text
l := len(data.Awards)
resp.Awards = make([]*v1pb.CapsuleOpenCapsuleResp_Award, l)
for i := 0; i < l; i++ {
resp.Awards[i] = &v1pb.CapsuleOpenCapsuleResp_Award{}
resp.Awards[i].Num = data.Awards[i].Num
resp.Awards[i].Name = data.Awards[i].Name
resp.Awards[i].Text = data.Awards[i].Text
resp.Awards[i].MobileImage = data.Awards[i].MobileImage
resp.Awards[i].WebImage = data.Awards[i].WebImage
resp.Awards[i].Img = data.Awards[i].Img
if data.Awards[i].Usage != nil {
resp.Awards[i].Usage = &v1pb.Usage{}
resp.Awards[i].Usage.Text = data.Awards[i].Usage.Text
resp.Awards[i].Usage.Url = data.Awards[i].Usage.Url
}
}
if s.infoc != nil {
awards, err1 := json.Marshal(resp.Awards)
if err1 != nil {
log.Error("OpenCapsule OpenCapsule err")
return
}
bmc, ok := ctx.(bm.Context)
if !ok {
return
}
header := bmc.Request.Header
userip := header.Get("x-backend-bili-real-ip")
if userip == "" {
userip = bmc.Request.RemoteAddr
}
s.infoc.Infov(context.Background(), uid, userip, strconv.FormatInt(time.Now().Unix(), 10), awards, header.Get("platform"), header.Get("version"), header.Get("buvid"), bmc.Request.UserAgent(), bmc.Request.Referer())
}
return
}
// FormatErr format error msg
func (s *CapsuleService) FormatErr(statusCode *status.Status) (code int32, msg string) {
gCode := statusCode.Code()
fmt.Printf("FormatErr %d %s", gCode, statusCode.Message())
code = 1
if gCode == 2 {
code, _ := strconv.Atoi(statusCode.Message())
switch code {
case -400:
msg = "参数错误"
case -401:
msg = "扭蛋币不足"
case -500:
msg = "系统繁忙,请稍后再试"
case -501:
msg = "系统繁忙,请稍后再试"
default:
msg = "系统繁忙,请稍后再试"
}
} else {
msg = "系统繁忙,请稍后再试"
}
return
}
// GetCapsuleInfo implementation
// `midware:"guest"`
func (s *CapsuleService) GetCapsuleInfo(ctx context.Context, req *v1pb.CapsuleGetCapsuleInfoReq) (resp *v1pb.CapsuleGetCapsuleInfoResp, err error) {
resp = &v1pb.CapsuleGetCapsuleInfoResp{}
uid, _ := metadata.Value(ctx, metadata.Mid).(int64)
data, err := s.dao.GetCapsuleInfo(ctx, uid, req.Type, req.From)
if err != nil || data == nil {
return
}
resp.Coin = data.Coin
resp.Rule = data.Rule
if len(data.GiftFilter) > 0 {
resp.GiftFilter = make([]*v1pb.CapsuleGetCapsuleInfoResp_GiftFilter, len(data.GiftFilter))
for ix, award := range data.GiftFilter {
resp.GiftFilter[ix] = &v1pb.CapsuleGetCapsuleInfoResp_GiftFilter{}
resp.GiftFilter[ix].Id = award.Id
resp.GiftFilter[ix].Name = award.Name
resp.GiftFilter[ix].WebUrl = award.WebUrl
resp.GiftFilter[ix].MobileUrl = award.MobileUrl
if award.Usage != nil {
resp.GiftFilter[ix].Usage = &v1pb.Usage{}
resp.GiftFilter[ix].Usage.Text = award.Usage.Text
resp.GiftFilter[ix].Usage.Url = award.Usage.Url
}
}
}
if len(data.GiftList) > 0 {
resp.GiftList = make([]*v1pb.CapsuleGetCapsuleInfoResp_GiftList, len(data.GiftList))
for ix, award := range data.GiftList {
resp.GiftList[ix] = &v1pb.CapsuleGetCapsuleInfoResp_GiftList{}
resp.GiftList[ix].Id = award.Id
resp.GiftList[ix].Name = award.Name
resp.GiftList[ix].Num = award.Num
resp.GiftList[ix].WebUrl = award.WebUrl
resp.GiftList[ix].MobileUrl = award.MobileUrl
resp.GiftList[ix].Type = award.Type
resp.GiftList[ix].Expire = award.Expire
if award.Usage != nil {
resp.GiftList[ix].Usage = &v1pb.Usage{}
resp.GiftList[ix].Usage.Text = award.Usage.Text
resp.GiftList[ix].Usage.Url = award.Usage.Url
}
}
}
return
}
// OpenCapsuleByType implementation
// `method:"POST" midware:"auth"`
func (s *CapsuleService) OpenCapsuleByType(ctx context.Context, req *v1pb.CapsuleOpenCapsuleByTypeReq) (resp *v1pb.CapsuleOpenCapsuleByTypeResp, err error) {
resp = &v1pb.CapsuleOpenCapsuleByTypeResp{}
uid, ok := metadata.Value(ctx, metadata.Mid).(int64)
if !ok {
err = errors.Wrap(err, "未取到uid")
return
}
data, err := s.dao.OpenCapsuleByType(ctx, uid, req.Type, req.Count, req.Platform)
if err != nil || data == nil {
return
}
resp.IsEntity = data.IsEntity
resp.Status = data.Status
resp.Text = data.Text
resp.Info = &v1pb.CapsuleOpenCapsuleByTypeResp_CapsuleInfo{Coin: 0}
if data.Info != nil {
resp.Info.Coin = data.Info.Coin
}
resp.Awards = make([]*v1pb.CapsuleOpenCapsuleByTypeResp_Award, len(data.Awards))
for ix, award := range data.Awards {
resp.Awards[ix] = &v1pb.CapsuleOpenCapsuleByTypeResp_Award{}
resp.Awards[ix].Id = award.Id
resp.Awards[ix].Name = award.Name
resp.Awards[ix].Num = award.Num
resp.Awards[ix].Text = award.Text
resp.Awards[ix].WebUrl = award.WebUrl
resp.Awards[ix].MobileUrl = award.MobileUrl
resp.Awards[ix].Type = award.Type
resp.Awards[ix].Expire = award.Expire
if award.Usage != nil {
resp.Awards[ix].Usage = &v1pb.Usage{}
resp.Awards[ix].Usage.Text = award.Usage.Text
resp.Awards[ix].Usage.Url = award.Usage.Url
}
}
return
}

View File

@@ -0,0 +1,106 @@
package v1
import (
"context"
"github.com/pkg/errors"
historypb "go-common/app/interface/live/web-ucenter/api/http/v1"
"go-common/app/interface/live/web-ucenter/conf"
"go-common/app/interface/live/web-ucenter/dao"
historydao "go-common/app/interface/live/web-ucenter/dao/history"
"go-common/app/service/live/room/api/liverpc/v2"
"go-common/library/ecode"
"go-common/library/log"
"go-common/library/net/metadata"
)
// Service struct
type Service struct {
c *conf.Config
dao *historydao.Dao
}
// New init
func New(c *conf.Config) (s *Service) {
s = &Service{
c: c,
dao: historydao.New(c),
}
return s
}
// GetHistoryByUid 获取直播历史记录
func (s *Service) GetHistoryByUid(ctx context.Context, req *historypb.GetHistoryReq) (resp *historypb.GetHistoryResp, err error) {
uid, ok := metadata.Value(ctx, metadata.Mid).(int64)
if !ok {
err = errors.Wrap(err, "未取到uid")
return
}
mainHistoryInfo, err := s.dao.GetMainHistory(ctx, int32(uid))
if err != nil {
err = errors.Wrap(err, "Call GetMainHistory err")
return
}
if mainHistoryInfo == nil {
return
}
RoomIds := make([]int64, 0)
for _, v := range mainHistoryInfo {
RoomIds = append(RoomIds, v.RoomId)
}
reply, err := dao.RoomAPI.V2Room.GetByIds(ctx, &v2.RoomGetByIdsReq{Ids: RoomIds})
if err != nil {
err = errors.Wrap(err, "Call GetByIds err")
return
}
if reply.GetCode() != 0 {
err = ecode.Int(int(reply.GetCode()))
return
}
roomInfos := reply.Data
resp = &historypb.GetHistoryResp{}
for _, RoomId := range RoomIds {
list := &historypb.GetHistoryResp_List{}
room, ok := roomInfos[RoomId]
if !ok {
log.Warn("[GetHistoryByUid] req(%v), uid(%d), failed to get room(%d) info from (%v)", req, uid, RoomId, roomInfos)
continue
}
list.Roomid = RoomId
list.Uid = int32(room.Uid)
list.Uname = room.Uname
list.Title = room.Title
list.Face = room.Face
list.LiveStatus = int32(room.LiveStatus)
list.FansNum = int32(room.Attentions)
list.AreaV2Id = int32(room.AreaV2Id)
list.AreaV2Name = room.AreaV2Name
list.LiveStatus = int32(room.LiveStatus)
list.UserCover = room.UserCover
list.AreaV2ParentId = int32(room.AreaV2ParentId)
list.AreaV2ParentName = room.AreaV2ParentName
list.Tags = room.Tags
resp.List = append(resp.List, list)
}
resp.Title = "哔哩哔哩直播 - 观看历史"
resp.Count = int32(len(roomInfos))
return
}
// DelHistory 删除直播历史记录
func (s *Service) DelHistory(ctx context.Context, req *historypb.DelHistoryReq) (resp *historypb.DelHistoryResp, err error) {
uid, ok := metadata.Value(ctx, metadata.Mid).(int64)
if !ok {
err = errors.Wrap(err, "未取到uid")
return
}
reply, err := s.dao.DelHistory(ctx, uid)
resp = &historypb.DelHistoryResp{}
if err != nil || reply != 0 {
err = ecode.Int(int(reply))
return
}
return
}

View File

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

View File

@@ -0,0 +1,141 @@
package v1
import (
"context"
"github.com/pkg/errors"
pb "go-common/app/interface/live/web-ucenter/api/http"
"go-common/app/interface/live/web-ucenter/conf"
"go-common/app/interface/live/web-ucenter/dao/user"
"go-common/app/interface/live/web-ucenter/model"
"go-common/library/log"
"go-common/library/net/metadata"
"go-common/library/sync/errgroup"
"strings"
)
// UserService user service
type UserService struct {
c *conf.Config
dao *user.Dao
}
// NewUserService new user service
func NewUserService(c *conf.Config) (s *UserService) {
s = &UserService{
c: c,
dao: user.New(c),
}
return s
}
// GetUserInfo implementation
// 根据uid查询用户信息
// `midware:"auth"`,需要登录态
func (s *UserService) GetUserInfo(ctx context.Context, req *pb.GetInfoReq) (resp *pb.GetInfoResp, err error) {
var (
group, errCtx = errgroup.WithContext(ctx)
userExp int64
userRank string
)
// check login
uid := metadata.Int64(ctx, metadata.Mid)
if uid == 0 {
err = errors.Wrap(err, "请先登录")
return
}
platform := checkPlatform(req.Platform)
resp = &pb.GetInfoResp{
Uid: uid,
UserCharged: 0,
}
// 并行获取account / xuser.vip / xuser.exp / wallet / rc / rankdb
func() {
// account.ProfileWithStat3
group.Go(func() (err error) {
profile, err := s.dao.GetAccountProfile(errCtx, uid)
if err != nil {
log.Error("[service.v1.user|GetUserInfo] GetAccountProfile error(%v), uid(%d)", err, uid)
return nil
}
resp.Uname = profile.Name
resp.Face = strings.Replace(profile.Face, "http://", "https://", 1)
resp.Coin = profile.Coins
return
})
// wallet
group.Go(func() (err error) {
silver, gold, err := s.dao.GetWallet(errCtx, uid, platform)
if err != nil {
log.Error("[service.v1.user|GetUserInfo] GetWallet error(%v), uid(%d)", err, uid)
return nil
}
resp.Silver = silver
resp.Gold = gold
return
})
// xuser.vip
group.Go(func() (err error) {
vipInfo, err := s.dao.GetLiveVip(errCtx, uid)
if err != nil || vipInfo == nil || vipInfo.Info == nil {
log.Error("[service.v1.user|GetUserInfo] GetLiveVip error(%v), uid(%d)", err, uid)
return nil
}
resp.Vip = vipInfo.Info.Vip
resp.Svip = vipInfo.Info.Svip
return
})
// xuser.exp
group.Go(func() (err error) {
expInfo, err := s.dao.GetLiveExp(errCtx, uid)
if err != nil || expInfo == nil || expInfo.UserLevel == nil {
log.Error("[service.v1.user|GetUserInfo] GetLiveExp error(%v), uid(%d)", err, uid)
return nil
}
userExp = expInfo.UserLevel.UserExp
resp.UserLevel = expInfo.UserLevel.Level
resp.UserNextLevel = expInfo.UserLevel.NextLevel
resp.UserIntimacy = expInfo.UserLevel.UserExp - expInfo.UserLevel.UserExpLeft
resp.UserNextIntimacy = expInfo.UserLevel.UserExpNextLevel
resp.IsLevelTop = expInfo.UserLevel.IsLevelTop
return
})
// rc
group.Go(func() (err error) {
achieve, err := s.dao.GetLiveAchieve(errCtx, uid)
if err != nil {
log.Error("[service.v1.user|GetUserInfo] GetLiveAchieve error(%v), uid(%d)", err, uid)
return nil
}
resp.Achieve = achieve
return
})
// rankdb
group.Go(func() (err error) {
if userRank, err = s.dao.GetLiveRank(errCtx, uid); err != nil {
log.Error("[service.v1.user|GetUserInfo] GetLiveRank error(%v), uid(%d)", err, uid)
return nil
}
return
})
}()
group.Wait()
// 根据exp & rankdb 判断组装返回的user_level_rank字段
if userExp < 120000000 {
resp.UserLevelRank = ">50000"
} else {
resp.UserLevelRank = userRank
}
log.Info("GetUserInfo.resp(%v)", resp)
return
}
func checkPlatform(p string) string {
if p == "" || (p != model.PlatformIos && p != model.PlatformAndroid) {
return model.PlatformPc
}
return p
}