Kaynağa Gözat

add plugin config; add key value storage

songtianyi 7 yıl önce
ebeveyn
işleme
c116af3991
6 değiştirilmiş dosya ile 150 ekleme ve 6 silme
  1. 23 0
      README.md
  2. 11 0
      examples/linux/terminal_bot.go
  3. 37 0
      kv/memory.go
  4. 73 0
      plugins/wxweb/config/config.go
  5. 1 1
      wxweb/api.go
  6. 5 5
      wxweb/session.go

+ 23 - 0
README.md

@@ -134,6 +134,29 @@ dump
 ###### share
 资源(纸牌屋)自动分发示例
 
+###### config
+配置管理插件
+设置配置, 在聊天窗口输入
+```
+set config key value
+```
+查看配置,在聊天窗口输入
+```
+get config key
+```
+在代码中使用配置
+```
+import "github.com/songtianyi/wechat-go/kv"
+func demo() {
+	kv.KVStorageInstance.Set("key", "value")
+	v := kv.KVStorageInstance.Get("key")
+	if v == nil {
+		return
+	}
+	// v.(string) etc.
+}
+```
+
 ## 制作自己的插件
 自定义插件的两个原则
 * 一个插件只完成一个功能,不在一个插件里加入多个handler

+ 11 - 0
examples/linux/terminal_bot.go

