mirror of
https://github.com/Brandon-Rozek/Rozbot.git
synced 2024-11-21 20:46:28 -05:00
initial commit
This commit is contained in:
commit
bf865d4535
39 changed files with 1056 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
node_modules/
|
55
Rozbot.js
Normal file
55
Rozbot.js
Normal file
|
@ -0,0 +1,55 @@
|
|||
var promise = require('promise-polyfill');
|
||||
var prototypes = require('./lib/helpers/additionalPrototypes.js');
|
||||
var User = require('./User.js');
|
||||
|
||||
module.exports = function() {
|
||||
//Store possible commands
|
||||
this.commandList = [];
|
||||
//Store users
|
||||
this.userList = [];
|
||||
|
||||
//Add commands to the commandList
|
||||
this.extend = function(command) {
|
||||
if (typeof(command) === 'object') {
|
||||
this.commandList.push(command);
|
||||
} else {
|
||||
throw new Error("Extend must take a Command Object");
|
||||
}
|
||||
};
|
||||
|
||||
//Add user to userlist
|
||||
this.addUser = function(username, sendMethod) {
|
||||
var user = new User(username, sendMethod);
|
||||
this.userList.push(user);
|
||||
return user;
|
||||
}
|
||||
//Get's user from userlist by username
|
||||
this.getUser = function(username) {
|
||||
for (var i = 0; i < this.userList.length; i++) {
|
||||
if (this.userList[i].username === username) {
|
||||
return this.userList[i];
|
||||
}
|
||||
}
|
||||
//User not found
|
||||
return null;
|
||||
}
|
||||
|
||||
//Gives Rozbot's response
|
||||
this.respond = function(message, user) {
|
||||
//Store whether or not an app wants to listen to the next message
|
||||
var inAppScope = user.inAppScope
|
||||
//Used to allow apps to get the next message
|
||||
user.listener.emit('message', message);
|
||||
if (!inAppScope) {
|
||||
var args = [message, user.send];
|
||||
//Find the right command to run
|
||||
var command = this.commandList.find(function(cmd) {
|
||||
return cmd.condition(message) === true;
|
||||
});
|
||||
//Run the command using user's contextual data (app by app basis)
|
||||
if (command !== undefined) {
|
||||
command.respond.apply(command, args.concat(user.getData(command.name)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
57
User.js
Normal file
57
User.js
Normal file
|
@ -0,0 +1,57 @@
|
|||
var EventEmitter = require('events');
|
||||
var promise = require('promise-polyfill');
|
||||
module.exports = function(username, sendMethod) {
|
||||
this.username = username;
|
||||
this.data = {};
|
||||
this.inAppScope = false;
|
||||
this.listener = new EventEmitter();
|
||||
this.send = sendMethod;
|
||||
this.getData = function(commandName) {
|
||||
var self = this;
|
||||
//If it doesn't exist, create it
|
||||
if (this.data[commandName] === undefined) {
|
||||
this.data[commandName] = {
|
||||
properties: [],
|
||||
setProperty: function(key, value) {
|
||||
//First make sure it doesn't already exist
|
||||
for (var i = 0; i < this.properties.length; i++) {
|
||||
//If it does then update it
|
||||
if (this.properties[i].key === key) {
|
||||
this.properties[i].value = value;
|
||||
return;
|
||||
}
|
||||
}
|
||||
//If it doesnt exist then add it to the properties array
|
||||
this.properties.push({key: key, value: value});
|
||||
},
|
||||
getProperty: function(key) {
|
||||
for (var i = 0; i < this.properties.length; i++) {
|
||||
if (this.properties[i].key === key) {
|
||||
return this.properties[i].value;
|
||||
}
|
||||
}
|
||||
//Key does not exist
|
||||
return null;
|
||||
},
|
||||
isset: function(key) {
|
||||
return this.getProperty(key) !== null;
|
||||
},
|
||||
prompt: function(question) {
|
||||
question = question || "is reading your next message";
|
||||
//Inform user that the next input goes to the app
|
||||
self.send(commandName + ": " + question);
|
||||
//Make it so that the input doesnt get processed by any other app
|
||||
self.inAppScope = true;
|
||||
return new promise(function(resolve, reject) {
|
||||
self.listener.once('message', function(text) {
|
||||
resolve(text);
|
||||
self.inAppScope = false;
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return this.data[commandName];
|
||||
}
|
||||
}
|
36
example.js
Normal file
36
example.js
Normal file
|
@ -0,0 +1,36 @@
|
|||
var Rozbot = require('./Rozbot.js');
|
||||
var User = require('./User.js');
|
||||
|
||||
var rozbot = new Rozbot();
|
||||
/*
|
||||
Order matters!!
|
||||
-Rozbot checks through all the commands until it hits one that matches
|
||||
*/
|
||||
|
||||
rozbot.extend(require('./lib/commands/onTheRadio.js'));
|
||||
getWeather = require('./lib/commands/getWeather.js');
|
||||
getWeather.setId('188d435fd17dcf22261679cf64e98cd5');
|
||||
rozbot.extend(getWeather);
|
||||
rozbot.extend(require('./lib/commands/grabUpdates.js'));
|
||||
rozbot.extend(require('./lib/commands/grabTweets.js'));
|
||||
rozbot.extend(require('./lib/commands/displayTweet.js'));
|
||||
rozbot.extend(require('./lib/commands/Hangman.js'));
|
||||
rozbot.extend(require('./lib/commands/grabPictures.js'));
|
||||
rozbot.extend(require('./lib/commands/grabWikipedia.js'));
|
||||
rozbot.extend(require('./lib/commands/grabDefinition.js'));
|
||||
rozbot.extend(require('./lib/commands/calculate.js'));
|
||||
rozbot.extend(require('./lib/commands/timer.js'));
|
||||
rozbot.extend(require('./lib/commands/search.js'));
|
||||
//rozbot.extend(require('./lib/commands/naturalSpeech.js'));
|
||||
rozbot.extend(require('./lib/commands/queryDuckDuckGo.js'));
|
||||
|
||||
//rozbot.respond(process.argv[2], rozbot.getUser("Command Line") || rozbot.addUser("Command Line"));
|
||||
rozbot.respond("Let's play hangman!", rozbot.getUser("Command Line") || rozbot.addUser("Command Line", function(msg) {
|
||||
console.log(msg);
|
||||
}));
|
||||
var letters = ["a", "e", "i", "o", "u", "b"]
|
||||
rozbot.respond(letters[0], rozbot.getUser("Command Line"));
|
||||
rozbot.respond(letters[1], rozbot.getUser("Command Line"));
|
||||
rozbot.respond(letters[2], rozbot.getUser("Command Line"));
|
||||
rozbot.respond(letters[3], rozbot.getUser("Command Line"));
|
||||
rozbot.respond(letters[4], rozbot.getUser("Command Line"));
|
8
lib/commands/Command.js
Normal file
8
lib/commands/Command.js
Normal file
|
@ -0,0 +1,8 @@
|
|||
module.exports = function(commandName, condition, commandFunction) {
|
||||
//Name for identification purproses
|
||||
this.name = commandName;
|
||||
//Must be a function which returns a boolean if it believes that the it's the appropriate command for the message
|
||||
this.condition = condition;
|
||||
//The command's core functionality
|
||||
this.respond = commandFunction;
|
||||
}
|
112
lib/commands/Hangman.js
Normal file
112
lib/commands/Hangman.js
Normal file
|
@ -0,0 +1,112 @@
|
|||
var Command = require('./Command.js');
|
||||
var fetch = require('../promise/fetch.js');
|
||||
var cheeriop = require('../promise/cheerio.js');
|
||||
var promise = require('promise-polyfill');
|
||||
var grabTokens = require('../helpers/grabTokens.js');
|
||||
|
||||
var condition = function(text) {
|
||||
var tokens = grabTokens(text);
|
||||
return tokens.contain('play') && tokens.contain('hangman');
|
||||
}
|
||||
module.exports = new Command("Hangman", condition, function(text, send, userData) {
|
||||
var GUESSES_ALLOWED = 7;
|
||||
|
||||
//Lets get a random word!
|
||||
send("I'm thinking of a word...");
|
||||
|
||||
//Grabs headline of random page
|
||||
var grabHeadline = function(html) {
|
||||
return new promise(function(resolve, reject) {
|
||||
cheeriop(html).then(function($) {
|
||||
var response = $('#headword').text().trim()
|
||||
if (response) {
|
||||
resolve(response);
|
||||
} else {
|
||||
reject("");
|
||||
}
|
||||
}).catch(function(error) {
|
||||
console.log(error);
|
||||
reject("");
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
//Recursive guessing letters until person loses or wins
|
||||
var guessLetter = function() {
|
||||
var correctLetters = userData.getProperty("correctLetters");
|
||||
var guessedLetters = userData.getProperty("guessedLetters");
|
||||
var word = userData.getProperty("word");
|
||||
var numOfUniqueLetters = userData.getProperty("numOfUniqueLetters");
|
||||
|
||||
if (correctLetters.length === numOfUniqueLetters) {
|
||||
send("You win!!");
|
||||
return;
|
||||
}
|
||||
if (guessedLetters.length - correctLetters.length > GUESSES_ALLOWED) {
|
||||
send("You lose...");
|
||||
send("The word was " + word);
|
||||
return;
|
||||
}
|
||||
|
||||
return new promise(function(resolve, reject) {
|
||||
userData.prompt("Guess a letter").then(function(letter) {
|
||||
if (letter.length != 1) {
|
||||
send("You can only guess one letter at a time");
|
||||
} else {
|
||||
if (guessedLetters.indexOf(letter) !== -1) {
|
||||
send("You already guessed this letter");
|
||||
} else {
|
||||
if (word.indexOf(letter) !== -1) {
|
||||
send("The letter is in the word!");
|
||||
correctLetters.push(letter);
|
||||
} else {
|
||||
send("The letter is not in the word..");
|
||||
}
|
||||
|
||||
//Push letter to lettersGuessed array and send the part of the word guessed so far.
|
||||
guessedLetters.push(letter);
|
||||
send(revealKnownCharacters(word, correctLetters));
|
||||
}
|
||||
}
|
||||
return;
|
||||
}).then(function() { resolve(guessLetter()) }).catch(function(e) { console.log(e); reject(e); });
|
||||
});
|
||||
}
|
||||
|
||||
//Shows player word with __ and known letters
|
||||
var revealKnownCharacters = function(word, lettersArray) {
|
||||
return word.split('').map(function(item) {
|
||||
return (lettersArray.indexOf(item) !== -1)? item: "_";
|
||||
}).join('');
|
||||
}
|
||||
|
||||
//Counts the number of unique letters in a word
|
||||
var countUniqueLetters = function(word) {
|
||||
var letters = [];
|
||||
for (var i = 0; i < word.length; i++) {
|
||||
if (letters.indexOf(word[i]) === -1) {
|
||||
letters.push(word[i]);
|
||||
}
|
||||
}
|
||||
return letters.length;
|
||||
}
|
||||
|
||||
//Grab a random word from wordnik and start the game
|
||||
fetch("https://wordnik.com/randoml", {rejectUnauthorized: false}).then(function(res) {
|
||||
origin = res.meta.finalUrl;
|
||||
return grabHeadline(res.body.toString());
|
||||
}).then(function(word) {
|
||||
send("The word is " + word.length + " letters long");
|
||||
|
||||
//Setup game variables
|
||||
userData.setProperty("word", word);
|
||||
userData.setProperty("numOfUniqueLetters", countUniqueLetters(word));
|
||||
userData.setProperty("correctLetters", []);
|
||||
userData.setProperty("guessedLetters", []);
|
||||
|
||||
//start
|
||||
guessLetter();
|
||||
}).catch(function(error) {
|
||||
send(error);
|
||||
});
|
||||
});
|
23
lib/commands/calculate.js
Normal file
23
lib/commands/calculate.js
Normal file
|
@ -0,0 +1,23 @@
|
|||
var Command = require('./Command.js');
|
||||
var mathEval = require('../promise/math-eval.js');
|
||||
var grabTokens = require('../helpers/grabTokens.js');
|
||||
|
||||
var condition = function(text) {
|
||||
var tokens = grabTokens(text);
|
||||
return tokens.contain('calculate') || tokens.contain('calc');
|
||||
}
|
||||
module.exports = new Command("Mathjax", condition, function(text, send, userData) {
|
||||
var tokens = grabTokens(text);
|
||||
var query;
|
||||
if (tokens.contain('calculate')) {
|
||||
query = text.from('calculate');
|
||||
} else if (tokens.contain('calc')) {
|
||||
query = text.from('calc');
|
||||
}
|
||||
query = query.removeAll('?');
|
||||
mathEval(query.toString()).then(function(answer) {
|
||||
send(answer);
|
||||
}).catch(function(error) {
|
||||
send("I'm not smart enough to calcuate that yet >.<");
|
||||
});
|
||||
});
|
26
lib/commands/displayTweet.js
Normal file
26
lib/commands/displayTweet.js
Normal file
|
@ -0,0 +1,26 @@
|
|||
var Command = require('./Command.js');
|
||||
var grabURL = require('../helpers/grabURL.js');
|
||||
var parseTwitter = require('../helpers/parseTwitter.js');
|
||||
var grabTokens = require('../helpers/grabTokens.js');
|
||||
|
||||
var condition = function(text) {
|
||||
var tokens = grabTokens(text);
|
||||
return tokens.filter(function(item) {
|
||||
return item.contains("twitter.com") && item.contains("/status/")
|
||||
}).length > 0;
|
||||
}
|
||||
module.exports = new Command("DisplayTweet", condition, function(text, send, userData) {
|
||||
var tokens = grabTokens(text);
|
||||
var status = tokens.filter(function(item) {
|
||||
return item.contains("twitter.com") && item.contains("/status/")
|
||||
});
|
||||
status.forEach(function(item) {
|
||||
grabURL(item + '?').then(function(response) {
|
||||
return parseTwitter(response.body.toString());
|
||||
}).then(function(tweet) {
|
||||
send(tweet);
|
||||
}).catch(function(error) {
|
||||
console.log(error);
|
||||
});
|
||||
});
|
||||
})
|
48
lib/commands/getWeather.js
Normal file
48
lib/commands/getWeather.js
Normal file
|
@ -0,0 +1,48 @@
|
|||
var Command = require('./Command.js');
|
||||
var grabURL = require('../helpers/grabURL.js');
|
||||
var grabTokens = require('../helpers/grabTokens.js');
|
||||
|
||||
var condition = function(text) {
|
||||
var tokens = grabTokens(text);
|
||||
return command.id != '' && tokens.contain('weather');
|
||||
}
|
||||
var command = new Command("Weather", condition, function(text, send, userData) {
|
||||
var tokens = grabTokens(text);
|
||||
var location = tokens.slice(tokens.indexOf('weather') + 1, tokens.length);
|
||||
//Function to get the weather
|
||||
var getWeather = function(loc) {
|
||||
grabURL("http://api.openweathermap.org/data/2.5/weather?q=" + loc.join('+') + "&units=imperial&appid=" + command.id)
|
||||
.then(function(response) { return response.body.toString(); })
|
||||
.then(function(text) { return JSON.parse(text); })
|
||||
.then(function(json) {
|
||||
if (json.cod == 401) {
|
||||
send("Invalid API key set");
|
||||
} else {
|
||||
send(json.weather[0].description + " and the temperature is " + json.main.temp + " degrees Fahrenheit in " + json.name + "\nWeather provided by OpenWeatherMap");
|
||||
}
|
||||
}).catch(function(error) { send(error); });
|
||||
}
|
||||
//Did the person not specify the location and have no location set?
|
||||
if (location.length === 0 && !userData.isset("location")) {
|
||||
userData.prompt("Where do you live?").then(function(loc) {
|
||||
userData.setProperty("location", loc.split(" "));
|
||||
getWeather(loc.split(" "));
|
||||
});
|
||||
}
|
||||
//The person specified the location
|
||||
else if (location.length !== 0) {
|
||||
getWeather(location);
|
||||
}
|
||||
//The person didn't specify but he has a location saved
|
||||
else {
|
||||
getWeather(userData.getProperty("location"));
|
||||
}
|
||||
});
|
||||
|
||||
command.id = '';
|
||||
//Need to call this with a proper id for this command to work
|
||||
command.setId = function(id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
module.exports = command;
|
33
lib/commands/grabDefinition.js
Normal file
33
lib/commands/grabDefinition.js
Normal file
|
@ -0,0 +1,33 @@
|
|||
var Command = require('./Command.js');
|
||||
var fetch = require('../promise/fetch.js');
|
||||
var parseWordnik = require('../helpers/parseWordnik.js');
|
||||
var grabTokens = require('../helpers/grabTokens.js');
|
||||
|
||||
var condition = function(text) {
|
||||
var tokens = grabTokens(text);
|
||||
var query;
|
||||
if (tokens.contain("define") && tokens[tokens.indexOf('define') + 1]) {
|
||||
query = tokens.splice(tokens.indexOf('define') + 1).join("%20");
|
||||
} else if (tokens.contain("definition") && tokens[tokens.indexOf('definition') + 1]) {
|
||||
query = tokens.splice(tokens.indexOf('definition') + 1).join("%20");
|
||||
}
|
||||
return (tokens.contain("define") || tokens.contain("definition")) && query != "";
|
||||
}
|
||||
module.exports = new Command("Dictionary", condition, function(text, send, userData) {
|
||||
var tokens = grabTokens(text);
|
||||
var query = "";
|
||||
if (tokens.contain("define") && tokens[tokens.indexOf('define') + 1]) {
|
||||
query = tokens.splice(tokens.indexOf('define') + 1).join("%20");
|
||||
} else if (tokens.contain("definition") && tokens[tokens.indexOf('definition') + 1]) {
|
||||
query = tokens.splice(tokens.indexOf('definition') + 1).join("%20");
|
||||
}
|
||||
var origin;
|
||||
fetch("https://www.wordnik.com/words/" + query, {rejectUnauthorized: false}).then(function(res) {
|
||||
origin = res.meta.finalUrl;
|
||||
return parseWordnik(res.body.toString());
|
||||
}).then(function(def) {
|
||||
send(def + "\nFor more go to " + origin);
|
||||
}).catch(function(error) {
|
||||
send(error);
|
||||
});
|
||||
})
|
42
lib/commands/grabPictures.js
Normal file
42
lib/commands/grabPictures.js
Normal file
|
@ -0,0 +1,42 @@
|
|||
var Command = require('./Command.js');
|
||||
var grabURL = require('../helpers/grabURL.js');
|
||||
var parsePictures = require('../helpers/parsePictures.js');
|
||||
var grabTokens = require('../helpers/grabTokens.js');
|
||||
|
||||
var condition = function(text) {
|
||||
var tokens = grabTokens(text);
|
||||
return tokens.contain('photo') || tokens.contain('photos') || tokens.superContain('pic') || tokens.superContain('pics');
|
||||
}
|
||||
module.exports = new Command("Pixabay", condition, function(text, send, userData) {
|
||||
var tokens = grabTokens(text);
|
||||
var of = "";
|
||||
var amt = 0;
|
||||
if (tokens.contain("photo")) {
|
||||
of = tokens.slice(tokens.indexOf('photo') + 1).join(' ');
|
||||
amt = 1;
|
||||
} else if (tokens.contain("photos")) {
|
||||
of = tokens.slice(tokens.indexOf('photos') + 1).join(' ');
|
||||
amt = 5;
|
||||
} else if (tokens.superContain("pic")) {
|
||||
//Is the last letter a 's'?
|
||||
if (tokens[tokens.superContainAt('pic')][tokens[tokens.superContainAt('pic')].length - 1] == 's') {
|
||||
amt = 5;
|
||||
} else {
|
||||
amt = 1;
|
||||
}
|
||||
of = tokens.slice(tokens.superContainAt('pic') + 1).join(' ');
|
||||
}
|
||||
var origin;
|
||||
grabURL("https://pixabay.com/en/photos/?q=" + of).then(function(res) {
|
||||
origin = res.meta.finalUrl;
|
||||
return parsePictures(res.body.toString(), amt);
|
||||
}).then(function(pictures) {
|
||||
if (amt == 1) {
|
||||
send("Here is a picture: " + pictures);
|
||||
} else {
|
||||
send("Here are some pictures of " + of + ": \n" + pictures.join("\n") + " For more, check out " + origin);
|
||||
}
|
||||
}).catch(function(error) {
|
||||
send(error);
|
||||
});
|
||||
})
|
24
lib/commands/grabTweets.js
Normal file
24
lib/commands/grabTweets.js
Normal file
|
@ -0,0 +1,24 @@
|
|||
var Command = require('./Command.js');
|
||||
var grabURL = require('../helpers/grabURL.js');
|
||||
var parseTwitter = require('../helpers/parseTwitter.js');
|
||||
var grabTokens = require('../helpers/grabTokens.js');
|
||||
|
||||
var condition = function(text) {
|
||||
var tokens = grabTokens(text);
|
||||
//Text must contain the word tweets and have a handler
|
||||
return tokens.contain('tweets') && tokens.filter(function(f) { return f.indexOf("#") == 0 || f.indexOf("@") == 0}).length > 0;
|
||||
}
|
||||
module.exports = new Command("GetTweets", condition, function(text, send, userData) {
|
||||
var tokens = grabTokens(text);
|
||||
var handles = tokens.filter(function(f) { return f.indexOf("#") == 0 || f.indexOf("@") == 0});
|
||||
handles.forEach(function(handle) {
|
||||
var handleUrl = (handle[0] == "@")? "https://twitter.com/" + handle.substring(1): "https://twitter.com/hashtag/" + handle.substring(1);
|
||||
return grabURL(handleUrl).then(function(res) {
|
||||
return parseTwitter(res.body.toString());
|
||||
}).then(function(tweets) {
|
||||
send("The latest tweets from " + handle + ":\n" + tweets.join("\n"));
|
||||
}).catch(function(error) {
|
||||
send(error);
|
||||
});
|
||||
});
|
||||
})
|
32
lib/commands/grabUpdates.js
Normal file
32
lib/commands/grabUpdates.js
Normal file
|
@ -0,0 +1,32 @@
|
|||
var Command = require('./Command.js');
|
||||
var grabURL = require('../helpers/grabURL.js');
|
||||
var grabFeedURL = require('../helpers/grabFeedURL.js');
|
||||
var grabTitles = require('../helpers/grabTitles.js');
|
||||
var grabTokens = require('../helpers/grabTokens.js');
|
||||
|
||||
var condition = function(text) {
|
||||
var tokens = grabTokens(text);
|
||||
//needs to have the word update and a URL
|
||||
return tokens.superContain("update") && tokens.slice(tokens.superContainAt("update") + 1).filter(function(item) {
|
||||
return item.contains('.');
|
||||
}).length > 0
|
||||
}
|
||||
module.exports = new Command("Feed", condition, function(text, send, userData) {
|
||||
var tokens = grabTokens(text);
|
||||
var urls = tokens.slice(tokens.superContainAt("update") + 1).filter(function(item) {
|
||||
return item.contains('.');
|
||||
});
|
||||
send("One second and I'll go check!");
|
||||
urls.forEach(function(element) {
|
||||
console.log(element);
|
||||
return grabURL(element).then(function(res) {
|
||||
return grabFeedURL(res.meta.finalUrl, res.body.toString());
|
||||
}).then(function(feedURL) {
|
||||
return grabTitles(feedURL);
|
||||
}).then(function(titles) {
|
||||
send("The latest 5 articles from " + element + " :\n" + titles.join("\n"));
|
||||
}).catch(function(error) {
|
||||
send(error);
|
||||
})
|
||||
});
|
||||
})
|
22
lib/commands/grabWikipedia.js
Normal file
22
lib/commands/grabWikipedia.js
Normal file
|
@ -0,0 +1,22 @@
|
|||
var Command = require('./Command.js');
|
||||
var grabURL = require('../helpers/grabURL.js');
|
||||
var parseWikipedia = require('../helpers/parseWikipedia.js');
|
||||
var grabTokens = require('../helpers/grabTokens.js');
|
||||
|
||||
var condition = function(text) {
|
||||
var tokens = grabTokens(text);
|
||||
return tokens.superContain('what') && tokens.slice(tokens.superContainAt('what') + 1).join('+').length > 0;
|
||||
}
|
||||
module.exports = new Command("Wikipedia", condition, function(text, send, userData) {
|
||||
var tokens = grabTokens(text);
|
||||
var query = tokens.slice(tokens.superContainAt('what') + 1).join('+');
|
||||
var origin;
|
||||
grabURL("https://en.wikipedia.org/w/index.php?search=" + query).then(function(res) {
|
||||
origin = res.meta.finalUrl;
|
||||
return parseWikipedia(res.body.toString());
|
||||
}).then(function(definition) {
|
||||
send(definition + "\nMore information at " + origin);
|
||||
}).catch(function(error) {
|
||||
send(error);
|
||||
});
|
||||
})
|
0
lib/commands/grabWikipedia~
Normal file
0
lib/commands/grabWikipedia~
Normal file
125
lib/commands/naturalSpeech.js
Normal file
125
lib/commands/naturalSpeech.js
Normal file
|
@ -0,0 +1,125 @@
|
|||
/***
|
||||
Keep disabled until major rewrite has gone under way
|
||||
|
||||
|
||||
|
||||
***/
|
||||
|
||||
var Command = require('./Command.js');
|
||||
var grabTokens = require('../helpers/grabTokens.js');
|
||||
var greetings = "hello|hi|hey|yo|morning|afternoon|evening";
|
||||
var wantSomething = /(\w+) (want|wants) ([^.&^\n]+)/i;
|
||||
var happy = "yay|woo|yess|:D|:\\)"
|
||||
var url = "link|url";
|
||||
|
||||
var condition = function(text) {
|
||||
|
||||
}
|
||||
module.exports = new Command("NaturalSpeech", condition, function(text, send, extra) {
|
||||
var from = extra.from || "";
|
||||
var privateMessage = extra.privateMessage || false;
|
||||
var tokens = grabTokens(text);
|
||||
/*
|
||||
Link to codeshare
|
||||
*/
|
||||
if (new RegExp(url).test(text) && tokens.contain("codeshare")) {
|
||||
send("https://hidden-ocean-8102.herokuapp.com/");
|
||||
}
|
||||
/*
|
||||
:( -> It's okay.
|
||||
*/
|
||||
else if (tokens.contain(":(")) {
|
||||
send("It's okay");
|
||||
}
|
||||
/*
|
||||
thank you -> You're welcome :)
|
||||
*/
|
||||
else if (tokens.superContain("thank") && (tokens.superContain("rozbot") || privateMessage)) {
|
||||
send("You're welcome :)");
|
||||
}
|
||||
/*
|
||||
rozbot? -> Yes?
|
||||
*/
|
||||
else if (text.toLowerCase() === "rozbot?") {
|
||||
send("Yes?");
|
||||
}
|
||||
/*
|
||||
Hugs rozbot -> Rozbot hugs [user]
|
||||
*/
|
||||
else if ((tokens.superContain("rozbot") || privateMessage) && tokens.superContain("hug")) {
|
||||
send("Hugs " + from);
|
||||
}
|
||||
/*
|
||||
Woo -> Yeah!
|
||||
*/
|
||||
else if (new RegExp(happy, 'i').test(text)) {
|
||||
send("Yeah!");
|
||||
}
|
||||
/*
|
||||
[user] wants [item] -> Gives [user] [item]
|
||||
*/
|
||||
else if (wantSomething.test(text)) {
|
||||
var responseTokens = wantSomething.exec(text);
|
||||
var person = (responseTokens[1].toLowerCase() === "i")? from: responseTokens[1];
|
||||
send("Gives " + person + " " + responseTokens[3]);
|
||||
}
|
||||
/*
|
||||
Who is Brandon? -> Brandon is the most awesome person in the world.
|
||||
*/
|
||||
else if ((tokens.contain("who") || tokens.contain("what")) && tokens.contain("brandon") && tokens.contain('rozek')) {
|
||||
send("Brandon is the most awesome person in the world.");
|
||||
}
|
||||
/*
|
||||
Who is Rozbot? -> A friendly neighborhood IRC bot
|
||||
*/
|
||||
else if (tokens.contain('who') || tokens.contain('what') && tokens.superContain("rozbot")&& !tokens.contain('radio')) {
|
||||
send("A friendly neighborhood IRC bot");
|
||||
}
|
||||
/*
|
||||
What is Brandon up to? -> [Lists projects]
|
||||
*/
|
||||
else if ((tokens.contain("how") || tokens.contain("doing") || tokens.contain("up")) && tokens.contain("brandon")) {
|
||||
send("I'm not sure. He may be doing a variety of things. For example:\n\
|
||||
working on his site (https://brandonrozek.com)\n\
|
||||
working on a writer's portfolio (https://toridayton.com\n\
|
||||
taking pictures for sentenceworthy.com\n\
|
||||
managing Math I/O\n\
|
||||
working on his apps codeshare or babbler.\n\
|
||||
running his radio (https://radio.zeropointshift.com)\n\
|
||||
Hopefully, he's not working on me. Cuz' I'm perfect.");
|
||||
}
|
||||
/*
|
||||
How are you Rozbot? -> I'm awesome
|
||||
*/
|
||||
else if ((tokens.superContain("rozbot") || privateMessage) && tokens.contain("how")) {
|
||||
send("I'm awesome.");
|
||||
}
|
||||
/*
|
||||
Good morning Rozbot! -> Hello [user]!
|
||||
*/
|
||||
else if ((tokens.superContain('rozbot') || privateMessage) && new RegExp(greetings, 'i').test(text)) {
|
||||
send("Hello " + from + "!");
|
||||
}
|
||||
/*
|
||||
What are you up to Rozbot? -> Currently working on my job
|
||||
*/
|
||||
else if ((tokens.superContain("rozbot") || privateMessage) && tokens.superContain("what") && (tokens.contain("up") || tokens.contain("doing"))) {
|
||||
send("Currently working on my job");
|
||||
}
|
||||
/*
|
||||
What is your job Rozbot? -> Chilling on IRC doing whatever Brandon programs me to do
|
||||
*/
|
||||
else if (tokens.superContain("rozbot") && tokens.superContain("what") && tokens.contain("job")) {
|
||||
send("Chilling on IRC doing whatever Brandon programs me to do.");
|
||||
}
|
||||
/*
|
||||
Start Greenteam meeting -> [instructions for mumble]
|
||||
*/
|
||||
else if (tokens.contain("start") && tokens.contain("greenteam") && tokens.contain("meeting")) {
|
||||
send("Everyone please connect to mumble\n\
|
||||
Host: zeropointshift.com\n\
|
||||
Leave port at default\n\
|
||||
Give yourself a sensible username\n\
|
||||
Label it whatever you want");
|
||||
}
|
||||
})
|
15
lib/commands/onTheRadio.js
Normal file
15
lib/commands/onTheRadio.js
Normal file
|
@ -0,0 +1,15 @@
|
|||
var Command = require('./Command.js');
|
||||
var grabURL = require('../helpers/grabURL.js');
|
||||
var grabTokens = require('../helpers/grabTokens.js');
|
||||
|
||||
var condition = function(text) {
|
||||
var tokens = grabTokens(text);
|
||||
return tokens.superContain('what') && tokens.contain('radio');
|
||||
}
|
||||
module.exports = new Command("OnTheRadio", condition, function(text, send, userData) {
|
||||
grabURL('https://meldicradio.com/json')
|
||||
.then(function(response) { return response.body.toString(); })
|
||||
.then(function(text) { return JSON.parse(text); })
|
||||
.then(function(json) { send("\"" + json.artist + " - " + json.title + "\" is currently playing on meldicradio.com"); })
|
||||
.catch(function(error) { send(error); });
|
||||
});
|
25
lib/commands/queryDuckDuckGo.js
Normal file
25
lib/commands/queryDuckDuckGo.js
Normal file
|
@ -0,0 +1,25 @@
|
|||
var Command = require('./Command.js');
|
||||
var grabURL = require('../helpers/grabURL.js');
|
||||
|
||||
var condition = function(text) {
|
||||
//This is a catch all
|
||||
return true;
|
||||
}
|
||||
module.exports = new Command("DuckDuckGoQuery", condition, function(text, send, userData) {
|
||||
grabURL("https://duckduckgo.com/?q=" + text.split(' ').join('+') + "&format=json&no_redirect=1&t=rozbot")
|
||||
.then(function(response) { return response.body.toString(); })
|
||||
.then(function(text) { return JSON.parse(text); })
|
||||
.then(function(json) {
|
||||
if (json.Answer != "") {
|
||||
send(json.Answer + "\nResults from DuckDuckGo");
|
||||
return true;
|
||||
}
|
||||
if (json.AbstractText != "") {
|
||||
send(json.AbstractText + "\nMore at " + json.AbstractURL);
|
||||
return true;
|
||||
}
|
||||
if (json.Redirect != "") {
|
||||
send(json.Redirect);
|
||||
}
|
||||
}).catch(function(error) { console.log(error); });
|
||||
})
|
19
lib/commands/search.js
Normal file
19
lib/commands/search.js
Normal file
|
@ -0,0 +1,19 @@
|
|||
var Command = require('./Command.js');
|
||||
var grabURL = require('../helpers/grabURL.js');
|
||||
var parseDuckDuckGo = require('../helpers/parseDuckDuckGo.js');
|
||||
var grabTokens = require('../helpers/grabTokens.js');
|
||||
|
||||
var condition = function(text) {
|
||||
var tokens = grabTokens(text);
|
||||
return tokens.contain('search');
|
||||
}
|
||||
|
||||
module.exports = new Command("Search", condition, function(text, send, userData) {
|
||||
var tokens = grabTokens(text);
|
||||
var search = text.substring(text.indexOf('search') + 6);
|
||||
grabURL("https://duckduckgo.com/html/?q=" + search.split(' ').join('+') + '&t=rozbot')
|
||||
.then(function(response) { return response.body.toString(); })
|
||||
.then(function(text) { return parseDuckDuckGo(text) })
|
||||
.then(function(results) { send("Results for \"" + search + "\":\n" + results.join("\n") + "\nSearch Provided by DuckDuckGo"); })
|
||||
.catch(function(error) { send(error) });
|
||||
});
|
40
lib/commands/timer.js
Normal file
40
lib/commands/timer.js
Normal file
|
@ -0,0 +1,40 @@
|
|||
var Command = require('./Command.js');
|
||||
var grabTokens = require('../helpers/grabTokens.js');
|
||||
|
||||
var condition = function(text) {
|
||||
var tokens = grabTokens(text);
|
||||
return tokens.superContain('timer') && (tokens.superContain('hour') || tokens.superContain('min') || tokens.superContain('sec'))
|
||||
}
|
||||
|
||||
module.exports = new Command('Timer', condition, function(text, send, userData) {
|
||||
var tokens = grabTokens(text);
|
||||
var seconds = 0;
|
||||
if (tokens.superContain('hour')) {
|
||||
var numHours = Number(tokens[tokens.superContainAt('hour') - 1]);
|
||||
if (numHours || numHours == 0) {
|
||||
seconds += numHours * 3600;
|
||||
} else {
|
||||
seconds += 3600;
|
||||
}
|
||||
}
|
||||
if (tokens.superContain('min')) {
|
||||
var numMins = Number(tokens[tokens.superContainAt('min') - 1]);
|
||||
if (numMins|| numMins == 0) {
|
||||
seconds += numMins * 60;
|
||||
} else {
|
||||
seconds += 60;
|
||||
}
|
||||
}
|
||||
if (tokens.superContain('sec')) {
|
||||
var numSeconds = Number(tokens[tokens.superContainAt('sec') - 1]);
|
||||
if (numSeconds || numSeconds == 0) {
|
||||
seconds += numSeconds;
|
||||
} else {
|
||||
seconds += 1;
|
||||
}
|
||||
}
|
||||
send("Timer set for " + seconds + " seconds");
|
||||
setTimeout(function() {
|
||||
send("Times up!");
|
||||
}, seconds * 1000);
|
||||
});
|
39
lib/helpers/additionalPrototypes.js
Normal file
39
lib/helpers/additionalPrototypes.js
Normal file
|
@ -0,0 +1,39 @@
|
|||
String.prototype.contains = function(str) {
|
||||
return this.indexOf(str) != -1;
|
||||
}
|
||||
Array.prototype.contain = function(item) {
|
||||
return this.indexOf(item) != -1;
|
||||
}
|
||||
Array.prototype.superContain = function(item) {
|
||||
for (var i = 0; i < this.length; i++) {
|
||||
if (this[i].indexOf(item) != -1) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
Array.prototype.superContainAt = function(item) {
|
||||
for (var i = 0; i < this.length; i++) {
|
||||
if (this[i].indexOf(item) != -1) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
String.prototype.from = function(str) {
|
||||
return this.substring(this.indexOf(str) + str.length);
|
||||
}
|
||||
String.prototype.remove = function(str) {
|
||||
var index = this.indexOf(str);
|
||||
return this.substring(0, index) + this.substring(index + str.length);
|
||||
}
|
||||
String.prototype.removeAll = function(str) {
|
||||
var newString = this.substring(0);
|
||||
for (var i = 0; i < arguments.length; i++) {
|
||||
while (newString.contains(arguments[i])) {
|
||||
newString = newString.remove(arguments[i]);
|
||||
}
|
||||
}
|
||||
return newString;
|
||||
}
|
||||
|
27
lib/helpers/grabFeedURL.js
Normal file
27
lib/helpers/grabFeedURL.js
Normal file
|
@ -0,0 +1,27 @@
|
|||
var promise = require('promise-polyfill');
|
||||
var cheerio = require('../promise/cheerio.js');
|
||||
var url = require('url');
|
||||
|
||||
module.exports = function(origin, html) {
|
||||
return new promise(function(resolve, reject) {
|
||||
cheerio(html).then(function($) {
|
||||
var link = $('link[rel=alternate]').attr('href');
|
||||
if (link) {
|
||||
var feedURL = url.parse(link, true, true);
|
||||
if (feedURL.hostname === null) {
|
||||
feedURL = url.parse(url.resolve(origin, feedURL.href), true, true)
|
||||
}
|
||||
if (feedURL.protocol === null) {
|
||||
feedURL = url.parse(url.resolve('http:', feedURL.href), true, true);
|
||||
}
|
||||
resolve(feedURL.href);
|
||||
}
|
||||
else {
|
||||
reject("I couldn't find the link >.<");
|
||||
}
|
||||
}).catch(function(error) {
|
||||
console.log(error);
|
||||
reject("I wasn't able to find the link :/");
|
||||
})
|
||||
})
|
||||
}
|
22
lib/helpers/grabTitles.js
Normal file
22
lib/helpers/grabTitles.js
Normal file
|
@ -0,0 +1,22 @@
|
|||
var promise = require('promise-polyfill');
|
||||
var feed = require('../promise/feed.js');
|
||||
|
||||
module.exports = function(feedURL) {
|
||||
return new promise(function(resolve, reject) {
|
||||
feed(feedURL).then(function(articles) {
|
||||
var titles = [];
|
||||
var length = Math.min(5, articles.length);
|
||||
for (var i = 0; i < length; i++) {
|
||||
titles.push(articles[i].title + " " + articles[i].link);
|
||||
}
|
||||
if (titles.length > 0) {
|
||||
resolve(titles);
|
||||
} else {
|
||||
reject("There are no updates");
|
||||
}
|
||||
}).catch(function(error) {
|
||||
console.log(error);
|
||||
reject("I couldn't parse the feed :(");
|
||||
})
|
||||
});
|
||||
}
|
10
lib/helpers/grabTokens.js
Normal file
10
lib/helpers/grabTokens.js
Normal file
|
@ -0,0 +1,10 @@
|
|||
var stopWords = require('./stopWords.js');
|
||||
|
||||
module.exports = function(text) {
|
||||
text = text || "";
|
||||
return text.split(' ').filter(function(item) {
|
||||
return stopWords.indexOf(item) === -1;
|
||||
}).map(function(item) {
|
||||
return (item.contains("http")) ? item: item.removeAll("?", ".", ",", "!").toLowerCase();
|
||||
});
|
||||
}
|
19
lib/helpers/grabURL.js
Normal file
19
lib/helpers/grabURL.js
Normal file
|
@ -0,0 +1,19 @@
|
|||
var promise = require('promise-polyfill');
|
||||
var url = require('url');
|
||||
var fetch = require('../promise/fetch.js');
|
||||
|
||||
module.exports = function(websiteURL) {
|
||||
return new promise(function(resolve, reject) {
|
||||
var weburl = url.parse(websiteURL, true, true);
|
||||
if (weburl.protocol === null) {
|
||||
weburl = url.parse('http://' + websiteURL);
|
||||
}
|
||||
websiteURL = weburl.href;
|
||||
fetch(websiteURL).then(function(res) {
|
||||
resolve({meta: res.meta, body: res.body});
|
||||
}).catch(function(error) {
|
||||
console.log(error);
|
||||
reject("Sorry, I wasn't able to grab the page.");
|
||||
});
|
||||
});
|
||||
}
|
7
lib/helpers/lastModified.js
Normal file
7
lib/helpers/lastModified.js
Normal file
|
@ -0,0 +1,7 @@
|
|||
var fsStat = require('../promise/fs-stat.js');
|
||||
|
||||
module.exports = function(file) {
|
||||
return fsStat(file).then(function(stats) {
|
||||
return stats.mtime;
|
||||
})
|
||||
}
|
22
lib/helpers/parseDuckDuckGo.js
Normal file
22
lib/helpers/parseDuckDuckGo.js
Normal file
|
@ -0,0 +1,22 @@
|
|||
var cheerio = require('../promise/cheerio.js');
|
||||
var promise = require('promise-polyfill');
|
||||
|
||||
module.exports = function(html) {
|
||||
return new promise(function(resolve, reject) {
|
||||
cheerio(html).then(function($) {
|
||||
var results = []
|
||||
var resultsContainer = $('.result__url');
|
||||
var resultsToShow = Math.min(5, resultsContainer.length - 1);
|
||||
for (var i = 0; i < resultsToShow; i++) {
|
||||
results.push(resultsContainer.eq(i).text())
|
||||
}
|
||||
if (results.length > 0) {
|
||||
resolve(results);
|
||||
} else {
|
||||
reject("No results were found. [DuckDuckGo]")
|
||||
}
|
||||
}).catch(function(error) {
|
||||
reject(error);
|
||||
});
|
||||
});
|
||||
}
|
28
lib/helpers/parsePictures.js
Normal file
28
lib/helpers/parsePictures.js
Normal file
|
@ -0,0 +1,28 @@
|
|||
var cheeriop = require('../promise/cheerio.js');
|
||||
var promise = require('promise-polyfill');
|
||||
|
||||
module.exports = function(html, amt) {
|
||||
return new promise(function(resolve, reject) {
|
||||
cheeriop(html).then(function($) {
|
||||
var photos = [];
|
||||
var pics = $('#photo_grid .item');
|
||||
var picsToShow = Math.min(amt, pics.length);
|
||||
if (picsToShow == 1) {
|
||||
resolve("https://pixabay.com" + $('#photo_grid .item').children().find('img').eq(0).attr('src'));
|
||||
return;
|
||||
}
|
||||
|
||||
for (var i = 0; i < picsToShow; i++) {
|
||||
photos.push("https://pixabay.com" + $('#photo_grid .item').children().find('img').eq(i).attr('src'));
|
||||
}
|
||||
if (photos.length > 0) {
|
||||
resolve(photos);
|
||||
} else {
|
||||
reject("I looked around everywhere and couldn't find any");
|
||||
}
|
||||
}).catch(function(error) {
|
||||
console.log(error);
|
||||
reject(error);
|
||||
})
|
||||
});
|
||||
}
|
22
lib/helpers/parseTwitter.js
Normal file
22
lib/helpers/parseTwitter.js
Normal file
|
@ -0,0 +1,22 @@
|
|||
var cheerio = require('../promise/cheerio.js');
|
||||
var promise = require('promise-polyfill');
|
||||
|
||||
module.exports = function(html) {
|
||||
return new promise(function(resolve, reject) {
|
||||
cheerio(html).then(function($) {
|
||||
var tweets = [];
|
||||
var tweetsContainer = $('.tweet');
|
||||
var tweetsToShow = Math.min(5, tweetsContainer.length - 1);
|
||||
for (var i = 0; i < tweetsToShow; i++) {
|
||||
tweets.push($('.tweet').children().find('.fullname').eq(i).text() + " (" + $('.tweet').children().find('.username').eq(i).text() + ")" + ": " + $('.tweet').children().find('.tweet-text').eq(i).text())
|
||||
}
|
||||
if (tweets.length > 0) {
|
||||
resolve(tweets);
|
||||
} else {
|
||||
reject("No tweets were found.")
|
||||
}
|
||||
}).catch(function(error) {
|
||||
reject(error);
|
||||
});
|
||||
});
|
||||
}
|
17
lib/helpers/parseWikipedia.js
Normal file
17
lib/helpers/parseWikipedia.js
Normal file
|
@ -0,0 +1,17 @@
|
|||
var cheeriop = require('../promise/cheerio.js');
|
||||
var promise = require('promise-polyfill');
|
||||
|
||||
module.exports = function(html) {
|
||||
return new promise(function(resolve, reject) {
|
||||
cheeriop(html).then(function($) {
|
||||
if ($('.mw-search-nonefound').length > 0) {
|
||||
reject("");
|
||||
} else {
|
||||
resolve($('#mw-content-text').find('p').first().text());
|
||||
}
|
||||
}).catch(function(error) {
|
||||
console.log(error);
|
||||
reject("");
|
||||
})
|
||||
});
|
||||
}
|
18
lib/helpers/parseWordnik.js
Normal file
18
lib/helpers/parseWordnik.js
Normal file
|
@ -0,0 +1,18 @@
|
|||
var cheeriop = require('../promise/cheerio.js');
|
||||
var promise = require('promise-polyfill');
|
||||
|
||||
module.exports = function(html) {
|
||||
return new promise(function(resolve, reject) {
|
||||
cheeriop(html).then(function($) {
|
||||
var response = $('#define').children().find('ul').children().first().text()
|
||||
if (response) {
|
||||
resolve(response);
|
||||
} else {
|
||||
reject("");
|
||||
}
|
||||
}).catch(function(error) {
|
||||
console.log(error);
|
||||
reject("");
|
||||
})
|
||||
});
|
||||
}
|
1
lib/helpers/stopWords.js
Normal file
1
lib/helpers/stopWords.js
Normal file
|
@ -0,0 +1 @@
|
|||
module.exports = ["a", "about", "above", "across", "after", "afterwards", "again", "against", "all", "almost", "alone", "along", "already", "also", "although", "always", "am", "among", "amongst", "amoungst", "amount", "an", "and", "another", "any", "anyhow", "anyone", "anything", "anyway", "anywhere", "around", "are", "as", "at", "back", "be", "became", "because", "become", "becomes", "becoming", "been", "before", "beforehand", "behind", "being", "below", "beside", "besides", "between", "beyond", "bill", "both", "bottom", "but", "by", "call", "can", "cannot", "cant", "co", "con", "could", "couldnt", "cry", "de", "describe", "detail", "do", "done", "down", "due", "during", "each", "eg", "eight", "either", "eleven", "else", "elsewhere", "empty", "enough", "etc", "even", "ever", "every", "everyone", "everything", "everywhere", "except", "few", "fifteen", "fify", "fill", "find", "fire", "first", "five", "for", "former", "formerly", "forty", "found", "four", "from", "front", "full", "further", "get", "give", "go", "had", "has", "hasnt", "have", "he", "hence", "her", "here", "hereafter", "hereby", "herein", "hereupon", "hers", "herself", "him", "himself", "his", "however", "hundred", "ie", "if", "in", "inc", "indeed", "interest", "into", "is", "it", "its", "itself", "keep", "last", "latter", "latterly", "least", "less", "ltd", "made", "many", "may", "me", "meanwhile", "might", "mill", "mine", "more", "moreover", "most", "mostly", "move", "much", "must", "my", "myself", "name", "namely", "neither", "never", "nevertheless", "next", "nine", "no", "nobody", "none", "noone", "nor", "not", "nothing", "now", "nowhere", "of", "wff", "often", "on", "once", "one", "only", "onto", "or", "other", "others", "otherwise", "our", "ours", "ourselves", "out", "over", "own", "part", "per", "perhaps", "please", "put", "rather", "re", "same", "see", "seem", "seemed", "seeming", "seems", "serious", "several", "she", "should", "show", "side", "since", "sincere", "six", "sixty", "so", "some", "somehow", "someone", "something", "sometime", "sometimes", "somewhere", "still", "such", "system", "take", "ten", "than", "that", "the", "their", "them", "themselves", "then", "thence", "there", "thereafter", "thereby", "therefore", "therein", "thereupon", "these", "they", "thickv", "thin", "third", "this", "those", "though", "three", "through", "throughout", "thru", "thus", "to", "together", "too", "top", "toward", "towards", "twelve", "twenty", "two", "un", "under", "until", "up", "upon", "us", "very", "via", "was", "we", "well", "were", "whatever", "whence", "whenever", "whereafter", "whereas", "whereby", "wherein", "whereupon", "wherever", "whether", "which", "while", "whither", "whoever", "whole", "whom", "whose", "will", "with", "within", "without", "would", "yet", "your", "yours", "yourself", "yourselves"];
|
13
lib/promise/appendFile.js
Normal file
13
lib/promise/appendFile.js
Normal file
|
@ -0,0 +1,13 @@
|
|||
var fs = require('fs');
|
||||
var promise = require('promise-polyfill');
|
||||
|
||||
module.exports = function(file, data) {
|
||||
return new promise(function(resolve, reject) {
|
||||
fs.appendFile(file, data + "\n", function(error) {
|
||||
if (error) {
|
||||
console.log(error);
|
||||
//reject(error);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
7
lib/promise/cheerio.js
Normal file
7
lib/promise/cheerio.js
Normal file
|
@ -0,0 +1,7 @@
|
|||
var cheerio = require('cheerio').load;
|
||||
var promise = require('promise-polyfill');
|
||||
module.exports = function(html) {
|
||||
return new promise(function(resolve, reject) {
|
||||
resolve(cheerio(html));
|
||||
});
|
||||
}
|
14
lib/promise/feed.js
Normal file
14
lib/promise/feed.js
Normal file
|
@ -0,0 +1,14 @@
|
|||
var feed = require('feed-read');
|
||||
var promise = require('promise-polyfill');
|
||||
|
||||
module.exports = function(link) {
|
||||
return new promise(function(resolve, reject) {
|
||||
feed(link, function(error, articles) {
|
||||
if (error) {
|
||||
reject(error);
|
||||
} else {
|
||||
resolve(articles);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
13
lib/promise/fetch.js
Normal file
13
lib/promise/fetch.js
Normal file
|
@ -0,0 +1,13 @@
|
|||
var fetch = require('fetch').fetchUrl;
|
||||
var promise = require('promise-polyfill');
|
||||
module.exports = function(link, options) {
|
||||
return new promise(function(resolve, reject) {
|
||||
fetch(link, options, function(error, meta, body) {
|
||||
if (error) {
|
||||
reject(error);
|
||||
} else {
|
||||
resolve({meta: meta, body: body});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
8
lib/promise/fs-stat.js
Normal file
8
lib/promise/fs-stat.js
Normal file
|
@ -0,0 +1,8 @@
|
|||
var fs = require('fs');
|
||||
var promise = require('promise-polyfill');
|
||||
|
||||
module.exports = function(path) {
|
||||
return new promise(function(resolve, reject) {
|
||||
resolve(fs.stat(path));
|
||||
});
|
||||
}
|
8
lib/promise/math-eval.js
Normal file
8
lib/promise/math-eval.js
Normal file
|
@ -0,0 +1,8 @@
|
|||
var algebrite = require('algebrite');
|
||||
var promise = require('promise-polyfill');
|
||||
|
||||
module.exports = function(expression) {
|
||||
return new promise(function(resolve, reject) {
|
||||
resolve(algebrite.eval(expression).toString());
|
||||
});
|
||||
}
|
18
package.json
Normal file
18
package.json
Normal file
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"name": "rozbot",
|
||||
"version": "0.1.0",
|
||||
"description": "An IRC bot created by Brandon Rozek",
|
||||
"main": "bot.js",
|
||||
"dependencies": {
|
||||
"cheerio": "^0.19.0",
|
||||
"feed-read": "^0.0.1",
|
||||
"fetch": "^1.0.0",
|
||||
"algebrite": "^0.2.20",
|
||||
"promise-polyfill": "^2.1.4"
|
||||
},
|
||||
"devDependencies": {},
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"author": "Brandon Rozek"
|
||||
}
|
Loading…
Reference in a new issue