Create & Init Project...
This commit is contained in:
32
app/interface/live/open-interface/internal/dao/BUILD
Normal file
32
app/interface/live/open-interface/internal/dao/BUILD
Normal 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",
|
||||
"grpc.go",
|
||||
],
|
||||
importpath = "go-common/app/interface/live/open-interface/internal/dao",
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
deps = ["//app/service/live/broadcast-proxy/api/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"],
|
||||
)
|
88
app/interface/live/open-interface/internal/dao/dao.go
Normal file
88
app/interface/live/open-interface/internal/dao/dao.go
Normal file
@ -0,0 +1,88 @@
|
||||
package dao
|
||||
|
||||
import (
|
||||
"context"
|
||||
)
|
||||
|
||||
// Dao dao.
|
||||
type Dao struct {
|
||||
// db *sql.DB
|
||||
// redis *redis.Pool
|
||||
// redisExpire int32
|
||||
// mc *memcache.Pool
|
||||
// mcExpire int32
|
||||
}
|
||||
|
||||
// func checkErr(err error) {
|
||||
// if err != nil {
|
||||
// panic(err)
|
||||
// }
|
||||
// }
|
||||
|
||||
// New new a dao and return.
|
||||
func New() (dao *Dao) {
|
||||
// var (
|
||||
// dc struct {
|
||||
// Demo *sql.Config
|
||||
// }
|
||||
// rc struct {
|
||||
// Demo *redis.Config
|
||||
// DemoExpire xtime.Duration
|
||||
// }
|
||||
// mc struct {
|
||||
// Demo *memcache.Config
|
||||
// DemoExpire xtime.Duration
|
||||
// }
|
||||
// )
|
||||
// checkErr(paladin.Get("mysql.toml").UnmarshalTOML(&dc))
|
||||
// checkErr(paladin.Get("redis.toml").UnmarshalTOML(&rc))
|
||||
// checkErr(paladin.Get("memcache.toml").UnmarshalTOML(&mc))
|
||||
dao = &Dao{
|
||||
// // mysql
|
||||
// db: sql.NewMySQL(dc.Demo),
|
||||
// // redis
|
||||
// redis: redis.NewPool(rc.Demo),
|
||||
// redisExpire: int32(time.Duration(rc.DemoExpire) / time.Second),
|
||||
// // memcache
|
||||
// mc: memcache.NewPool(mc.Demo),
|
||||
// mcExpire: int32(time.Duration(mc.DemoExpire) / time.Second),
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Close close the resource.
|
||||
func (d *Dao) Close() {
|
||||
// d.mc.Close()
|
||||
// d.redis.Close()
|
||||
// d.db.Close()
|
||||
}
|
||||
|
||||
// Ping ping the resource.
|
||||
func (d *Dao) Ping(ctx context.Context) (err error) {
|
||||
// if err = d.pingMC(ctx); err != nil {
|
||||
// return
|
||||
// }
|
||||
// if err = d.pingRedis(ctx); err != nil {
|
||||
// return
|
||||
// }
|
||||
// return d.db.Ping(ctx)
|
||||
return nil
|
||||
}
|
||||
|
||||
// func (d *Dao) pingMC(ctx context.Context) (err error) {
|
||||
// conn := d.mc.Get(ctx)
|
||||
// defer conn.Close()
|
||||
// if err = conn.Set(&memcache.Item{Key: "ping", Value: []byte("pong"), Expiration: 0}); err != nil {
|
||||
// log.Error("conn.Set(PING) error(%v)", err)
|
||||
// }
|
||||
// return
|
||||
// }
|
||||
|
||||
// func (d *Dao) pingRedis(ctx context.Context) (err error) {
|
||||
// conn := d.redis.Get(ctx)
|
||||
// defer conn.Close()
|
||||
// if _, err = conn.Do("SET", "ping", "pong"); err != nil {
|
||||
// log.Error("conn.Set(PING) error(%v)", err)
|
||||
// }
|
||||
// return
|
||||
// }
|
19
app/interface/live/open-interface/internal/dao/grpc.go
Normal file
19
app/interface/live/open-interface/internal/dao/grpc.go
Normal file
@ -0,0 +1,19 @@
|
||||
package dao
|
||||
|
||||
import (
|
||||
broadcasrtService "go-common/app/service/live/broadcast-proxy/api/v1"
|
||||
)
|
||||
|
||||
var (
|
||||
//BcastClient 弹幕服务
|
||||
BcastClient *broadcasrtService.Client
|
||||
)
|
||||
|
||||
//InitGrpc 初始化grpcclient
|
||||
func InitGrpc() {
|
||||
var err error
|
||||
BcastClient, err = broadcasrtService.NewClient(nil)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
28
app/interface/live/open-interface/internal/model/BUILD
Normal file
28
app/interface/live/open-interface/internal/model/BUILD
Normal 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/open-interface/internal/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"],
|
||||
)
|
@ -0,0 +1 @@
|
||||
package model
|
36
app/interface/live/open-interface/internal/server/http/BUILD
Normal file
36
app/interface/live/open-interface/internal/server/http/BUILD
Normal file
@ -0,0 +1,36 @@
|
||||
package(default_visibility = ["//visibility:public"])
|
||||
|
||||
load(
|
||||
"@io_bazel_rules_go//go:def.bzl",
|
||||
"go_library",
|
||||
)
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["http.go"],
|
||||
importpath = "go-common/app/interface/live/open-interface/internal/server/http",
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//app/interface/live/open-interface/api/http/v1:go_default_library",
|
||||
"//app/interface/live/open-interface/internal/service:go_default_library",
|
||||
"//library/conf/paladin:go_default_library",
|
||||
"//library/log:go_default_library",
|
||||
"//library/net/http/blademaster: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"],
|
||||
)
|
@ -0,0 +1,63 @@
|
||||
package http
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
dmv1pb "go-common/app/interface/live/open-interface/api/http/v1"
|
||||
"go-common/app/interface/live/open-interface/internal/service"
|
||||
"go-common/library/conf/paladin"
|
||||
"go-common/library/log"
|
||||
bm "go-common/library/net/http/blademaster"
|
||||
"go-common/library/net/http/blademaster/middleware/verify"
|
||||
)
|
||||
|
||||
var (
|
||||
svc *service.Service
|
||||
)
|
||||
|
||||
// New new a bm server.
|
||||
func New(s *service.Service) (engine *bm.Engine) {
|
||||
var (
|
||||
hc struct {
|
||||
Server *bm.ServerConfig
|
||||
}
|
||||
)
|
||||
if err := paladin.Get("http.toml").UnmarshalTOML(&hc); err != nil {
|
||||
if err != paladin.ErrNotExist {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
svc = s
|
||||
engine = bm.DefaultServer(hc.Server)
|
||||
initRouter(engine, verify.New(nil))
|
||||
if err := engine.Start(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func initRouter(e *bm.Engine, v *verify.Verify) {
|
||||
e.Ping(ping)
|
||||
e.Register(register)
|
||||
g := e.Group("/x/open-interface")
|
||||
{
|
||||
g.GET("/start", v.Verify, howToStart)
|
||||
}
|
||||
dmv1pb.RegisterDmBMServer(e, svc)
|
||||
}
|
||||
|
||||
func ping(ctx *bm.Context) {
|
||||
if err := svc.Ping(ctx); err != nil {
|
||||
log.Error("ping error(%v)", err)
|
||||
ctx.AbortWithStatus(http.StatusServiceUnavailable)
|
||||
}
|
||||
}
|
||||
|
||||
func register(c *bm.Context) {
|
||||
c.JSON(map[string]interface{}{}, nil)
|
||||
}
|
||||
|
||||
// example for http request handler.
|
||||
func howToStart(c *bm.Context) {
|
||||
c.String(0, "Golang 大法好 !!!")
|
||||
}
|
41
app/interface/live/open-interface/internal/service/BUILD
Normal file
41
app/interface/live/open-interface/internal/service/BUILD
Normal file
@ -0,0 +1,41 @@
|
||||
package(default_visibility = ["//visibility:public"])
|
||||
|
||||
load(
|
||||
"@io_bazel_rules_go//go:def.bzl",
|
||||
"go_library",
|
||||
)
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = [
|
||||
"dm.go",
|
||||
"service.go",
|
||||
],
|
||||
importpath = "go-common/app/interface/live/open-interface/internal/service",
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//app/interface/live/open-interface/api/http/v1:go_default_library",
|
||||
"//app/interface/live/open-interface/internal/dao:go_default_library",
|
||||
"//app/service/live/broadcast-proxy/api/v1:go_default_library",
|
||||
"//app/service/live/resource/sdk:go_default_library",
|
||||
"//library/conf/paladin: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"],
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
101
app/interface/live/open-interface/internal/service/dm.go
Normal file
101
app/interface/live/open-interface/internal/service/dm.go
Normal file
@ -0,0 +1,101 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/md5"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"math"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
dmv1pb "go-common/app/interface/live/open-interface/api/http/v1"
|
||||
"go-common/app/interface/live/open-interface/internal/dao"
|
||||
broadcasrtService "go-common/app/service/live/broadcast-proxy/api/v1"
|
||||
titansSdk "go-common/app/service/live/resource/sdk"
|
||||
"go-common/library/ecode"
|
||||
"go-common/library/log"
|
||||
"go-common/library/net/metadata"
|
||||
)
|
||||
|
||||
func checksign(ts string, sign string, group string) bool {
|
||||
sts := time.Now().Unix()
|
||||
cts, _ := strconv.ParseInt(ts, 10, 64)
|
||||
dv := sts - cts
|
||||
if math.Abs(float64(dv)) > 5 {
|
||||
log.Info("[dm] ts err: %+d", dv)
|
||||
return false
|
||||
}
|
||||
|
||||
userSecrets, terr := titansSdk.Get("dmUser")
|
||||
if terr != nil {
|
||||
log.Error("[dm] get titan conf err: %+v", terr)
|
||||
return false
|
||||
}
|
||||
juserSecrets := make(map[string]string)
|
||||
if jerr := json.Unmarshal([]byte(userSecrets), &juserSecrets); jerr != nil {
|
||||
log.Error("[dm] JSON decode titan conf err: %+v", terr)
|
||||
return false
|
||||
}
|
||||
|
||||
secret, ok := juserSecrets[group]
|
||||
if !ok {
|
||||
log.Info("[dm] unknow group: %+v", group)
|
||||
return false
|
||||
}
|
||||
|
||||
newSign := fmt.Sprintf("%x", md5.Sum([]byte(group+secret+ts)))
|
||||
if newSign != sign {
|
||||
log.Info("[dm] check sign err sign: %+s service sign: %s", sign, newSign)
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
//Sendmsg 发送弹幕消息
|
||||
func (s *Service) Sendmsg(ctx context.Context, req *dmv1pb.SendMsgReq) (resp *dmv1pb.SendMsgResp, err error) {
|
||||
if ok := checksign(req.GetTs(), req.GetSign(), req.GetGroup()); !ok {
|
||||
return nil, ecode.Error(-403, "sign or ts error")
|
||||
}
|
||||
|
||||
var dmString = "{\"cmd\":\"DANMU_MSG\",\"info\":[[0,1,25,16777215,%d,0,0,\"\",0,0,0],\"%s\",[0,\"\",0,0,0,0,0,\"\"],[],[0,0,0,\"\"],[\"\",\"\"],0,0]}"
|
||||
|
||||
breq := &broadcasrtService.RoomMessageRequest{
|
||||
RoomId: int32(req.GetRoomID()),
|
||||
Message: fmt.Sprintf(dmString, time.Now().Unix(), req.GetMsg()),
|
||||
}
|
||||
_, berr := dao.BcastClient.DanmakuClient.RoomMessage(ctx, breq)
|
||||
if berr != nil {
|
||||
log.Error("[dm] SendBroadCastGrpc err: %+v", berr)
|
||||
return nil, ecode.Error(-400, "send msg err")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
//GetConf 获取弹幕配置
|
||||
func (s *Service) GetConf(ctx context.Context, req *dmv1pb.GetConfReq) (resp *dmv1pb.GetConfResp, err error) {
|
||||
if ok := checksign(req.GetTs(), req.GetSign(), req.GetGroup()); !ok {
|
||||
return nil, ecode.Error(-403, "sign or ts error")
|
||||
}
|
||||
|
||||
resp = &dmv1pb.GetConfResp{
|
||||
WSPort: []int64{2244},
|
||||
WSSPort: []int64{443},
|
||||
TCPPort: []int64{2243, 80},
|
||||
DomianList: []string{},
|
||||
}
|
||||
|
||||
breq := &broadcasrtService.DispatchRequest{
|
||||
UserIp: metadata.String(ctx, metadata.RemoteIP),
|
||||
}
|
||||
bresp, berr := dao.BcastClient.Dispatch(ctx, breq)
|
||||
if berr != nil {
|
||||
resp.IPList = []string{"broadcastlv.chat.bilibili.com"}
|
||||
resp.DomianList = []string{"broadcastlv.chat.bilibili.com"}
|
||||
log.Error("[dm] get IPList by BcastClient Dispatch err:%+v", berr)
|
||||
} else {
|
||||
resp.IPList = bresp.Ip
|
||||
resp.DomianList = bresp.Host
|
||||
}
|
||||
return resp, nil
|
||||
}
|
@ -0,0 +1,50 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"go-common/app/interface/live/open-interface/internal/dao"
|
||||
titansSdk "go-common/app/service/live/resource/sdk"
|
||||
"go-common/library/conf/paladin"
|
||||
)
|
||||
|
||||
// Service service.
|
||||
type Service struct {
|
||||
ac *paladin.Map
|
||||
dao *dao.Dao
|
||||
}
|
||||
|
||||
// New new a service and return.
|
||||
func New() (s *Service) {
|
||||
var ac = new(paladin.TOML)
|
||||
if err := paladin.Watch("application.toml", ac); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
s = &Service{
|
||||
ac: ac,
|
||||
dao: dao.New(),
|
||||
}
|
||||
|
||||
dao.InitGrpc()
|
||||
InitTitan()
|
||||
return s
|
||||
}
|
||||
|
||||
//InitTitan 初始化kv配置
|
||||
func InitTitan() {
|
||||
conf := &titansSdk.Config{
|
||||
TreeId: 82686,
|
||||
Expire: 1,
|
||||
}
|
||||
titansSdk.Init(conf)
|
||||
}
|
||||
|
||||
// Ping ping the resource.
|
||||
func (s *Service) Ping(ctx context.Context) (err error) {
|
||||
return s.dao.Ping(ctx)
|
||||
}
|
||||
|
||||
// Close close the resource.
|
||||
func (s *Service) Close() {
|
||||
s.dao.Close()
|
||||
}
|
Reference in New Issue
Block a user