You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
179 lines
3.9 KiB
179 lines
3.9 KiB
package http |
|
|
|
import ( |
|
"net/http" |
|
"strings" |
|
|
|
"go-common/app/interface/bbq/bullet/api" |
|
"go-common/app/interface/bbq/bullet/internal/conf" |
|
"go-common/app/interface/bbq/bullet/internal/model" |
|
"go-common/app/interface/bbq/bullet/internal/service" |
|
xauth "go-common/app/interface/bbq/common/auth" |
|
chttp "go-common/app/interface/bbq/common/http" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
bm "go-common/library/net/http/blademaster" |
|
antispam "go-common/library/net/http/blademaster/middleware/antispam" |
|
"go-common/library/net/http/blademaster/middleware/verify" |
|
|
|
"github.com/golang/protobuf/ptypes/empty" |
|
) |
|
|
|
var ( |
|
// TODO:verify |
|
vfy *verify.Verify |
|
svc *service.Service |
|
authSrv *xauth.BannedAuth |
|
logger *chttp.UILog |
|
bulletAntiSpam *antispam.Antispam |
|
) |
|
|
|
// Init init |
|
func Init(c *conf.Config, s *service.Service) { |
|
svc = s |
|
initAntiSpam(c) |
|
vfy = verify.New(c.Verify) |
|
authSrv = xauth.NewBannedAuth(c.Auth, c.OnlineMySQL) |
|
engine := bm.DefaultServer(c.BM) |
|
route(engine) |
|
if err := engine.Start(); err != nil { |
|
log.Error("bm Start error(%v)", err) |
|
panic(err) |
|
} |
|
logger = chttp.New(c.Infoc) |
|
} |
|
|
|
func initAntiSpam(c *conf.Config) { |
|
var antiConfig *antispam.Config |
|
var exists bool |
|
if antiConfig, exists = c.AntiSpam["bullet"]; !exists { |
|
panic("lose bullet anti_spam config") |
|
} |
|
bulletAntiSpam = antispam.New(antiConfig) |
|
} |
|
|
|
func route(e *bm.Engine) { |
|
e.Ping(ping) |
|
e.Register(register) |
|
g := e.Group("/bbq/bullet", wrapBBQ) |
|
{ |
|
g.GET("/content/list", authSrv.Guest, contentList) |
|
g.GET("/content/get", authSrv.Guest, contentGet) |
|
g.POST("/content/post", authSrv.User, phoneCheck, bulletAntiSpam.ServeHTTP, contentPost) |
|
} |
|
} |
|
|
|
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) |
|
} |
|
|
|
//wrapRes 为返回头添加BBQ自定义字段 |
|
func wrapBBQ(ctx *bm.Context) { |
|
chttp.WrapHeader(ctx) |
|
} |
|
|
|
func uiLog(ctx *bm.Context, action int, ext interface{}) { |
|
logger.Infoc(ctx, action, ext) |
|
} |
|
|
|
func contentGet(c *bm.Context) { |
|
if conf.Conf.BulletConfig.CloseRead { |
|
c.JSON([]*api.Bullet{}, nil) |
|
return |
|
} |
|
|
|
arg := &api.ListBulletReq{} |
|
if err := c.Bind(arg); err != nil { |
|
return |
|
} |
|
if arg.Oid == 0 { |
|
res := new([]interface{}) |
|
c.JSON(res, ecode.DanmuGetErr) |
|
return |
|
} |
|
|
|
if midValue, exists := c.Get("mid"); exists { |
|
arg.Mid = midValue.(int64) |
|
} |
|
|
|
c.JSON(svc.ContentGet(c, arg)) |
|
} |
|
|
|
func contentList(c *bm.Context) { |
|
if conf.Conf.BulletConfig.CloseRead { |
|
c.JSON(api.ListBulletReply{HasMore: false}, nil) |
|
return |
|
} |
|
|
|
arg := &api.ListBulletReq{} |
|
if err := c.Bind(arg); err != nil { |
|
return |
|
} |
|
|
|
if arg.Oid == 0 { |
|
res := new([]interface{}) |
|
c.JSON(res, ecode.DanmuGetErr) |
|
return |
|
} |
|
|
|
if midValue, exists := c.Get("mid"); exists { |
|
arg.Mid = midValue.(int64) |
|
} |
|
|
|
c.JSON(svc.ContentList(c, arg)) |
|
} |
|
|
|
func contentPost(c *bm.Context) { |
|
if conf.Conf.BulletConfig.CloseWrite { |
|
c.JSON(struct{}{}, nil) |
|
return |
|
} |
|
|
|
arg := &api.Bullet{} |
|
if err := c.Bind(arg); err != nil { |
|
return |
|
} |
|
|
|
// 这里客户端是有限制的,所以这里就不单独给出toast了 |
|
if arg.Oid == 0 || arg.Content == "" || strings.Count(arg.Content, "") > model.BulletMaxLen { |
|
log.Warnw(c, "log", "post error", "req", arg, "content_len", strings.Count(arg.Content, "")) |
|
c.JSON(nil, ecode.DanmuPostErr) |
|
return |
|
} |
|
|
|
if midValue, exists := c.Get("mid"); exists { |
|
arg.Mid = midValue.(int64) |
|
} |
|
dmid, err := svc.ContentPost(c, arg) |
|
c.JSON(new(empty.Empty), err) |
|
|
|
uiLog(c, model.ActionDanmaku, struct { |
|
DMID int64 `json:"dmid"` |
|
}{ |
|
DMID: dmid, |
|
}) |
|
} |
|
|
|
// phoneCheck 进行手机校验 |
|
func phoneCheck(ctx *bm.Context) { |
|
midValue, exists := ctx.Get("mid") |
|
if !exists { |
|
ctx.JSON(nil, ecode.NoLogin) |
|
ctx.Abort() |
|
return |
|
} |
|
mid := midValue.(int64) |
|
err := svc.PhoneCheck(ctx, mid) |
|
if err != nil { |
|
ctx.JSON(nil, err) |
|
ctx.Abort() |
|
return |
|
} |
|
}
|
|
|