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,57 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
go_library(
name = "go_default_library",
srcs = [
"captcha.go",
"roomAdmin.go",
],
importpath = "go-common/app/interface/live/web-room/service/v1",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/web-room/api/http/v1:go_default_library",
"//app/interface/live/web-room/conf:go_default_library",
"//app/interface/live/web-room/dao:go_default_library",
"//app/service/live/xcaptcha/api/grpc/v1:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/metadata: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-room/service/v1/dm:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
go_test(
name = "go_default_test",
srcs = ["roomAdmin_test.go"],
embed = [":go_default_library"],
tags = ["automanaged"],
deps = [
"//app/interface/live/web-room/api/http/v1:go_default_library",
"//app/interface/live/web-room/conf:go_default_library",
"//library/net/metadata:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)

View File

@@ -0,0 +1,105 @@
package v1
import (
v1pb "go-common/app/interface/live/web-room/api/http/v1"
"go-common/app/interface/live/web-room/conf"
xCaptcha "go-common/app/service/live/xcaptcha/api/grpc/v1"
"go-common/library/ecode"
"go-common/library/log"
"go-common/library/net/metadata"
"context"
)
// CaptchaService struct
type CaptchaService struct {
conf *conf.Config
xCaptcha *xCaptcha.Client
// optionally add other properties here, such as dao
// dao *dao.Dao
}
//NewCaptchaService init
func NewCaptchaService(c *conf.Config) (s *CaptchaService) {
s = &CaptchaService{
conf: c,
}
client, err := xCaptcha.NewClient(c.XCaptcha)
if err != nil {
log.Error("[web-room][captcha][new XCaptcha error] init XCaptcha error, %+v", err)
}
s.xCaptcha = client
return s
}
// captcha 相关服务
// Create implementation
// 创建验证码
func (s *CaptchaService) Create(ctx context.Context, req *v1pb.CreateCaptchaReq) (resp *v1pb.CreateCaptchaResp, err error) {
resp = &v1pb.CreateCaptchaResp{}
uid, _ := metadata.Value(ctx, "mid").(int64)
if uid <= 0 {
err = ecode.Error(ecode.NoLogin, "未登录")
return
}
XCaptchaReq := &xCaptcha.XCreateCaptchaReq{
Type: req.GetType(),
ClientType: req.GetClientType(),
Height: req.GetHeight(),
Width: req.GetWidth(),
Uid: uid,
ClientIp: metadata.String(ctx, metadata.RemoteIP),
}
if s.xCaptcha == nil {
err = ecode.Error(ecode.ServerErr, "创建验证码失败")
return
}
XCaptchaResp, err := s.xCaptcha.Create(ctx, XCaptchaReq)
if err != nil || XCaptchaResp == nil {
return
}
resp = &v1pb.CreateCaptchaResp{
Type: XCaptchaResp.Type,
Geetest: &v1pb.GeeTest{},
Image: &v1pb.Image{},
}
resp.Geetest.Challenge = XCaptchaResp.Geetest.Challenge
resp.Geetest.Gt = XCaptchaResp.Geetest.Gt
resp.Image.Token = XCaptchaResp.Image.Token
resp.Image.Content = XCaptchaResp.Image.Content
resp.Image.Tips = XCaptchaResp.Image.Tips
return
}
// Verify implementation
// 校验接口 `midware:"auth" method:"POST"`
func (s *CaptchaService) Verify(ctx context.Context, req *v1pb.VerifyReq) (resp *v1pb.VerifyResp, err error) {
resp = &v1pb.VerifyResp{}
uid, _ := metadata.Value(ctx, "mid").(int64)
if uid <= 0 {
err = ecode.Error(ecode.NoLogin, "未登录")
return
}
if req.GetAnti() == "" {
err = ecode.Error(ecode.ParamInvalid, "参数错误")
return
}
XCaptchaReq := &xCaptcha.CheckReq{
Anti: req.GetAnti(),
Uid: uid,
ClientIp: metadata.String(ctx, metadata.RemoteIP),
}
if s.xCaptcha == nil {
err = ecode.Error(ecode.ServerErr, "创建验证码失败")
return
}
XCaptchaResp, err := s.xCaptcha.Check(ctx, XCaptchaReq)
if err != nil || XCaptchaResp == nil {
return
}
resp.Type = XCaptchaResp.Type
resp.Token = XCaptchaResp.Token
return
}

View File

@@ -0,0 +1,44 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"dM.go",
"data.go",
"validate.go",
],
importpath = "go-common/app/interface/live/web-room/service/v1/dm",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/web-room/api/http/v1:go_default_library",
"//app/interface/live/web-room/conf:go_default_library",
"//app/interface/live/web-room/model:go_default_library",
"//app/service/live/live-dm/api/grpc/v1:go_default_library",
"//app/service/live/live_riskcontrol/api/grpc/v1:go_default_library",
"//app/service/live/xcaptcha/api/grpc/v1: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",
],
)
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,136 @@
package v1
import (
v1pb "go-common/app/interface/live/web-room/api/http/v1"
"go-common/app/interface/live/web-room/conf"
dmrpc "go-common/app/service/live/live-dm/api/grpc/v1"
risk "go-common/app/service/live/live_riskcontrol/api/grpc/v1"
xcaptcha "go-common/app/service/live/xcaptcha/api/grpc/v1"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/metadata"
"strings"
)
// DMService struct
type DMService struct {
conf *conf.Config
}
var (
//dmClient 弹幕clietn
dmClient dmrpc.DMClient
//riskClient 风控Client
riskClient risk.IsForbiddenClient
//验证码client
xcaptchaClient xcaptcha.XCaptchaClient
)
//NewDMService init
func NewDMService(c *conf.Config) (s *DMService) {
s = &DMService{
conf: c,
}
var err error
if dmClient, err = dmrpc.NewClient(c.DM); err != nil {
panic(err)
}
if riskClient, err = risk.NewClient(c.DM); err != nil {
panic(err)
}
if xcaptchaClient, err = xcaptcha.NewClient(c.VerifyConf); err != nil {
panic(err)
}
return s
}
func sendMsg(ctx *bm.Context, req *v1pb.SendDMReq, uid int64) (resp *v1pb.SendMsgResp, err error) {
resp = &v1pb.SendMsgResp{}
ip := metadata.String(ctx, metadata.RemoteIP)
var ck = make([]string, 0, 10)
for _, v := range ctx.Request.Cookies() {
if v.Name != "SESSDATA" {
ck = append(ck, v.Name+"="+v.Value)
}
}
var dmReq = &dmrpc.SendMsgReq{
Uid: uid,
Roomid: req.Roomid,
Msg: req.Msg,
Rnd: req.Rnd,
Ip: ip,
Fontsize: req.Fontsize,
Mode: req.Mode,
Platform: "web",
Msgtype: 0,
Bubble: req.Bubble,
Lancer: &dmrpc.Lancer{
Build: 0,
Buvid: "",
Refer: ctx.Request.Header.Get("Referer"),
UserAgent: ctx.Request.Header.Get("User-Agent"),
Cookie: strings.Join(ck, ";"),
},
}
gresp, gerr := dmClient.SendMsg(ctx, dmReq)
if gerr != nil {
log.Error("DM GRPC ERR: %v", gerr)
err = ecode.Error(1003218, "系统正在维护中,请稍后尝试")
return nil, err
}
if gresp.IsLimit {
err = ecode.Error(ecode.Code(gresp.Code), gresp.LimitMsg)
return nil, err
}
return resp, nil
}
// SendMsg implementation
// `method:"POST"`
func (s *DMService) SendMsg(ctx *bm.Context, req *v1pb.SendDMReq) (resp *v1pb.SendMsgResp, err error) {
uid, ok := ctx.Get("mid")
if !ok {
err = ecode.Error(1003218, "未登录")
return nil, err
}
//验证码
if req.Anti != "" {
result := checkVerify(ctx, req.Anti, uid.(int64), req.Roomid)
if !result {
return nil, ecode.Error(1990001, "验证码验证失败")
}
return sendMsg(ctx, req, uid.(int64))
}
//风控校验
ifb, ferr := isriskcontrol(ctx, uid.(int64), req)
if ifb {
return nil, ferr
}
//发送弹幕
return sendMsg(ctx, req, uid.(int64))
}
// GetHistory implementation
// `method:"POST"`
func (s *DMService) GetHistory(ctx *bm.Context, req *v1pb.HistoryReq) (resp *v1pb.HistoryResp, err error) {
resp = &v1pb.HistoryResp{}
var hreq = &dmrpc.HistoryReq{
Roomid: req.Roomid,
}
gresp, err := dmClient.GetHistory(ctx, hreq)
if err != nil {
log.Error("DM GRPC ERR: %v", err)
return
}
resp.Admin = gresp.Admin
resp.Room = gresp.Room
return
}

