/
sendLineMsgHandler.go
68 lines (58 loc) · 1.55 KB
/
sendLineMsgHandler.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package http
import (
"bytes"
"fmt"
"net/http"
"text/template"
"github.com/labstack/echo"
"github.com/line/line-bot-sdk-go/linebot"
log "github.com/sirupsen/logrus"
"github.com/VagabondDataNinjas/gizlinebot/storage"
)
type SendLineMsgRequest struct {
UserIds []string `json:"user_ids"`
Messages []string `json:"messages"`
}
type MsgVars struct {
UserId string
}
func SendLineMsgHandlerBuilder(s * storage.Sql, lineBot *linebot.Client) func(c echo.Context) error {
return func(c echo.Context) error {
payload := new(SendLineMsgRequest)
if err := c.Bind(payload); err != nil {
return err
}
// @TODO validate UserIds exist
// @TODO validate that the message templates compile
// @TODO segment users list in max 150 users @see line documentation
// @TODO use multicast
warnings := []string{}
for _, userId := range payload.UserIds {
for _, message := range payload.Messages {
vars := MsgVars{
UserId: userId,
}
tmpl, err := template.New("lineMsg").Parse(message)
if err != nil {
// @TODO log
return err
}
buf := new(bytes.Buffer)
err = tmpl.Execute(buf, vars)
if err != nil {
return err
}
lineMsg := linebot.NewTextMessage(buf.String())
if _, err := lineBot.PushMessage(userId, lineMsg).Do(); err != nil {
warn := fmt.Sprintf("Got error when seding msg to %s: %s", userId, err)
log.Error(warn)
warnings = append(warnings, warn)
continue
}
}
}
return c.JSON(http.StatusOK, map[string]interface{}{
"status": "success", "warnings": warnings,
})
}
}