119 lines
2.9 KiB
TypeScript
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
|
|
}
|