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

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
}