View File

@@ -0,0 +1,32 @@
package v1
import (
"encoding/json"
v1pb "go-common/app/interface/live/web-room/api/http/v1"
"go-common/app/interface/live/web-room/model"
)
//HistoryData 历史数据处理
func HistoryData(data *v1pb.HistoryResp) map[string][]*model.History {
var result = make(map[string][]*model.History)
result["admin"] = make([]*model.History, 0, 10)
result["room"] = make([]*model.History, 0, 10)
for i := 0; i < len(data.Admin); i++ {
var h = &model.History{}
err := json.Unmarshal([]byte(data.Admin[i]), h)
if err != nil {
break
}
result["admin"] = append(result["admin"], h)
}
for i := 0; i < len(data.Room); i++ {
var h = &model.History{}
err := json.Unmarshal([]byte(data.Room[i]), h)
if err != nil {
break
}
result["room"] = append(result["room"], h)
}
return result
}

View File

@@ -0,0 +1,79 @@
package v1
import (
"encoding/json"
v1pb "go-common/app/interface/live/web-room/api/http/v1"
risk "go-common/app/service/live/live_riskcontrol/api/grpc/v1"
xcaptcha "go-common/app/service/live/xcaptcha/api/grpc/v1"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/metadata"
)
type rbody struct {
Roomid int64 `json:"roomid"`
Msg string `json:"msg" `
Rnd string `json:"rnd" `
Fontsize int64 `json:"fontsize"`
Mode int64 `json:"mode" `
Color int64 `json:"color"`
Bubble int64 `json:"bubble"`
}
func isriskcontrol(ctx *bm.Context, uid int64, r *v1pb.SendDMReq) (forbid bool, err *ecode.Status) {
req := &risk.GetForbiddenReq{
Uid: uid,
Uri: "/xlive/app-room/v1/dM/sendmsg",
Ip: metadata.String(ctx, metadata.RemoteIP),
Method: "POST",
Header: make(map[string]string),
}
for k := range ctx.Request.Header {
req.Header[k] = ctx.Request.Header.Get(k)
}
rb := &rbody{
Roomid: r.Roomid,
Msg: r.Msg,
Rnd: r.Rnd,
Fontsize: r.Fontsize,
Mode: r.Mode,
Color: r.Color,
Bubble: r.Bubble,
}
jb, _ := json.Marshal(rb)
req.Body = string(jb)
resp, rerr := riskClient.GetForbidden(ctx, req)
if rerr != nil {
log.Error("DM: riskcontrol err:%+v", rerr)
return false, nil
}
switch resp.IsForbidden {
case 0:
return false, nil
case 1:
return true, ecode.Error(400, "访问被拒绝")
case 2:
return true, ecode.Error(1990000, "need a second time verify")
}
return false, nil
}
func checkVerify(ctx *bm.Context, anti string, uid int64, roomid int64) bool {
req := &xcaptcha.XVerifyReq{
Uid: uid,
ClientIp: metadata.String(ctx, metadata.RemoteIP),
XAnti: anti,
RoomId: roomid,
}
if _, err := xcaptchaClient.Verify(ctx, req); err != nil {
return false
}
return true
}

