From 748b5c9739ee94b0fce6732642466ca1b45d4ec6 Mon Sep 17 00:00:00 2001 From: Evan Chen Date: Tue, 4 Jan 2022 15:09:46 +0800 Subject: [PATCH] update --- api_join.go | 2 +- api_line.go | 15 +++++--- api_line_claim.go | 2 +- api_line_products.go | 63 +++++++++++++++++++++++++++++---- api_line_user.go | 8 +++-- assets/asset.go | 6 ++++ assets/brown.jpg | Bin 0 -> 23138 bytes files.go | 12 ++++--- main.go | 8 +++++ build.sh => scripts/build.sh | 0 deploy.sh => scripts/deploy.sh | 0 run.sh => scripts/run.sh | 0 {assets => tmpl}/check.html | 0 {assets => tmpl}/claim.html | 0 {assets => tmpl}/product.html | 0 {assets => tmpl}/profile.html | 0 16 files changed, 96 insertions(+), 20 deletions(-) create mode 100644 assets/asset.go create mode 100644 assets/brown.jpg rename build.sh => scripts/build.sh (100%) rename deploy.sh => scripts/deploy.sh (100%) rename run.sh => scripts/run.sh (100%) rename {assets => tmpl}/check.html (100%) rename {assets => tmpl}/claim.html (100%) rename {assets => tmpl}/product.html (100%) rename {assets => tmpl}/profile.html (100%) diff --git a/api_join.go b/api_join.go index f04766b..e5350df 100644 --- a/api_join.go +++ b/api_join.go @@ -71,7 +71,7 @@ func ApiSelectProfile(event *linebot.Event) { } go func(uid string) { - time.Sleep(time.Second * 5) + time.Sleep(time.Second * 3) if _, err := SendMessage("", uid, DefaultMsg()); err != nil { panic(err) } diff --git a/api_line.go b/api_line.go index 73a559f..befa77a 100644 --- a/api_line.go +++ b/api_line.go @@ -47,6 +47,10 @@ func postback(event *linebot.Event) { ApiSelectProfile(event) case strings.HasPrefix(data, "claim="): ApiPrepareClaim(event) + case strings.HasPrefix(data, "cat="): + ApiListProductOfCat(event) + case data == "list-tags": + ApiListCategories(event) } } @@ -61,17 +65,20 @@ func controller(event *linebot.Event) { switch { case msg.Text == "我想投保": - ApiListProduct(event) + ApiPreparePurchase(event) case msg.Text == "辦理理賠": ApiMyOrders(event) case msg.Text == "我的資料": ApiMe(event) case msg.Text == "我的保單": ApiMyOrders(event) - case strings.HasPrefix(msg.Text, "我是"): - case strings.HasPrefix(msg.Text, "我要理賠"): + case msg.Text == "為我推薦": + ApiListRecommanded(event) - case strings.HasPrefix(msg.Text, "幫我介紹"): + // discard + case strings.HasPrefix(msg.Text, "我是"): + case msg.Text == "我知道": + case msg.Text == "我要理賠": default: // route to watson diff --git a/api_line_claim.go b/api_line_claim.go index df075e7..10b8169 100644 --- a/api_line_claim.go +++ b/api_line_claim.go @@ -22,7 +22,7 @@ func ApiPrepareClaim(event *linebot.Event) { for _, cat := range prod.Categories { if cat.Name == "旅平" { - url := "https://bot.ework.tw/claim" + url := flagBase + "/claim" button := linebot.NewButtonsTemplate("", "", "請上傳收據", linebot.NewURIAction("開啟上傳頁面", url)) msg := linebot.NewTemplateMessage(fmt.Sprintf("請前往 %v 上傳收據", url), button) diff --git a/api_line_products.go b/api_line_products.go index 6355322..b05f21c 100644 --- a/api_line_products.go +++ b/api_line_products.go @@ -1,12 +1,63 @@ package main -import "github.com/line/line-bot-sdk-go/v7/linebot" +import ( + "strings" -func ApiListProduct(event *linebot.Event) { - leftBtn := linebot.NewMessageAction("修改資料", "修改資料") - rightBtn := linebot.NewMessageAction("我的保單", "我的保單") - template := linebot.NewConfirmTemplate("請問想辦理甚麼服務?", leftBtn, rightBtn) - msg := linebot.NewTemplateMessage("請問想辦理甚麼服務?", template) + "github.com/line/line-bot-sdk-go/v7/linebot" +) + +func ApiPreparePurchase(event *linebot.Event) { + text := "沒問題!您知道想投保甚麼險種嗎?我們很樂意為您介紹" + template := linebot.NewConfirmTemplate(text, + linebot.NewPostbackAction("我知道", "list-tags", "我知道", ""), + linebot.NewMessageAction("為我推薦", "為我推薦")) + msg := linebot.NewTemplateMessage(text, template) + if _, err := SendMessage(event.ReplyToken, event.Source.UserID, msg); err != nil { + panic(err) + } +} + +func ApiListCategories(event *linebot.Event) { + var cats []Category + DB.Find(&cats) + buttons := make([]*linebot.QuickReplyButton, len(cats)) + + for i, cat := range cats { + buttons[i] = linebot.NewQuickReplyButton("", + linebot.NewPostbackAction(cat.Name, "cat="+cat.Name, "", "險種: "+cat.Name)) + } + msg := linebot.NewTextMessage("請選擇險種。").WithQuickReplies( + linebot.NewQuickReplyItems(buttons...), + ) + if _, err := SendMessage(event.ReplyToken, event.Source.UserID, msg); err != nil { + panic(err) + } +} +func ApiListProductOfCat(event *linebot.Event) { + data := event.Postback.Data + data = strings.TrimPrefix(data, "cat=") + + msg := linebot.NewTextMessage(data + ":") + if _, err := SendMessage(event.ReplyToken, event.Source.UserID, msg); err != nil { + panic(err) + } +} + +func ApiGetProduct(event *linebot.Event) {} + +func ApiListRecommanded(event *linebot.Event) { + var prods []Product + DB.Limit(10).Find(&prods, "id not in (select product_id from orders where user_id = ?)", event.Source.UserID) + + // sort for target user + + // send slide + + text := "您的推薦" + leftBtn := linebot.NewMessageAction("修改資料", "修改資料") + rightBtn := linebot.NewMessageAction("我的保單", "我的保單") + template := linebot.NewConfirmTemplate(text, leftBtn, rightBtn) + msg := linebot.NewTemplateMessage(text, template) if _, err := SendMessage(event.ReplyToken, event.Source.UserID, msg); err != nil { panic(err) } diff --git a/api_line_user.go b/api_line_user.go index ea08986..9df46d2 100644 --- a/api_line_user.go +++ b/api_line_user.go @@ -3,7 +3,7 @@ package main import "github.com/line/line-bot-sdk-go/v7/linebot" func ApiMe(event *linebot.Event) { - leftBtn := linebot.NewURIAction("修改資料", "https://bot.ework.tw/profile") + leftBtn := linebot.NewURIAction("修改資料", flagBase+"/profile") rightBtn := linebot.NewMessageAction("我的保單", "我的保單") template := linebot.NewConfirmTemplate("請問想辦理甚麼服務?", leftBtn, rightBtn) msg := linebot.NewTemplateMessage("請問想辦理甚麼服務?", template) @@ -17,7 +17,9 @@ func ApiMyOrders(event *linebot.Event) { DB.Order("product_id").Find(&orders, "user_id = ?", event.Source.UserID) if len(orders) == 0 { - msg := linebot.NewTextMessage("您目前沒有保單, 歡迎前往「我想投保」專區選取保單。") + text := "您目前沒有保單喲, 歡迎前往投保專區選取保單。" + tmp := linebot.NewButtonsTemplate("", "", text, linebot.NewMessageAction("帶我前往", "我想投保")) + msg := linebot.NewTemplateMessage(text, tmp) if _, err := SendMessage(event.ReplyToken, event.Source.UserID, msg); err != nil { panic(err) } @@ -34,7 +36,7 @@ func ApiMyOrders(event *linebot.Event) { for i, prod := range products { columns[i] = linebot.NewCarouselColumn( prod.Img, prod.Name, prod.Brief, - linebot.NewURIAction("保單詳細", "https://bot.ework.tw/product"), + linebot.NewURIAction("保單詳細", flagBase+"/product"), linebot.NewPostbackAction("我要理賠", "claim="+prod.Name, "我要理賠", ""), // linebot.NewPostbackAction("我是"+prof.Name, "select="+prof.Name, "我是"+prof.Name, ""), ) diff --git a/assets/asset.go b/assets/asset.go new file mode 100644 index 0000000..6db2b46 --- /dev/null +++ b/assets/asset.go @@ -0,0 +1,6 @@ +package asset + +import "embed" + +//go:embed * +var FS embed.FS diff --git a/assets/brown.jpg b/assets/brown.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c13d853df2e5da12882e1d3080e99bf1cc5f912c GIT binary patch literal 23138 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 ec5CVU&vyRH|CuC