initial commit
This commit is contained in:
commit
1607b4be3f
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
node_modules
|
5
README.md
Normal file
5
README.md
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
slack-roll-command
|
||||||
|
==================
|
||||||
|
This command allows people to roll dice for slack.
|
||||||
|
|
||||||
|
Usage: `/roll 2d6`
|
23
index.js
Normal file
23
index.js
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
var PEG = require('pegjs'),
|
||||||
|
path = require('path'),
|
||||||
|
fs = require('fs');
|
||||||
|
|
||||||
|
var parser = PEG.buildParser(
|
||||||
|
fs.readFileSync(
|
||||||
|
path.resolve(__dirname, "roll.pegjs")
|
||||||
|
).toString()
|
||||||
|
);
|
||||||
|
|
||||||
|
function roll(text) {
|
||||||
|
return "" + parser.parse(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = function(ee) {
|
||||||
|
ee.on('roll', function(slack) {
|
||||||
|
try {
|
||||||
|
slack.replyUser(roll(slack.text));
|
||||||
|
} catch (e) {
|
||||||
|
slack.error(e.toString());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
29
package.json
Normal file
29
package.json
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
{
|
||||||
|
"name": "slack-roll-command",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"description": "A slack command to roll dice",
|
||||||
|
"main": "index.js",
|
||||||
|
"dependencies": {
|
||||||
|
"pegjs": "^0.8.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {},
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/terribly-lazy/slack-roll-command.git"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"slack",
|
||||||
|
"command",
|
||||||
|
"roll",
|
||||||
|
"dice"
|
||||||
|
],
|
||||||
|
"author": "Kegan Myers <kegan@keganmyers.com>",
|
||||||
|
"license": "BSD 2-Clause",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/terribly-lazy/slack-roll-command/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/terribly-lazy/slack-roll-command"
|
||||||
|
}
|
75
roll.pegjs
Normal file
75
roll.pegjs
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
/* This is a grammar written to be compiled by PEG.js, this is the most human readable form of the parser */
|
||||||
|
|
||||||
|
/* Here are our tokens that get spit out by our parser, then all combined once the "start" rule finishes */
|
||||||
|
|
||||||
|
{
|
||||||
|
function TokenList(tokens) {
|
||||||
|
this.getValue = function() {
|
||||||
|
var tokenListResult = 0;
|
||||||
|
|
||||||
|
for (var i = 0; i < tokens.length; i++) {
|
||||||
|
tokenListResult += tokens[i].getValue()
|
||||||
|
}
|
||||||
|
|
||||||
|
return tokenListResult;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function AdditiveToken(valueToken) {
|
||||||
|
this.getValue = function() {
|
||||||
|
return valueToken.getValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function SubtractiveToken(valueToken) {
|
||||||
|
this.getValue = function() {
|
||||||
|
return -1 * valueToken.getValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function RollToken(countToken, sizeToken) {
|
||||||
|
this.getValue = function() {
|
||||||
|
//Figure out how many times we are rolling, and what size die to use.
|
||||||
|
var count = countToken.getValue();
|
||||||
|
var size = sizeToken.getValue();
|
||||||
|
|
||||||
|
var rollResult = 0;
|
||||||
|
|
||||||
|
for (var i = 0; i < count; i++) {
|
||||||
|
rollResult += Math.ceil(Math.random() * size);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rollResult;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function NumberToken(num) {
|
||||||
|
this.getValue = function() {
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Here is the grammar itself, what defines all the work that gets done parsing the input */
|
||||||
|
|
||||||
|
start
|
||||||
|
= tokens:tokenList { return tokens.getValue() }
|
||||||
|
|
||||||
|
tokenList
|
||||||
|
= roll:dieRoll mod:modifier* {return new TokenList([roll, new TokenList(mod)]) }
|
||||||
|
|
||||||
|
modifier
|
||||||
|
= additive
|
||||||
|
/ subtractive
|
||||||
|
|
||||||
|
additive
|
||||||
|
= "+" number:number { return new AdditiveToken(number) }
|
||||||
|
|
||||||
|
subtractive
|
||||||
|
= "*" number:number { return new SubtractiveToken(number) }
|
||||||
|
|
||||||
|
number
|
||||||
|
= dieRoll
|
||||||
|
/ integer
|
||||||
|
|
||||||
|
dieRoll
|
||||||
|
= count:integer "d" size:integer { return new RollToken(count, size) }
|
||||||
|
|
||||||
|
integer "integer"
|
||||||
|
= digits:[0-9]+ { return new NumberToken(parseInt(digits.join(""), 10)); }
|
Loading…
Reference in a new issue