View File

@@ -0,0 +1,75 @@
package v1
import (
"context"
v1pb "go-common/app/interface/live/web-room/api/http/v1"
"go-common/app/interface/live/web-room/conf"
"go-common/app/interface/live/web-room/dao"
"go-common/library/log"
)
// RoomAdminService struct
type RoomAdminService struct {
conf *conf.Config
// optionally add other properties here, such as dao
// dao *dao.Dao
dao *dao.Dao
}
//NewRoomAdminService init
func NewRoomAdminService(c *conf.Config) (s *RoomAdminService) {
s = &RoomAdminService{
conf: c,
dao: dao.New(c),
}
return s
}
// History 相关服务
// GetByRoom implementation
// 获取主播拥有的的所有房管, 无需登录态
// `method:"GET"
func (s *RoomAdminService) GetByRoom(ctx context.Context, req *v1pb.RoomAdminGetByRoomReq) (resp *v1pb.RoomAdminGetByRoomResp, err error) {
// 默认值
resp = &v1pb.RoomAdminGetByRoomResp{
Page: &v1pb.RoomAdminGetByRoomResp_Page{
Page: 1,
PageSize: 1,
TotalPage: 1,
TotalCount: 0,
},
Data: []*v1pb.RoomAdminGetByRoomResp_Data{},
}
roomID := req.GetRoomid()
page := req.GetPage()
pageSize := req.GetPageSize()
if page <= 0 {
page = 1
}
if pageSize <= 0 || pageSize > 100 {
pageSize = int64(10)
}
ret, err := s.dao.GetByRoomIDPage(ctx, roomID, page, pageSize)
if ret == nil {
log.Info("call GetByAnchor nil mid(%v) err (%v)", roomID, err)
return
}
if err != nil {
return
}
if nil != ret.Page {
resp.Page = ret.Page
}
if nil != ret.Data {
resp.Data = ret.Data
}
return
}

View File

@@ -0,0 +1,40 @@
package v1
import (
"context"
"flag"
"fmt"
"go-common/app/interface/live/web-room/api/http/v1"
"go-common/app/interface/live/web-room/conf"
"go-common/library/net/metadata"
"testing"
"github.com/smartystreets/goconvey/convey"
)
var roomAdmin *RoomAdminService
func init() {
flag.Set("conf", "../../cmd/test.toml")
if err := conf.Init(); err != nil {
panic(err)
}
roomAdmin = NewRoomAdminService(conf.Conf)
}
func TestV1NewRoomAdminService(t *testing.T) {
convey.Convey("NewRoomAdminService", t, func() {
ctx := metadata.NewContext(context.TODO(), metadata.MD{
metadata.Mid: int64(25156756),
})
res, err := roomAdmin.GetByRoom(ctx, &v1.RoomAdminGetByRoomReq{
Page: 0,
Roomid: 1008,
PageSize: 0,
})
fmt.Println("------", res, err, "-------")
t.Logf("%v,%s", res, err)
convey.So(err, convey.ShouldBeNil)
})
}