wangchuanjin 5 hónapja
szülő
commit
c170ad067c

+ 0 - 5
pushentniche/push/config.json

@@ -98,11 +98,6 @@
 		"available":true,
 		"checkMaxPushPersion":0,
 		"selectPoolSize":5,
-		"isRecommendNewest":true,
-		"wxNodeNum":2, 
-		"dayNum":7,
-		"count":1000000,
-		"retain":100000,
 		"wx":{
 			"id":"ahEQafQBYZX8cVYXko-XaU1QkJ8MHiR-O9UNv_BRMzk",
 			"url":"/jy_mobile/tabbar/recommendedlist"

+ 3 - 14
pushentniche/push/config/config.go

@@ -76,14 +76,9 @@ type config struct {
 		} `json:"app"`
 	} `json:"subMsgTip"`
 	NoMsgTip struct {
-		Available           bool  `json:"available"`
-		CheckMaxPushPersion int   `json:"checkMaxPushPersion"`
-		SelectPoolSize      int   `json:"selectPoolSize"`
-		IsRecommendNewest   bool  `json:"isRecommendNewest"`
-		WxNodeNum           int64 `json:"wxNodeNum"`
-		DayNum              int64 `json:"dayNum"`
-		Count               int64 `json:"count"`
-		Retain              int64 `json:"retain"`
+		Available           bool `json:"available"`
+		CheckMaxPushPersion int  `json:"checkMaxPushPersion"`
+		SelectPoolSize      int  `json:"selectPoolSize"`
 		Wx                  struct {
 			Id  string
 			Url string
@@ -116,21 +111,15 @@ type pushMail struct {
 	MailReTry    int    `json:"mailReTry"`
 }
 
-type task struct {
-	NoMsgTipLastId int64
-}
-
 var (
 	Gmails         []*mail.GmailAuth
 	Config         *config
 	FastigiumStart int
 	FastigiumEnd   int
-	Task           *task
 )
 
 func init() {
 	util.ReadConfig("./config.json", &Config)
-	util.ReadConfig("./task.json", &Task)
 	//
 	if fastigiumTimes := strings.Split(Config.FastigiumTime, "-"); len(fastigiumTimes) == 2 {
 		FastigiumStart = util.IntAll(fastigiumTimes[0])

+ 24 - 101
pushentniche/push/job/nomsgtipjob.go

@@ -6,11 +6,9 @@ import (
 	. "pushentniche/push/config"
 	. "pushentniche/push/db"
 	putil "pushentniche/push/util"
-	"sort"
 	"strconv"
 	"strings"
 	"sync"
-	"sync/atomic"
 	"time"
 
 	util "app.yhyue.com/moapp/jybase/common"
@@ -48,14 +46,17 @@ func (n *NoMsgTipJob) Execute(taskType, hour int) {
 	InitEnt(Mysql, Mgo, DbConf.Mongodb.Main.DbName, Config.TestQuery)
 	pushPool := make(chan bool, Config.PushPoolSize)
 	pushWait := &sync.WaitGroup{}
-	lock := &sync.Mutex{}
-	allTipsA, allTipsB := []*UserInfo{}, []*UserInfo{}
 	for _, v := range EntUsers {
+		isTake := MonitorTimeOut(pushPool, time.Minute, Config.TimeoutWarn, func() {
+			logger.Error("推送任务", taskType, "推送放入通道超时,", v.Id)
+		})
 		pushWait.Add(1)
-		go func(entUser *EntUser) {
+		go func(entUser *EntUser, take bool) {
 			defer util.Catch()
 			defer func() {
-				<-pushPool
+				if take {
+					<-pushPool
+				}
 				pushWait.Done()
 			}()
 			user, userObj := NewMyUserInfoByEntUserId(Mgo, Mysql, fmt.Sprint(entUser.Id))
@@ -85,47 +86,24 @@ func (n *NoMsgTipJob) Execute(taskType, hour int) {
 			if taskType == 1 || (taskType == 2 && user.PushSet.SubSet.RateMode == 2) || (taskType == 3 && user.PushSet.SubSet.RateMode == 3) ||
 				(taskType == 4 && user.PushSet.SubSet.RateMode == 4) || (taskType == 5 && (user.PushSet.SubSet.RateMode == 3 || user.PushSet.SubSet.RateMode == 4)) ||
 				(taskType == 6 && user.PushSet.SubSet.RateMode == 0) || (taskType == 7 && user.PushSet.SubSet.RateMode == 1) {
-				if n.isTip(taskType, hour, user) {
-					lock.Lock()
-					if int64(user.Entniche.UserId) > Task.NoMsgTipLastId {
-						allTipsA = append(allTipsA, user)
-					} else {
-						allTipsB = append(allTipsB, user)
-					}
-					lock.Unlock()
-				}
+				n.tip(taskType, hour, user)
 			}
-		}(v)
+		}(v, isTake)
 	}
 	pushWait.Wait()
-	sort.Slice(allTipsA, func(i, j int) bool {
-		return allTipsA[i].Entniche.UserId < allTipsA[j].Entniche.UserId
-	})
-	sort.Slice(allTipsB, func(i, j int) bool {
-		return allTipsB[i].Entniche.UserId < allTipsB[j].Entniche.UserId
-	})
-	var noMsgTipLastId int64
-	wxTplSurplus := WxNoMsgTmplUsableNum(Mgo_Log, Config.NoMsgTip.WxNodeNum, Config.NoMsgTip.DayNum, Config.NoMsgTip.Count, Config.NoMsgTip.Retain)
-	if Config.NoMsgTip.IsRecommendNewest {
-		VarRecommend.SetNewest(1)
-	}
-	n.beforeTip(taskType, allTipsA, wxTplSurplus, &noMsgTipLastId)
-	n.beforeTip(taskType, allTipsB, wxTplSurplus, &noMsgTipLastId)
-	Task.NoMsgTipLastId = noMsgTipLastId
-	util.WriteSysConfig("./task.json", &Task)
 	logger.Info("无消息提醒任务结束。。。", taskType, hour)
 }
 
 //提醒
-func (n *NoMsgTipJob) isTip(taskType, hour int, user *UserInfo) bool {
+func (n *NoMsgTipJob) tip(taskType, hour int, user *UserInfo) {
 	now := time.Now()
 	if user.VipStatus != 1 && user.MemberStatus != 1 && user.NicheStatus != 1 {
 		if prevTipUnix, err := redis.GetNewInt(Pushcache_2_c, PrevNoMsgTipKey(user)); err != nil {
 			logger.Error("无消息提醒任务", taskType, "redis判断三天前是否提醒过出错", err)
-			return false
+			return
 		} else if now.Unix() < int64(prevTipUnix+ThreeDay) {
 			logger.Info("无消息提醒任务", taskType, "三天内已经提醒过,过滤掉", user.Id)
-			return false
+			return
 		}
 	}
 	startEndMd := ""
@@ -138,7 +116,7 @@ func (n *NoMsgTipJob) isTip(taskType, hour int, user *UserInfo) bool {
 	} else if user.PushSet.SubSet.RateMode == 2 {
 		isOver, start, end := TimesIsOver(user.PushSet.SubSet.Times, hour)
 		if taskType != 1 && !isOver {
-			return false
+			return
 		}
 		startUnix = start.Unix()
 		endUnix = end.Unix()
@@ -159,99 +137,44 @@ func (n *NoMsgTipJob) isTip(taskType, hour int, user *UserInfo) bool {
 		startUnix = start.Unix()
 		endUnix = now.Unix()
 	} else {
-		return false
+		return
 	}
 	if exists, err := redis.Exists(Pushcache_2_c, HasPushKey(user)); err != nil {
 		logger.Error("无消息提醒任务", taskType, "redis判断今天订阅是否推送过出错", err, user.Entniche.UserId)
-		return false
+		return
 	} else if exists {
 		logger.Info("无消息提醒任务", taskType, "redis判断今天订阅推送过,过滤掉", user.Entniche.UserId)
-		return false
+		return
 	} else if exists, err := redis.Exists(Pushcache_2_c, HasDisPushKey(user)); err != nil {
 		logger.Error("无消息提醒任务", taskType, "redis判断今天分发是否推送过出错", err, user.Entniche.UserId)
-		return false
+		return
 	} else if exists {
 		logger.Info("无消息提醒任务", taskType, "redis判断今天分发推送过,过滤掉", user.Entniche.UserId)
-		return false
+		return
 	} else if exists, err := redis.Exists(Pushcache_2_c, NoMsgTipKey(user)); err != nil {
 		logger.Error("无消息提醒任务", taskType, "redis判断今天是否提醒过出错", err, user.Entniche.UserId)
-		return false
+		return
 	} else if exists {
 		logger.Info("无消息提醒任务", taskType, "redis判断今天提醒过,过滤掉", user.Entniche.UserId)
-		return false
+		return
 	} else if n.pushCount(user, startUnix, endUnix) != 0 {
 		logger.Info("无消息提醒任务", taskType, "mysql判断用户该时间段推送过,过滤掉", startUnix, endUnix, user.Entniche.UserId)
-		return false
-	}
-	user.Extend = &UserInfoExtend{
-		Object: map[string]interface{}{"startEndMd": startEndMd},
-	}
-	return true
-}
-
-//
-func (n *NoMsgTipJob) beforeTip(taskType int, allTip []*UserInfo, wxTplSurplus int64, noMsgTipLastId *int64) {
-	pushPool := make(chan bool, Config.PushPoolSize)
-	pushWait := &sync.WaitGroup{}
-	for _, v := range allTip {
-		isTake := MonitorTimeOut(pushPool, time.Minute, Config.TimeoutWarn, func() {
-			logger.Error("推送任务", taskType, "推送放入通道超时,", v.Id)
-		})
-		pushWait.Add(1)
-		go func(user *UserInfo, take bool) {
-			defer util.Catch()
-			defer func() {
-				if take {
-					<-pushPool
-				}
-				pushWait.Done()
-			}()
-			n.toTip(taskType, user, wxTplSurplus, noMsgTipLastId)
-		}(v, isTake)
+		return
 	}
-}
-
-//
-func (n *NoMsgTipJob) toTip(taskType int, user *UserInfo, wxTplSurplus int64, noMsgTipLastId *int64) {
 	firstTitle, area, jcly, mailContent, infoCount, firstAutoId := n.SubRecommend(user)
 	if infoCount == 0 {
 		logger.Info("无消息提醒任务", taskType, "没有要推荐的信息,过滤掉", user.Entniche.UserId)
 		return
 	}
-	now := time.Now()
 	redis.Put(Pushcache_2_c, NoMsgTipKey(user), 1, OneDaySecond)
 	redis.Put(Pushcache_2_c, PrevNoMsgTipKey(user), time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local).Unix(), ThreeDay+OneDaySecond)
 	logger.Info("无消息提醒任务", taskType, "开始推送", user.Entniche.UserId, "rateMode", user.PushSet.SubSet.RateMode, "jpushid", user.Jpushid, "opushid", user.Opushid, "appponetype", user.AppPhoneType, "email", user.PushSet.Email)
 	ut1, _, ut3 := GetUserType(user)
-	startEndMd, _ := user.Extend.Object["startEndMd"].(string)
 	var isWxPushOk, isAppPushOk, isMailPushOk bool
 	if user.PushSet.SubSet.WxPush == 1 {
-		isWxPush := false
-		if wxTplSurplus < 0 {
-			isWxPush = true
-		} else {
-			key := fmt.Sprintf(Redis_NoMsgTipWxTmplCount, FormatDate(&now, Date_yyyyMMdd))
-			maxNum, err := redis.IncrByErr(Pushcache_2_c, key)
-			if err != nil {
-				logger.Error("无消息提醒任务", taskType, "从redis获取noMsgTipWxTmplCount出错", err)
-			}
-			if maxNum == 1 {
-				redis.SetExpire(Pushcache_2_c, key, OneDaySecond)
-			}
-			if maxNum <= wxTplSurplus {
-				isWxPush = true
-			}
-		}
-		if isWxPush {
-			logger.Info("无消息提醒任务", taskType, "开始微信推送", user.Entniche.UserId)
-			isWxPushOk = n.sendWeixin(user, ut3, firstTitle, area, jcly, infoCount)
-			logger.Info("无消息提醒任务", taskType, "微信推送结束", isWxPushOk, user.Entniche.UserId)
-		} else {
-			if atomic.LoadInt64(noMsgTipLastId) < int64(user.Entniche.UserId) {
-				atomic.StoreInt64(noMsgTipLastId, int64(user.Entniche.UserId))
-			}
-			logger.Info("无消息提醒任务", taskType, "超过剩余模板消息量,不再推送微信", user.Entniche.UserId)
-		}
+		logger.Info("无消息提醒任务", taskType, "开始微信推送", user.Entniche.UserId)
+		isWxPushOk = n.sendWeixin(user, ut3, firstTitle, area, jcly, infoCount)
+		logger.Info("无消息提醒任务", taskType, "微信推送结束", isWxPushOk, user.Entniche.UserId)
 	}
 	if user.PushSet.SubSet.AppPush == 1 {
 		logger.Info("无消息提醒任务", taskType, "开始app推送", user.Entniche.UserId)

+ 0 - 1
pushentniche/push/task.json

@@ -1 +0,0 @@
-{"noMsgTipLastId":0}

+ 0 - 5
pushmember/push/config.json

@@ -80,11 +80,6 @@
 		"available":true,
 		"checkMaxPushPersion":0,
 		"selectPoolSize":5,
-		"isRecommendNewest":true,
-		"wxNodeNum":2, 
-		"dayNum":7,
-		"count":1000000,
-		"retain":100000,
 		"wx":{
 			"id":"WHcFvQgOLdlLOdXEfBe-Oy5SwrMK2zQqEKogJvXd7m0",
 			"url":"/jy_mobile/tabbar/recommendedlist"

+ 3 - 13
pushmember/push/config/config.go

@@ -63,14 +63,9 @@ type config struct {
 		Url   string `json:"url"`
 	} `json:"appMsg"`
 	NoMsgTip struct {
-		Available           bool  `json:"available"`
-		CheckMaxPushPersion int   `json:"checkMaxPushPersion"`
-		SelectPoolSize      int   `json:"selectPoolSize"`
-		IsRecommendNewest   bool  `json:"isRecommendNewest"`
-		WxNodeNum           int64 `json:"wxNodeNum"`
-		DayNum              int64 `json:"dayNum"`
-		Count               int64 `json:"count"`
-		Retain              int64 `json:"retain"`
+		Available           bool `json:"available"`
+		CheckMaxPushPersion int  `json:"checkMaxPushPersion"`
+		SelectPoolSize      int  `json:"selectPoolSize"`
 		Wx                  struct {
 			Id  string
 			Url string
@@ -96,21 +91,16 @@ type pushMail struct {
 	MailPoolSize int    `json:"mailPoolSize"`
 	MailReTry    int    `json:"mailReTry"`
 }
-type task struct {
-	NoMsgTipLastId string
-}
 
 var (
 	Gmails         []*mail.GmailAuth
 	Config         *config
 	FastigiumStart int
 	FastigiumEnd   int
-	Task           *task
 )
 
 func init() {
 	util.ReadConfig("./config.json", &Config)
-	util.ReadConfig("./task.json", &Task)
 	//
 	if fastigiumTimes := strings.Split(Config.FastigiumTime, "-"); len(fastigiumTimes) == 2 {
 		FastigiumStart = util.IntAll(fastigiumTimes[0])

+ 12 - 94
pushmember/push/job/nomsgtipjob.go

@@ -6,11 +6,9 @@ import (
 	. "pushmember/push/config"
 	. "pushmember/push/db"
 	putil "pushmember/push/util"
-	"sort"
 	"strconv"
 	"strings"
 	"sync"
-	"sync/atomic"
 	"time"
 
 	util "app.yhyue.com/moapp/jybase/common"
@@ -61,8 +59,6 @@ func (n *NoMsgTipJob) Execute(taskType, hour int) {
 	it := sess.DB(DbConf.Mongodb.Main.DbName).C(Mgo_User).Find(query).Select(UserCollFields).Iter()
 	pushPool := make(chan bool, Config.PushPoolSize)
 	pushWait := &sync.WaitGroup{}
-	lock := &sync.Mutex{}
-	allTipsA, allTipsB := []*UserInfo{}, []*UserInfo{}
 	for temp := make(map[string]interface{}); it.Next(&temp); {
 		isTake := MonitorTimeOut(pushPool, time.Minute, Config.TimeoutWarn, func() {
 			logger.Error("推送任务", taskType, "推送放入通道超时,", temp["_id"])
@@ -89,40 +85,17 @@ func (n *NoMsgTipJob) Execute(taskType, hour int) {
 			}
 			if taskType == 1 || (taskType == 6 && user.PushSet.SubSet.RateMode == 1) || (taskType == 2 && user.PushSet.SubSet.RateMode == 2) || (taskType == 3 && user.PushSet.SubSet.RateMode == 3) ||
 				(taskType == 4 && user.PushSet.SubSet.RateMode == 4) || (taskType == 5 && (user.PushSet.SubSet.RateMode == 3 || user.PushSet.SubSet.RateMode == 4)) {
-				if n.isTip(taskType, hour, user) {
-					lock.Lock()
-					if user.Id > Task.NoMsgTipLastId {
-						allTipsA = append(allTipsA, user)
-					} else {
-						allTipsB = append(allTipsB, user)
-					}
-					lock.Unlock()
-				}
+				n.tip(taskType, hour, user)
 			}
 		}(temp, isTake)
 		temp = make(map[string]interface{})
 	}
 	pushWait.Wait()
-	sort.Slice(allTipsA, func(i, j int) bool {
-		return allTipsA[i].Id < allTipsA[j].Id
-	})
-	sort.Slice(allTipsB, func(i, j int) bool {
-		return allTipsB[i].Id < allTipsB[j].Id
-	})
-	var noMsgTipLastId atomic.Value
-	wxTmplUsableNum := WxNoMsgTmplUsableNum(Mgo_Log, Config.NoMsgTip.WxNodeNum, Config.NoMsgTip.DayNum, Config.NoMsgTip.Count, Config.NoMsgTip.Retain)
-	if Config.NoMsgTip.IsRecommendNewest {
-		VarRecommend.SetNewest(1)
-	}
-	n.beforeTip(taskType, allTipsA, wxTmplUsableNum, noMsgTipLastId)
-	n.beforeTip(taskType, allTipsB, wxTmplUsableNum, noMsgTipLastId)
-	Task.NoMsgTipLastId = noMsgTipLastId.Load().(string)
-	util.WriteSysConfig("./task.json", &Task)
 	logger.Info("无消息提醒任务结束。。。", taskType, hour)
 }
 
 //提醒
-func (n *NoMsgTipJob) isTip(taskType, hour int, user *UserInfo) bool {
+func (n *NoMsgTipJob) tip(taskType, hour int, user *UserInfo) {
 	now := time.Now()
 	startEndMd := ""
 	var startUnix, endUnix int64
@@ -134,7 +107,7 @@ func (n *NoMsgTipJob) isTip(taskType, hour int, user *UserInfo) bool {
 	} else if user.PushSet.SubSet.RateMode == 2 {
 		isOver, start, end := TimesIsOver(user.PushSet.SubSet.Times, hour)
 		if taskType != 1 && !isOver {
-			return false
+			return
 		}
 		startUnix = start.Unix()
 		endUnix = end.Unix()
@@ -155,91 +128,36 @@ func (n *NoMsgTipJob) isTip(taskType, hour int, user *UserInfo) bool {
 		startUnix = start.Unix()
 		endUnix = now.Unix()
 	} else {
-		return false
+		return
 	}
 	if exists, err := redis.Exists(Pushcache_2_c, HasPushKey(user.Id)); err != nil {
 		logger.Error("无消息提醒任务", taskType, "redis判断今天是否推送过出错", err, user.Id)
-		return false
+		return
 	} else if exists {
 		logger.Info("无消息提醒任务", taskType, "redis判断今天推送过,过滤掉", user.Id)
-		return false
+		return
 	} else if exists, err := redis.Exists(Pushcache_2_c, NoMsgTipKey(user.Id)); err != nil {
 		logger.Error("无消息提醒任务", taskType, "redis判断今天是否提醒过出错", err, user.Id)
-		return false
+		return
 	} else if exists {
 		logger.Info("无消息提醒任务", taskType, "redis判断今天提醒过,过滤掉", user.Id)
-		return false
+		return
 	} else if n.pushCount(user.BaseUserId, startUnix, endUnix) != 0 {
 		logger.Info("无消息提醒任务", taskType, "mysql判断用户该时间段推送过,过滤掉", startUnix, endUnix, user.Id)
-		return false
-	}
-	user.Extend = &UserInfoExtend{
-		Object: map[string]interface{}{"startEndMd": startEndMd},
-	}
-	return true
-}
-
-//
-func (n *NoMsgTipJob) beforeTip(taskType int, allTip []*UserInfo, wxTmplUsableNum int64, noMsgTipLastId atomic.Value) {
-	pushPool := make(chan bool, Config.PushPoolSize)
-	pushWait := &sync.WaitGroup{}
-	for _, v := range allTip {
-		isTake := MonitorTimeOut(pushPool, time.Minute, Config.TimeoutWarn, func() {
-			logger.Error("推送任务", taskType, "推送放入通道超时,", v.Id)
-		})
-		pushWait.Add(1)
-		go func(user *UserInfo, take bool) {
-			defer util.Catch()
-			defer func() {
-				if take {
-					<-pushPool
-				}
-				pushWait.Done()
-			}()
-			n.toTip(taskType, user, wxTmplUsableNum, noMsgTipLastId)
-		}(v, isTake)
+		return
 	}
-}
-
-//
-func (n *NoMsgTipJob) toTip(taskType int, user *UserInfo, wxTmplUsableNum int64, noMsgTipLastId atomic.Value) {
 	firstTitle, area, jcly, mailContent, infoCount, firstAutoId := n.SubRecommend(user)
 	if infoCount == 0 {
 		logger.Info("无消息提醒任务", taskType, "没有要推荐的信息,过滤掉", user.Id)
 		return
 	}
-	now := time.Now()
 	redis.Put(Pushcache_2_c, NoMsgTipKey(user.Id), 1, OneDaySecond)
 	logger.Info("无消息提醒任务", taskType, "开始推送", user.Id, "rateMode", user.PushSet.SubSet.RateMode, "jpushid", user.Jpushid, "opushid", user.Opushid, "appponetype", user.AppPhoneType, "email", user.PushSet.Email)
-	startEndMd, _ := user.Extend.Object["startEndMd"].(string)
 	var isWxPushOk, isAppPushOk, isMailPushOk bool
 	if user.PushSet.SubSet.WxPush == 1 {
-		isWxPush := false
-		if wxTmplUsableNum < 0 {
-			isWxPush = true
-		} else {
-			key := fmt.Sprintf(Redis_NoMsgTipWxTmplCount, FormatDate(&now, Date_yyyyMMdd))
-			maxNum, err := redis.IncrByErr(Pushcache_2_c, key)
-			if err != nil {
-				logger.Error("无消息提醒任务", taskType, "从redis获取noMsgTipWxTmplCount出错", err)
-			}
-			if maxNum == 1 {
-				redis.SetExpire(Pushcache_2_c, key, OneDaySecond)
-			}
-			if maxNum <= wxTmplUsableNum {
-				isWxPush = true
-			}
-		}
-		if isWxPush {
-			logger.Info("无消息提醒任务", taskType, "开始微信推送", user.Id)
-			isWxPushOk = n.sendWeixin(user, firstTitle, area, jcly, infoCount)
-			logger.Info("无消息提醒任务", taskType, "微信推送结束", isWxPushOk, user.Id)
-		} else {
-			if noMsgTipLastId.Load().(string) < user.Id {
-				noMsgTipLastId.Store(user.Id)
-			}
-			logger.Info("无消息提醒任务", taskType, "超过剩余模板消息量,不再推送微信", user.Entniche.UserId)
-		}
+		logger.Info("无消息提醒任务", taskType, "开始微信推送", user.Id)
+		isWxPushOk = n.sendWeixin(user, firstTitle, area, jcly, infoCount)
+		logger.Info("无消息提醒任务", taskType, "微信推送结束", isWxPushOk, user.Id)
 	}
 	if user.PushSet.SubSet.AppPush == 1 {
 		logger.Info("无消息提醒任务", taskType, "开始app推送", user.Id)

+ 0 - 1
pushmember/push/task.json

@@ -1 +0,0 @@
-{"noMsgTipLastId":""}

+ 0 - 5
pushsupersub/push/config.json

@@ -80,11 +80,6 @@
 		"available":true,
 		"checkMaxPushPersion":5,
 		"selectPoolSize":5,
-		"isRecommendNewest":true,
-		"wxNodeNum":2, 
-		"dayNum":7,
-		"count":1000000,
-		"retain":100000,
 		"wx":{
 			"id":"ahEQafQBYZX8cVYXko-XaU1QkJ8MHiR-O9UNv_BRMzk",
 			"url":"/jy_mobile/tabbar/recommendedlist"

+ 3 - 13
pushsupersub/push/config/config.go

@@ -60,14 +60,9 @@ type config struct {
 		Url   string `json:"url"`
 	} `json:"appMsg"`
 	NoMsgTip struct {
-		Available           bool  `json:"available"`
-		CheckMaxPushPersion int   `json:"checkMaxPushPersion"`
-		SelectPoolSize      int   `json:"selectPoolSize"`
-		IsRecommendNewest   bool  `json:"isRecommendNewest"`
-		WxNodeNum           int64 `json:"wxNodeNum"`
-		DayNum              int64 `json:"dayNum"`
-		Count               int64 `json:"count"`
-		Retain              int64 `json:"retain"`
+		Available           bool `json:"available"`
+		CheckMaxPushPersion int  `json:"checkMaxPushPersion"`
+		SelectPoolSize      int  `json:"selectPoolSize"`
 		Wx                  struct {
 			Id  string
 			Url string
@@ -93,21 +88,16 @@ type pushMail struct {
 	MailPoolSize int    `json:"mailPoolSize"`
 	MailReTry    int    `json:"mailReTry"`
 }
-type task struct {
-	NoMsgTipLastId string
-}
 
 var (
 	Gmails         []*mail.GmailAuth
 	Config         *config
 	FastigiumStart int
 	FastigiumEnd   int
-	Task           *task
 )
 
 func init() {
 	util.ReadConfig("./config.json", &Config)
-	util.ReadConfig("./task.json", &Task)
 	//
 	if fastigiumTimes := strings.Split(Config.FastigiumTime, "-"); len(fastigiumTimes) == 2 {
 		FastigiumStart = util.IntAll(fastigiumTimes[0])

+ 12 - 94
pushsupersub/push/job/nomsgtipjob.go

@@ -6,11 +6,9 @@ import (
 	. "pushsupersub/push/config"
 	. "pushsupersub/push/db"
 	putil "pushsupersub/push/util"
-	"sort"
 	"strconv"
 	"strings"
 	"sync"
-	"sync/atomic"
 	"time"
 
 	util "app.yhyue.com/moapp/jybase/common"
@@ -62,8 +60,6 @@ func (n *NoMsgTipJob) Execute(taskType, hour int) {
 	it := sess.DB(DbConf.Mongodb.Main.DbName).C(Mgo_User).Find(query).Select(UserCollFields).Iter()
 	pushPool := make(chan bool, Config.PushPoolSize)
 	pushWait := &sync.WaitGroup{}
-	lock := &sync.Mutex{}
-	allTipsA, allTipsB := []*UserInfo{}, []*UserInfo{}
 	for temp := make(map[string]interface{}); it.Next(&temp); {
 		isTake := MonitorTimeOut(pushPool, time.Minute, Config.TimeoutWarn, func() {
 			logger.Error("推送任务", taskType, "推送放入通道超时,", temp["_id"])
@@ -87,40 +83,17 @@ func (n *NoMsgTipJob) Execute(taskType, hour int) {
 			}
 			if taskType == 1 || (taskType == 6 && user.PushSet.SubSet.RateMode == 1) || (taskType == 2 && user.PushSet.SubSet.RateMode == 2) || (taskType == 3 && user.PushSet.SubSet.RateMode == 3) ||
 				(taskType == 4 && user.PushSet.SubSet.RateMode == 4) || (taskType == 5 && (user.PushSet.SubSet.RateMode == 3 || user.PushSet.SubSet.RateMode == 4)) {
-				if n.isTip(taskType, hour, user) {
-					lock.Lock()
-					if user.Id > Task.NoMsgTipLastId {
-						allTipsA = append(allTipsA, user)
-					} else {
-						allTipsB = append(allTipsB, user)
-					}
-					lock.Unlock()
-				}
+				n.tip(taskType, hour, user)
 			}
 		}(temp, isTake)
 		temp = make(map[string]interface{})
 	}
 	pushWait.Wait()
-	sort.Slice(allTipsA, func(i, j int) bool {
-		return allTipsA[i].Id < allTipsA[j].Id
-	})
-	sort.Slice(allTipsB, func(i, j int) bool {
-		return allTipsB[i].Id < allTipsB[j].Id
-	})
-	var noMsgTipLastId atomic.Value
-	wxTplSurplus := WxNoMsgTmplUsableNum(Mgo_Log, Config.NoMsgTip.WxNodeNum, Config.NoMsgTip.DayNum, Config.NoMsgTip.Count, Config.NoMsgTip.Retain)
-	if Config.NoMsgTip.IsRecommendNewest {
-		VarRecommend.SetNewest(1)
-	}
-	n.beforeTip(taskType, allTipsA, wxTplSurplus, noMsgTipLastId)
-	n.beforeTip(taskType, allTipsB, wxTplSurplus, noMsgTipLastId)
-	Task.NoMsgTipLastId = noMsgTipLastId.Load().(string)
-	util.WriteSysConfig("./task.json", &Task)
 	logger.Info("无消息提醒任务结束。。。", taskType, hour)
 }
 
 //提醒
-func (n *NoMsgTipJob) isTip(taskType, hour int, user *UserInfo) bool {
+func (n *NoMsgTipJob) tip(taskType, hour int, user *UserInfo) {
 	now := time.Now()
 	startEndMd := ""
 	var startUnix, endUnix int64
@@ -132,7 +105,7 @@ func (n *NoMsgTipJob) isTip(taskType, hour int, user *UserInfo) bool {
 	} else if user.PushSet.SubSet.RateMode == 2 {
 		isOver, start, end := TimesIsOver(user.PushSet.SubSet.Times, hour)
 		if taskType != 1 && !isOver {
-			return false
+			return
 		}
 		startUnix = start.Unix()
 		endUnix = end.Unix()
@@ -153,93 +126,38 @@ func (n *NoMsgTipJob) isTip(taskType, hour int, user *UserInfo) bool {
 		startUnix = start.Unix()
 		endUnix = now.Unix()
 	} else {
-		return false
+		return
 	}
 	if exists, err := redis.Exists(Pushcache_2_c, HasPushKey(user.Id)); err != nil {
 		logger.Error("无消息提醒任务", taskType, "redis判断今天是否推送过出错", err, user.Id)
-		return false
+		return
 	} else if exists {
 		logger.Info("无消息提醒任务", taskType, "redis判断今天推送过,过滤掉", user.Id)
-		return false
+		return
 	} else if exists, err := redis.Exists(Pushcache_2_c, NoMsgTipKey(user.Id)); err != nil {
 		logger.Error("无消息提醒任务", taskType, "redis判断今天是否提醒过出错", err, user.Id)
-		return false
+		return
 	} else if exists {
 		logger.Info("无消息提醒任务", taskType, "redis判断今天提醒过,过滤掉", user.Id)
-		return false
+		return
 	} else if n.pushCount(user.BaseUserId, startUnix, endUnix) != 0 {
 		logger.Info("无消息提醒任务", taskType, "mysql判断超级订阅用户该时间段推送过,过滤掉", startUnix, endUnix, user.Id)
-		return false
-	}
-	user.Extend = &UserInfoExtend{
-		Object: map[string]interface{}{"startEndMd": startEndMd},
-	}
-	return true
-}
-
-//
-func (n *NoMsgTipJob) beforeTip(taskType int, allTip []*UserInfo, wxTplSurplus int64, noMsgTipLastId atomic.Value) {
-	pushPool := make(chan bool, Config.PushPoolSize)
-	pushWait := &sync.WaitGroup{}
-	for _, v := range allTip {
-		isTake := MonitorTimeOut(pushPool, time.Minute, Config.TimeoutWarn, func() {
-			logger.Error("推送任务", taskType, "推送放入通道超时,", v.Id)
-		})
-		pushWait.Add(1)
-		go func(user *UserInfo, take bool) {
-			defer util.Catch()
-			defer func() {
-				if take {
-					<-pushPool
-				}
-				pushWait.Done()
-			}()
-			n.toTip(taskType, user, wxTplSurplus, noMsgTipLastId)
-		}(v, isTake)
+		return
 	}
-}
-
-//
-func (n *NoMsgTipJob) toTip(taskType int, user *UserInfo, wxTplSurplus int64, noMsgTipLastId atomic.Value) {
 	firstTitle, area, jcly, mailContent, infoCount, firstAutoId := n.SubRecommend(user)
 	if infoCount == 0 {
 		logger.Info("无消息提醒任务", taskType, "没有要推荐的信息,过滤掉", user.Id)
 		return
 	}
-	now := time.Now()
 	redis.Put(Pushcache_2_c, NoMsgTipKey(user.Id), 1, OneDaySecond)
 	redis.Put(Pushcache_2_c, PrevNoMsgTipKey(user.Id), time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local).Unix(), ThreeDay+OneDaySecond)
 	logger.Info("无消息提醒任务", taskType, "开始推送", user.Id, "rateMode", user.PushSet.SubSet.RateMode, "jpushid", user.Jpushid, "opushid", user.Opushid, "appponetype", user.AppPhoneType, "email", user.PushSet.Email)
 	userType := "超级订阅"
-	startEndMd, _ := user.Extend.Object["startEndMd"].(string)
 	var isWxPushOk, isAppPushOk, isMailPushOk bool
 	if user.PushSet.SubSet.WxPush == 1 {
-		isWxPush := false
-		if wxTplSurplus < 0 {
-			isWxPush = true
-		} else {
-			key := fmt.Sprintf(Redis_NoMsgTipWxTmplCount, FormatDate(&now, Date_yyyyMMdd))
-			maxNum, err := redis.IncrByErr(Pushcache_2_c, key)
-			if err != nil {
-				logger.Error("无消息提醒任务", taskType, "从redis获取noMsgTipWxTmplCount出错", err)
-			}
-			if maxNum == 1 {
-				redis.SetExpire(Pushcache_2_c, key, OneDaySecond)
-			}
-			if maxNum <= wxTplSurplus {
-				isWxPush = true
-			}
-		}
-		if isWxPush {
-			logger.Info("无消息提醒任务", taskType, "开始微信推送", user.Id)
-			isWxPushOk = n.sendWeixin(user, firstTitle, area, jcly, infoCount)
-			logger.Info("无消息提醒任务", taskType, "微信推送结束", isWxPushOk, user.Id)
-		} else {
-			if noMsgTipLastId.Load().(string) < user.Id {
-				noMsgTipLastId.Store(user.Id)
-			}
-			logger.Info("无消息提醒任务", taskType, "超过剩余模板消息量,不再推送微信", user.Entniche.UserId)
-		}
+		logger.Info("无消息提醒任务", taskType, "开始微信推送", user.Id)
+		isWxPushOk = n.sendWeixin(user, firstTitle, area, jcly, infoCount)
+		logger.Info("无消息提醒任务", taskType, "微信推送结束", isWxPushOk, user.Id)
 	}
 	if user.PushSet.SubSet.AppPush == 1 {
 		logger.Info("无消息提醒任务", taskType, "开始app推送", user.Id)

+ 0 - 1
pushsupersub/push/task.json

@@ -1 +0,0 @@
-{"noMsgTipLastId":""}

+ 13 - 0
wxTmplSendTj/config.json

@@ -0,0 +1,13 @@
+{
+	"mongodb":{
+		"address": "192.168.3.149:27190",
+      	"size": 5,
+      	"dbName": "qfw",
+      	"userName": "admin",
+      	"password": "123456"
+	},
+	"cmdText":"cat /mnt/weixin_new/jylog/*.log | grep %s | grep 'SendTmplMsg success' | wc -l",
+	"timeTask":"01:00",
+	"node":"node1",
+	"mailWarn":"http://172.17.4.195:19281/_send/_mail?program=wxTmplSendTj&to=wangchuanjin@topnet.net.cn&title=每日统计微信模板消息发送量&body=node1未统计到"
+}

+ 20 - 0
wxTmplSendTj/go.mod

@@ -0,0 +1,20 @@
+module wxTmplSendTj
+
+go 1.20
+
+require app.yhyue.com/moapp/jybase v0.0.0-20250208012652-ed633bf76e1b
+
+require (
+	github.com/go-stack/stack v1.8.0 // indirect
+	github.com/golang/snappy v0.0.4 // indirect
+	github.com/klauspost/compress v1.13.6 // indirect
+	github.com/pkg/errors v0.9.1 // indirect
+	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
+	github.com/xdg-go/scram v1.0.2 // indirect
+	github.com/xdg-go/stringprep v1.0.2 // indirect
+	github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
+	go.mongodb.org/mongo-driver v1.9.1 // indirect
+	golang.org/x/crypto v0.0.0-20210920023735-84f357641f63 // indirect
+	golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
+	golang.org/x/text v0.3.7 // indirect
+)

+ 358 - 0
wxTmplSendTj/go.sum

@@ -0,0 +1,358 @@
+app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d/go.mod h1:91/lSD/hS+ckMVP3WdidRzDhC60lLMdyce9QHy0cSMA=
+app.yhyue.com/moapp/jybase v0.0.0-20250208012652-ed633bf76e1b h1:iPwxi8JofqqgHubq9hYP7aoehCc31pk8TCNrswk12dU=
+app.yhyue.com/moapp/jybase v0.0.0-20250208012652-ed633bf76e1b/go.mod h1:XHNATN6tsJKHdCB0DbUtFdPPHXexTUFyB3RlO+lUUoM=
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/RoaringBitmap/roaring v1.5.0/go.mod h1:plvDsJQpxOC5bw8LRteu/MLWHsHez/3y6cubLI4/1yE=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
+github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/aws/aws-sdk-go v1.35.20/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k=
+github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
+github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
+github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/coscms/tagfast v0.0.0-20150925144250-2b69b2496250/go.mod h1:zX8vynptAghuV/KG8BOZlDeo4DsTKWfBQ154RWlkay0=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/donnie4w/go-logger v0.0.0-20170827050443-4740c51383f4/go.mod h1:L7S4x0R7vv3xoOhGuyAJyCO2MYzWOpccM4Isn8jIUgY=
+github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
+github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/garyburd/redigo v1.6.2/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
+github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
+github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
+github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
+github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
+github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
+github.com/howeyc/fsnotify v0.9.0/go.mod h1:41HzSPxBGeFRQKEEwgh49TRw/nKBsYZ2cF1OzPjSJsA=
+github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
+github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
+github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
+github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
+github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
+github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
+github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
+github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/olivere/elastic v6.2.37+incompatible/go.mod h1:J+q1zQJTgAz9woqsbVRqGeB5G1iqDKVBWLNSYW8yfJ8=
+github.com/olivere/elastic/v7 v7.0.22/go.mod h1:VDexNy9NjmtAkrjNoI7tImv7FR4tf5zUA3ickqu5Pc8=
+github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
+github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
+github.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
+github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=
+github.com/smartystreets/gunit v1.4.2/go.mod h1:ZjM1ozSIMJlAz/ay4SG8PeKF00ckUp+zMHZXV9/bvak=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
+github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
+github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
+github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
+github.com/xdg-go/scram v1.0.2 h1:akYIkZ28e6A96dkWNJQu3nmCzH3YfwMPQExUYDaRv7w=
+github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
+github.com/xdg-go/stringprep v1.0.2 h1:6iq84/ryjjeRmMJwxutI51F2GIPlP5BfTvXHeYjyhBc=
+github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM=
+github.com/yl2chen/cidranger v1.0.2/go.mod h1:9U1yz7WPYDwf0vpNWFaeRh0bjwz5RVgRy/9UEQfHl0g=
+github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
+github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A=
+go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
+go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY=
+go.mongodb.org/mongo-driver v1.9.1 h1:m078y9v7sBItkt1aaoe2YlvWEXcD263e1a4E1fBrJ1c=
+go.mongodb.org/mongo-driver v1.9.1/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY=
+go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
+go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
+go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
+go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
+go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
+go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
+go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
+go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
+golang.org/x/crypto v0.0.0-20210920023735-84f357641f63 h1:kETrAMYZq6WVGPa8IIixL0CaEcIUNi+1WX7grUoi3y8=
+golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
+golang.org/x/net v0.0.0-20220531201128-c960675eff93/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
+google.golang.org/genproto v0.0.0-20220602131408-e326c6e8e9c8/go.mod h1:yKyY4AMRwFiC8yMMNaMi+RkCnjZJt9LoWuvhXjMs+To=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
+google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
+google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
+google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gorm.io/driver/mysql v1.0.5/go.mod h1:N1OIhHAIhx5SunkMGqWbGFVeh4yTNWKmMo1GOAsohLI=
+gorm.io/gorm v1.21.3/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=

+ 105 - 0
wxTmplSendTj/main.go

@@ -0,0 +1,105 @@
+package main
+
+import (
+	"flag"
+	"fmt"
+	"io/ioutil"
+	"log"
+	"net/http"
+	"os/exec"
+	"strings"
+	"time"
+
+	. "app.yhyue.com/moapp/jybase/common"
+	. "app.yhyue.com/moapp/jybase/date"
+	. "app.yhyue.com/moapp/jybase/mongodb"
+)
+
+type config struct {
+	Mongodb struct {
+		Address  string
+		Size     int
+		DbName   string
+		UserName string
+		Password string
+	}
+	CmdText  string
+	TimeTask string
+	Node     string
+	MailWarn string
+}
+
+var Config *config
+var Mgo *MongodbSim
+
+func main() {
+	ReadConfig("./config.json", &Config)
+	Mgo = &MongodbSim{
+		MongodbAddr: Config.Mongodb.Address,
+		Size:        Config.Mongodb.Size,
+		DbName:      Config.Mongodb.DbName,
+		UserName:    Config.Mongodb.UserName,
+		Password:    Config.Mongodb.Password,
+	}
+	Mgo.InitPool()
+	model := flag.Int("m", 0, "模式")
+	flag.Parse()
+	if *model == 1 {
+		run()
+	} else {
+		SimpleCrontab(false, Config.TimeTask, run)
+		select {}
+	}
+}
+func run() {
+	now := time.Now().AddDate(0, 0, -1)
+	ymd := FormatDate(&now, Date_Short_Layout)
+	count := getCmdResult(fmt.Sprintf(Config.CmdText, ymd))
+	log.Println(Config.Node, "模板消息推送量", count)
+	if count == 0 {
+		go http.Get(Config.MailWarn)
+	}
+	Mgo.Update("wxtmplsend_tj", map[string]interface{}{
+		"ymd":       ymd,
+		"node_type": Config.Node,
+	}, map[string]interface{}{
+		"$set": map[string]interface{}{
+			"count":     count,
+			"node_type": Config.Node,
+			"ymd":       ymd,
+		},
+	}, true, false)
+}
+
+//
+func getCmdResult(cmdText string) (count int64) {
+	log.Println("执行命令", cmdText)
+	cmd := exec.Command("/bin/bash", "-c", cmdText)
+
+	//创建获取命令输出管道
+	stdout, err := cmd.StdoutPipe()
+	if err != nil {
+		fmt.Printf("Error:can not obtain stdout pipe for command:%s\n", err)
+		return
+	}
+
+	//执行命令
+	if err := cmd.Start(); err != nil {
+		fmt.Println("Error:The command is err,", err)
+		return
+	}
+
+	//读取所有输出
+	bytes, err := ioutil.ReadAll(stdout)
+	if err != nil {
+		fmt.Println("ReadAll Stdout:", err.Error())
+		return
+	}
+
+	if err := cmd.Wait(); err != nil {
+		fmt.Println("wait:", err.Error())
+		return
+	}
+	count = Int64All(strings.TrimSpace(string(bytes)))
+	return
+}

BIN
wxTmplSendTj/wxTmplSendTj