Browse Source

ORC限制

renzheng 9 years ago
parent
commit
a8dcd1ba8c

+ 32 - 0
weixin/src/limit.json

@@ -0,0 +1,32 @@
+{
+    "rpcserver": "127.0.0.1:83",
+    "autoUnlimit": false,
+    "ocrlimit": {
+        "limitrules": [
+            [
+                60,
+                50
+            ],
+            [
+                300,
+                200
+            ]
+        ],
+        "limitmsg": "名片识别进入限制状态,原因:%d秒内识别次数为%d超过%d次。",
+        "unlimitduration": 1800,
+        "notifyIds": [
+            "oJULtwzXo6EFV1Ah-XeyRBimXGM8"
+        ],
+        "unlimitrules": [
+            [
+                1800,
+                200
+            ],
+            [
+                300,
+                100
+            ]
+        ],
+        "unlimitmsg": "解除名片识别限制,%s。"
+    }
+}

+ 2 - 1
weixin/src/qfw/weixin/msgtxtchandler.go

@@ -42,7 +42,8 @@ func MsgTxtHandler(w ResponseWriter, r *Request) {
 		}
 	} else if r.Content == "微信管理" && mids[openid] {
 		UserSession[r.FromUserName] = NewUserSession("wxadmin")
-		w.ReplyText("您已进入微信管理,请输入指令操作:\n1.查看抽奖模式(指令:f0)\n2.切换抽奖模式(指令:c*,*为数字。如c0(自动模式),c1(手动模式1),c2(手动模式2),c3(手动模式3))\n3.统计抽奖结果(tjr*,tjr120(最近两分钟),tjr120-1200(最近两分钟至最近20分钟之间的))\n4.统计新用户数(tju*)\n5.服务器情况监测(ser0)\n6服务管理(man*,man1重启主程序(man11关闭),man3重启积分(man33关闭),man4重启微信认证(man44关闭))。\n输入q或Q离开。")
+		w.ReplyText(`您已进入微信管理,请输入指令操作:\n1.查看抽奖模式(指令:f0)\n2.切换抽奖模式(指令:c*,*为数字。如c0(自动模式),c1(手动模式1),c2(手动模式2),c3(手动模式3))\n3.统计抽奖结果(tjr*,tjr120(最近两分钟),tjr120-1200(最近两分钟至最近20分钟之间的))\n4.统计新用户数(tju*)\n5.服务器情况监测(ser0)\n6服务管理(man*,man1重启主程序(man11关闭),man3重启积分(man33关闭),man4重启微信认证(man44关闭))。\n输入q或Q离开。` +
+			`\n7.名片识别(指令:mp*,mp1查看识别状态,mp2关闭识别,mp3开启识别,mp60(数字大于10小于7200)查询最近60秒的识别次数)`)
 		return
 	} else if cj_reg.MatchString(r.Content) { //进入抽奖环节
 		if time.Now().Unix() > 1455552000 { //活动过期 ,过期后,这段代码要删除

+ 212 - 0
weixin/src/qfw/weixin/util/limitocr.go

@@ -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{}) {})
+
+}

+ 23 - 1
weixin/src/qfw/weixin/wxadmin.go

@@ -2,16 +2,18 @@ package weixin
 
 import (
 	"fmt"
-	. "gopkg.in/mgo.v2/bson"
 	"io/ioutil"
 	"log"
 	"os/exec"
 	"qfw/util"
 	"qfw/util/mongodb"
 	"qfw/util/redis"
+	wutil "qfw/weixin/util"
 	"strconv"
 	"strings"
 	"time"
+
+	. "gopkg.in/mgo.v2/bson"
 )
 
 func processWxAdmin(openid, content string, w ResponseWriter, r *Request) {
@@ -32,6 +34,26 @@ func processWxAdmin(openid, content string, w ResponseWriter, r *Request) {
 							resStr = "模式已切换:" + getMode()
 						}
 					}
+				case "mp":
+					//名片识别的处理
+					if var1 <= 10 {
+						switch var1 {
+						case 1:
+							//查看识别状态
+							resStr = fmt.Sprintf("识别状态:%s", util.If(wutil.LimitStatus, "关闭", "开启"))
+						case 2:
+							//关闭识别
+							wutil.LimitStatus = true
+							resStr = "关闭识别完成"
+						case 3:
+							//开启识别
+							wutil.LimitStatus = false
+							resStr = "开启识别完成"
+						}
+					} else {
+						num, _ := wutil.GetValFromList(int(var1))
+						resStr = fmt.Sprintf("最近%s秒,识别次数:%d", var1, num)
+					}
 				case "tjr":
 					//数据库抽奖查看
 					var1, var2 = getTimes(qleng, unit, var1, var2)