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.
110 lines
3.2 KiB
110 lines
3.2 KiB
package weeklyhonor |
|
|
|
import ( |
|
"context" |
|
"errors" |
|
"fmt" |
|
"net/url" |
|
"time" |
|
|
|
"go-common/library/log" |
|
"go-common/library/xstr" |
|
) |
|
|
|
const ( |
|
_title = "叮!你有一份荣誉周报待查收!" |
|
_newYearTitle = "嘭~~~啪!你有一份荣誉周报待查收!" |
|
_content = "这周的成就已达成,快进来瞅瞅吧~ #{周报传送门}{\"https://member.bilibili.com/studio/annyroal/upper-honor-weekly/my\"}" |
|
_newYearContent = "这周的成就已达成,元气满满过新年~ #{周报传送门}{\"https://member.bilibili.com/studio/annyroal/upper-honor-weekly/my\"}" |
|
_notifyDataType = "4" // 消息类型:1、回复我的2、@我3、收到的爱4、业务通知 |
|
_notifyURL = "/api/notify/send.user.notify.do" |
|
_notifyMC = "1_17_1" |
|
_upMidsURL = "/x/internal/uper/list_up" |
|
) |
|
|
|
type newYear struct { |
|
start, end time.Time |
|
} |
|
|
|
var ( |
|
ny = newYear{ |
|
start: time.Date(2019, 2, 3, 0, 0, 0, 0, time.Local), |
|
end: time.Date(2019, 2, 24, 0, 0, 0, 0, time.Local), |
|
} |
|
) |
|
|
|
type msgReply struct { |
|
Code int `json:"code"` |
|
Data *data `json:"data"` |
|
} |
|
|
|
type data struct { |
|
TotalCount int `json:"total_count"` |
|
ErrorCount int `json:"error_count"` |
|
ErrorMidList []int64 `json:"error_mid_list"` |
|
} |
|
|
|
// SendNotify 发送站内信 |
|
func (d *Dao) SendNotify(c context.Context, mids []int64) (errMids []int64, err error) { |
|
title, content := getTitleAndContent() |
|
res := msgReply{} |
|
params := url.Values{} |
|
params.Set("mc", _notifyMC) |
|
params.Set("title", title) |
|
params.Set("data_type", _notifyDataType) |
|
params.Set("context", content) |
|
params.Set("mid_list", xstr.JoinInts(mids)) |
|
notifyURI := d.c.Host.Message + _notifyURL |
|
if err = d.httpClient.Post(c, notifyURI, "", params, &res); err != nil { |
|
log.Error("d.httpClient.Post(%s,%v,%d)", notifyURI, params, err) |
|
return |
|
} |
|
if res.Code != 0 { |
|
err = errors.New("code != 0") |
|
log.Error("d.httpClient.Post(%s,%v,%v,%d)", notifyURI, params, err, res.Code) |
|
} |
|
if res.Data != nil { |
|
errMids = res.Data.ErrorMidList |
|
log.Info("SendNotify log total_count(%d) error_count(%d) error_mid_list(%v)", res.Data.TotalCount, res.Data.ErrorCount, res.Data.ErrorMidList) |
|
} |
|
return |
|
} |
|
|
|
func getTitleAndContent() (string, string) { |
|
now := time.Now() |
|
if now.After(ny.end) || now.Before(ny.start) { |
|
return _title, _content |
|
} |
|
return _newYearTitle, _newYearContent |
|
} |
|
|
|
// Deprecated: use UpActivesList instead. |
|
func (d *Dao) UpMids(c context.Context, size int, lastid int64, activeOnly bool) (mids []int64, newid int64, err error) { |
|
res := &struct { |
|
Code int `json:"code"` |
|
Data *struct { |
|
Result []int64 `json:"result"` |
|
LastID int64 `json:"last_id"` |
|
} `json:"data"` |
|
}{} |
|
params := url.Values{} |
|
params.Set("size", fmt.Sprintf("%d", size)) |
|
params.Set("last_id", fmt.Sprintf("%d", lastid)) |
|
if activeOnly { |
|
// filter by having archive within 180 days |
|
params.Set("activity", "1,2,3") |
|
} |
|
midsURI := d.c.Host.API + _upMidsURL |
|
if err = d.httpClient.Get(c, midsURI, "", params, &res); err != nil { |
|
log.Error("d.httpClient.Get(%s,%v,%d)", midsURI+"?"+params.Encode(), params, err) |
|
return |
|
} |
|
if res.Code != 0 { |
|
err = errors.New("code != 0") |
|
log.Error("d.httpClient.Get(%s,%v,%v,%d)", midsURI, params, err, res.Code) |
|
} |
|
if res != nil && res.Data != nil { |
|
return res.Data.Result, res.Data.LastID, nil |
|
} |
|
return |
|
}
|
|
|