Create & Init Project...

This commit is contained in:
2019-04-22 18:49:16 +08:00
commit fc4fa37393
25440 changed files with 4054998 additions and 0 deletions

View File

@@ -0,0 +1,51 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["model_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = ["//vendor/github.com/smartystreets/goconvey/convey:go_default_library"],
)
go_library(
name = "go_default_library",
srcs = [
"brands.go",
"constants.go",
"functions.go",
"model.go",
"platforms.go",
"rpc.go",
"settings.go",
],
importpath = "go-common/app/service/main/push/model",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/log:go_default_library",
"//library/time:go_default_library",
"//vendor/github.com/dgryski/go-farm:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,37 @@
package model
import "strings"
const (
_brandOhters = 0
_brandXiaomi = 1
_brandHuawei = 2
_brandOppo = 3
_brandVivo = 4
_brandMeizu = 5
_brandSamsung = 6
)
// mapping 映射可以解决一个品牌对应多个品牌标识的问题
var brandMapping = map[string]int{
"xiaomi": _brandXiaomi,
"huawei": _brandHuawei,
"honor": _brandHuawei,
"oppo": _brandOppo,
"vivo": _brandVivo,
"meizu": _brandMeizu,
"samsung": _brandSamsung,
}
// DeviceBrand .
func DeviceBrand(s string) int {
s = strings.Trim(s, " ")
if s == "" {
return _brandOhters
}
s = strings.ToLower(s)
if v, ok := brandMapping[s]; ok {
return v
}
return _brandOhters
}

View File

@@ -0,0 +1,178 @@
package model
const (
// TempTaskPrefix used to separate from the DB tasks.
TempTaskPrefix = "t"
// APPIDBBPhone 哔哩哔哩动画
APPIDBBPhone = 1
// HTTPCodeOk http response normally.
HTTPCodeOk = 0
// SwitchOff off.
SwitchOff = 0
// SwitchOn on.
SwitchOn = 1
// DelMiFeedback feedback 删除 (无效token删除方式)
DelMiFeedback = 1
// DelMiUninstalled 卸载
DelMiUninstalled = 2
// DefaultMessageTitle .
DefaultMessageTitle = "哔哩哔哩消息"
// UnknownBuild 未知build号
UnknownBuild = 0
)
const (
// MobiAndroid mobi_app android
MobiAndroid = 1
// MobiIPhone mobi_app iPhone
MobiIPhone = 2
// MobiIPad mobi_app iPad
MobiIPad = 3
// MobiAndroidComic
MobiAndroidComic = 4
)
// task status
const (
// TaskStatusPending 待审核
TaskStatusPending = int8(-5)
// TaskStatusStop 主动停止
TaskStatusStop = int8(-4)
// TaskStatusDelay 延期
TaskStatusDelay = int8(-3)
// TaskStatusExpired 过期
TaskStatusExpired = int8(-2)
// TaskStatusFailed 失败
TaskStatusFailed = int8(-1)
// TaskStatusPrepared 未开始
TaskStatusPrepared = int8(0)
// TaskStatusDoing 进行中
TaskStatusDoing = int8(1)
// TaskStatusDone 已完成
TaskStatusDone = int8(2)
// TaskStatusPretreatmentPrepared 等待预处理,处理完后是按平台拆成任务(token形式)
TaskStatusPretreatmentPrepared = int8(3)
// TaskStatusPretreatmentDoing 预处理中
TaskStatusPretreatmentDoing = int8(4)
// TaskStatusPretreatmentDone 预处理完成
TaskStatusPretreatmentDone = int8(5)
// TaskStatusPretreatmentFailed 预处理失败
TaskStatusPretreatmentFailed = int8(6)
// TaskStatusWaitDataPlatform 等待从数据平台获取数据
TaskStatusWaitDataPlatform = int8(7)
)
// data platform
const (
// DpCondStatusNoFile 没有查询到文件
DpCondStatusNoFile = -3
// DpCondStatusPending 待审核
DpCondStatusPending = -2
// DpCondStatusFailed 失败的查询
DpCondStatusFailed = -1
// DpCondStatusPrepared 准备提交到数据平台的查询
DpCondStatusPrepared = 0
// DpCondStatusSubmitting 提交中
DpCondStatusSubmitting = 1
// DpCondStatusSubmitted 已经提交的查询
DpCondStatusSubmitted = 2
// DpCondStatusPolling 轮询任务看有没有生成文件
DpCondStatusPolling = 3
// DpCondStatusDownloading 正在下载文件
DpCondStatusDownloading = 4
// DpCondStatusDone 已经完成的查询
DpCondStatusDone = 5
// DpTaskTypeMid mid维度查询
DpTaskTypeMid = 1
// DptaskTypeToken token维度查询
DpTaskTypeToken = 2
)
const (
// TaskTypeAll 后台全量
TaskTypeAll = 1
// TaskTypePart 后台批量
TaskTypePart = 2
// TaskTypeBusiness 业务推送
TaskTypeBusiness = 3
// TaskTypeTokens 批量token推送
TaskTypeTokens = 4
// TaskTypeMngMid 后台按mid推送
TaskTypeMngMid = 5
// TaskTypeMngToken 后台按token推送
TaskTypeMngToken = 6
// TaskTypeStrategyMid 策略层按mid推送
TaskTypeStrategyMid = 7
// TaskTypeDataPlatformMid 通过mid维度从数据平台获取token
TaskTypeDataPlatformMid = 8
// TaskTypeDataPlatformToken 通过token维度从数据平台获取token
TaskTypeDataPlatformToken = 9
)
const (
// LinkTypeBangumi bangumi 协议链接类型
LinkTypeBangumi = int8(1)
// LinkTypeVideo 视频
LinkTypeVideo = int8(2)
// LinkTypeLive 直播
LinkTypeLive = int8(3)
// LinkTypeSplist 专题页
LinkTypeSplist = int8(4)
// LinkTypeSearch 搜索
LinkTypeSearch = int8(5)
// LinkTypeAuthor 个人空间
LinkTypeAuthor = int8(6)
// LinkTypeBrowser 浏览器
LinkTypeBrowser = int8(7)
// LinkTypeVipBuy 大会员购买页
LinkTypeVipBuy = int8(10)
// LinkTypeCustom 自定义协议内容
LinkTypeCustom = int8(11)
)
const (
// 定义参考http://syncsvn.bilibili.co/app/wiki/blob/master/Android-App-URI.md
// SchemeBangumiSeasonIOS 番剧详情 iPhoneiPadHD 支持番剧
SchemeBangumiSeasonIOS = "bilibili://bangumi/season/"
// SchemeBangumiSeasonAndroid .
SchemeBangumiSeasonAndroid = "bili:///?type=season&season_id="
// SchemeVideoIOS 视频详情页 iPhoneiPadHD 支持视频
SchemeVideoIOS = "bilibili://video/"
// SchemeVideoAndroid .
SchemeVideoAndroid = "bili:///?type=bilivideo&avid="
// SchemeLive 直播详情页, 支持 iOS 和 Android 新协议
SchemeLive = "bilibili://live/"
// SchemeLiveAndroid Android 老协议
SchemeLiveAndroid = "bili:///?type=bililive&roomid="
// SchemeSplist 专题页 iPhone, iPadHD, Android 支持专题
SchemeSplist = "bilibili://splist/"
// SchemeSearchIOS 搜索 iPhoneiPadHD 支持搜索
SchemeSearchIOS = "bilibili://search/?keyword="
// SchemeSearchAndroid .
SchemeSearchAndroid = "bilibili://search/"
// SchemeAuthorIOS 个人空间 iPhoneiPadHD 支持个人空间
SchemeAuthorIOS = "bilibili://user/"
// SchemeAuthorAndroid .
SchemeAuthorAndroid = "bilibili://author/"
// SchemeBrowserIOS 指定URL iPhoneiPadHD 支持H5
SchemeBrowserIOS = "bilibili://browser/?url="
// SchemeBrowserAndroid .
SchemeBrowserAndroid = "bili:///?type=weblink&url="
// SchemeVipBuy 大会员购买页
SchemeVipBuy = "bilibili://user_center/vip/buy/"
)

View File

@@ -0,0 +1,244 @@
package model
import (
"bytes"
"crypto/md5"
"encoding/json"
"fmt"
"math"
"net/url"
"strconv"
"strings"
"time"
"go-common/library/log"
"github.com/dgryski/go-farm"
)
// SplitInts splts string to int-slice by ,
func SplitInts(s string) (res []int) {
if s == "" {
return
}
ints := strings.Split(s, ",")
for _, v := range ints {
i, _ := strconv.Atoi(v)
res = append(res, i)
}
return
}
// JoinInts merges int slice to string.
func JoinInts(ints []int) string {
if len(ints) == 0 {
return ""
}
if len(ints) == 1 {
return strconv.Itoa(ints[0])
}
buf := bytes.Buffer{}
for _, v := range ints {
buf.WriteString(strconv.Itoa(v))
buf.WriteString(",")
}
if buf.Len() > 0 {
buf.Truncate(buf.Len() - 1)
}
return buf.String()
}
// ExistsInt judge if item in the ints.
func ExistsInt(ints []int, item int) (exists bool) {
for _, i := range ints {
if i == item {
return true
}
}
return false
}
// HashToken gets token's hash value.
func HashToken(token string) int64 {
return int64(farm.Hash64([]byte(token)) % math.MaxInt64)
}
// RealTime culculates real time by timezone.
func RealTime(reportZone int) time.Time {
now := time.Now()
_, offset := now.Zone()
return now.Add(time.Duration(reportZone-offset/3600) * time.Hour)
}
// Scheme gets uri scheme.
func Scheme(typ int8, val string, platform, build int) (uri string) {
switch typ {
case LinkTypeBangumi: // 番剧
if platform == PlatformAndroid {
uri = SchemeBangumiSeasonAndroid + val
} else {
uri = SchemeBangumiSeasonIOS + val
}
case LinkTypeVideo: // 视频
if platform == PlatformAndroid {
uri = SchemeVideoAndroid + val
} else {
uri = SchemeVideoIOS + val
}
case LinkTypeLive:
var (
param string
parts = strings.Split(val, ",") // 值可能为 1 或者 1,0
)
if len(parts) == 2 {
param = "?broadcast_type=" + parts[1]
}
uri = SchemeLive + parts[0] + param
if platform == PlatformAndroid && build < 5290000 {
uri = SchemeLiveAndroid + parts[0]
}
case LinkTypeSplist: // 专题
uri = SchemeSplist + val
case LinkTypeAuthor: // 个人空间
if platform == PlatformAndroid {
uri = SchemeAuthorAndroid + val
} else {
uri = SchemeAuthorIOS + val
}
case LinkTypeSearch: // 搜索
if platform == PlatformAndroid {
uri = SchemeSearchAndroid + val
} else {
uri = SchemeSearchIOS + val
}
case LinkTypeBrowser: // H5
if platform == PlatformAndroid {
uri = SchemeBrowserAndroid + url.QueryEscape(val)
} else {
// 容错逻辑,标准写法是 SchemeBrowserIOS + val且 val 需要业务方进行 urlencode
// 但是老客户端有bug客户端会强制encode客户端从 5.28 开始修了这个bug
// 版本覆盖完全后,可改成标准写法
uri = val
}
case LinkTypeVipBuy:
uri = SchemeVipBuy + val
case LinkTypeCustom:
uri = val
default:
uri = ""
}
return
}
// ParseBuild parses string to build struct.
func ParseBuild(s string) (builds map[int]*Build) {
builds = make(map[int]*Build)
if s == "" {
return
}
temp := make(map[string]*Build)
if err := json.Unmarshal([]byte(s), &temp); err != nil {
log.Error("json.Unmarshal(%s) error(%v)", s, err)
return
}
for plat, build := range temp {
p, _ := strconv.Atoi(plat)
builds[p] = build
}
return
}
// TempTaskID gen temporary task ID.
func TempTaskID() string {
n := time.Now().UnixNano()
m := md5.Sum([]byte(strconv.FormatInt(n, 10)))
return TempTaskPrefix + fmt.Sprintf("%x", m)[:8] // 要把taskid当作jobkey参数jobkey要求长度最多9位, 1位prefix+8位时间hash值前段
}
// JobName gen job name.
func JobName(timestamp int64, content, linkValue, group string) int64 {
s := []byte(fmt.Sprintf("%d%s%s%s%s", timestamp, time.Now().Format("20060102"), content, linkValue, group))
return int64(farm.Hash64(s) % math.MaxInt64)
}
// Hash gen hash value by solt.
func Hash(salt string) string {
s := salt + strconv.FormatInt(time.Now().UnixNano(), 10)
return fmt.Sprintf("%x", md5.Sum([]byte(s)))
}
// 免打扰时间默认值
const (
_defaultSilentBeginHour = 22
_defaultSilentEndHour = 8
_defaultSilentBeginMinute = 0
_defaultSilentEndMinute = 0
)
// ParseSilentTime .
func ParseSilentTime(s string) (st BusinessSilentTime) {
st = BusinessSilentTime{
BeginHour: _defaultSilentBeginHour,
EndHour: _defaultSilentEndHour,
BeginMinute: _defaultSilentBeginMinute,
EndMinute: _defaultSilentEndMinute,
}
s = strings.Trim(s, " ")
if s == "" {
return
}
r := strings.Split(s, "-")
if len(r) != 2 {
return
}
begin := strings.Split(r[0], ":")
if len(begin) == 2 {
st.BeginHour, _ = strconv.Atoi(begin[0])
st.BeginMinute, _ = strconv.Atoi(begin[1])
}
end := strings.Split(r[1], ":")
if len(end) == 2 {
st.EndHour, _ = strconv.Atoi(end[0])
st.EndMinute, _ = strconv.Atoi(end[1])
}
return st
}
// IsAndroid .
func IsAndroid(platformID int) bool {
m := map[int]bool{
PlatformIPhone: true,
PlatformIPad: true,
}
return !m[platformID]
}
// ValidateBuild checks token&platform valid.
func ValidateBuild(platform, build int, builds map[int]*Build) bool {
if len(builds) == 0 {
return true
}
if IsAndroid(platform) {
platform = PlatformAndroid
}
if builds[platform] == nil {
return true
}
c := builds[platform].Condition
b := builds[platform].Build
switch c {
case "gt":
return build > b
case "gte":
return build >= b
case "lt":
return build < b
case "lte":
return build <= b
case "eq":
return build == b
case "ne":
return build != b
}
return false
}

View File

@@ -0,0 +1,191 @@
package model
import (
xtime "go-common/library/time"
)
// Report APP report info.
type Report struct {
ID int64 `json:"id"`
APPID int64 `json:"app_id"` // application
PlatformID int `json:"platform_id"`
Mid int64 `json:"mid"`
Buvid string `json:"buvid"`
Build int `json:"build"`
TimeZone int `json:"time_zone"`
NotifySwitch int `json:"notify_switch"` // global notification switch
DeviceToken string `json:"device_token"`
DeviceBrand string `json:"device_brand"`
DeviceModel string `json:"device_model"`
OSVersion string `json:"os_version"`
Extra string `json:"extra"`
Dtime int64 `json:"dtime"`
}
// Task push task info.
type Task struct {
ID string `json:"id"` // task id
Job int64 `json:"job"` // 多个子任务拥有同一个 job name
Type int `json:"type"` // 任务类型 1:后台全量 2:后台批量 3:业务推送
APPID int64 `json:"app_id"`
BusinessID int64 `json:"business_id"`
PlatformID int `json:"platform_id"`
Platform []int `json:"platform"`
Title string `json:"title"`
Summary string `json:"summary"`
LinkType int8 `json:"link_type"`
LinkValue string `json:"link_value"`
Build map[int]*Build `json:"build"`
Sound int `json:"sound"`
Vibration int `json:"vibration"`
PassThrough int `json:"pass_through"`
MidFile string `json:"mid_file"`
Progress *Progress `json:"progress"`
PushTime xtime.Time `json:"push_time"`
ExpireTime xtime.Time `json:"expire_time"`
Status int8 `json:"status"`
Group string `json:"group"`
ImageURL string `json:"image_url"`
Extra *TaskExtra `json:"extra"`
}
// TaskExtra task extra.
type TaskExtra struct {
Group string `json:"group"`
Filename string `json:"filename,omitempty"` // 任务文件的名称(前端展示用)
}
// Build version limit.
type Build struct {
Build int `json:"build"`
Condition string `json:"condition"`
}
// Progress task push progress.
type Progress struct {
// total indicators
Status int8 `json:"st"` // 任务状态
MidTotal int64 `json:"mid_total"` // 任务接收到的mid总数
MidValid int64 `json:"mid_valid"` // 能查到token的mid数
MidMissed int64 `json:"mm"` // mid_missed 查不到token的mid数
MidMissedSuccess int64 `json:"mms"` // mid_missed_success 无效mid补偿推送成功的
MidMissedFailed int64 `json:"mmf"` // mid_missed_failed 无效mid补偿推送失败的
TokenTotal int64 `json:"token_total"` // 一共要推送的token数
TokenValid int64 `json:"token_valid"` // 有效token
TokenDelay int64 `json:"token_delay"` // 延迟推送的token
TokenSuccess int64 `json:"token_success"` // 推送成功的
TokenFailed int64 `json:"token_failed"` // 推送失败的
// brand indicators
Brands map[int]int64 `json:"brands"` // 各品牌统计数据
// server indicators
RetryTimes int64 `json:"retry"` // 重试次数
BeginTime xtime.Time `json:"btime"` // 开始时间
PushTime xtime.Time `json:"ptime"` // 开始推送时间
EndTime xtime.Time `json:"etime"` // 结束时间
}
// APP appication
type APP struct {
ID int64
Name string
PushLimitUser int
}
// Business business
type Business struct {
ID int64 `json:"id"`
APPID int64 `json:"app_id"`
Name string `json:"name"`
Desc string `json:"desc"`
Token string `json:"token"`
Sound int `json:"sound"`
Vibration int `json:"vibration"`
ReceiveSwitch int `json:"receive_switch"`
PushSwitch int `json:"push_switch"`
SilentTime BusinessSilentTime `json:"silent_time"`
PushLimitUser int `json:"push_limit_user"`
Whitelist int `json:"whitelist"`
}
// BusinessSilentTime .
type BusinessSilentTime struct {
BeginHour, EndHour int
BeginMinute, EndMinute int
}
// PushInfo push message.
type PushInfo struct {
Job int64
TaskID string
APPID int64
Title string
Summary string
LinkType int8
LinkValue string
PushTime xtime.Time
ExpireTime xtime.Time
PassThrough int
Sound int
Vibration int
ImageURL string
}
// PushItem push item.
type PushItem struct {
Platform int
Token string
Mid int64
Sound int
Vibration int
Build int
}
// PushChanItem push channel item.
type PushChanItem struct {
Info *PushInfo
Item *PushItem
}
// PushChanItems push channel item.
type PushChanItems struct {
Info *PushInfo
Items []*PushItem
}
// Auth cert or auth info.
type Auth struct {
APPID int64
PlatformID int
Name string // 第三方名称 for android例如 小米
Key string // android的包名 或 iOS的 cert key
Value string // android的 auth 或 iOS的 cert value
BundleID string // just for iOS
}
// HTTPResponse http response.
type HTTPResponse struct {
Code int
Msg string
}
// Callback push callback.
type Callback struct {
Task string
APP int64
Platform int
Mid int64
Pid int // mobi_app ID
Token string
Buvid string
Click uint8 // 是否被点击
Brand int
Extra *CallbackExtra
}
// CallbackExtra .
type CallbackExtra struct {
Status int `json:"st"`
Channel int `json:"chan"`
}

View File

@@ -0,0 +1,102 @@
package model
import (
"testing"
"time"
. "github.com/smartystreets/goconvey/convey"
)
func TestFuncs(t *testing.T) {
Convey("int string functions", t, func() {
Convey("SplitInts", func() {
res := SplitInts("1,2,3")
So(res, ShouldResemble, []int{1, 2, 3})
})
Convey("JoinInts", func() {
ints := []int{1, 2, 3}
res := JoinInts(ints)
So(res, ShouldEqual, "1,2,3")
})
Convey("existsInt", func() {
exists := ExistsInt([]int{}, 4)
So(exists, ShouldBeFalse)
ints := []int{1, 2, 3}
exists = ExistsInt(ints, 1)
So(exists, ShouldBeTrue)
exists = ExistsInt(ints, 4)
So(exists, ShouldBeFalse)
})
Convey("gen temp task id", func() {
id := TempTaskID()
So(len(id), ShouldEqual, 9)
})
Convey("gen job name", func() {
name := JobName(time.Now().UnixNano(), "123", "456", "g")
t.Logf("job name is: %d", name)
})
})
Convey("ParseBuild", t, func() {
buildString := `{"2":{"Build":100,"Condition":"gt"}}`
build := ParseBuild(buildString)
So(build, ShouldResemble, map[int]*Build{2: {Build: 100, Condition: "gt"}})
})
Convey("platform", t, func() {
plat := Platform("iphone", PushSDKApns)
So(plat, ShouldEqual, PlatformIPhone)
plat = Platform("ipad", PushSDKApns)
So(plat, ShouldEqual, PlatformIPad)
plat = Platform("whatever", PushSDKXiaomi)
So(plat, ShouldEqual, PlatformXiaomi)
})
Convey("parse silent time", t, func() {
st := ParseSilentTime("22:30-06:00")
So(st, ShouldResemble, BusinessSilentTime{
BeginHour: 22,
EndHour: 6,
BeginMinute: 30,
EndMinute: 0,
})
})
}
func TestValidateBuild(t *testing.T) {
builds := map[int]*Build{
1: {Build: 520000, Condition: "eq"},
2: {Build: 123456, Condition: "gt"},
}
Convey("ValidateBuild", t, func() {
b := ValidateBuild(2, 123455, builds)
So(b, ShouldBeFalse)
b = ValidateBuild(2, 123457, builds)
So(b, ShouldBeTrue)
b = ValidateBuild(4, 520001, builds)
So(b, ShouldBeFalse)
b = ValidateBuild(4, 519999, builds)
So(b, ShouldBeFalse)
b = ValidateBuild(4, 520000, builds)
So(b, ShouldBeTrue)
})
}
func TestScheme(t *testing.T) {
Convey("Scheme()", t, func() {
scheme := Scheme(LinkTypeLive, "1,0", PlatformAndroid, 5300000)
So(scheme, ShouldEqual, "bilibili://live/1?broadcast_type=0")
scheme = Scheme(LinkTypeLive, "1", PlatformAndroid, 5280000)
So(scheme, ShouldEqual, "bili:///?type=bililive&roomid=1")
scheme = Scheme(LinkTypeLive, "1,1", PlatformIPhone, 5300000)
So(scheme, ShouldEqual, "bilibili://live/1?broadcast_type=1")
scheme = Scheme(LinkTypeLive, "1,0", PlatformIPhone, 5280000)
So(scheme, ShouldEqual, "bilibili://live/1?broadcast_type=0")
scheme = Scheme(LinkTypeCustom, "custom_scheme", PlatformIPhone, 68)
So(scheme, ShouldEqual, "custom_scheme")
})
}

View File

@@ -0,0 +1,76 @@
package model
import "strings"
// PushSDK* for parameter 'push_sdk' in http report API.
const (
// PushSDKApns apns sdk.
PushSDKApns = 1
// PushSDKXiaomi mipush sdk.
PushSDKXiaomi = 2
// PushSDKHuawei huawei sdk.
PushSDKHuawei = 3
// PushSDKOppo oppo sdk.
PushSDKOppo = 5
// PushSDKJpush jpush sdk.
PushSDKJpush = 6
// PushSDKFCM fcm sdk
PushSDKFCM = 7
)
const (
// PlatformUnknown unknown.
PlatformUnknown = 0
// PlatformAndroid Android.
PlatformAndroid = 1
// PlatformIPhone iPhone.
PlatformIPhone = 2
// PlatformIPad iPad.
PlatformIPad = 3
// PlatformXiaomi mipush.
PlatformXiaomi = 4
// PlatformHuawei huawei.
PlatformHuawei = 5
// PlatformOppo oppo.
PlatformOppo = 8
// PlatformJpush jpush.
PlatformJpush = 9
// PlatformFCM fcm
PlatformFCM = 10
)
// Platforms all platform
var Platforms = []int{
PlatformIPhone,
PlatformIPad,
PlatformXiaomi,
PlatformHuawei,
PlatformOppo,
PlatformJpush,
PlatformFCM,
}
// Platform gets real platform.
func Platform(platform string, pushSDK int) int {
switch pushSDK {
case PushSDKApns:
platform = strings.ToLower(platform)
if strings.HasPrefix(platform, "iphone") {
return PlatformIPhone
} else if strings.HasPrefix(platform, "ipad") {
return PlatformIPad
}
case PushSDKXiaomi:
return PlatformXiaomi
case PushSDKHuawei:
return PlatformHuawei
case PushSDKOppo:
return PlatformOppo
case PushSDKJpush:
return PlatformJpush
case PushSDKFCM:
return PlatformFCM
}
// TODO add more brands
return PlatformUnknown
}

View File

@@ -0,0 +1,84 @@
package model
// ArgReport .
type ArgReport struct {
ID int64
APPID int64
PlatformID int
Mid int64
Buvid string
DeviceToken string
Build int
TimeZone int
NotifySwitch int
DeviceBrand string
DeviceModel string
OSVersion string
Extra string
RealIP string
}
// ArgReports .
type ArgReports struct {
Reports []*Report
}
// ArgUserReports .
type ArgUserReports struct {
Mid int64
Reports []*Report
}
// ArgToken .
type ArgToken struct {
Token string
RealIP string
}
// ArgMidToken .
type ArgMidToken struct {
Mid int64
Token string
RealIP string
}
// ArgDelInvalidReport .
type ArgDelInvalidReport struct {
Type int
RealIP string
}
// ArgMid .
type ArgMid struct {
Mid int64
RealIP string
}
// ArgSetting .
type ArgSetting struct {
Mid int64
Type int
Value int
RealIP string
}
// ArgCallback .
type ArgCallback struct {
Task string
APP int64
Platform int
Mid int64
Pid int // mobi_app ID
Token string
Buvid string
Click uint8 // 是否被点击
Extra *CallbackExtra
}
// ArgMidProgress .
type ArgMidProgress struct {
Task string
MidTotal int64
MidValid int64
RealIP string
}

View File

@@ -0,0 +1,14 @@
package model
const (
// UserSettingArchive up主新投稿提醒
UserSettingArchive = 1
// UserSettingLive 主播开播提醒
UserSettingLive = 2
)
// Settings .
var Settings = map[int]int{
UserSettingArchive: SwitchOn,
UserSettingLive: SwitchOn,
}