"use strict"; const line = require("@line/bot-sdk"); const express = require("express"); const config = require("./config.json"); const bodyParser = require("body-parser"); const axios = require("axios"); const fs = require("fs"); const request = require("request"); const moment = require("moment"); const flexMsg = require("./flexMsg"); const ContentService = require("./services/ContentService"); const LineService = require("./services/LineService"); // create LINE SDK client const client = new line.Client(config); const app = express(); const configLine = [ { lineOA_name: "น้องปุ้ย OA", webhook: "/webhook1", lineOA: { channelAccessToken: "be/XHjQ+gMoypZE78Us7hk0h6PA04TyfpQciMOq+B/OVPmumozdhGzYUwopDgsOMCM7RymTK8m++q20GSj3c6B7gZkgEmuGYEYPvc6j+4as6X5bu7tEg+KAZKMfBVDnk+ekpAorC7FMwVPyt2frGRQdB04t89/1O/w1cDnyilFU=", channelSecret: "df6ab26f85f5130ebf5b546f3a5a4b7f", }, }, { lineOA_name: "ปุ้ย OA2", webhook: "/webhook2", lineOA: { channelAccessToken: "NYy1k9OM7e/T7PgabnjafdqcxbRc58m7/K4A3kuNCVkoPxhBoZ/Jvg9gaarsqySG2BtvsoQcVgE4yulPaT1WJ7qTUyBaqegae+r8uh0oWrZO93zXIUILn3bOGUFtLmVFcTuBfRKgFHCaJhi1+wFQ6QdB04t89/1O/w1cDnyilFU=", channelSecret: "58690bf9c646cb2535894e07c387c0aa", }, }, { lineOA_name: "น้องปุ้ย OA3", lineOA: { channelAccessToken: "4GuNsc3jKQuohzyD81dWtHu2CB3Lay1WJjfS8ZRvODbTmnK0W9U5Elra2JEFbHeHp+X58qfXlEAMbHLlI9ACklppS06qp3Kd8/y6SyYrQVsyIozyG8Taj/OZtvPrlz9I1NoSnTxRh+4iuntIB9792QdB04t89/1O/w1cDnyilFU=", channelSecret: "44332b03dee7c5631c7954b2e5e64f84", }, webhook: "/webhook3", }, ]; for (let cl of configLine) { app.post(cl.webhook,line.middleware(cl.lineOA), (req, res) => { const clientx = new line.Client(cl.lineOA); if (!Array.isArray(req.body.events)) { return res.status(500).end(); } console.log('to lineOA :',cl.lineOA_name); console.log('-------------------------------') console.log("req.body.events !", req.body.events); Promise.all( req.body.events.map((event) => { console.log("event", event); // check verify webhook event if ( event.replyToken === "00000000000000000000000000000000" || event.replyToken === "ffffffffffffffffffffffffffffffff" ) { return; } return replyHookBasic(event,clientx); }) ) .then(() => res.end()) .catch((err) => { console.error(err); res.status(500).end(); }); }); } // webhook callback let debugMode = false; app.use("/webhook", line.middleware(config)); app.post("/webhook", (req, res) => { // req.body.events should be an array of events if (!Array.isArray(req.body.events)) { return res.status(500).end(); } console.log("req.body.events !", req.body.events); // handle events separately Promise.all( req.body.events.map((event) => { console.log("event", event); // check verify webhook event if ( event.replyToken === "00000000000000000000000000000000" || event.replyToken === "ffffffffffffffffffffffffffffffff" ) { return; } return handleEvent(event); }) ) .then(() => res.end()) .catch((err) => { console.error(err); res.status(500).end(); }); }); const handleEvent = (event) => { let payload = { type: "text", text: "Hello From PUI", }; if (event.type == "message" && event.message.type == "text") { let selecttext = String(event.message.text).toLowerCase(); let get_text = ContentService.mockText()[selecttext]; if (get_text) { payload = get_text; } console.log("event.message.text ::", event.message.text); if (event.message.text == "แจ้งซ่อม") { const user_id = event.source.userId; let sendNotiData = { body: `ทำรายการแจ้งซ่อม`, title: "SmartRMS For Condo", }; let messx = { type: "flex", altText: "GenContentFlex!0", contents: { type: "bubble", body: { type: "box", layout: "vertical", spacing: "sm", contents: [ { type: "text", text: sendNotiData.body, weight: "bold", size: "xl", wrap: true, contents: [], }, { type: "box", layout: "baseline", contents: [ { type: "text", text: sendNotiData.title, weight: "bold", size: "xl", flex: 0, wrap: true, contents: [], }, ], }, ], }, footer: { type: "box", layout: "vertical", spacing: "sm", contents: [ { type: "button", action: { type: "uri", label: "ไปแจ้งซ่อมได้ที่นี่", uri: `http://localhost:4200/fix-alert/${user_id}`, }, style: "primary", }, ], }, }, }; payload = messx; } } else { payload.text = "Other Message =>>>" + JSON.stringify(event); } console.log("SEND TO ==> " + JSON.stringify(payload)); return client.replyMessage(event.replyToken, payload); }; app.use(bodyParser.json()); app.get("/", (req, res) => { res.json({ line: "ok" }); }); app.post("/push", (req, res) => { let body = req.body; let { user_id, message } = body; console.log("push =>> body ::", body); if (!message) { message = { type: "text", text: `Push Message! to ${user_id}`, }; } client.pushMessage(user_id, message); res.json(message); }); app.post("/multicast", (req, res) => { let body = req.body; let { user_ids } = body; console.log("body ::", body); let message = [ { type: "text", text: `use multicast Message1! to ${JSON.stringify(user_ids)}`, }, { type: "text", text: `use multicast Message2! to ${JSON.stringify(user_ids)}`, }, ]; client.multicast(user_ids, message); res.json(message); }); app.post("/multicast", (req, res) => { let body = req.body; let { user_ids } = body; console.log("body ::", body); let message = [ { type: "text", text: `use multicast Message1! to ${JSON.stringify(user_ids)}`, }, { type: "text", text: `use multicast Message2! to ${JSON.stringify(user_ids)}`, }, ]; client.multicast(user_ids, message); res.json(message); }); app.post("/broadcast", async (req, res) => { let body = req.body; let { messages } = body; console.log("body ::", body); let resx = await LineService.Message.Broadcast(messages); console.log("resx.data", resx.data); res.json({ message: "OK" }); }); app.post("/save", bodyParser.json(), async (req, res) => { console.log("saveFile!"); try { const downloadFile = function (uri, filename, callback) { request.head(uri, function (err, res, body) { console.log("content-type:", res.headers["content-type"]); console.log("content-length:", res.headers["content-length"]); console.log("Content-Type:", res.headers["Content-Type"]); console.log("res.headers ::", res.headers); request(uri, { headers: { Authorization: "Bearer be/XHjQ+gMoypZE78Us7hk0h6PA04TyfpQciMOq+B/OVPmumozdhGzYUwopDgsOMCM7RymTK8m++q20GSj3c6B7gZkgEmuGYEYPvc6j+4as6X5bu7tEg+KAZKMfBVDnk+ekpAorC7FMwVPyt2frGRQdB04t89/1O/w1cDnyilFU=", }, }) .pipe(fs.createWriteStream(filename)) .on("close", callback); }); }; let unquie_file = moment().format("YYYY-MM-DD_HHmmssss"); let file_name = `filesave_${unquie_file}`; let message_id = req.body.message_id; let URI = `https://api-data.line.me/v2/bot/message/${message_id}/content`; console.log("message_id ::", message_id); console.log("file_name ::", file_name); axios .get(URI, { headers: { Authorization: "Bearer be/XHjQ+gMoypZE78Us7hk0h6PA04TyfpQciMOq+B/OVPmumozdhGzYUwopDgsOMCM7RymTK8m++q20GSj3c6B7gZkgEmuGYEYPvc6j+4as6X5bu7tEg+KAZKMfBVDnk+ekpAorC7FMwVPyt2frGRQdB04t89/1O/w1cDnyilFU=", }, }) .then(function (response) { // handle success console.log("axios =>>", response.headers["content-type"]); let sp = response.headers["content-type"].split("/"); let type = sp[sp.length - 1]; let full_file_name = file_name + "." + type; console.log("full_file_name =", full_file_name); downloadFile(URI, full_file_name, function () { console.log("done!"); res.json({ LoadFlieName: "Success" }); }); }) .catch(function (error) { // handle error console.log(error); console.error("errorxx ::", error); res.json({ error: "error" }); }); } catch (error) { console.error("errorxx ::", error); } }); const port = config.port; app.listen(port, () => { console.log(`listening on ${port}`); });