-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathapi_bot.go
146 lines (129 loc) · 4.25 KB
/
api_bot.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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package main
import (
"log"
"net/http"
"strings"
"github.com/line/line-bot-sdk-go/v7/linebot"
)
// LinkCustomer : A chatbot DB to store account link information.
type LinkCustomer struct {
//Data from CustData from provider.
Name string
Age int
Desc string
Nonce string
//For chatbot linked data.
LinkUserID string
}
var linkedCustomers []LinkCustomer
func callbackHandler(w http.ResponseWriter, r *http.Request) {
events, err := bot.ParseRequest(r)
if err != nil {
if err == linebot.ErrInvalidSignature {
w.WriteHeader(400)
} else {
w.WriteHeader(500)
}
return
}
for _, event := range events {
if event.Type == linebot.EventTypeMessage {
switch message := event.Message.(type) {
case *linebot.TextMessage:
var userID string
if event.Source != nil {
userID = event.Source.UserID
}
switch {
case strings.EqualFold(message.Text, "link"):
//token link
//1. The bot server calls the API that issues a link token from the LINE user ID.
//2. The LINE Platform returns the link token to the bot server.
res, err := bot.IssueLinkToken(userID).Do()
if err != nil {
log.Println("Issue link token error, err=", err)
}
log.Println("Get user token:", res.LinkToken)
//3. The bot server calls the Messaging API to send a linking URL to the user.
//4. The LINE Platform sends a linking URL to the user.
if _, err = bot.ReplyMessage(
event.ReplyToken,
linebot.NewTextMessage("Account Link: link= "+serverURL+"link?linkToken="+res.LinkToken)).Do(); err != nil {
log.Println("err:", err)
return
}
return
case strings.EqualFold(message.Text, "list"):
if _, err = bot.ReplyMessage(
event.ReplyToken,
linebot.NewTextMessage("List all user: link= "+serverURL)).Do(); err != nil {
log.Println("err:", err)
return
}
return
}
//Check user if it is linked.
for _, usr := range linkedCustomers {
if usr.LinkUserID == event.Source.UserID {
if _, err = bot.ReplyMessage(
event.ReplyToken,
linebot.NewTextMessage("Hi "+usr.Name+"!, Nice to see you. \nWe know you: "+usr.Desc+" \nHere is all features ...")).Do(); err != nil {
log.Println("err:", err)
return
}
return
}
}
log.Println("source:>>>", event.Source, " group:>>", event.Source.GroupID, " room:>>", event.Source.RoomID)
if _, err = bot.ReplyMessage(
event.ReplyToken,
linebot.NewTextMessage("Welcome to booksstore, currently your account is not linked to provider. \nThis is a starter for account link, check following actions.").
WithQuickReplies(linebot.NewQuickReplyItems(
linebot.NewQuickReplyButton(
"",
linebot.NewMessageAction("account link", "link")),
linebot.NewQuickReplyButton(
"",
linebot.NewMessageAction("list user", "list")),
)),
).Do(); err != nil {
log.Println("err:", err)
return
}
}
} else if event.Type == linebot.EventTypeAccountLink {
//11. The LINE Platform sends an event (which includes the LINE user ID and nonce) via webhook to the bot server.
// account link success
log.Println("EventTypeAccountLink: source=", event.Source, " result=", event.AccountLink.Result)
for _, user := range linkedCustomers {
if event.Source.UserID == user.LinkUserID {
log.Println("User:", user, " already linked account.")
return
}
}
//search from all user using nonce.
for _, usr := range customers {
//12. The bot server uses the nonce to acquire the user ID of the provider's service.
if usr.Nonce == event.AccountLink.Nonce {
//Append to linked DB.
linkedUser := LinkCustomer{
Name: usr.Name,
Age: usr.Age,
Desc: usr.Desc,
LinkUserID: event.Source.UserID,
}
linkedCustomers = append(linkedCustomers, linkedUser)
//Send message back to user
if _, err = bot.ReplyMessage(
event.ReplyToken,
linebot.NewTextMessage("Hi "+usr.Name+" your account already linked to this chatbot.")).Do(); err != nil {
log.Println("err:", err)
return
}
return
}
}
log.Println("Error: no such user:", event.Source.UserID, " nonce=", event.AccountLink.Nonce, " for account link.")
}
}
}