From aaa2fb475a13e4be8331455ce61009fc5d03da23 Mon Sep 17 00:00:00 2001 From: Zhao Xiaojie Date: Mon, 22 Jul 2019 20:56:34 +0800 Subject: [PATCH] Add random text respones (#15) * Add random text respones * Add more debug info * Fix the random issues * Add more debug info * Add more debug info --- pkg/article/articles.go | 5 +++++ pkg/article/articles_test.go | 36 ++++++++++++++++++++++++++++++++---- pkg/reply/match.go | 17 +++++++++++++++++ pkg/types.go | 8 ++++++++ 4 files changed, 62 insertions(+), 4 deletions(-) diff --git a/pkg/article/articles.go b/pkg/article/articles.go index 1e388cd..6fb4296 100644 --- a/pkg/article/articles.go +++ b/pkg/article/articles.go @@ -54,6 +54,7 @@ func (drm *DefaultResponseManager) InitCheck(weConfig *config.WeChatConfig) { log.Println("clone failure", err) return } + log.Println("the clone progress is done") } else { r, err := git.PlainOpen(CONFIG) if err == nil { @@ -110,6 +111,10 @@ func (drm *DefaultResponseManager) responseHandler(yamlContent []byte) { news := core.NewsResponseBody{} yaml.Unmarshal(yamlContent, &news) drm.ResponseMap[reps.Keyword] = news + case "random": // TODO this not the regular way + random := core.RandomResponseBody{} + yaml.Unmarshal(yamlContent, &random) + drm.ResponseMap[reps.Keyword] = random default: log.Println("unknow type", reps.MsgType) } diff --git a/pkg/article/articles_test.go b/pkg/article/articles_test.go index f15c55b..8796f3c 100644 --- a/pkg/article/articles_test.go +++ b/pkg/article/articles_test.go @@ -17,9 +17,10 @@ image: mediaID: mediaId ` - responseHandler([]byte(yml)) + mgr := NewDefaultResponseManager() + mgr.responseHandler([]byte(yml)) - resp := respMap["hi"] + resp := mgr.ResponseMap["hi"] if resp == nil { t.Error("Can't find response by keyword: hi.") } @@ -44,9 +45,10 @@ articles: url: "http://blog.com" ` - responseHandler([]byte(yml)) + mgr := NewDefaultResponseManager() + mgr.responseHandler([]byte(yml)) - resp := respMap["about"] + resp := mgr.ResponseMap["about"] if resp == nil { t.Error("Can't find response by keyword: about.") return @@ -58,3 +60,29 @@ articles: } assert.Equal(t, newsResp.Articles.Articles[0].Title, "title", "title parse error.") } + +func TestRandomResponseBody(t *testing.T) { + yml := ` +keyword: weixin +msgType: random +items: +- abc +- def +` + + mgr := NewDefaultResponseManager() + mgr.responseHandler([]byte(yml)) + + resp := mgr.ResponseMap["weixin"] + if resp == nil { + t.Error("Can't find response by keyword: weixin.") + return + } + + newsResp, ok := resp.(core.RandomResponseBody) + if !ok { + t.Error("Get the wrong type, should be RandomResponseBody.") + } + assert.Equal(t, len(newsResp.Items), 2, "can not parse items") + assert.Equal(t, newsResp.Items[0], "abc") +} diff --git a/pkg/reply/match.go b/pkg/reply/match.go index 9b75ea3..2d29931 100644 --- a/pkg/reply/match.go +++ b/pkg/reply/match.go @@ -3,6 +3,8 @@ package reply import ( "fmt" "log" + "math/rand" + "time" core "github.com/jenkins-zh/wechat-backend/pkg" "github.com/jenkins-zh/wechat-backend/pkg/article" @@ -77,6 +79,21 @@ func (m *MatchAutoReply) Handle() (string, error) { if err != nil { err = fmt.Errorf("Wechat Service: makeNewsResponseBody error: %v", err) } + } else if random, ok := resp.(core.RandomResponseBody); ok { + items := random.Items + count := len(items) + + r := rand.New(rand.NewSource(time.Now().UnixNano())) + index := r.Intn(count) + + fmt.Printf("response random item count: %d, index: %d\n", count, index) + + rondomText := fmt.Sprintf("%s\n%s", random.Content, items[index]) + + data, err = makeTextResponseBody(from, to, rondomText) + if err != nil { + err = fmt.Errorf("Wechat Service: RandomResponseBody error: %v", err) + } } else { err = fmt.Errorf("type error %v", resp) } diff --git a/pkg/types.go b/pkg/types.go index e221d37..ec9d867 100644 --- a/pkg/types.go +++ b/pkg/types.go @@ -44,6 +44,14 @@ type ImageResponseBody struct { Image Image } +// RandomResponseBody is not a regular type from wechat system +type RandomResponseBody struct { + ResponseBody `yaml:",inline"` + XMLName xml.Name `xml:"xml"` + Items []string + Content string +} + type Articles struct { // XMLName xml.Name `xml:"Articles"` Articles []Article `xml:"item"` -- GitLab