index dynamic.js 9.24 KB
"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}`);
});