-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbot.js
173 lines (143 loc) · 5.23 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
var Botkit = require('botkit');
var os = require('os');
var moment = require('moment');
var util = require('util');
var scraper = require('./scraper.js');
var cron = require('cron');
var DATE_FORMAT = 'YYYY-MM-DD';
var INVAL_MESSAGE_RESP = ":confused: 무슨 말인지 모르겠어요. *!밥 도움말* 을 확인하세요.";
var EMPTY_MENU_RESP = ":disappointed: %s %s에 %s 식당은 운영하지 않아요.";
var MENU_FORMAT = ":rice: *%s* *%s* 식당 *%s* 식단:\n>>>%s"
var NOTI_FORMAT = ":clock11: %s 식사 시간 입니다. %s"
var HURRY = ["지금 가면 자리 많아요.", "밥 먹고 일해요.", "얼른 가야 줄 안 서요."]
var DEFAULT_NOTI_CRON = "00 20 11 * * 1-5"
var MAX_WORDS_IN_MSG = 3;
var defaultCafeName = '교수회관';
if (!process.env.token) {
console.log('Error: Specify token in environment');
process.exit(1);
}
var controller = Botkit.slackbot();
var bot = controller.spawn({
token: process.env.token
}).startRTM();
var cafeNameToCode = {
'북측': 'north',
'서측': 'west',
'동측': 'east1',
'동측2': 'east2',
'교수회관': 'faculty',
'문지': 'munji',
'화암': 'hwaam'
};
var mealToId = {
'아침': 0,
'점심': 1,
'저녁': 2
};
var dateKeyToDiff = {
'어제': -1,
'오늘': 0,
'내일': 1
};
var HELP_CMD = '도움말';
var HELP_MESSAGE = '사용법: *!밥 [날짜] [식당] [식사시간]* (순서는 상관 없음)\n' +
'>>>날짜: *어제, 오늘, 내일* 혹은 *YYYY-MM-DD* 형식의 날짜 (기본: 오늘)\n' +
'식당: *북측, 서측, 동측, 동측2, 교수회관, 문지, 화암* (기본: 교수회관)\n' +
'시간: *아침, 점심, 저녁* (기본: < 10시 - 아침, < 2시 - 점심, > 2시 저녁)\n';
var isValidDate = function(string) {
return moment(string, DATE_FORMAT, true).isValid();
};
var getDefaultMealName = function() {
var h = moment().hour();
return h < 10 ? '아침' : (h < 14 ? '점심' : '저녁');
};
var messageHandler = function(bot, message) {
var cafeName = defaultCafeName;
var mealName = getDefaultMealName();
var date = moment().format(DATE_FORMAT);
var cafeCode = cafeNameToCode[defaultCafeName];
var mealId = mealToId[mealName];
var validityCheckArr = Array(MAX_WORDS_IN_MSG);
var valid = true;
var i;
var msgArr = message.match.length > 1 ? message.match[1].split(' ') : [];
if (msgArr.length == 1 && msgArr[0] === HELP_CMD) {
bot.reply(message, HELP_MESSAGE);
return;
}
if (msgArr.length > MAX_WORDS_IN_MSG) {
bot.reply(message, INVAL_MESSAGE_RESP);
return;
}
for (i = 0; i < msgArr.length; ++i) {
word = msgArr[i];
if (word in cafeNameToCode) {
cafeCode = cafeNameToCode[word];
cafeName = word;
validityCheckArr[0] += 1;
} else if (word in mealToId) {
mealId = mealToId[word];
mealName = word;
validityCheckArr[1] += 1;
} else if (word in dateKeyToDiff) {
date = moment().add(dateKeyToDiff[word], 'days')
.format(DATE_FORMAT);
validityCheckArr[2] += 1;
} else if (isValidDate(word)) {
date = word;
validityCheckArr[2] += 1;
} else {
valid = false;
}
}
for (i = 0; i < validityCheckArr.length; ++i) {
if (validityCheckArr[i] > 1) {
valid = false;
break;
}
}
if (!valid) {
bot.reply(message, INVAL_MESSAGE_RESP);
return;
}
scraper.scrapeMenu(cafeCode, date, mealId, function(result) {
bot.reply(message, result == '' ?
util.format(EMPTY_MENU_RESP, date, mealName, cafeName) :
util.format(MENU_FORMAT, date, cafeName, mealName, result));
});
};
var randomPick = function(arr) {
return arr[Math.floor(Math.random() * arr.length)];
};
var notificationJob = new cron.CronJob(DEFAULT_NOTI_CRON, function() {
var cafeName = defaultCafeName;
var mealName = getDefaultMealName();
var date = moment().format(DATE_FORMAT);
var cafeCode = cafeNameToCode[defaultCafeName];
var mealId = mealToId[mealName];
var returnOption = function (result, channelId) {
return {
text: util.format(NOTI_FORMAT, mealName, randomPick(HURRY)) + '\n'
+ (result == '' ?
util.format(EMPTY_MENU_RESP, date, mealName, cafeName) :
util.format(MENU_FORMAT, date, cafeName, mealName, result)),
channel: channelId
}
};
bot.api.channels.list({'exclude_archived': 1}, function(err, res) {
scraper.scrapeMenu(cafeCode, date, mealId, function(result) {
for (i = 0; i < res.channels.length; ++i)
bot.say(returnOption(result, res.channels[i].id));
});
});
bot.api.groups.list({'exclude_archived': 1}, function(err, res) {
scraper.scrapeMenu(cafeCode, date, mealId, function(result) {
for (i = 0; i < res.groups.length; ++i)
bot.say(returnOption(result, res.groups[i].id));
});
});
});
controller.hears(['!밥 (.*)', '!밥'], 'direct_message,direct_mention,mention,ambient',
messageHandler);
notificationJob.start();