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.
154 lines
4.5 KiB
154 lines
4.5 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"fmt" |
|
"net/url" |
|
"strconv" |
|
"strings" |
|
|
|
"go-common/app/admin/main/push/model" |
|
pushmdl "go-common/app/service/main/push/model" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
) |
|
|
|
const ( |
|
_testPushURL = "http://api.bilibili.co/x/internal/push-service/push" |
|
_testTokenURL = "http://api.bilibili.co/x/internal/push-service/test/token" |
|
) |
|
|
|
// AddTask add task. |
|
func (s *Service) AddTask(c context.Context, task *model.Task) (err error) { |
|
if err = s.DB.Create(task).Error; err != nil { |
|
s.dao.SendWechat("推送后台新建任务失败,原因:写入DB失败") |
|
log.Error("s.AddTask(%+v) error(%v)", task, err) |
|
} |
|
return |
|
} |
|
|
|
// TestPushMid test push by mid. |
|
func (s *Service) TestPushMid(c context.Context, mid string, task *model.Task) (err error) { |
|
params := url.Values{} |
|
params.Set("app_id", fmt.Sprintf("%d", task.AppID)) |
|
params.Set("platform", task.Platform) |
|
params.Set("alert_title", task.Title) |
|
params.Set("alert_body", task.Summary) |
|
params.Set("link_type", strconv.Itoa(task.LinkType)) |
|
params.Set("link_value", task.LinkValue) |
|
params.Set("expire_time", fmt.Sprintf("%d", task.ExpireTimeUnix)) |
|
params.Set("builds", task.Build) |
|
params.Set("sound", strconv.Itoa(task.Sound)) |
|
params.Set("vibration", strconv.Itoa(task.Vibration)) |
|
params.Set("mid", mid) |
|
params.Set("image_url", task.ImageURL) |
|
var res struct { |
|
Code int `json:"code"` |
|
Message string `json:"message"` |
|
} |
|
if err = s.httpClient.Post(c, _testPushURL, "", params, &res); err != nil { |
|
log.Error("s.TestPush(%s) httpClient.Get(%s,%v) error(%v)", mid, _testPushURL, params, err) |
|
return |
|
} |
|
if res.Code != ecode.OK.Code() { |
|
log.Error("测试推送失败 mid(%s) code(%d)", mid, res.Code) |
|
err = ecode.Int(res.Code) |
|
} |
|
return |
|
} |
|
|
|
// TestPushToken test push by token. |
|
func (s *Service) TestPushToken(c context.Context, info *pushmdl.PushInfo, platform int, token string) (err error) { |
|
params := url.Values{} |
|
params.Set("app_id", fmt.Sprintf("%d", info.APPID)) |
|
params.Set("platform", strconv.Itoa(platform)) |
|
params.Set("alert_title", info.Title) |
|
params.Set("alert_body", info.Summary) |
|
params.Set("link_type", fmt.Sprintf("%d", info.LinkType)) |
|
params.Set("link_value", info.LinkValue) |
|
params.Set("expire_time", fmt.Sprintf("%d", int64(info.ExpireTime))) |
|
params.Set("sound", strconv.Itoa(info.Sound)) |
|
params.Set("vibration", strconv.Itoa(info.Vibration)) |
|
params.Set("pass_through", strconv.Itoa(info.PassThrough)) |
|
params.Set("token", token) |
|
var res struct { |
|
Code int `json:"code"` |
|
Message string `json:"message"` |
|
} |
|
if err = s.httpClient.Post(c, _testTokenURL, "", params, &res); err != nil { |
|
log.Error("s.TestToken(%s) httpClient.Get(%s) error(%v)", token, params.Encode(), err) |
|
return |
|
} |
|
if res.Code != ecode.OK.Code() { |
|
log.Error("测试推送失败 token(%s) code(%d)", token, res.Code) |
|
err = ecode.Int(res.Code) |
|
} |
|
return |
|
} |
|
|
|
// 上传说明: |
|
// 前端是批量上传,会随机按内容长度切割文件进行分批上传,有可能会切断原始行内容 |
|
// 如果想在上传的时候同步判断文件格式,产生错误时需要忽略首行和末行 |
|
|
|
// CheckUploadMid checks uploaded mid validation. |
|
func (s *Service) CheckUploadMid(c context.Context, data []byte) (err error) { |
|
var ( |
|
mid int64 |
|
lineNum int |
|
lines = strings.Split(string(data), "\n") |
|
total = len(lines) |
|
) |
|
for _, v := range lines { |
|
lineNum++ |
|
v = strings.Trim(v, " \r\t") |
|
if v == "" { |
|
continue |
|
} |
|
if mid, err = strconv.ParseInt(v, 10, 64); err != nil { |
|
log.Error("CheckUploadMid data(%s) error(%v)", v, err) |
|
return ecode.PushUploadInvalidErr |
|
} |
|
if mid <= 0 { |
|
if lineNum == 1 || lineNum == total { |
|
continue |
|
} |
|
log.Error("CheckUploadMid data(%s) error(%v)", v, err) |
|
return ecode.PushUploadInvalidErr |
|
} |
|
} |
|
return |
|
} |
|
|
|
// CheckUploadToken checks uploaded token validation. |
|
func (s *Service) CheckUploadToken(c context.Context, data []byte) (err error) { |
|
var ( |
|
plat int |
|
lineNum int |
|
lines = strings.Split(string(data), "\n") |
|
total = len(lines) |
|
) |
|
for _, v := range lines { |
|
lineNum++ |
|
if lineNum == 1 || lineNum == total { |
|
continue |
|
} |
|
v = strings.Trim(v, " \r") |
|
if v == "" { |
|
continue |
|
} |
|
res := strings.Split(v, "\t") |
|
if len(res) != 2 { |
|
log.Error("CheckUploadToken data(%s)", v) |
|
return ecode.PushUploadInvalidErr |
|
} |
|
if res[0] == "" || res[1] == "" { |
|
log.Error("CheckUploadToken data(%s)", v) |
|
return ecode.PushUploadInvalidErr |
|
} |
|
if plat, err = strconv.Atoi(res[0]); err != nil || plat <= 0 { |
|
log.Error("CheckUploadToken data(%s) error(%v)", v, err) |
|
return ecode.PushUploadInvalidErr |
|
} |
|
} |
|
return |
|
}
|
|
|