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.
480 lines
12 KiB
480 lines
12 KiB
package http |
|
|
|
import ( |
|
"io/ioutil" |
|
"mime/multipart" |
|
"path" |
|
"strconv" |
|
"strings" |
|
"sync" |
|
"time" |
|
"unicode/utf8" |
|
|
|
"go-common/app/interface/main/feedback/conf" |
|
"go-common/app/interface/main/feedback/model" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
bm "go-common/library/net/http/blademaster" |
|
"go-common/library/sync/errgroup" |
|
) |
|
|
|
const ( |
|
_timeFromat = "2006-01-02 15:04:05" |
|
) |
|
|
|
// addReply |
|
func addReply(c *bm.Context) { |
|
header := c.Request.Header |
|
params := c.Request.Form |
|
// params |
|
buvid := header.Get("Buvid") |
|
system := params.Get("system") |
|
version := params.Get("version") |
|
midStr := params.Get("mid") |
|
content := params.Get("content") |
|
imgURL := params.Get("img_url") |
|
logURL := params.Get("log_url") |
|
device := params.Get("device") |
|
channel := params.Get("channel") |
|
entrance := params.Get("entrance") |
|
netState := params.Get("net_state") |
|
netOperator := params.Get("net_operator") |
|
agencyArea := params.Get("agency_area") |
|
platform := params.Get("platform") |
|
browser := params.Get("browser") |
|
qq := params.Get("qq") |
|
mobiApp := params.Get("mobi_app") |
|
email := params.Get("email") |
|
tagStr := params.Get("tag_id") |
|
// check params |
|
if buvid == "" { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
if system == "" { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
if version == "" { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
var ( |
|
mid int64 |
|
err error |
|
) |
|
if midStr != "" { |
|
if mid, err = strconv.ParseInt(midStr, 10, 64); err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
} |
|
if content == "" && imgURL == "" && logURL == "" { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
tagID, _ := strconv.ParseInt(tagStr, 10, 64) |
|
c.JSON(feedbackSvr.AddReply(c, mid, tagID, buvid, system, version, mobiApp, filtered(content), imgURL, logURL, device, channel, entrance, netState, netOperator, agencyArea, platform, browser, qq, email, time.Now())) |
|
} |
|
|
|
func addWebReply(c *bm.Context) { |
|
params := c.Request.Form |
|
// system := params.Get("system") |
|
version := params.Get("version") |
|
midStr := params.Get("mid") |
|
sidStr := params.Get("session_id") |
|
content := params.Get("content") |
|
imgURL := params.Get("img_url") |
|
logURL := params.Get("log_url") |
|
// device := params.Get("device") |
|
buvid := params.Get("buvid") |
|
// channel := params.Get("channel") |
|
netState := params.Get("net_state") |
|
netOperator := params.Get("net_operator") |
|
agencyArea := params.Get("agency_area") |
|
platform := params.Get("platform") |
|
browser := params.Get("browser") |
|
qq := params.Get("qq") |
|
email := params.Get("email") |
|
tagStr := params.Get("tag_id") |
|
aidStr := params.Get("aid") |
|
var ( |
|
mid int64 |
|
sid int64 |
|
err error |
|
) |
|
if mid, err = strconv.ParseInt(midStr, 10, 64); err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
if content == "" && imgURL == "" && logURL == "" { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
sid, _ = strconv.ParseInt(sidStr, 10, 64) |
|
tagID, _ := strconv.ParseInt(tagStr, 10, 64) |
|
if platform == "" { |
|
platform = "ugc" |
|
} |
|
c.JSON(feedbackSvr.AddWebReply(c, mid, sid, tagID, aidStr, filtered(content), imgURL, netState, netOperator, agencyArea, platform, version, buvid, browser, qq, email, time.Now())) |
|
} |
|
|
|
//replys |
|
func replys(c *bm.Context) { |
|
header := c.Request.Header |
|
params := c.Request.Form |
|
buvid := header.Get("Buvid") |
|
system := params.Get("system") |
|
version := params.Get("version") |
|
midStr := params.Get("mid") |
|
platform := params.Get("platform") |
|
mobiApp := params.Get("mobi_app") |
|
device := params.Get("device") |
|
pnStr := params.Get("pn") |
|
psStr := params.Get("ps") |
|
entrance := params.Get("entrance") |
|
// check params |
|
if system == "" { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
if version == "" { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
var ( |
|
mid int64 |
|
err error |
|
) |
|
if midStr != "" { |
|
if mid, err = strconv.ParseInt(midStr, 10, 64); err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
} |
|
if mid == 0 && buvid == "" { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
pn, err := strconv.Atoi(pnStr) |
|
if err != nil || pn < 1 { |
|
pn = 1 |
|
} |
|
ps, err := strconv.Atoi(psStr) |
|
if err != nil || ps < 1 || ps > conf.Conf.Feedback.ReplysNum { |
|
ps = conf.Conf.Feedback.ReplysNum |
|
} |
|
rs, isEndReply, err := feedbackSvr.Replys(c, buvid, platform, mobiApp, device, system, version, entrance, mid, pn, ps) |
|
if err != nil { |
|
c.JSON(nil, err) |
|
return |
|
} |
|
res := map[string]interface{}{ |
|
"data": rs, |
|
"is_end_reply": isEndReply, |
|
} |
|
c.JSONMap(res, err) |
|
} |
|
|
|
func sessions(c *bm.Context) { |
|
params := c.Request.Form |
|
tagid := params.Get("tag_id") |
|
platform := params.Get("platform") |
|
stateStr := params.Get("state") |
|
midStr := params.Get("mid") |
|
start := params.Get("start") |
|
end := params.Get("end") |
|
pnStr := params.Get("pn") |
|
psStr := params.Get("ps") |
|
mid, err := strconv.ParseInt(midStr, 10, 64) |
|
if err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
var ( |
|
etime time.Time |
|
) |
|
if start == "" { |
|
start = "00-00-00 00:00:00" |
|
} |
|
stime, _ := time.Parse(_timeFromat, start) |
|
etime, _ = time.Parse(_timeFromat, end) |
|
if end == "" { |
|
etime = time.Now() |
|
} |
|
pn, err := strconv.Atoi(pnStr) |
|
if err != nil || pn < 1 { |
|
pn = 1 |
|
} |
|
ps, err := strconv.Atoi(psStr) |
|
if err != nil || ps < 0 || ps > 10 { |
|
ps = 10 |
|
} |
|
total, sessions, err := feedbackSvr.Sessions(c, mid, stateStr, tagid, platform, stime, etime, ps, pn) |
|
if err != nil { |
|
c.JSON(nil, err) |
|
return |
|
} |
|
res := map[string]interface{}{ |
|
"data": sessions, |
|
"total": total, |
|
} |
|
c.JSONMap(res, err) |
|
} |
|
|
|
func sessionsClose(c *bm.Context) { |
|
params := c.Request.Form |
|
sidStr := params.Get("session_id") |
|
sid, err := strconv.ParseInt(sidStr, 10, 64) |
|
if err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
c.JSON(nil, feedbackSvr.UpdateSessionState(c, 3, sid)) |
|
} |
|
|
|
func replyTag(c *bm.Context) { |
|
params := c.Request.Form |
|
tp := params.Get("type") // NOTE: player |
|
platform := params.Get("platform") |
|
c.JSON(model.Tags[tp][platform], nil) |
|
} |
|
|
|
func ugcTag(c *bm.Context) { |
|
params := c.Request.Form |
|
tp := params.Get("type") |
|
platform := params.Get("platform") |
|
mold, err := strconv.Atoi(tp) |
|
if err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
midStr := params.Get("mid") |
|
mid, err := strconv.ParseInt(midStr, 10, 64) |
|
if err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
c.JSON(feedbackSvr.Tags(c, mid, mold, platform)) |
|
} |
|
|
|
func webReply(c *bm.Context) { |
|
params := c.Request.Form |
|
sidStr := params.Get("session_id") |
|
sid, err := strconv.ParseInt(sidStr, 10, 64) |
|
if err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
midStr := params.Get("mid") |
|
mid, err := strconv.ParseInt(midStr, 10, 64) |
|
if err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
c.JSON(feedbackSvr.WebReplys(c, sid, mid)) |
|
} |
|
|
|
func filtered(content string) string { |
|
v := make([]rune, 0, len(content)) |
|
for _, c := range content { |
|
if c != utf8.RuneError { |
|
v = append(v, c) |
|
} |
|
} |
|
return string(v) |
|
} |
|
|
|
func playerCheck(c *bm.Context) { |
|
var ( |
|
params = c.Request.Form |
|
header = c.Request.Header |
|
platform, ipChangeTimes int |
|
mid, checkTime, aid, connectSpeed, ioSpeed int64 |
|
region, school string |
|
err error |
|
) |
|
platformStr := params.Get("platform") |
|
if platform = model.FormPlatForm(platformStr); platform == 0 { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
if region = params.Get("region"); region == "" { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
if school = params.Get("school"); school == "" { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
midStr := params.Get("mid") |
|
if mid, err = strconv.ParseInt(midStr, 10, 64); err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
checkTimeStr := params.Get("check_time") |
|
if checkTime, err = strconv.ParseInt(checkTimeStr, 10, 64); err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
aid, _ = strconv.ParseInt(params.Get("aid"), 10, 64) |
|
ipChangeTimesStr := params.Get("ip_change_times") |
|
if ipChangeTimes, err = strconv.Atoi(ipChangeTimesStr); err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
connectSpeedStr := params.Get("connect_speed") |
|
if connectSpeed, err = strconv.ParseInt(connectSpeedStr, 10, 64); err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
ioSpeedStr := params.Get("io_speed") |
|
if ioSpeed, err = strconv.ParseInt(ioSpeedStr, 10, 64); err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
c.JSON(nil, feedbackSvr.PlayerCheck(c, platform, ipChangeTimes, mid, checkTime, aid, connectSpeed, ioSpeed, region, school, header.Get("X-Cache-Server-Addr"))) |
|
} |
|
|
|
// addReplyH5 add from H5 |
|
func addReplyH5(c *bm.Context) { |
|
c.Request.ParseMultipartForm(model.MaxUploadSize) |
|
header := c.Request.Header |
|
params := c.Request.MultipartForm |
|
buvid := header.Get("Buvid") |
|
var system, version, midStr, content, logURL, device, channel, entrance, netState, netOperator, agencyArea, platform, browser, qq, mobiApp, email, tagStr string |
|
// params |
|
if len(params.Value["system"]) > 0 { |
|
system = params.Value["system"][0] |
|
} |
|
if len(params.Value["version"]) > 0 { |
|
version = params.Value["version"][0] |
|
} |
|
if len(params.Value["mid"]) > 0 { |
|
midStr = params.Value["mid"][0] |
|
} |
|
if len(params.Value["content"]) > 0 { |
|
content = params.Value["content"][0] |
|
} |
|
if len(params.Value["log_url"]) > 0 { |
|
logURL = params.Value["log_url"][0] |
|
} |
|
if len(params.Value["device"]) > 0 { |
|
device = params.Value["device"][0] |
|
} |
|
if len(params.Value["channel"]) > 0 { |
|
channel = params.Value["channel"][0] |
|
} |
|
if len(params.Value["entrance"]) > 0 { |
|
entrance = params.Value["entrance"][0] |
|
} |
|
if len(params.Value["net_state"]) > 0 { |
|
netState = params.Value["net_state"][0] |
|
} |
|
if len(params.Value["net_operator"]) > 0 { |
|
netOperator = params.Value["net_operator"][0] |
|
} |
|
if len(params.Value["agency_area"]) > 0 { |
|
agencyArea = params.Value["agency_area"][0] |
|
} |
|
if len(params.Value["platform"]) > 0 { |
|
platform = params.Value["platform"][0] |
|
} |
|
if len(params.Value["browser"]) > 0 { |
|
browser = params.Value["browser"][0] |
|
} |
|
if len(params.Value["qq"]) > 0 { |
|
qq = params.Value["qq"][0] |
|
} |
|
if len(params.Value["mobi_app"]) > 0 { |
|
mobiApp = params.Value["mobi_app"][0] |
|
} |
|
if len(params.Value["email"]) > 0 { |
|
email = params.Value["email"][0] |
|
} |
|
if len(params.Value["buvid"]) > 0 && buvid == "" { |
|
buvid = params.Value["buvid"][0] |
|
} |
|
if len(params.Value["tag_id"]) > 0 { |
|
tagStr = params.Value["tag_id"][0] |
|
} |
|
// check params |
|
if buvid == "" { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
if system == "" { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
if version == "" { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
var ( |
|
mid int64 |
|
err error |
|
) |
|
if midStr != "" { |
|
if mid, err = strconv.ParseInt(midStr, 10, 64); err != nil { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
} |
|
imgs := c.Request.MultipartForm.File["imgs"] |
|
var ( |
|
imgURL string |
|
urls []string |
|
mutex = sync.Mutex{} |
|
) |
|
g, ctx := errgroup.WithContext(c) |
|
for k, fh := range imgs { |
|
if k == conf.Conf.Feedback.ImgLimit { |
|
break |
|
} |
|
var ( |
|
img multipart.File |
|
url string |
|
fileName string |
|
fileTpye string |
|
body []byte |
|
) |
|
if img, err = fh.Open(); err != nil { |
|
log.Error("H5 addReply Open %s failed", fh.Filename) |
|
err = nil |
|
continue |
|
} |
|
defer img.Close() |
|
fileName = fh.Filename |
|
fileTpye = strings.TrimPrefix(path.Ext(fileName), ".") |
|
if body, err = ioutil.ReadAll(img); err != nil { |
|
log.Error("H5 addReply ioutil.ReadAll %s failed", fh.Filename) |
|
err = nil |
|
continue |
|
} |
|
g.Go(func() (err error) { |
|
if url, err = feedbackSvr.Upload(ctx, "", fileTpye, time.Now(), body); err != nil { |
|
log.Error("H5 addReply Upload %s failed", fh.Filename) |
|
err = nil |
|
return |
|
} |
|
mutex.Lock() |
|
urls = append(urls, url) |
|
mutex.Unlock() |
|
return |
|
}) |
|
} |
|
if err = g.Wait(); err != nil { |
|
log.Error("%+v", err) |
|
return |
|
} |
|
if len(urls) > 0 { |
|
imgURL = strings.Join(urls, ";") |
|
} |
|
if content == "" && imgURL == "" && logURL == "" { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
tagID, _ := strconv.ParseInt(tagStr, 10, 64) |
|
c.JSON(feedbackSvr.AddReply(c, mid, tagID, buvid, system, version, mobiApp, filtered(content), imgURL, logURL, device, channel, entrance, netState, netOperator, agencyArea, platform, browser, qq, email, time.Now())) |
|
}
|
|
|