@@ -3,6 +3,7 @@ package main
 import (
 	"github.com/songtianyi/rrframework/logs"
 	"github.com/songtianyi/wechat-go/plugins/wxweb/cleaner"
+	"github.com/songtianyi/wechat-go/plugins/wxweb/config"
 	"github.com/songtianyi/wechat-go/plugins/wxweb/faceplusplus"
 	"github.com/songtianyi/wechat-go/plugins/wxweb/forwarder"
 	"github.com/songtianyi/wechat-go/plugins/wxweb/gifer"
@@ -40,12 +41,22 @@ func main() {
 	youdao.Register(session)
 	verify.Register(session)
 	share.Register(session)
+	config.Register(session)
 
 	// disable by type example
 	if err := session.HandlerRegister.DisableByType(wxweb.MSG_SYS); err != nil {
 		logs.Error(err)
 		return
 	}
+	if err := session.HandlerRegister.DisableByType(wxweb.MSG_TEXT); err != nil {
+		logs.Error(err)
+		return
+	}
+	if err := session.HandlerRegister.DisableByType(wxweb.MSG_IMG); err != nil {
+		logs.Error(err)
+		return
+	}
+	session.HandlerRegister.EnableByName("switcher")
 
 	for {
 		if err := session.LoginAndServe(false); err != nil {

+ 37 - 0
kv/memory.go

@@ -0,0 +1,37 @@
+package kv
+
+import (
+	"sync"
+)
+
+var (
+	KVStorageInstance *KVStorage
+)
+
+func init() {
+	KVStorageInstance = &KVStorage{
+		meta: make(map[string]interface{}),
+	}
+}
+
+type KVStorage struct {
+	meta map[string]interface{}
+
+	rLock sync.RWMutex
+	wLock sync.RWMutex
+}
+
+func (s *KVStorage) Put(key string, value interface{}) {
+	s.wLock.Lock()
+	s.meta[key] = value
+	s.wLock.Unlock()
+}
+
+func (s *KVStorage) Get(key string) interface{} {
+	s.rLock.RLock()
+	if v, ok := s.meta[key]; ok {
+		return v
+	}
+	s.rLock.RUnlock()
+	return nil
+}

+ 73 - 0
plugins/wxweb/config/config.go

@@ -0,0 +1,73 @@
+/*
+Copyright 2017 wechat-go Authors. All Rights Reserved.
+MIT License
+
+Copyright (c) 2017
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+package config
+
+import (
+	"github.com/songtianyi/rrframework/logs"
+	"github.com/songtianyi/wechat-go/kv"
+	"github.com/songtianyi/wechat-go/wxweb"
+	"strings"
+)
+
+// Register plugin
+func Register(session *wxweb.Session) {
+	session.HandlerRegister.Add(wxweb.MSG_TEXT, wxweb.Handler(configure), "config")
+	if err := session.HandlerRegister.EnableByName("config"); err != nil {
+		logs.Error(err)
+	}
+}
+
+func configure(session *wxweb.Session, msg *wxweb.ReceivedMessage) {
+	// from myself
+	if msg.FromUserName != session.Bot.UserName {
+		return
+	}
+	kvp := strings.Split(msg.Content, " ")
+	logs.Debug(kvp)
+	// command filter
+	if strings.Contains(strings.ToLower(msg.Content), "set config ") {
+		if len(kvp) < 4 {
+			session.SendText("invalid key value pair", session.Bot.UserName, msg.FromUserName)
+			return
+		}
+		kv.KVStorageInstance.Put(kvp[2], kvp[3])
+		return
+	}
+
+	if strings.Contains(strings.ToLower(msg.Content), "get config ") {
+		if len(kvp) < 3 {
+			session.SendText("invalid key value pair", session.Bot.UserName, msg.FromUserName)
+			return
+		}
+		v := kv.KVStorageInstance.Get(kvp[2])
+		if v == nil {
+			session.SendText("invalid key", session.Bot.UserName, msg.FromUserName)
+			return
+		}
+		session.SendText(v.(string), session.Bot.UserName, msg.FromUserName)
+		return
+	}
+}

+ 1 - 1
wxweb/api.go

@@ -248,7 +248,7 @@ func WebWxSync(common *Common,
 	u, _ := url.Parse(uri)
 	jar.SetCookies(u, cookies)
 	//client := &http.Client{Jar: jar, Timeout: time.Duration(10) * time.Second}
-	client := &http.Client{Jar: jar}// 防止synccheck 产生 0 3错误
+	client := &http.Client{Jar: jar} // 防止synccheck 产生 0 3错误
 	req, err := http.NewRequest("POST", uri, bytes.NewReader(b))
 	req.Header.Add("Content-Type", "application/json; charset=UTF-8")
 	req.Header.Add("User-Agent", common.UserAgent)

+ 5 - 5
wxweb/session.go

@@ -288,24 +288,24 @@ func (s *Session) producer(msg chan []byte, errChan chan error) {
 loop1:
 	for {
 		ret, sel, err := SyncCheck(s.WxWebCommon, s.WxWebXcg, s.Cookies, s.WxWebCommon.SyncSrv, s.SynKeyList)
-		logs.Info(s.WxWebCommon.SyncSrv, ret, sel)//检查状态返回的值
+		logs.Info(s.WxWebCommon.SyncSrv, ret, sel) //检查状态返回的值
 		if err != nil {
 			logs.Error(err)
 			continue
 		}
-		if ret == 0 {//0 正常
+		if ret == 0 { //0 正常
 			// check success
-			if sel == 2 {//2 新的消息
+			if sel == 2 { //2 新的消息
 				// new message
 				err := WebWxSync(s.WxWebCommon, s.WxWebXcg, s.Cookies, msg, s.SynKeyList)
 				if err != nil {
 					logs.Error(err)
 				}
-			} else if sel != 0 && sel != 7 && sel !=4 {//0 正常 7 进入/离开聊天界面 4 点击保存群聊到通讯录或者改群聊名字
+			} else if sel != 0 && sel != 7 && sel != 4 { //0 正常 7 进入/离开聊天界面 4 点击保存群聊到通讯录或者改群聊名字
 				errChan <- fmt.Errorf("session down, sel %d", sel)
 				break loop1
 			}
-		} else if ret == 1101 {//1100 失败/登出微信
+		} else if ret == 1101 { //1100 失败/登出微信
 			errChan <- nil
 			break loop1
 		} else if ret == 1205 {