-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
128 lines (106 loc) · 3.6 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
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
"use strict";
if (process.env.NODE_ENV != "production") require("dotenv").load({ silent: true });
var APP_URL = process.env.APP_URL;
var BOT_TOKEN = process.env.BOT_TOKEN;
var SLACK_WEBHOOK_URL = process.env.SLACK_WEBHOOK_URL;
var CONDUIT_USER = process.env.CONDUIT_USER;
var CONDUIT_CERTIFICATE = process.env.CONDUIT_CERTIFICATE;
var CONDUIT_API_URL = process.env.CONDUIT_API_URL;
var express = require("express");
var urljoin = require("url-join");
var request = require("request");
var cowsay = require("cowsay");
var log = console.log;
var MemeRepository = require("./meme/phabricator/repository");
var VoteRepository = require("./vote/repository");
var Bot = require("./slack/bot");
var Conduit = require("./phabricator/conduit");
var PhabricatorNotificator = require("./phabricator/notificator");
var voteRepository = new VoteRepository();
var bot = new Bot(BOT_TOKEN);
var conduit = new Conduit(CONDUIT_USER, CONDUIT_CERTIFICATE, CONDUIT_API_URL);
var phabricatorNotificator = new PhabricatorNotificator(conduit);
var memeRepository = new MemeRepository(conduit);
// Pool upvote
// ex: +sauce
bot.when(/^\+(.+)$/, (message, subject) => {
log("Upvote", subject, message.user);
voteRepository.upVote(subject, message.user);
});
// Pool downvote
// ex: -cry
bot.when(/^\-(.+)$/, (message, subject) => {
log("Downvote", subject, message.user);
voteRepository.downVote(subject, message.user);
});
// Pool leaderboard
// ex: ?cats
bot.when(/^\?(.+)$/, (message, subject) => {
log("Leaderboard for", subject);
voteRepository.votesForSubject(subject).then(votes => {
log(subject, votes.up.length, votes.down.length);
bot.postMessage(subject + " tem " + votes.up.length + " votos a favor e " + votes.down.length + " contra.", message.channel);
}, () => {
log(subject, " not found");
bot.postMessage("Ninguém votou na enquete \"" + subject + "\" ainda...", message.channel);
});
});
// Diff URL
// ex: Could someone review D2015?
bot.when(/\b(D\d+)\b/, (message, diff) => {
log("Generating diff URL for", diff);
bot.postMessage(urljoin(PHABRICATOR_URL, diff), message.channel);
});
// Meme!!11!
// ex: sashakiss
bot.when(/^([^\s]+)$/, (message, meme) => {
memeRepository.findMeme(meme).then(() => {
log("Meme", meme, "in a jorney for the lulz");
bot.postMeme(meme, message.channel);
}, () => {
log("Meme " + meme + " not found");
});
});
var app = express();
// Slack slash command /meme
app.get("/meme", (req, res) => {
memeRepository.listMemes().then(memes => {
res.writeHead(200, { "Content-Type": "text/plain" });
res.write(memes.join("\n")).end();
});
});
// Slack slash command /cowsay
app.get("/cowsay", (req, res) => {
request({
uri: SLACK_WEBHOOK_URL,
method: "POST",
json: {
text: "```\n" + cowsay.say({ text: req.query.text }) + "\n```",
channel: "#" + req.query.channel_name,
username: "cow",
icon_emoji: ":cow:"
}
});
res.status(204).end();
});
var memePath = "/meme/:name";
app.get(memePath, (req, res) => {
memeRepository.findMeme(req.params.name).then(meme => {
meme.getImage().pipe(res);
}, () => {
res.status(404).end();
});
});
// Let's teach the bot how to retrieve a meme
bot.memeUrl = function(meme) {
return urljoin(APP_URL, memePath).replace(":name", meme);
}
phabricatorNotificator.feed().subscribe(function(diffUpdate) {
console.log("Diff:", diffUpdate.diff.title);
bot.postDiff(diffUpdate);
});
var server = app.listen(process.env.PORT || 3000, () => {
log("Server listening port", server.address().port);
log("Time to wake up the engines")
bot.start(name => log("Bot " + name + " up and running"));
});