import * as line from "@line/bot-sdk"; import dateFormat from "dateformat"; import express from "express"; import fs from "fs"; import { IncomingMessage, ServerResponse } from "http"; import https from "https"; import MemberJoinedClass from "./MemberJoinedClass"; import MessageClass from "./MessageClass"; /** * LineBot */ export default class LineBotClass { //#region private private bot: line.Client = null; private message: MessageClass; private memberJoined: MemberJoinedClass; //#endregion //#region Lifecycle /** * */ constructor() { //讀取憑證及金鑰 const prikey: string = fs.readFileSync("/certificate/RSA-privkey.pem", "utf8"); const cert: string = fs.readFileSync("/certificate/RSA-cert.pem", "utf8"); const cafile: string = fs.readFileSync("/certificate/RSA-chain.pem", "utf-8"); //建立憑證及金鑰 const credentials: Object = { key: prikey, cert: cert, ca: cafile }; // 用於辨識Line Channel的資訊 const config: any = { channelSecret: process.env.channelSecret, channelAccessToken: process.env.channelAccessToken || "" }; this.bot = new line.Client(config); this.message = new MessageClass(this.bot); this.memberJoined = new MemberJoinedClass(this.bot); // const ZhuHanbot: linebot.Client = new linebot.Client({ // channelSecret: process.env.ZhuHanchannelSecret, // channelAccessToken: process.env.ZhuHanchannelAccessToken || "" // }); // Bot所監聽的webhook路徑與port const path: string = process.env.URLPATH || "/"; const port: number = +process.env.PORT || 3000; // tslint:disable-next-line:typedef const app = express(); const httpsServer: https.Server = https.createServer(credentials, app); app.post(path, line.middleware(config), (req, res) => { Promise .all(req.body.events.map(this.handleEvent.bind(this))) .then((result) => res.json(result)); }); httpsServer.listen(port, () => { let datetime: string = dateFormat(new Date(), "yyyy-mm-dd HH:MM:ss"); console.log(`${datetime} listening on ${port}`); console.log(`${datetime} [BOT已準備就緒]`); }); } //#endregion //#region Custom private async handleEvent(event: any): Promise { switch (event.type) { case "message": { this.message.Message(event); break; } case "postback": { // self.Postback.Postback(event); return Promise.resolve(null); } case "join": case "leave": case "follow": case "unfollow": case "memberJoin": { this.memberJoined.MemberJoined(event); break; } case "memberLeave": case "accountLink": case "fallback": default: { return Promise.resolve(null); } } // if (event.type !== "message" || event.message.type !== "text") { // return Promise.resolve(null); // } // return this.bot.replyMessage(event.replyToken, { // type: "text", // text: event.message.text // }); } //#endregion }