From b33c7b1096a6352370f990db1be92a521352e3b4 Mon Sep 17 00:00:00 2001 From: cdle <798731886@qq.com> Date: Mon, 20 Sep 2021 18:20:35 +0800 Subject: [PATCH] update --- core/function.go | 1 + core/im.go | 5 ++ core/store.go | 14 +++--- im/qq/main.go | 4 -- im/qq/sender.go | 4 ++ im/tg/tg.go | 4 ++ im/wxmp/init.go | 124 ++++++++++++++++++++++++++++++++++++++++++++--- 7 files changed, 137 insertions(+), 19 deletions(-) diff --git a/core/function.go b/core/function.go index e82ee03..5dd8941 100644 --- a/core/function.go +++ b/core/function.go @@ -99,6 +99,7 @@ func handleMessage(sender Sender) { rt := function.Handle(sender) if rt != nil { sender.Reply(rt) + sender.Finish() } return } diff --git a/core/im.go b/core/im.go index cf417c1..7201628 100644 --- a/core/im.go +++ b/core/im.go @@ -24,6 +24,7 @@ type Sender interface { Reply(...interface{}) (int, error) Delete() error Disappear(lifetime ...time.Duration) + Finish() } type Edit int @@ -111,3 +112,7 @@ func (sender *Faker) Delete() error { func (sender *Faker) Disappear(lifetime ...time.Duration) { } + +func (sender *Faker) Finish() { + +} diff --git a/core/store.go b/core/store.go index 8aa454f..59174d0 100644 --- a/core/store.go +++ b/core/store.go @@ -28,24 +28,24 @@ func initStore() { } } -func (bucket Bucket) Set(key string, value interface{}) { +func (bucket Bucket) Set(key interface{}, value interface{}) { db.Update(func(tx *bolt.Tx) error { b := tx.Bucket([]byte(bucket)) if b == nil { b, _ = tx.CreateBucket([]byte(bucket)) } - b.Put([]byte(key), []byte(fmt.Sprint(value))) + b.Put([]byte(fmt.Sprint(key)), []byte(fmt.Sprint(value))) return nil }) } -func (bucket Bucket) Get(kv ...string) string { +func (bucket Bucket) Get(kv ...interface{}) string { var key, value string for i := range kv { if i == 0 { - key = kv[0] + key = fmt.Sprint(kv[0]) } else { - value = kv[1] + value = fmt.Sprint(kv[1]) } } db.View(func(tx *bolt.Tx) error { @@ -61,7 +61,7 @@ func (bucket Bucket) Get(kv ...string) string { return value } -func (bucket Bucket) GetInt(key string, vs ...int) int { +func (bucket Bucket) GetInt(key interface{}, vs ...int) int { var value int if len(vs) != 0 { value = vs[0] @@ -71,7 +71,7 @@ func (bucket Bucket) GetInt(key string, vs ...int) int { if b == nil { return nil } - v := Int(string(b.Get([]byte(key)))) + v := Int(string(b.Get([]byte(fmt.Sprint(key))))) if v != 0 { value = v } diff --git a/im/qq/main.go b/im/qq/main.go index 5d51227..70084da 100644 --- a/im/qq/main.go +++ b/im/qq/main.go @@ -248,7 +248,3 @@ func start() { bot.SendGroupMessage(int64(i), &message.SendingMessage{Elements: []message.IMessageElement{&message.AtElement{Target: int64(j)}, &message.TextElement{Content: s}}}) } } - -func (sender *Sender) Temporary() { - -} diff --git a/im/qq/sender.go b/im/qq/sender.go index b5e629c..162655b 100644 --- a/im/qq/sender.go +++ b/im/qq/sender.go @@ -250,3 +250,7 @@ func (sender *Sender) Disappear(lifetime ...time.Duration) { sender.Duration = &lifetime[0] } } + +func (sender *Sender) Finish() { + +} diff --git a/im/tg/tg.go b/im/tg/tg.go index 0bec76b..9168831 100644 --- a/im/tg/tg.go +++ b/im/tg/tg.go @@ -234,3 +234,7 @@ func (sender *Sender) Disappear(lifetime ...time.Duration) { sender.Duration = &lifetime[0] } } + +func (sender *Sender) Finish() { + +} diff --git a/im/wxmp/init.go b/im/wxmp/init.go index 2c96216..0ae6314 100644 --- a/im/wxmp/init.go +++ b/im/wxmp/init.go @@ -2,6 +2,8 @@ package wxgzh import ( "fmt" + "strings" + "time" "github.com/cdle/sillyGirl/core" "github.com/gin-gonic/gin" @@ -12,6 +14,7 @@ import ( ) var wxmp = core.NewBucket("wxmp") +var u2i = core.NewBucket("wxmpu2i") func init() { core.Server.Any("/wx/", func(c *gin.Context) { @@ -27,19 +30,124 @@ func init() { officialAccount := wc.GetOfficialAccount(cfg) server := officialAccount.GetServer(c.Request, c.Writer) server.SetMessageHandler(func(msg *message.MixMessage) *message.Reply { - //TODO - //回复消息:演示回复用户发送的消息 - fmt.Println(msg.Content) - text := message.NewText(msg.Content) - return &message.Reply{MsgType: message.MsgTypeText, MsgData: text} + sender := &Sender{} + sender.Message = msg.Content + sender.Wait = make(chan string) + sender.uid = u2i.GetInt(msg.FromUserName) + if sender.uid == 0 { + sender.uid = int(time.Now().UnixNano()) + u2i.Set(msg.FromUserName, sender.uid) + } + + return &message.Reply{MsgType: message.MsgTypeText, MsgData: message.NewText(<-sender.Wait)} }) - //处理消息接收以及回复 err := server.Serve() if err != nil { - fmt.Println(err) return } - //发送回复的消息 server.Send() }) } + +type Sender struct { + Message string + matches [][]string + Responses []string + Wait chan string + uid int +} + +func (sender *Sender) GetContent() string { + return sender.Message +} + +func (sender *Sender) GetUserID() int { + return sender.uid +} + +func (sender *Sender) GetChatID() int { + return 0 +} + +func (sender *Sender) GetImType() string { + return "wxmp" +} + +func (sender *Sender) GetMessageID() int { + return 0 +} + +func (sender *Sender) GetUsername() string { + return "" +} + +func (sender *Sender) IsReply() bool { + return false +} + +func (sender *Sender) GetReplySenderUserID() int { + return 0 +} + +func (sender *Sender) GetRawMessage() interface{} { + return sender.Message +} + +func (sender *Sender) SetMatch(ss []string) { + sender.matches = [][]string{ss} +} +func (sender *Sender) SetAllMatch(ss [][]string) { + sender.matches = ss +} + +func (sender *Sender) GetMatch() []string { + return sender.matches[0] +} + +func (sender *Sender) GetAllMatch() [][]string { + return sender.matches +} + +func (sender *Sender) Get(index ...int) string { + i := 0 + if len(index) != 0 { + i = index[0] + } + if len(sender.matches) == 0 { + return "" + } + if len(sender.matches[0]) < i+1 { + return "" + } + return sender.matches[0][i] +} + +func (sender *Sender) IsAdmin() bool { + return strings.Contains(wxmp.Get("masters"), fmt.Sprint(sender.uid)) +} + +func (sender *Sender) IsMedia() bool { + return false +} + +func (sender *Sender) Reply(msgs ...interface{}) (int, error) { + for _, item := range msgs { + switch item.(type) { + case string: + sender.Responses = append(sender.Responses, item.(string)) + } + } + return 0, nil +} + +func (sender *Sender) Delete() error { + return nil +} + +func (sender *Sender) Disappear(lifetime ...time.Duration) { + +} + +func (sender *Sender) Finish() { + sender.Wait <- strings.Join(sender.Responses, "\n") +}