-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
64 lines (59 loc) · 1.93 KB
/
index.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
const bodyParser = require('body-parser');
const express = require('express');
const memes = require('./memes');
const path = require('path');
const levenshtein = require('fast-levenshtein');
const PORT = process.env.PORT || 5000;
const S3_PATH = 'https://s3-us-west-2.amazonaws.com/seemslegit';
function memeResponse(res, meme, redirect=false) {
const type = memes[meme];
const url = `${S3_PATH}/${meme}.${type}`;
if (redirect) {
res.redirect(302, url);
} else {
const closest = !type && closestMeme(meme);
const attachment = type ?
{'image_url': url, 'fallback': 'Valid meme, but failed to load. :('} :
{
'text':
'600+ memes, but this one is invalid. Did you mean: ' + closest,
'actions': [{
'type': 'button',
'text': 'View all memes',
'url': 'https://seemslegit.herokuapp.com/list',
}],
};
res.json({
'response_type': 'in_channel',
'attachments': [attachment],
});
}
}
function closestMeme(inputMeme) {
return Object.keys(memes).reduce((memo, meme) => {
const score = levenshtein.get(inputMeme, meme);
if (score < memo.score) {
memo.score = score;
memo.meme = meme;
}
return memo;
}, {score: Infinity, meme: null}).meme;
}
express()
.use(express.static(path.join(__dirname, 'public')))
.use(bodyParser.json())
.use(bodyParser.urlencoded({extended: true}))
.set('views', path.join(__dirname, 'views'))
.set('view engine', 'ejs')
.get('/', (req, res) => res.render('pages/index'))
.get('/list', (req, res) => {
res.render('pages/list', {memes: memes, s3Path: S3_PATH});
})
.get('/meme', (req, res) => {
memeResponse(res, req.query.meme, true);
})
.post('/meme', (req, res) => {
const meme = req.body.meme || req.body.text || req.query.text;
memeResponse(res, meme, !!req.body.meme);
})
.listen(PORT, () => console.log(`Listening on ${ PORT }`));