Add bot funcitonality and problems
This commit is contained in:
parent
2f3c67b5f6
commit
036e46378b
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
node_modules/
|
||||||
|
data/
|
93
np-bot.js
Normal file
93
np-bot.js
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
var Botkit = require('botkit');
|
||||||
|
var controller = Botkit.slackbot({
|
||||||
|
json_file_store: process.argv[3]
|
||||||
|
});
|
||||||
|
var bot = controller.spawn({
|
||||||
|
token: process.argv[2]
|
||||||
|
})
|
||||||
|
var problems = [
|
||||||
|
{"title": "Travelling salesman problem", "wiki_title": "Travelling_salesman_problem"},
|
||||||
|
{"title": "Knapsack problem", "wiki_title": "Knapsack_problem"},
|
||||||
|
{"title": "Bin packing problem", "wiki_title": "Bin_packing_problem"},
|
||||||
|
{"title": "Partition problem", "wiki_title": "Parition_problem"},
|
||||||
|
{"title": "Longest path problem", "wiki_title": "Longest_path_problem"},
|
||||||
|
{"title": "Longest common subsequence problem"},
|
||||||
|
{"title": "Art gallery problem"},
|
||||||
|
{"title": "Route inspection problem"},
|
||||||
|
{"title": "Open-shop scheduling problem"},
|
||||||
|
{"title": "Calculated minimum spanning tree"}
|
||||||
|
]
|
||||||
|
|
||||||
|
var last_index = -1;
|
||||||
|
|
||||||
|
|
||||||
|
bot.startRTM(function(err,bot,payload) {
|
||||||
|
if (err) {
|
||||||
|
throw new Error('Could not connect to Slack');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function createData(id) {
|
||||||
|
return {id: id, bot_calls: 0};
|
||||||
|
};
|
||||||
|
|
||||||
|
function incrementKey(id, key, amount, scope) {
|
||||||
|
controller.storage[scope].get(id, function(err,data) {
|
||||||
|
if (!data) {
|
||||||
|
console.log("Initializing " + scope + " data");
|
||||||
|
data = createData(id);
|
||||||
|
}
|
||||||
|
console.log("Current " + scope + " data:",data);
|
||||||
|
console.log("Incrementing mentions to " + (data[key] + amount));
|
||||||
|
data[key] = data[key] + amount
|
||||||
|
controller.storage[scope].save(data);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
controller.hears(["np"],["direct_message","direct_mention","mention","ambient"],function(bot,message) {
|
||||||
|
console.log(message.user + " mentioned \"np\"");
|
||||||
|
|
||||||
|
// Increment the logged amount of mentions
|
||||||
|
incrementKey(message.user, "bot_calls", 1, "users");
|
||||||
|
incrementKey(message.channel, "bot_calls", 1, "channels");
|
||||||
|
incrementKey(message.team, "bot_calls", 1, "teams");
|
||||||
|
|
||||||
|
// Decide what to do
|
||||||
|
if (Math.random() < 0.9) {
|
||||||
|
var index = Math.floor(Math.random() * problems.length);
|
||||||
|
var base_url = "https://en.wikipedia.org/wiki/";
|
||||||
|
var problem, title, wiki_title;
|
||||||
|
|
||||||
|
// Ensure that the same problem won't get posted twice
|
||||||
|
while (index == last_index && problems.length > 1) {
|
||||||
|
index = Math.floor(Math.random() * problems.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find the problem metadata
|
||||||
|
problem = problems[index];
|
||||||
|
title = problem.title;
|
||||||
|
wiki_title = title.replace(/ /g,"_");
|
||||||
|
|
||||||
|
// Reply with the chosen problem
|
||||||
|
bot.reply(message,"Have you heard about the _" + title + "_? That is an NP-complete problem!\nSee " + base_url + wiki_title + " for more info!");
|
||||||
|
last_index = index;
|
||||||
|
} else {
|
||||||
|
bot.say(
|
||||||
|
{
|
||||||
|
text: '<@U0NEAMJS3|jonbot>, what do you think about NP-complete problems?',
|
||||||
|
channel: message.channel
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// React with appropriate emoji
|
||||||
|
bot.api.reactions.add({
|
||||||
|
timestamp: message.ts,
|
||||||
|
channel: message.channel,
|
||||||
|
name: "mount_fuji",
|
||||||
|
},function(err, res) {
|
||||||
|
if (err) {
|
||||||
|
bot.botkit.log('Failed to add reaction emoji');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user