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.
268 lines
6.1 KiB
268 lines
6.1 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"encoding/json" |
|
"math" |
|
"strconv" |
|
"time" |
|
|
|
"go-common/app/job/main/growup/model" |
|
"go-common/library/log" |
|
"go-common/library/xstr" |
|
) |
|
|
|
// add to blacklist reason |
|
const ( |
|
// _all = 0 |
|
// _stopIncome = 1 |
|
// _breachRecord = 2 |
|
_porder = 3 |
|
_executeOrder = 4 |
|
) |
|
|
|
// InitBlacklistMID init av_black_list mid |
|
func (s *Service) InitBlacklistMID(c context.Context) (err error) { |
|
blacklist, err := s.listBlacklist(c, "mid = 0") |
|
if err != nil { |
|
log.Error("s.listBlacklist error(%v)", err) |
|
return |
|
} |
|
|
|
avIDs := make([]int64, 0) |
|
for _, b := range blacklist { |
|
if b.MID == 0 { |
|
avIDs = append(avIDs, b.AvID) |
|
} |
|
} |
|
if len(avIDs) == 0 { |
|
return |
|
} |
|
m, err := s.GetAvsMID(c, avIDs) |
|
if err != nil { |
|
log.Error("GetAvsMID error(%v)", err) |
|
return |
|
} |
|
|
|
for i := 0; i < len(blacklist); i++ { |
|
blacklist[i].MID = m[blacklist[i].AvID] |
|
} |
|
_, err = s.updateBlacklistBatch(c, blacklist) |
|
return |
|
} |
|
|
|
func (s *Service) listBlacklist(c context.Context, query string) (list []*model.Blacklist, err error) { |
|
from, limit := 0, 2000 |
|
var b []*model.Blacklist |
|
for { |
|
b, err = s.dao.ListBlacklist(c, query, from, limit) |
|
if err != nil { |
|
return |
|
} |
|
list = append(list, b...) |
|
if len(b) < limit { |
|
break |
|
} |
|
from += len(b) |
|
} |
|
return |
|
} |
|
|
|
// UpdateBlacklist update blacklist |
|
func (s *Service) UpdateBlacklist(c context.Context) (err error) { |
|
defer func() { |
|
GetTaskService().SetTaskStatus(c, TaskBlacklist, time.Now().AddDate(0, 0, -1).Format(_layout), err) |
|
}() |
|
|
|
blacklist := make([]*model.Blacklist, 0) |
|
porders, err := s.getNewPorder(c) |
|
if err != nil { |
|
log.Error("s.getNewPorder error(%v)", err) |
|
return |
|
} |
|
log.Info("Get new porder %d", len(porders)) |
|
blacklist = append(blacklist, porders...) |
|
|
|
executeOrders, err := s.getNewExecuteOrder(c) |
|
if err != nil { |
|
log.Error("s.getNewExecuteOrder error(%v)", err) |
|
return |
|
} |
|
log.Info("Get new execute order %d", len(executeOrders)) |
|
|
|
blacklist = append(blacklist, executeOrders...) |
|
count, err := s.updateBlacklistBatch(c, blacklist) |
|
if err != nil { |
|
log.Error("s.updateBlacklistBatch error(%v)", err) |
|
return |
|
} |
|
log.Info("Add %d list into blacklist", count) |
|
return |
|
} |
|
|
|
func (s *Service) updateBlacklistBatch(c context.Context, blacklist []*model.Blacklist) (count int64, err error) { |
|
ups, err := s.getHasSignUpInfo(c) |
|
if err != nil { |
|
log.Error("s.dao.GetHasSignUpInfo error(%v)", err) |
|
return |
|
} |
|
|
|
for i := 0; i < len(blacklist); i++ { |
|
if nickname, ok := ups[blacklist[i].MID]; ok { |
|
blacklist[i].HasSigned = 1 |
|
blacklist[i].Nickname = nickname |
|
} |
|
} |
|
return s.dao.AddBlacklistBatch(c, blacklist) |
|
} |
|
|
|
func (s *Service) getHasSignUpInfo(c context.Context) (m map[int64]string, err error) { |
|
m = make(map[int64]string) |
|
offset, limit := 0, 2000 |
|
for { |
|
err = s.dao.GetHasSignUpInfo(c, offset, limit, m) |
|
if err != nil { |
|
log.Error("s.dao.GetHasSignUpInfo error(%v)", err) |
|
return |
|
} |
|
offset += limit |
|
if len(m) < offset { |
|
break |
|
} |
|
} |
|
return |
|
} |
|
|
|
func (s *Service) getNewPorder(c context.Context) (blacklist []*model.Blacklist, err error) { |
|
beginTime, err := s.dao.GetLastCtime(c, _porder) |
|
if err != nil { |
|
log.Error("s.dao.GetLastCtime error(%v)", err) |
|
return |
|
} |
|
if beginTime != 0 { |
|
beginTime -= 10 * 60 // pre 10min |
|
} |
|
endTime := time.Now().Unix() |
|
|
|
porders, err := s.getPorder(beginTime, endTime) |
|
if err != nil { |
|
log.Error("get Porder error(%v)", err) |
|
return |
|
} |
|
|
|
// get porder mid |
|
avIds := []int64{} |
|
for _, b := range porders { |
|
avIds = append(avIds, b.AID) |
|
} |
|
m, err := s.GetAvsMID(c, avIds) |
|
if err != nil { |
|
log.Error("s.dao.GetAvsMID error(%v)", err) |
|
return |
|
} |
|
|
|
blacklist = make([]*model.Blacklist, len(porders)) |
|
for i := 0; i < len(porders); i++ { |
|
blacklist[i] = &model.Blacklist{ |
|
AvID: porders[i].AID, |
|
MID: m[porders[i].AID], |
|
Reason: _porder, |
|
} |
|
} |
|
|
|
return |
|
} |
|
|
|
// GetAvsMID get avs mid from api |
|
func (s *Service) GetAvsMID(c context.Context, avs []int64) (avsMap map[int64]int64, err error) { |
|
avsMap = make(map[int64]int64) |
|
if len(avs) == 0 { |
|
return |
|
} |
|
start, limit := 0, 10 |
|
if limit > len(avs) { |
|
limit = len(avs) |
|
} |
|
for start+limit <= len(avs) { |
|
if err = s.getAvsMID(c, avs[start:start+limit], avsMap); err != nil { |
|
return |
|
} |
|
start += limit |
|
if start < len(avs) && start+limit > len(avs) { |
|
limit = len(avs) - start |
|
} |
|
} |
|
log.Info("Get avs(%d) from archiveURL", len(avsMap)) |
|
return |
|
} |
|
|
|
func (s *Service) getAvsMID(c context.Context, avs []int64, avsMap map[int64]int64) (err error) { |
|
params := map[string]string{"aids": xstr.JoinInts(avs)} |
|
body, err := s.HTTPClient("GET", s.conf.Host.Archives, params, time.Now().Unix()) |
|
if err != nil { |
|
log.Error("s.HTTPClient error(%v)", err) |
|
return |
|
} |
|
|
|
res := model.ArchiveRes{} |
|
err = json.Unmarshal(body, &res) |
|
if err != nil { |
|
log.Error("json.Unmarshal body %s error(%v)", string(body), err) |
|
return |
|
} |
|
|
|
for _, archive := range res.Data { |
|
avsMap[archive.AID] = archive.Owner.MID |
|
} |
|
return |
|
} |
|
|
|
func (s *Service) getPorder(begin, end int64) (porders []*model.Porder, err error) { |
|
params := map[string]string{ |
|
"begin": strconv.FormatInt(begin, 10), |
|
"end": strconv.FormatInt(end, 10), |
|
} |
|
body, err := s.HTTPClient("GET", s.conf.Host.Porder, params, time.Now().UnixNano()/int64(math.Pow(10, 6))) |
|
if err != nil { |
|
log.Error("s.HTTPClient error(%v)", err) |
|
return |
|
} |
|
|
|
res := model.PorderRes{} |
|
err = json.Unmarshal(body, &res) |
|
if err != nil { |
|
log.Error("json.Unmarshal body %s error(%v)", string(body), err) |
|
return |
|
} |
|
|
|
porders = res.Data |
|
return |
|
} |
|
|
|
func (s *Service) getNewExecuteOrder(c context.Context) (blacklist []*model.Blacklist, err error) { |
|
beginTime, err := s.dao.GetLastCtime(c, _executeOrder) |
|
if err != nil { |
|
log.Error("s.dao.GetLastCtime error(%v)", err) |
|
return |
|
} |
|
|
|
if beginTime != 0 { |
|
beginTime -= 10 * 60 // pre 10min |
|
} |
|
|
|
executeOrders, err := s.dao.GetExecuteOrder(c, time.Unix(beginTime, 0), time.Now()) |
|
if err != nil { |
|
log.Error("s.dao.GetExecuteOrder error(%v)", err) |
|
return |
|
} |
|
|
|
blacklist = make([]*model.Blacklist, len(executeOrders)) |
|
for i := 0; i < len(executeOrders); i++ { |
|
blacklist[i] = &model.Blacklist{ |
|
AvID: executeOrders[i].AvID, |
|
MID: executeOrders[i].MID, |
|
Reason: _executeOrder, |
|
} |
|
} |
|
return |
|
}
|
|
|