-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.js
293 lines (252 loc) · 16.6 KB
/
app.js
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
const { google } = require("googleapis");
const line = require('@line/bot-sdk');
const express = require('express');
const dotenv = require('dotenv');
const message = require('./message.json');
// config env และ package
const env = dotenv.config().parsed
const app = express()
const lineConfig = {
channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN || env.CHANNEL_ACCESS_TOKEN,
channelSecret: process.env.CHANNEL_SECRET || env.CHANNEL_SECRET
}
const client = new line.Client(lineConfig);
// Setting ส่วนของ Google
const auth = new google.auth.GoogleAuth({
keyFile: "credentials.json",
scopes: "https://www.googleapis.com/auth/spreadsheets"
});
// Configure routing
app.get("/", (req, res) => {
res.sendStatus(200)
});
// ฟังชั่นหลัก
app.post('/webhook', line.middleware(lineConfig), async (req, res, next) => {
try {
const events = req.body.events
console.log('event', events);
events.length > 0 ? await events.map(item => handleEvent(item)) : res.status(200).send("OK")
if (req.session.user) return next();
return next(new NotAuthorizedError());
} catch (e) {
res.status(500).end()
}
});
// ตัวแปลไว้เก็บข้อความแบบ Global
let replyLineMessage
// 1=add stock 2=delete stock
let confirm = 0;
// ตัวแปลเก็บข้อมูลจาก GS และ เก็บค่าเช็ค
let x, y, sheet
let checkitem = true;
// ฟังชั่นรอง
handleEvent = async (event) => {
// ส่วนของ Google
const authclient = await auth.getClient();
const googleSheets = google.sheets({version: "v4", auth: authclient });
// ID ของ Google Sheet
const spreadsheetId = "1TFMBHX19EVQWgTZIruszDxIlXo5r1Oj4LYsQQTcutlM";
// get ค่าแถวของ GS
const getRows = await googleSheets.spreadsheets.values.get({auth, spreadsheetId, range: "data1"});
//คำสั่งเรียกใช้งาน
const prefix = '!';
// เช็คข้อมูลว่าเป็น message หรือเปล่า
if(event.type !== 'message' || event.message.type !== 'text') return null;
// เริ่มทำงานในโต้ตอบ
else if (event.message.text.startsWith(prefix)) {
// คำสั่งเรียกใช้งาน
const args = event.message.text.trim().split(/ +/g);
const cmd = args[0].slice(prefix.length).toLowerCase();
// เช็คข้อมูลว่าตรงกับ GS หรือเปล่า
for (var i=1;i<getRows.data.values.length; i++){
if(getRows.data.values[i][0] != args[1]) {
// เช็คว่ามีข้อมูลอยู่หรือเปล่า
checkitem = false;
}
}
for (var i=1;i<getRows.data.values.length; i++){
if(getRows.data.values[i][0] == args[1]) {
x = getRows.data.values[i][1]
y = getRows.data.values[i][2]
checkitem = true;
sheet = i;
}
}
// ส่งข้อมูลไปเก็บไว้ใน ไฟล์ JSON
let num1 = 1;
let num2 = 0;
for (var i = 0; i < 5; i++) {
num1+=1
num2+=1
message.msg1.contents.contents[0].body.contents[3].contents[num1].contents[0].text = getRows.data.values[num2][0];
message.msg1.contents.contents[0].body.contents[3].contents[num1].contents[1].text = getRows.data.values[num2][1];
message.msg1.contents.contents[0].body.contents[3].contents[num1].contents[2].text = getRows.data.values[num2][2];
}
for (var i = 0; i < 4; i++) {
num2+=1
message.msg1.contents.contents[1].body.contents[3].contents[i].contents[0].text = getRows.data.values[num2][0];
message.msg1.contents.contents[1].body.contents[3].contents[i].contents[1].text = getRows.data.values[num2][1];
message.msg1.contents.contents[1].body.contents[3].contents[i].contents[2].text = getRows.data.values[num2][2];
}
message.msg2.contents.body.contents[1].text = args[1];
message.msg2.contents.body.contents[3].contents[0].contents[1].text = x+" หน่วย";
message.msg2.contents.body.contents[3].contents[1].contents[1].text = y+" บาท";
// เริ่มคำสั่ง
switch (cmd){
case "stock":
replyLineMessage = message.msg1
break
case "ckst":
if (args[1] == null) {
replyLineMessage = {"type": "text", "text": "โปรดกรอกข้อมูลที่ต้องการค้นหาครับ"}
break
}
if (checkitem != true) replyLineMessage = {"type": "text", "text": "ไม่พบข้อมูลที่ต้องการตรวจสอบครับ" }
else replyLineMessage = message.msg2
break
case "adst":
if (checkitem == true){
if (args[1] == null){
replyLineMessage = {"type": "text", "text": "โปรดกรอกข้อมูลที่ต้องการอัพเดท ตัวอย่างเช่น !adst ชื่อสินค้า จำนวน ราคา"}
break
} else if (args[2] == null) {
replyLineMessage = {"type": "text", "text": "โปรดกรอก จำนวน สินค้า ตัวอย่างเช่น !adst ชื่อสินค้า จำนวน ราคา"}
break
} else if (args[3] == null) {
replyLineMessage = {"type": "text", "text": "โปรดกรอก ราคา สินค้า ตัวอย่างเช่น !adst ชื่อสินค้า จำนวน ราคา"}
break
} else if (Number.isInteger(parseInt(args[2])) == false || Number.isInteger(parseInt(args[3])) == false) {
replyLineMessage = {"type": "text", "text": "โปรดกรอกข้อมูลให้ถูกต้อง ตัวอย่างเช่น !adst ชื่อสินค้า จำนวน ราคา"}
break
}
let updatedata = parseInt(args[2])+parseInt(x);
// อัพเดทข้อมูลลงแถวของ GS
await googleSheets.spreadsheets.values.update(
{auth, spreadsheetId, range: `data1!A${sheet+1}:C${sheet+1}`, valueInputOption: "USER_ENTERED",
resource:{range: `data1!A${sheet+1}:C${sheet+1}`, majorDimension: "ROWS", values: [[`${args[1]}`, `${updatedata}`, `${parseInt(args[3])}`]] }
});
replyLineMessage = {"type": "text", "text": "อัพเดทข้อมูลเรียบร้อยแล้วค้าบบบ" }
break
} else {
if (args[1] == null){
replyLineMessage = {"type": "text", "text": "โปรดกรอกข้อมูลที่ต้องการเพิ่ม ตัวอย่างเช่น !adst ชื่อสินค้า จำนวน ราคา"}
break
} else if (args[2] == null) {
replyLineMessage = {"type": "text", "text": "โปรดกรอก จำนวน สินค้า ตัวอย่างเช่น !adst ชื่อสินค้า จำนวน ราคา"}
break
} else if (args[3] == null) {
replyLineMessage = {"type": "text", "text": "โปรดกรอก ราคา สินค้า ตัวอย่างเช่น !adst ชื่อสินค้า จำนวน ราคา"}
break
} else if (Number.isInteger(parseInt(args[2])) == false || Number.isInteger(parseInt(args[3])) == false) {
replyLineMessage = {"type": "text", "text": "โปรดกรอกข้อมูลให้ถูกต้อง ตัวอย่างเช่น !adst ชื่อสินค้า จำนวน ราคา"}
break
}
// ส่งข้อมูลที่ผู้ใช้ต้องการเพิ่มใหม่ไปเก็บไว้ไฟล์ message.json
confirm = 1;
message.adddata.data1 = args[1];
message.adddata.data2 = args[2];
message.adddata.data3 = args[3];
replyLineMessage = {"type": "text", "text": "ต้องการที่จะเพิ่มข้อมูลใหม่ใช่หรือไม่? (หากมีข้อมูลอยู่แล้วอาจทำให้ซ้ำกับอันเก่าได้)\nโปรดพิม ใช่/Y หรือ ไม่/N เพื่อยืนยัน" }
break
}
case "rmst":
if (getRows.data.values[10] == null){
replyLineMessage = {"type": "text", "text": "ไม่สามารถลบข้อมูลได้ เนื่องจากข้อมูลสินค้าน้อยเกินไป โปรดเพิ่มสิ้นค้าก่อนจะลบครับ"}
break
}
if (args[1] == null){
replyLineMessage = {"type": "text", "text": "โปรดกรอกข้อมูลที่ต้องลบ ตัวอย่างเช่น !rmst ชื่อสินค้า"}
break
}
if (checkitem != true) {
replyLineMessage = {"type": "text", "text": "ไม่พบข้อมูลที่ต้องการจะลบครับ" }
break
}
confirm = 2;
replyLineMessage = {"type": "text", "text": "ต้องการที่จะลบข้อมูลใหม่ใช่หรือไม่? (ข้อมูลที่ถูกลบจะไม่สามารถกู้คืนได้)\nโปรดพิม ใช่/Y หรือ ไม่/N เพื่อยืนยัน" }
break
case "help":
replyLineMessage = message.msg3
break
default:
replyLineMessage = {"type": "text", "text": "ไม่พบคำสั่ง โปรดลองพิม !help เพื่อดูคำสั่งครับ"}
break
}
// ส่งข้อมูลกลับไปยังฟังชั่นหลัก
return client.replyMessage(event.replyToken, replyLineMessage).catch((err) => {console.log(err)});
// พิมหาบอทที่ไม่ใช่ command
} else {
//array คำที่ผู้ใช้งานพิมจะตอบกลับเป็นข้อความแบบสุ่ม
let usermsg = ["มี", "ใช่"]
let replymsgX = ["ต้องการใช้งานบอทหรอครับ? (โปรดพิม ใช่ ถ้าต้องการใช้งานครับ)", "มีอะไรให้ช่วยไหมครับ >_< (โปรดพิม มี ถ้าต้องการใช้งานครับ)"]
let replymsgY = ["โปรดพิม !help ครับ", "พิม !help ดูสิ!", "พิม !help เพื่อดูคำสั่งครับ"]
let replymsgZ = ["อ่าวววว...เหงาหรอครับวัยรุ่น", "...", "ไม่อะไรครับ", "ไม่ต้องพูดดดดด"]
// เช็คคำที่ผู้ใช้งานพิมมา
for (var i=0; i < usermsg.length; i++) {
if (!event.message.text.includes(usermsg[i])) check = false;
}
for (var i=0; i < usermsg.length; i++) {
if (event.message.text.includes(usermsg[i])) check = true;
}
// ยืนยันการเพิ่มสินค้าใหม่
if (confirm == 1) {
if (event.message.text == "ใช่" || event.message.text.toLowerCase() == "y") {
// เพิ่มข้อมูลลงแถวของ GS
await googleSheets.spreadsheets.values.append({auth, spreadsheetId, range: "data1!A:C", valueInputOption: "USER_ENTERED",
resource: {
values: [[`${message.adddata.data1}`, `${parseInt(message.adddata.data2)}`, `${parseInt(message.adddata.data3)}`]]
}
});
confirm = 0;
return client.replyMessage(event.replyToken, {"type": "text", "text": "เพิ่มสินค้าลงในคลังเรียบร้อยแล้วค้าบ >_<"}).catch((err) => {console.log(err)});
} else if (event.message.text == "ไม่" || event.message.text.toLowerCase() == "n") {
confirm = 0;
return client.replyMessage(event.replyToken, {"type": "text", "text": "ยกเลิกการเพิ่มข้อมูลใหม่เรียบร้อยแล้ว!"}).catch((err) => {console.log(err)});
}
// ยืนยันการลบข้อมูล
} else if (confirm == 2){
if (event.message.text == "ใช่" || event.message.text.toLowerCase() == "y") {
let resource = {
"requests": [{"deleteDimension": {"range": {"sheetId": "0", "dimension": "ROWS", "startIndex": sheet, "endIndex": sheet+1}}}]
}
await googleSheets.spreadsheets.batchUpdate({auth: auth,spreadsheetId: spreadsheetId, resource: resource});
confirm = 0;
return client.replyMessage(event.replyToken, {"type": "text", "text": "ลบข้อมูลสินค้าในคลังเรียบร้อยแล้วค้าบ >_<"}).catch((err) => {console.log(err)});
} else if (event.message.text == "ไม่" || event.message.text.toLowerCase() == "n") {
confirm = 0;
return client.replyMessage(event.replyToken, {"type": "text", "text": "ยกเลิกการลบข้อมูลเรียบร้อยแล้ว!"}).catch((err) => {console.log(err)});
}
}
// ถ้าผู้ใช้พิมคำอะไรไม่รู้มาแล้วให้ตอบกลับเป็นการเข้าถึง Command
if (check == false) {
switch (event.message.text) {
case "สีเหลือง" :
replyLineMessage = {"type": "text", "text": "Yellow!"};
break
case "มะม่วง" :
replyLineMessage = {"type": "text", "text": "Mango!"};
break
case "ห้ะ" :
replyLineMessage = {"type": "text", "text": "ห้ะ!"};
break
case "ไม่" :
replyLineMessage = {"type": "text", "text": replymsgZ[Math.floor(Math.random()*replymsgZ.length)] };
break
default :
replyLineMessage = {"type": "text", "text": replymsgX[Math.floor(Math.random()*replymsgX.length)] };
break
}
} else replyLineMessage = {"type": "text", "text": replymsgY[Math.floor(Math.random()*replymsgY.length)] };
return client.replyMessage(event.replyToken, replyLineMessage).catch((err) => {console.log(err)});
}
}
//รันบน localhost
// app.listen(4000, () => {
// console.log(`listening on 4000`);
// });
// รันบน server
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(PORT);
console.log(`listening on Port ${PORT}`);
});