forked from okajax/Botkit-template-for-heroku
-
Notifications
You must be signed in to change notification settings - Fork 0
/
bot.js
308 lines (234 loc) · 10.1 KB
/
bot.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Botkit Basic Template for Heroku
Author: okajax (https://github.com/okajax)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//=========================================================
// Botの準備
//=========================================================
if (!process.env.token) {
console.log('Error: Specify token in environment');
process.exit(1);
}
var Botkit = require('botkit');
var os = require('os');
var fs = require('fs');
var csv = require('csv');
var filename = 'restaurant_data.csv';
var controller = Botkit.slackbot({
debug: true,
});
var bot = controller.spawn({
token: process.env.token
}).startRTM();
//=========================================================
// 基本的な受け答え
//=========================================================
// 以下がBotkitの基本形です。
// controller.hears()で、マッチした単語に応じて処理を実行します。
// 第一引数 ['ほげ','ふが'] の部分には、マッチさせたい単語を入れます。正規表現も使えます。
// 第二引数 'direct_message,direct_mention' の部分には、反応するパターンを入れます。
// [反応パターン一覧]
// direct_message: ダイレクトメッセージに反応します
// direct_mention: 先頭に@付きで発言されたメッセージに反応します
// mention: @付きで言及されたメッセージに反応します
// ambient: どんなメッセージタイプにも反応します
controller.hears(['挨拶', 'こんにちは', 'Bot', 'あなた', '誰', 'だれ', '自己紹介'], 'direct_message,direct_mention,mention', function (bot, message) {
// bot.reply()で、botに発言をさせます。
bot.reply(message, 'こんにちは!私は *Botkit製のBot* です! \n _いろんな事ができますよ!_ :smiley:');
});
//=========================================================
// 質問形式の会話
//=========================================================
controller.hears(['shashoku-shout'], 'direct_message,direct_mention,mention', function (bot, message) {
var shoutList = [
'サァバー・ナカオチー!!!',
'ナンメェー?',
'チュウモンドウゾー!!!',
'ヘァアアアァァイ!アジフラーーイ!!!!!',
'キテナイノアタライッテクダサーイ!!!',
'ども、ども、ありがとうございます!!!!',
'ハァァァイ!!!!',
'マグロフラーイ!!!!!!',
'イッピンハー!!????',
'ゴハンモテクルカラチョトマテクダサイ!!!',
'サバ・中落ちで! → サンマ・メゴチーーー!!!!',
'スグカタヅケルカラモウチョットマッテネ!!!!!'
];
var shoutSeed = Math.floor(Math.random() * shoutList.length);
bot.reply(message, shoutList[shoutSeed]);
});
controller.hears(['shashoku'], 'direct_message,direct_mention,mention', function (bot, message) {
bot.reply(message, '今日の社食で何食べるか決めるね!:star:');
var menu = {
'main': [
{
'type': 'grilled-fish',
'name': 'さば塩焼き'
},
{
'type': 'grilled-fish',
'name': 'さんま塩焼き'
},
{
'type': 'raw-fish',
'name': 'まぐろぶつ'
},
{
'type': 'raw-fish',
'name': '中おち'
},
{
'type': 'raw-fish',
'name': 'はまち刺'
},
{
'type': 'fried-fish',
'name': '日替わりフライ'
},
{
'type': 'fried-fish',
'name': 'あじフライ'
},
{
'type': 'fried-fish',
'name': 'キスフライ'
},
{
'type': 'fried-fish',
'name': 'イカフライ'
},
{
'type': 'fried-fish',
'name': 'えびフライ'
},
{
'type': 'others',
'name': '串カツ'
},
{
'type': 'others',
'name': 'ハムカツ'
},
{
'type': 'others',
'name': 'メンチカツ'
},
{
'type': 'others',
'name': 'ハンバーグ'
},
{
'type': 'others',
'name': '揚げシュウマイ'
}
],
'sub': [
'五目ひじき',
'切干大根煮',
'焼のり・生玉子',
'焼のり・梅干',
'生玉子・梅干',
'ポテトサラダ',
'しらすおろし',
'明太子',
'とろろ',
'めかぶ',
'納豆',
'冷奴'
]
};
var main_seed1 = Math.floor(Math.random() * menu.main.length);
var main_seed2 = Math.floor(Math.random() * menu.main.length);
for (var i = 0; i < 10; i++) {
if (main_seed1 !== main_seed2) {
break;
}
main_seed2 = Math.floor(Math.random() * menu.main.length);
}
var main_seed = Math.floor(Math.random() * menu.sub.length);
bot.reply(message,
'今日は、 ' +
menu.main[main_seed1]['name'] +
' 、' +
menu.main[main_seed2]['name'] +
' 、 ' +
menu.sub[main_seed] +
' で注文してみるのはどう?'
);
});
controller.hears(['random'], 'direct_message,direct_mention,mention', function (bot, message) {
bot.reply(message, '今日のランチを適当に決めるけどいい?:grin:');
var parser = csv.parse({trim: true});
var list = [];
parser.on('readable', function() {
var data;
while (data = parser.read()) {
list.push(data);
}
});
parser.on('end', function () {
var seed = Math.floor(Math.random() * list.length);
bot.reply(message, '今日は、 ' + list[seed][0] + ' どう? ( ' + list[seed][2] + ' )');
});
fs.createReadStream(filename).pipe(parser);
});
//=========================================================
// 名前を覚える(データを保存する)
//=========================================================
// Botが、シャットダウン/再起動するまでの間、データを保持する事ができます。
// 保存、取得、削除、すべて削除 の4つの操作ができます。
// [例]
// controller.storage.users.save({id: message.user, foo:'bar'}, function(err) { ... });
// controller.storage.users.get(id, function(err, user_data) {...});
// controller.storage.users.delete(id, function(err) {...});
// controller.storage.users.all(function(err, all_user_data) {...});
// Botkitは、「ユーザー」「チャンネル」「チーム」ごとにデータを保持できます。
// それぞれ、下記のように呼び出せます。
// [例]
// controller.storage.users.***
// controller.storage.channels.***
// controller.storage.teams.***
controller.hears(['(.*)って呼んで'], 'direct_message,direct_mention,mention', function (bot, message) {
// 「◯◯って呼んで」の、◯◯の部分を取り出します。
// message.match[1] には、hearsの正規表現にマッチした単語が入っています。
var name_from_msg = message.match[1];
// まず、controller.storage.users.getで、ユーザーデータを取得します。
// message.userには、ユーザーIDが入っています。
// ユーザーデータは、ユーザーIDと紐付けていますので、第一引数には、必ずmessage.userを入れます。
controller.storage.users.get(message.user, function (err, user_info) {
// ▼ データ取得後の処理 ▼
// ユーザーデータが存在しているかどうか調べる
// ※第二引数で指定した変数(ここでは'user_info')に、ユーザーデータが入っています。
if (!user_info) {
// ▼ ユーザーデータがなかった場合の処理 ▼
// ユーザーidとユーザー名 のオブジェクトを、user_infoとして作成します。
user_info = {
id: message.user,
name: name_from_msg
};
}
// user_infoを保存します。
controller.storage.users.save(user_info, function (err, id) {
// ▼ 保存完了後の処理▼
bot.reply(message, 'あなたのお名前は *' + user_info.name + '* さんですね!覚えました!');
});
});
});
//=========================================================
// どれにも当てはまらなかった場合の返答
//=========================================================
// controller.hears()には優先順位があり、上のものから優先にマッチします。
// すべてにマッチするhears()を、一番最後に記述すれば、
// 「当てはまらなかった場合の返答」を作成できます。
controller.hears(['(.*)'], 'direct_message,direct_mention,mention', function (bot, message) {
// ユーザーデータを取得
controller.storage.users.get(message.user, function (err, user_info) {
if (user_info && user_info.name) {
// ▼ ユーザーデータが保存されていたときの処理 ▼
bot.reply(message, 'こんにちは *' + user_info.name + '* さん! :grin:');
} else {
// ▼ ユーザーデータが保存されていなかった場合の処理 ▼
bot.reply(message, 'はじめまして!\n`「◯◯って呼んで」`って話しかけると、名前を覚えますよ!');
}
});
});