go-common/app/interface/live/open-interface/internal/service/dm.go
2019-04-22 18:49:16 +08:00

102 lines
2.9 KiB
Go

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
}