diff --git a/im/wxmp/init.go b/im/wxmp/init.go index ff02dc0..07d5d25 100644 --- a/im/wxmp/init.go +++ b/im/wxmp/init.go @@ -2,9 +2,12 @@ package wxgzh import ( "fmt" + "io" + "os" "strings" "time" + "github.com/beego/beego/v2/adapter/httplib" "github.com/cdle/sillyGirl/core" "github.com/gin-gonic/gin" wechat "github.com/silenceper/wechat/v2" @@ -17,6 +20,7 @@ var wxmp = core.NewBucket("wxmp") var u2i = core.NewBucket("wxmpu2i") func init() { + file_dir := core.ExecPath + "/logs/wxmp/" core.Server.Any("/wx/", func(c *gin.Context) { wc := wechat.NewWechat() memory := cache.NewMemory() @@ -28,11 +32,12 @@ func init() { Cache: memory, } officialAccount := wc.GetOfficialAccount(cfg) + server := officialAccount.GetServer(c.Request, c.Writer) server.SetMessageHandler(func(msg *message.MixMessage) *message.Reply { sender := &Sender{} sender.Message = msg.Content - sender.Wait = make(chan string, 1) + sender.Wait = make(chan []interface{}, 1) sender.uid = u2i.GetInt(msg.FromUserName) if sender.uid == 0 { sender.uid = int(time.Now().UnixNano()) @@ -40,14 +45,53 @@ func init() { } core.Senders <- sender end := <-sender.Wait - if end == "" { + if len(end) == 0 { return nil } - // { - // wechat.AddMaterial(message.MsgTypeText, "xxx") - // } - // return &message.Reply{MsgType: message.MsgTypeImage, MsgData: message.NewText(end)} - return &message.Reply{MsgType: message.MsgTypeText, MsgData: message.NewText(end)} + ss := []string{} + url := "" + for _, item := range end { + switch item.(type) { + case error: + ss = append(ss, item.(error).Error()) + case string: + ss = append(ss, item.(string)) + case []byte: + ss = append(ss, string(item.([]byte))) + case core.ImageUrl: + url = string(item.(core.ImageUrl)) + } + } + mediaID := "" + if url != "" { + filename := file_dir + fmt.Sprint(time.Now().UnixNano()) + err := func() error { + f, err := os.Open(filename) + if err != nil { + return err + } + rsp, err := httplib.Get(url).Response() + _, err = io.Copy(f, rsp.Body) + if err != nil { + f.Close() + return err + } + f.Close() + m := officialAccount.GetMaterial() + mediaID, _, err = m.AddMaterial(message.MsgTypeImage, filename) + if err != nil { + return err + } + return nil + }() + if err != nil { + ss = append(ss, err.Error()) + goto TEXT + } + return &message.Reply{MsgType: message.MsgTypeImage, MsgData: message.NewImage(mediaID)} + } + TEXT: + return &message.Reply{MsgType: message.MsgTypeText, MsgData: message.NewText(strings.Join(ss, "\n\n"))} }) err := server.Serve() if err != nil { @@ -60,8 +104,8 @@ func init() { type Sender struct { Message string matches [][]string - Responses []string - Wait chan string + Responses []interface{} + Wait chan []interface{} uid int } @@ -139,15 +183,7 @@ func (sender *Sender) IsMedia() bool { } func (sender *Sender) Reply(msgs ...interface{}) (int, error) { - for _, item := range msgs { - switch item.(type) { - case string: - sender.Responses = append(sender.Responses, item.(string)) - case []byte: - sender.Responses = append(sender.Responses, string(item.([]byte))) - case core.ImageUrl: - } - } + sender.Responses = append(sender.Responses, msgs...) return 0, nil } @@ -160,5 +196,8 @@ func (sender *Sender) Disappear(lifetime ...time.Duration) { } func (sender *Sender) Finish() { - sender.Wait <- strings.Join(sender.Responses, "\n") + if sender.Responses == nil { + sender.Responses = []interface{}{} + } + sender.Wait <- sender.Responses }