line-bot-ts/src/LineBotClass.ts

119 lines
2.9 KiB
TypeScript

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<typeof IncomingMessage, typeof ServerResponse> = 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<any> {
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
}