|
@@ -0,0 +1,212 @@
|
|
|
|
+package util
|
|
|
|
+
|
|
|
|
+import (
|
|
|
|
+ "container/list"
|
|
|
|
+ "fmt"
|
|
|
|
+ "log"
|
|
|
|
+ "net/rpc"
|
|
|
|
+ qutil "qfw/util"
|
|
|
|
+ qrpc "qfw/util/rpc"
|
|
|
|
+ "strconv"
|
|
|
|
+ "sync"
|
|
|
|
+ "time"
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+//限制与解除数组
|
|
|
|
+var limitrule, unlimitrule [][]int
|
|
|
|
+
|
|
|
|
+//解除限制的时间间隔
|
|
|
|
+var unlimitduration int
|
|
|
|
+
|
|
|
|
+//提示语
|
|
|
|
+var limitmsg, unlimitmsg string
|
|
|
|
+
|
|
|
|
+//锁
|
|
|
|
+var limitLock = new(sync.Mutex)
|
|
|
|
+
|
|
|
|
+//限制状态
|
|
|
|
+var LimitStatus = false
|
|
|
|
+
|
|
|
|
+//流量池
|
|
|
|
+var tList = list.New()
|
|
|
|
+
|
|
|
|
+//全局抽奖次数
|
|
|
|
+var orctimes int64
|
|
|
|
+
|
|
|
|
+//通知openid
|
|
|
|
+var notifyIds []string
|
|
|
|
+
|
|
|
|
+var rpcserver string = "120.25.216.197:83"
|
|
|
|
+
|
|
|
|
+//对池的管理
|
|
|
|
+func listFun() {
|
|
|
|
+ tList.Remove(tList.Front())
|
|
|
|
+ tList.PushBack(orctimes)
|
|
|
|
+ time.AfterFunc(1*time.Second, listFun)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+//取值
|
|
|
|
+func CheckLimit() bool {
|
|
|
|
+ orctimes++
|
|
|
|
+ return LimitStatus
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func GetValFromList(n int) (val int, flag bool) {
|
|
|
|
+ qutil.Try(func() {
|
|
|
|
+ B := tList.Back()
|
|
|
|
+ Bn := B.Value.(int64)
|
|
|
|
+ ti := 1
|
|
|
|
+ n = n - 1
|
|
|
|
+ A := B.Prev()
|
|
|
|
+ flag = true
|
|
|
|
+ for ti < n {
|
|
|
|
+ if A != nil {
|
|
|
|
+ ti++
|
|
|
|
+ A = A.Prev()
|
|
|
|
+ } else {
|
|
|
|
+ flag = false
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ val = int(Bn - A.Value.(int64))
|
|
|
|
+ }, func(e interface{}) {
|
|
|
|
+ log.Println("ERROR", e)
|
|
|
|
+ })
|
|
|
|
+ return
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+//限制的监测
|
|
|
|
+func limitFun() {
|
|
|
|
+ limitLock.Lock()
|
|
|
|
+ //非限制状态
|
|
|
|
+ if !LimitStatus {
|
|
|
|
+ for _, v := range limitrule {
|
|
|
|
+ //取的秒的区间
|
|
|
|
+ if val, flag := GetValFromList(v[0]); flag && val >= v[1] {
|
|
|
|
+ //限制状态
|
|
|
|
+ LimitStatus = true
|
|
|
|
+ //发送模板消息
|
|
|
|
+ str := fmt.Sprintf(limitmsg, v[0], val, v[1])
|
|
|
|
+ go func() {
|
|
|
|
+ log.Println("发送识别限制通知", str)
|
|
|
|
+ qutil.Try(func() {
|
|
|
|
+ for _, id := range notifyIds {
|
|
|
|
+ SendManagerNotifyMsg(&qrpc.NotifyMsg{
|
|
|
|
+ Openid: id,
|
|
|
|
+ Title: "识别进入限制状态通知",
|
|
|
|
+ Detail: "系统",
|
|
|
|
+ Result: str,
|
|
|
|
+ Remark: time.Now().Format(qutil.Date_Full_Layout),
|
|
|
|
+ })
|
|
|
|
+ }
|
|
|
|
+ }, func(e interface{}) {})
|
|
|
|
+ }()
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ limitLock.Unlock()
|
|
|
|
+ time.AfterFunc(5*time.Second, limitFun)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+//解除限制的监测
|
|
|
|
+func unlimitFun() {
|
|
|
|
+ limitLock.Lock()
|
|
|
|
+ //非限制状态
|
|
|
|
+ if LimitStatus {
|
|
|
|
+ allb := true
|
|
|
|
+ str := ""
|
|
|
|
+ for _, v := range unlimitrule {
|
|
|
|
+ //取的秒的区间
|
|
|
|
+ val, flag := GetValFromList(v[0])
|
|
|
|
+ if !flag || val >= v[1] {
|
|
|
|
+ allb = false
|
|
|
|
+ break
|
|
|
|
+ } else {
|
|
|
|
+ str += " [间隔:" + strconv.Itoa(v[0]) + "秒," + "实际次数:" + strconv.Itoa(val) + ",限制:" + strconv.Itoa(v[1]) + "]"
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if allb {
|
|
|
|
+ LimitStatus = false
|
|
|
|
+ //发送解除通知
|
|
|
|
+ go func() {
|
|
|
|
+ log.Println("发送解除识别限制通知", str)
|
|
|
|
+ qutil.Try(func() {
|
|
|
|
+ for _, id := range notifyIds {
|
|
|
|
+ SendManagerNotifyMsg(&qrpc.NotifyMsg{
|
|
|
|
+ Openid: id,
|
|
|
|
+ Title: "解除识别限制通知",
|
|
|
|
+ Detail: "系统",
|
|
|
|
+ Result: fmt.Sprintf(unlimitmsg, str),
|
|
|
|
+ Remark: time.Now().Format(qutil.Date_Full_Layout),
|
|
|
|
+ })
|
|
|
|
+ }
|
|
|
|
+ }, func(e interface{}) {})
|
|
|
|
+ }()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ limitLock.Unlock()
|
|
|
|
+ time.AfterFunc(time.Duration(unlimitduration)*time.Second, unlimitFun)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+var limitConfig map[string]interface{}
|
|
|
|
+
|
|
|
|
+//初始化内容
|
|
|
|
+func init() {
|
|
|
|
+ qutil.ReadConfig("./limit.json", &limitConfig)
|
|
|
|
+ rpcserver = qutil.ObjToString(limitConfig["rpcserver"])
|
|
|
|
+ Limit := limitConfig["ocrlimit"].(map[string]interface{})
|
|
|
|
+ tmpLimtRules := Limit["limitrules"].([]interface{})
|
|
|
|
+ limitrule = make([][]int, len(tmpLimtRules))
|
|
|
|
+ for i, k := range tmpLimtRules {
|
|
|
|
+ minR := k.([]interface{})
|
|
|
|
+ tmpInts := make([]int, len(minR))
|
|
|
|
+ limitrule[i] = tmpInts
|
|
|
|
+ for j, v := range minR {
|
|
|
|
+ tmpInts[j] = int(v.(float64))
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ tmpUnLimtRules := Limit["unlimitrules"].([]interface{})
|
|
|
|
+ unlimitrule = make([][]int, len(tmpUnLimtRules))
|
|
|
|
+ for i, k := range tmpUnLimtRules {
|
|
|
|
+ minR := k.([]interface{})
|
|
|
|
+ tmpInts := make([]int, len(minR))
|
|
|
|
+ unlimitrule[i] = tmpInts
|
|
|
|
+ for j, v := range minR {
|
|
|
|
+ tmpInts[j] = int(v.(float64))
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ unlimitduration = int(Limit["unlimitduration"].(float64))
|
|
|
|
+ limitmsg = Limit["limitmsg"].(string)
|
|
|
|
+ unlimitmsg = Limit["unlimitmsg"].(string)
|
|
|
|
+
|
|
|
|
+ notifyIds = qutil.ObjArrToStringArr(Limit["notifyIds"].([]interface{}))
|
|
|
|
+
|
|
|
|
+ for tList.Len() < 7200 {
|
|
|
|
+ tList.PushBack(int64(0))
|
|
|
|
+ }
|
|
|
|
+ go listFun()
|
|
|
|
+ go limitFun()
|
|
|
|
+ autoUnlimit := limitConfig["autoUnlimit"].(bool)
|
|
|
|
+ if autoUnlimit {
|
|
|
|
+ go unlimitFun()
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func SendManagerNotifyMsg(p *qrpc.NotifyMsg) {
|
|
|
|
+ qutil.Try(func() {
|
|
|
|
+ client, err := rpc.DialHTTP("tcp", rpcserver)
|
|
|
|
+ defer client.Close()
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Println(err.Error())
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ var repl qrpc.RpcResult
|
|
|
|
+ err = client.Call("WeiXinRpc.SendManagerNotifyMsg", p, &repl)
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Println(err.Error())
|
|
|
|
+ }
|
|
|
|
+ }, func(e interface{}) {})
|
|
|
|
+
|
|
|
|
+}
|