diff options
| author | syuilo <syuilotan@yahoo.co.jp> | 2017-10-07 18:30:04 +0900 |
|---|---|---|
| committer | syuilo <syuilotan@yahoo.co.jp> | 2017-10-07 18:30:04 +0900 |
| commit | 96b6ef4d9ba73dc04eb601ffedee52d6b6ab580a (patch) | |
| tree | 0f5f53fb09c68c7988c9f33380880affdfb5b833 /src/api/bot/interfaces | |
| parent | Refactor (diff) | |
| download | sharkey-96b6ef4d9ba73dc04eb601ffedee52d6b6ab580a.tar.gz sharkey-96b6ef4d9ba73dc04eb601ffedee52d6b6ab580a.tar.bz2 sharkey-96b6ef4d9ba73dc04eb601ffedee52d6b6ab580a.zip | |
:v:
Diffstat (limited to 'src/api/bot/interfaces')
| -rw-r--r-- | src/api/bot/interfaces/line.ts | 105 |
1 files changed, 74 insertions, 31 deletions
diff --git a/src/api/bot/interfaces/line.ts b/src/api/bot/interfaces/line.ts index 437f29cb3c..03dc2a85ba 100644 --- a/src/api/bot/interfaces/line.ts +++ b/src/api/bot/interfaces/line.ts @@ -10,20 +10,83 @@ import prominence = require('prominence'); const redis = prominence(_redis); +class LineBot extends BotCore { + private replyToken: string; + + private reply(messages: any[]) { + request.post({ + url: 'https://api.line.me/v2/bot/message/reply', + headers: { + 'Authorization': `Bearer ${config.line_bot.channel_access_token}` + }, + json: { + replyToken: this.replyToken, + messages: messages + } + }, (err, res, body) => { + if (err) { + console.error(err); + return; + } + }); + } + + public async react(ev: any): Promise<void> { + // テキスト以外(スタンプなど)は無視 + if (ev.message.type !== 'text') return; + + const res = await this.q(ev.message.text); + + if (res == null) return; + + // 返信 + this.reply([{ + type: 'text', + text: res + }]); + } + + public static import(data) { + const bot = new LineBot(); + bot._import(data); + return bot; + } + + public async showUserCommand(q: string) { + const user = await require('../endpoints/users/show')({ + username: q.substr(1) + }, this.user); + + this.reply([{ + type: 'template', + altText: await super.showUserCommand(q), + template: { + type: 'buttons', + thumbnailImageUrl: `${user.avatar_url}?thumbnail&size=1024`, + title: `${user.name} (@${user.username})`, + text: user.description || '(no description)', + actions: [{ + type: 'uri', + label: 'Webで見る', + uri: `${config.url}/${user.username}` + }] + } + }]); + } +} + module.exports = async (app: express.Application) => { if (config.line_bot == null) return; const handler = new EventEmitter(); handler.on('message', async (ev) => { - // テキスト以外(スタンプなど)は無視 - if (ev.message.type !== 'text') return; const sourceId = ev.source.userId; const sessionId = `line-bot-sessions:${sourceId}`; const _session = await redis.get(sessionId); - let session: BotCore; + let bot: LineBot; if (_session == null) { const user = await User.findOne({ @@ -32,9 +95,9 @@ module.exports = async (app: express.Application) => { } }); - session = new BotCore(user); + bot = new LineBot(user); - session.on('signin', user => { + bot.on('signin', user => { User.update(user._id, { $set: { line: { @@ -44,7 +107,7 @@ module.exports = async (app: express.Application) => { }); }); - session.on('signout', user => { + bot.on('signout', user => { User.update(user._id, { $set: { line: { @@ -54,36 +117,16 @@ module.exports = async (app: express.Application) => { }); }); - redis.set(sessionId, JSON.stringify(session.export())); + redis.set(sessionId, JSON.stringify(bot.export())); } else { - session = BotCore.import(JSON.parse(_session)); + bot = LineBot.import(JSON.parse(_session)); } - session.on('updated', () => { - redis.set(sessionId, JSON.stringify(session.export())); + bot.on('updated', () => { + redis.set(sessionId, JSON.stringify(bot.export())); }); - const res = await session.q(ev.message.text); - - // 返信 - request.post({ - url: 'https://api.line.me/v2/bot/message/reply', - headers: { - 'Authorization': `Bearer ${config.line_bot.channel_access_token}` - }, - json: { - replyToken: ev.replyToken, - messages: [{ - type: 'text', - text: res - }] - } - }, (err, res, body) => { - if (err) { - console.error(err); - return; - } - }); + bot.react(ev); }); app.post('/hooks/line', (req, res, next) => { |