233 lines
5.8 KiB
Go
233 lines
5.8 KiB
Go
package service
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"time"
|
||
|
||
"go-common/app/admin/main/workflow/model/param"
|
||
"go-common/app/job/main/workflow/model"
|
||
"go-common/library/database/elastic"
|
||
"go-common/library/ecode"
|
||
"go-common/library/log"
|
||
)
|
||
|
||
const (
|
||
// LOGAPPID audit log appid .
|
||
LOGAPPID = "log_audit"
|
||
// LOGINDEX .
|
||
LOGINDEX = "log_audit_11_all"
|
||
// GROUPAPPID .
|
||
GROUPAPPID = "workflow_group_common"
|
||
// GROUPINDEX .
|
||
GROUPINDEX = "workflow_group_common"
|
||
// CHALLAPPID .
|
||
CHALLAPPID = "workflow_chall_common"
|
||
// CHALLINDEX .
|
||
CHALLINDEX = "workflow_chall_common"
|
||
// BUSINESS .
|
||
BUSINESS = 1
|
||
// MC .
|
||
MC = "1_15_1"
|
||
)
|
||
|
||
// notifyState .
|
||
var notifyState = []int64{0, 2}
|
||
|
||
// notifyproc .
|
||
func (s *Service) notifyproc(c context.Context) {
|
||
for {
|
||
if err := s.sendMessage(c); err != nil {
|
||
log.Error("s.sendMessage type(%d) error(%v)", err)
|
||
time.Sleep(time.Second * 3)
|
||
continue
|
||
}
|
||
time.Sleep(time.Second * 60)
|
||
}
|
||
}
|
||
|
||
// SendMessage .
|
||
func (s *Service) sendMessage(c context.Context) (err error) {
|
||
var (
|
||
group []*model.GroupRes
|
||
chall map[int64][]*model.ChallRes
|
||
gids []int64
|
||
)
|
||
if group, err = s.NotNotifyGroupSearch(c); err != nil {
|
||
log.Error("s.NotNotifyGroupSearch error(%v)", err)
|
||
return
|
||
}
|
||
if len(group) <= 0 {
|
||
log.Info("group search length is 0")
|
||
return
|
||
}
|
||
for _, g := range group {
|
||
gids = append(gids, g.ID)
|
||
}
|
||
if chall, err = s.NotNotifyChallSearch(c, gids); err != nil {
|
||
log.Error("s.NotNotifyChallSearch error(%v)", err)
|
||
return
|
||
}
|
||
if len(chall) <= 0 {
|
||
log.Info("chall search length is 0")
|
||
return
|
||
}
|
||
for _, g := range group {
|
||
mids := []int64{}
|
||
ok := false
|
||
var chs []*model.ChallRes
|
||
if chs, ok = chall[g.ID]; !ok {
|
||
log.Error("gid(%d) in group but not in chall", g.ID)
|
||
continue
|
||
}
|
||
for _, ch := range chs {
|
||
mids = append(mids, ch.MID)
|
||
}
|
||
if len(mids) <= 0 {
|
||
log.Error("gid(%d) with mid in chall is empty", g.ID)
|
||
continue
|
||
}
|
||
param := ¶m.MessageParam{
|
||
Type: "json",
|
||
Source: 1,
|
||
DataType: 4,
|
||
MC: MC,
|
||
Title: "您的投诉已收到",
|
||
Context: fmt.Sprintf("您对稿件(av%d)的举报我们已经收到。感谢您对 bilibili 社区秩序的维护,哔哩哔哩 (゜-゜)つロ 干杯~ ", g.OID),
|
||
MidList: mids,
|
||
}
|
||
log.Info("send message param(%+v)", param)
|
||
if err = s.dao.SendMessage(c, chs, param); err != nil {
|
||
log.Error("s.dao.SendMessage error(%v)", err)
|
||
}
|
||
}
|
||
return
|
||
}
|
||
|
||
// NotNotifyGroupSearch .
|
||
func (s *Service) NotNotifyGroupSearch(c context.Context) (result []*model.GroupRes, err error) {
|
||
var (
|
||
pn = 1
|
||
ps = 1000
|
||
tempRes *model.SearchGroup
|
||
)
|
||
frontTenMin, _ := time.ParseDuration("-10m")
|
||
frontTwelveMin, _ := time.ParseDuration("-12m")
|
||
frontTenMinFormat := time.Now().Add(frontTenMin).Format("2006-01-02 15:04:05")
|
||
frontTwelveMinFormat := time.Now().Add(frontTwelveMin).Format("2006-01-02 15:04:05")
|
||
e := elastic.NewElastic(nil)
|
||
r := e.NewRequest(GROUPAPPID).Index(GROUPINDEX).Fields("id", "oid").
|
||
WhereEq("business", BUSINESS).
|
||
WhereIn("state", notifyState).
|
||
WhereRange("lasttime", frontTwelveMinFormat, frontTenMinFormat, elastic.RangeScopeLoRo).
|
||
Pn(pn).
|
||
Ps(ps)
|
||
if err = r.Scan(context.Background(), &tempRes); err != nil {
|
||
log.Error("elastic search group Scan error(%v)", err)
|
||
return
|
||
}
|
||
log.Info("groupparams is(%v)", r.Params())
|
||
res := tempRes.Result
|
||
if len(res) <= 0 {
|
||
return
|
||
}
|
||
// search audit log
|
||
var logGids map[int64][]*model.LogRes
|
||
if logGids, err = s.searchAuditLog(c, res); err != nil {
|
||
log.Error("s.searchAuditLog error(%v)", err)
|
||
return
|
||
}
|
||
for _, r := range res {
|
||
if _, ok := logGids[r.OID]; !ok {
|
||
result = append(result, r)
|
||
}
|
||
}
|
||
return
|
||
}
|
||
|
||
// searchAuditLog .
|
||
func (s *Service) searchAuditLog(c context.Context, grp []*model.GroupRes) (logGids map[int64][]*model.LogRes, err error) {
|
||
pn := 1
|
||
ps := 1000
|
||
oids := []int64{}
|
||
logGids = make(map[int64][]*model.LogRes)
|
||
for _, g := range grp {
|
||
oids = append(oids, g.OID)
|
||
}
|
||
e := elastic.NewElastic(nil)
|
||
for {
|
||
var res *model.AuditLog
|
||
r := e.NewRequest(LOGAPPID).Index(LOGINDEX).Fields("int_1", "oid").
|
||
WhereIn("oid", oids).
|
||
WhereEq("type", 2).
|
||
WhereEq("business", 11).
|
||
WhereEq("action", "notify_users_received").
|
||
Pn(pn).
|
||
Ps(ps)
|
||
if err = r.Scan(context.Background(), res); err != nil {
|
||
log.Error("elastic search audit log Scan error(%v)", err)
|
||
return
|
||
}
|
||
if res == nil {
|
||
time.Sleep(time.Second * 3)
|
||
continue
|
||
}
|
||
if res.Page.Total > 10000 {
|
||
log.Error("elastic search audit log result too long")
|
||
err = ecode.ServerErr
|
||
return
|
||
}
|
||
log.Info("auditlogparams is(%v)", r.Params())
|
||
logRes := res.Result
|
||
for _, lg := range logRes {
|
||
logGids[lg.Oid] = append(logGids[lg.Oid], lg)
|
||
}
|
||
if len(res.Result) < ps {
|
||
break
|
||
}
|
||
pn++
|
||
}
|
||
return
|
||
}
|
||
|
||
// NotNotifyChallSearch .
|
||
func (s *Service) NotNotifyChallSearch(c context.Context, gids []int64) (chall map[int64][]*model.ChallRes, err error) {
|
||
var (
|
||
pn = 1
|
||
ps = 1000
|
||
)
|
||
if len(gids) <= 0 {
|
||
return
|
||
}
|
||
chall = make(map[int64][]*model.ChallRes)
|
||
frontTenMin, _ := time.ParseDuration("-10m")
|
||
frontTwelveMin, _ := time.ParseDuration("-12m")
|
||
frontTenMinFormat := time.Now().Add(frontTenMin).Format("2006-01-02 15:04:05")
|
||
frontTwelveMinFormat := time.Now().Add(frontTwelveMin).Format("2006-01-02 15:04:05")
|
||
e := elastic.NewElastic(nil)
|
||
for {
|
||
res := &model.SearchChall{}
|
||
r := e.NewRequest(CHALLAPPID).Index(CHALLINDEX).Fields([]string{"id", "gid", "mid", "oid"}...).
|
||
WhereEq("business", BUSINESS).
|
||
WhereEq("state", 0).
|
||
WhereIn("gid", gids).
|
||
WhereRange("ctime", frontTwelveMinFormat, frontTenMinFormat, elastic.RangeScopeLoRo).
|
||
Pn(pn).
|
||
Ps(ps)
|
||
if err = r.Scan(context.Background(), &res); err != nil {
|
||
log.Error("elastic search chall Scan error(%v)", err)
|
||
time.Sleep(time.Second * 3)
|
||
continue
|
||
}
|
||
log.Info("challparams is(%v)", r.Params())
|
||
for _, r := range res.Result {
|
||
chall[r.GID] = append(chall[r.GID], r)
|
||
}
|
||
if len(res.Result) < ps {
|
||
break
|
||
}
|
||
pn++
|
||
}
|
||
return
|
||
}
|