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.
365 lines
8.4 KiB
365 lines
8.4 KiB
package http |
|
|
|
import ( |
|
"math" |
|
"net/http" |
|
"strconv" |
|
xtime "time" |
|
|
|
"go-common/app/interface/main/dm2/model" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
bm "go-common/library/net/http/blademaster" |
|
"go-common/library/net/ip" |
|
"go-common/library/net/metadata" |
|
"go-common/library/time" |
|
) |
|
|
|
func httpCode(err error) (code int) { |
|
switch err { |
|
case ecode.NotModified: |
|
code = http.StatusNotModified |
|
case ecode.RequestErr: |
|
code = http.StatusBadRequest |
|
case ecode.NothingFound: |
|
code = http.StatusNotFound |
|
case ecode.ServiceUnavailable: |
|
code = http.StatusServiceUnavailable |
|
default: |
|
code = http.StatusInternalServerError |
|
} |
|
return |
|
} |
|
|
|
func dmXML(c *bm.Context) { |
|
var ( |
|
p = c.Request.Form |
|
comp = p.Get("comp") |
|
contentType = "text/xml" |
|
) |
|
oid, err := strconv.ParseInt(p.Get("oid"), 10, 64) |
|
if err != nil || oid <= 0 { |
|
c.AbortWithStatus(http.StatusBadRequest) |
|
return |
|
} |
|
data, err := dmSvc.DMXML(c, model.SubTypeVideo, oid) |
|
if err != nil { |
|
c.AbortWithStatus(httpCode(err)) |
|
log.Error("dmSvc.XML(%d) error(%v)", oid, err) |
|
return |
|
} |
|
c.Writer.Header().Set("Content-Encoding", "deflate") |
|
c.Writer.Header().Set("Last-Modified", xtime.Now().Format(http.TimeFormat)) |
|
if comp == "0" { |
|
c.Writer.Header().Set("Content-Encoding", "none") |
|
if data, err = dmSvc.Gzdeflate(data); err != nil { |
|
log.Error("dmSvc.Gzdeflate(%d) error(%v)", oid, err) |
|
c.AbortWithStatus(httpCode(err)) |
|
return |
|
} |
|
} |
|
c.Bytes(http.StatusOK, contentType, data) |
|
} |
|
|
|
func dmSeg(c *bm.Context) { |
|
var ( |
|
plat int32 |
|
mid int64 |
|
contentType = "application/octet-stream" |
|
p = c.Request.Form |
|
) |
|
iMid, ok := c.Get("mid") |
|
if ok { |
|
mid = iMid.(int64) |
|
} |
|
oid, err := strconv.ParseInt(p.Get("oid"), 10, 64) |
|
if err != nil || oid <= 0 { |
|
c.AbortWithStatus(http.StatusBadRequest) |
|
return |
|
} |
|
ps, err := strconv.ParseInt(p.Get("ps"), 10, 64) |
|
if err != nil { |
|
c.AbortWithStatus(http.StatusBadRequest) |
|
return |
|
} |
|
tp, err := strconv.ParseInt(p.Get("type"), 10, 64) |
|
if err != nil { |
|
c.AbortWithStatus(http.StatusBadRequest) |
|
return |
|
} |
|
aid, err := strconv.ParseInt(p.Get("aid"), 10, 64) |
|
if err != nil { |
|
c.AbortWithStatus(http.StatusBadRequest) |
|
return |
|
} |
|
platform, err := strconv.ParseInt(p.Get("plat"), 10, 64) |
|
if err != nil { |
|
plat = model.PlatUnknow |
|
} else { |
|
plat = int32(platform) |
|
} |
|
data, err := dmSvc.DMSeg(c, int32(tp), plat, mid, aid, oid, ps) |
|
if err != nil { |
|
c.AbortWithStatus(httpCode(err)) |
|
return |
|
} |
|
if len(data) == 0 { |
|
c.AbortWithStatus(http.StatusNotFound) |
|
return |
|
} |
|
c.Bytes(http.StatusOK, contentType, data) |
|
} |
|
|
|
func dmSegV2(c *bm.Context) { |
|
var ( |
|
plat int32 |
|
mid int64 |
|
p = c.Request.Form |
|
) |
|
iMid, ok := c.Get("mid") |
|
if ok { |
|
mid = iMid.(int64) |
|
} |
|
oid, err := strconv.ParseInt(p.Get("oid"), 10, 64) |
|
if err != nil || oid <= 0 { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
pn, err := strconv.ParseInt(p.Get("pn"), 10, 64) |
|
if err != nil || pn <= 0 { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
tp, err := strconv.ParseInt(p.Get("type"), 10, 64) |
|
if err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
aid, err := strconv.ParseInt(p.Get("aid"), 10, 64) |
|
if err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
platform, err := strconv.ParseInt(p.Get("plat"), 10, 64) |
|
if err != nil { |
|
plat = model.PlatUnknow |
|
} else { |
|
plat = int32(platform) |
|
} |
|
c.JSON(dmSvc.DMSegV2(c, int32(tp), mid, aid, oid, pn, plat)) |
|
} |
|
|
|
func dm(c *bm.Context) { |
|
p := c.Request.Form |
|
oid, err := strconv.ParseInt(p.Get("oid"), 10, 64) |
|
if err != nil || oid <= 0 { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
tp, err := strconv.ParseInt(p.Get("type"), 10, 64) |
|
if err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
aid, err := strconv.ParseInt(p.Get("aid"), 10, 64) |
|
if err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
c.JSON(dmSvc.DM(c, int32(tp), aid, oid)) |
|
} |
|
|
|
func ajaxDM(c *bm.Context) { |
|
var ( |
|
p = c.Request.Form |
|
msgs = make([]string, 0) |
|
) |
|
app := p.Get("mobi_app") |
|
if app == "android" || app == "iphone" { |
|
c.JSON(msgs, nil) |
|
return |
|
} |
|
aid, err := strconv.ParseInt(p.Get("aid"), 10, 64) |
|
if err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
c.JSON(dmSvc.AjaxDM(c, aid)) |
|
} |
|
|
|
// validDMStyle 验证弾幕pool and mode. |
|
func validDMStyle(pool, mode int32) (valid bool) { |
|
switch pool { |
|
case model.PoolNormal, model.PoolSubtitle: |
|
if mode == model.ModeRolling || mode == model.ModeBottom || mode == model.ModeTop || |
|
mode == model.ModeReverse || mode == model.ModeSpecial { |
|
valid = true |
|
} |
|
case model.PoolSpecial: |
|
if mode == model.ModeCode || mode == model.ModeBAS { |
|
valid = true |
|
} |
|
} |
|
return |
|
} |
|
|
|
//dm post |
|
func dmPost(c *bm.Context) { |
|
var ( |
|
plat = int64(model.PlatUnknow) |
|
p = c.Request.Form |
|
now = xtime.Now().Unix() |
|
) |
|
mid, _ := c.Get("mid") |
|
msg := p.Get("msg") |
|
typ, err := strconv.ParseInt(p.Get("type"), 10, 64) |
|
if err != nil || int32(typ) != model.SubTypeVideo { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
aid, err := strconv.ParseInt(p.Get("aid"), 10, 64) |
|
if err != nil || aid <= 0 { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
oid, err := strconv.ParseInt(p.Get("oid"), 10, 64) |
|
if err != nil || oid <= 0 { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
progress, err := strconv.ParseInt(p.Get("progress"), 10, 32) // NOTE 老接口过来的弹幕时间为秒 |
|
if err != nil || progress < 0 || progress > math.MaxInt32 { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
color, err := strconv.ParseInt(p.Get("color"), 10, 64) |
|
if err != nil || color < 0 || color > math.MaxInt32 { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
fontsize, err := strconv.ParseInt(p.Get("fontsize"), 10, 32) |
|
if err != nil || fontsize <= 0 || fontsize > 127 { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
pool, err := strconv.ParseInt(p.Get("pool"), 10, 32) |
|
if err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
mode, err := strconv.ParseInt(p.Get("mode"), 10, 32) |
|
if err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
if !validDMStyle(int32(pool), int32(mode)) { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
rnd, err := strconv.ParseInt(p.Get("rnd"), 10, 64) |
|
if err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
platStr := p.Get("plat") |
|
if platStr != "" { |
|
if plat, err = strconv.ParseInt(platStr, 10, 32); err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
} |
|
dm := &model.DM{ |
|
Type: int32(typ), |
|
Oid: oid, |
|
Mid: mid.(int64), |
|
Progress: int32(progress), |
|
Pool: int32(pool), |
|
State: model.StateNormal, |
|
Ctime: time.Time(now), |
|
Mtime: time.Time(now), |
|
Content: &model.Content{ |
|
FontSize: int32(fontsize), |
|
Color: color, |
|
IP: int64(ip.InetAtoN(metadata.String(c, metadata.RemoteIP))), |
|
Mode: int32(mode), |
|
Plat: int32(plat), |
|
Msg: msg, |
|
Ctime: time.Time(now), |
|
Mtime: time.Time(now), |
|
}, |
|
} |
|
if dm.Pool == model.PoolSpecial { |
|
dm.ContentSpe = &model.ContentSpecial{ |
|
Msg: msg, |
|
Ctime: time.Time(now), |
|
Mtime: time.Time(now), |
|
} |
|
} |
|
if err = dmSvc.Post(c, dm, aid, rnd); err != nil { |
|
c.JSON(nil, err) |
|
return |
|
} |
|
data := map[string]interface{}{ |
|
"dmid": dm.ID, |
|
} |
|
c.JSON(data, nil) |
|
} |
|
|
|
// judgeDM dm judge list. |
|
func judgeDM(c *bm.Context) { |
|
p := c.Request.Form |
|
cid, err := strconv.ParseInt(p.Get("cid"), 10, 64) |
|
if err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
dmid, err := strconv.ParseInt(p.Get("dmid"), 10, 64) |
|
if err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
data, err := dmSvc.JudgeDms(c, 1, cid, dmid) |
|
if err != nil { |
|
log.Error("dmSvc.JudgeDms(cid:%d,dmid:%d) error(%v)", cid, dmid, err) |
|
c.JSON(nil, err) |
|
return |
|
} |
|
c.JSON(data, nil) |
|
} |
|
|
|
func dmAdvert(c *bm.Context) { |
|
p := c.Request.Form |
|
arg := &model.ADReq{ |
|
ClientIP: metadata.String(c, metadata.RemoteIP), |
|
Buvid: c.Request.Header.Get("Buvid"), |
|
MobiApp: p.Get("mobi_app"), |
|
ADExtra: p.Get("ad_extra"), |
|
} |
|
if mid, ok := c.Get("mid"); ok { |
|
arg.Mid = mid.(int64) |
|
} |
|
typ, err := strconv.ParseInt(p.Get("type"), 10, 64) |
|
if err != nil || int32(typ) != model.SubTypeVideo { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
aid, err := strconv.ParseInt(p.Get("aid"), 10, 64) |
|
if err != nil || aid <= 0 { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
arg.Aid = aid |
|
oid, err := strconv.ParseInt(p.Get("oid"), 10, 64) |
|
if err != nil || oid <= 0 { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
arg.Oid = oid |
|
build, err := strconv.ParseInt(p.Get("build"), 10, 64) |
|
if err != nil || build <= 0 { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
arg.Build = build |
|
c.JSON(dmSvc.DMAdvert(c, arg)) |
|
}
|
|
|