Started on rust version: Added simple parsing and tests
This commit is contained in:
parent
5a75ec61f5
commit
964ce47501
6
.gitignore
vendored
6
.gitignore
vendored
@ -2,4 +2,8 @@ node_modules/
|
|||||||
auth.json
|
auth.json
|
||||||
error.log
|
error.log
|
||||||
verbose.log
|
verbose.log
|
||||||
.vscode/
|
.vscode/
|
||||||
|
|
||||||
|
#Added by cargo
|
||||||
|
|
||||||
|
/target
|
||||||
|
|||||||
1504
Cargo.lock
generated
Normal file
1504
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
14
Cargo.toml
Normal file
14
Cargo.toml
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
[package]
|
||||||
|
name = "rollux"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["adne"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
regex = "1"
|
||||||
|
serenity = "0.8"
|
||||||
|
rand = "0.7"
|
||||||
|
anyhow = "1"
|
||||||
|
thiserror = "1"
|
||||||
14
Dockerfile
14
Dockerfile
@ -1,13 +1 @@
|
|||||||
FROM node:latest
|
# TODO
|
||||||
|
|
||||||
RUN mkdir /app/
|
|
||||||
|
|
||||||
ADD . /app/.
|
|
||||||
|
|
||||||
RUN cd /app/ && npm install
|
|
||||||
|
|
||||||
RUN mkdir /data
|
|
||||||
|
|
||||||
WORKDIR /data/
|
|
||||||
|
|
||||||
CMD ["node", "/app/bot.js"]
|
|
||||||
43
README.md
43
README.md
@ -1,50 +1,15 @@
|
|||||||
# Rollux
|
# Rollux
|
||||||
|
|
||||||
Rollux is a simple dice rolling bot for discord
|
Rollux is a simple dice rolling bot for discord written in rust using [serenity](https://docs.rs/serenity/0.8.6/serenity/)
|
||||||
|
|
||||||
# How to run
|
# How to run
|
||||||
|
|
||||||
1. Make a discord bot [here](https://discordapp.com/developers/applications/).
|
TODO
|
||||||
- Here is a [tutorial](https://www.digitaltrends.com/gaming/how-to-make-a-discord-bot/) on how to make a discord bot.
|
|
||||||
2. Make a auth.json file and add the following to it:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"token": "{your token}"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
3. Install node.js and npm, then run the following command: `npm install`
|
|
||||||
4. Run it with `node bot.js`
|
|
||||||
|
|
||||||
# Running with docker
|
# Running with docker
|
||||||
|
|
||||||
1. Build docker image with a tag
|
TODO
|
||||||
Example: `docker build -t rollux .`
|
|
||||||
|
|
||||||
2. Add authentication by either:
|
|
||||||
1. Mount `/data` directory in container with your auth.json file
|
|
||||||
2. Pass the environment variable `DISCORD_TOKEN` with your discord token
|
|
||||||
|
|
||||||
## Example docker-compose file:
|
## Example docker-compose file:
|
||||||
|
|
||||||
For auth.json method:
|
TODO
|
||||||
```
|
|
||||||
version: '2'
|
|
||||||
|
|
||||||
services:
|
|
||||||
rollux:
|
|
||||||
image: 'rollux'
|
|
||||||
volumes:
|
|
||||||
- ./data:/data
|
|
||||||
```
|
|
||||||
|
|
||||||
For environment variable:
|
|
||||||
```
|
|
||||||
version: '2'
|
|
||||||
|
|
||||||
services:
|
|
||||||
rollux:
|
|
||||||
image: 'rollux'
|
|
||||||
environment:
|
|
||||||
- DISCORD_TOKEN={your token}
|
|
||||||
```
|
|
||||||
85
bot.js
85
bot.js
@ -1,85 +0,0 @@
|
|||||||
var Discord = require('discord.js');
|
|
||||||
var winston = require('winston');
|
|
||||||
var fs = require('fs');
|
|
||||||
var diceRoller = require('./diceRolling.js');
|
|
||||||
|
|
||||||
const client = new Discord.Client();
|
|
||||||
|
|
||||||
const logger = winston.createLogger({
|
|
||||||
level: 'debug',
|
|
||||||
format: winston.format.json(),
|
|
||||||
defaultMeta: { service: 'user-service' },
|
|
||||||
transports: [
|
|
||||||
new winston.transports.Console(),
|
|
||||||
new winston.transports.File({ filename: 'error.log', level: 'error' }),
|
|
||||||
new winston.transports.File({ filename: 'verbose.log', level: 'verbose' }),
|
|
||||||
]
|
|
||||||
});
|
|
||||||
|
|
||||||
const get_auth = () => {
|
|
||||||
if (process.env.DISCORD_TOKEN != undefined) {
|
|
||||||
logger.info('using auth from environment variable');
|
|
||||||
return { token: process.env.DISCORD_TOKEN };
|
|
||||||
} else {
|
|
||||||
logger.info('using auth from auth.json file');
|
|
||||||
return JSON.parse(fs.readFileSync('./auth.json', 'utf8'));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
client.on('ready', () => {
|
|
||||||
logger.info('Connected');
|
|
||||||
logger.info(`Logged in as: ${client.user.tag}`);
|
|
||||||
client.user.setPresence({ activity: { name: 'with dice | /roll' }})
|
|
||||||
.then(logger.info)
|
|
||||||
.catch(er => logger.error(`Encountered error: ${JSON.stringify(er)}`));
|
|
||||||
});
|
|
||||||
|
|
||||||
client.on('message', msg => {
|
|
||||||
try {
|
|
||||||
if (msg.content.substring(0, 1) !== '/') return;
|
|
||||||
|
|
||||||
var args = msg.content.substring(1).split(' ');
|
|
||||||
var cmd = args[0];
|
|
||||||
|
|
||||||
switch (cmd) {
|
|
||||||
case 'hi':
|
|
||||||
sendMessage(channelID, 'Hello, World!');
|
|
||||||
break;
|
|
||||||
case 'roll':
|
|
||||||
if (msg.content.length < 7) {
|
|
||||||
sendMessage(
|
|
||||||
channelID,
|
|
||||||
'Can\'t roll nothing'
|
|
||||||
)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (/([+\-]?\d{0,}d\d{1,})([+\-*x/]\d{1,}){0,}/gi.test(msg.content.substring(6).replace(/\s/g, ''))) {
|
|
||||||
var res = (msg.content.substring(6) + ': ' + diceRoller.roll(msg.content.substring(6))).replace('*', '\\*')
|
|
||||||
msg.reply(res);
|
|
||||||
} else {
|
|
||||||
var res = "I don't recognize this: \""
|
|
||||||
+ msg.content
|
|
||||||
.substring(6)
|
|
||||||
.replace(/([+\-]?\d{0,}d\d{1,})([+\-*x/]\d{1,}){0,}/gi, "")
|
|
||||||
.toString()
|
|
||||||
+ "\"";
|
|
||||||
msg.reply(res);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} catch (er) {
|
|
||||||
msg.reply('Sorry, something went wrong.')
|
|
||||||
logger.error(`Encountered error: ${JSON.stringify(er)}`);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
client.on('warn', warn => {
|
|
||||||
logger.warn(`Warning: ${JSON.stringify(er)}`);
|
|
||||||
});
|
|
||||||
|
|
||||||
client.on('error', er => {
|
|
||||||
logger.error(`Error event triggered: ${JSON.stringify(er)}`);
|
|
||||||
});
|
|
||||||
|
|
||||||
var auth = get_auth();
|
|
||||||
client.login(auth.token);
|
|
||||||
@ -1,91 +0,0 @@
|
|||||||
|
|
||||||
module.exports = {
|
|
||||||
roll: function (req) {
|
|
||||||
if (typeof req !== "string") {
|
|
||||||
return "<@138725786067664897>! You don goofed!";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Splits request into segments. Example "3d6+3+5d2" => ["3d6", "+3", "+5d2"]
|
|
||||||
var segments = req.replace(/\s/g, '').match(/([+\-]?\d{0,}d\d{1,})|([+\-*/x]\d{1,})/gi);
|
|
||||||
|
|
||||||
var message = '';
|
|
||||||
|
|
||||||
var i = -1;
|
|
||||||
var results = [];
|
|
||||||
var curResult = 0;
|
|
||||||
var curMod = 1;
|
|
||||||
segments.forEach(e => {
|
|
||||||
if (e.match(/([+\-]?\d{0,}d\d{1,})/gi)) { // xdy
|
|
||||||
// if not first add previous result and resetting curResult
|
|
||||||
if (i >= 0) {
|
|
||||||
curResult *= curMod;
|
|
||||||
results[i] = curResult;
|
|
||||||
|
|
||||||
curResult = 0;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
|
|
||||||
// Set modifier for dice group
|
|
||||||
curMod = (e.substring(0, 1) === '-') ? -1 : 1;
|
|
||||||
|
|
||||||
// dice[0] = number of rolls, dice[1] = sides of dice rolled
|
|
||||||
var dice = e.replace(/[+\-]?/, '').split(/d/i);
|
|
||||||
var rolls = [];
|
|
||||||
for (var l = 0; l < parseInt(dice[0] === '' ? 1 : dice[0]); l++) {
|
|
||||||
rolls[l] = rollDice(dice[1]);
|
|
||||||
curResult += rolls[l];
|
|
||||||
}
|
|
||||||
|
|
||||||
// add result to message
|
|
||||||
var sign = e.match(/[+\-]/);
|
|
||||||
message += ((sign === null) ? ' ' : ' ' + sign) + '[' + rolls.toString() + ']';
|
|
||||||
} else if (e.match(/([+\-*/x]\d{1,})/gi)) { // Modifier
|
|
||||||
switch (e.substring(0, 1)) {
|
|
||||||
case '+':
|
|
||||||
curResult += parseInt(e.substring(1));
|
|
||||||
break;
|
|
||||||
case '-':
|
|
||||||
curResult -= parseInt(e.substring(1));
|
|
||||||
break;
|
|
||||||
case '*':
|
|
||||||
case 'x':
|
|
||||||
curResult *= parseInt(e.substring(1));
|
|
||||||
break;
|
|
||||||
case '/':
|
|
||||||
curResult /= parseInt(e.substring(1));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
message += e;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
curResult *= curMod;
|
|
||||||
results[i] = curResult;
|
|
||||||
|
|
||||||
|
|
||||||
// Adding the sum to the message
|
|
||||||
var sum = 0;
|
|
||||||
if (results.length > 1){
|
|
||||||
sum = results.reduce(getSum);
|
|
||||||
} else if (results.length === 1){
|
|
||||||
sum = results[0];
|
|
||||||
}
|
|
||||||
message += ' = ' + sum;
|
|
||||||
|
|
||||||
if (message.length > 2000)
|
|
||||||
message = "Response was to long. Sum: " + sum;
|
|
||||||
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Roll one dice, returns result
|
|
||||||
* @param {int} dice Amount of sides od dice rolled
|
|
||||||
*/
|
|
||||||
function rollDice(dice) {
|
|
||||||
return parseInt((Math.random() * dice) + 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
function getSum(total, num) {
|
|
||||||
return total + num
|
|
||||||
}
|
|
||||||
368
package-lock.json
generated
368
package-lock.json
generated
@ -1,368 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "rollux",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"lockfileVersion": 1,
|
|
||||||
"requires": true,
|
|
||||||
"dependencies": {
|
|
||||||
"@discordjs/collection": {
|
|
||||||
"version": "0.1.5",
|
|
||||||
"resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.5.tgz",
|
|
||||||
"integrity": "sha512-CU1q0UXQUpFNzNB7gufgoisDHP7n+T3tkqTsp3MNUkVJ5+hS3BCvME8uCXAUFlz+6T2FbTCu75A+yQ7HMKqRKw=="
|
|
||||||
},
|
|
||||||
"abort-controller": {
|
|
||||||
"version": "3.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
|
|
||||||
"integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
|
|
||||||
"requires": {
|
|
||||||
"event-target-shim": "^5.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"async": {
|
|
||||||
"version": "2.6.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
|
|
||||||
"integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
|
|
||||||
"requires": {
|
|
||||||
"lodash": "^4.17.14"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"asynckit": {
|
|
||||||
"version": "0.4.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
|
||||||
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
|
|
||||||
},
|
|
||||||
"color": {
|
|
||||||
"version": "3.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz",
|
|
||||||
"integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==",
|
|
||||||
"requires": {
|
|
||||||
"color-convert": "^1.9.1",
|
|
||||||
"color-string": "^1.5.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"color-convert": {
|
|
||||||
"version": "1.9.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
|
|
||||||
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
|
|
||||||
"requires": {
|
|
||||||
"color-name": "1.1.3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"color-name": {
|
|
||||||
"version": "1.1.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
|
|
||||||
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
|
|
||||||
},
|
|
||||||
"color-string": {
|
|
||||||
"version": "1.5.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz",
|
|
||||||
"integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==",
|
|
||||||
"requires": {
|
|
||||||
"color-name": "^1.0.0",
|
|
||||||
"simple-swizzle": "^0.2.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"colornames": {
|
|
||||||
"version": "1.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz",
|
|
||||||
"integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y="
|
|
||||||
},
|
|
||||||
"colors": {
|
|
||||||
"version": "1.4.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
|
|
||||||
"integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA=="
|
|
||||||
},
|
|
||||||
"colorspace": {
|
|
||||||
"version": "1.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz",
|
|
||||||
"integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==",
|
|
||||||
"requires": {
|
|
||||||
"color": "3.0.x",
|
|
||||||
"text-hex": "1.0.x"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"combined-stream": {
|
|
||||||
"version": "1.0.8",
|
|
||||||
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
|
|
||||||
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
|
|
||||||
"requires": {
|
|
||||||
"delayed-stream": "~1.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"core-util-is": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
|
||||||
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
|
|
||||||
},
|
|
||||||
"delayed-stream": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
|
|
||||||
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
|
|
||||||
},
|
|
||||||
"diagnostics": {
|
|
||||||
"version": "1.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz",
|
|
||||||
"integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==",
|
|
||||||
"requires": {
|
|
||||||
"colorspace": "1.1.x",
|
|
||||||
"enabled": "1.0.x",
|
|
||||||
"kuler": "1.0.x"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"discord.js": {
|
|
||||||
"version": "12.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.1.1.tgz",
|
|
||||||
"integrity": "sha512-Y6+QfAUZkb9cy27cfNqUigAgYVSKTw9jPF3mN4UDMih3Em3VQ0WjGBdX1UbE8CwFkLOu5XWQSNPdsoStTR8c2Q==",
|
|
||||||
"requires": {
|
|
||||||
"@discordjs/collection": "^0.1.5",
|
|
||||||
"abort-controller": "^3.0.0",
|
|
||||||
"form-data": "^3.0.0",
|
|
||||||
"node-fetch": "^2.6.0",
|
|
||||||
"prism-media": "^1.2.0",
|
|
||||||
"setimmediate": "^1.0.5",
|
|
||||||
"tweetnacl": "^1.0.3",
|
|
||||||
"ws": "^7.2.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"enabled": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz",
|
|
||||||
"integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=",
|
|
||||||
"requires": {
|
|
||||||
"env-variable": "0.0.x"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"env-variable": {
|
|
||||||
"version": "0.0.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.6.tgz",
|
|
||||||
"integrity": "sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg=="
|
|
||||||
},
|
|
||||||
"event-target-shim": {
|
|
||||||
"version": "5.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
|
|
||||||
"integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="
|
|
||||||
},
|
|
||||||
"fast-safe-stringify": {
|
|
||||||
"version": "2.0.7",
|
|
||||||
"resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz",
|
|
||||||
"integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA=="
|
|
||||||
},
|
|
||||||
"fecha": {
|
|
||||||
"version": "2.3.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz",
|
|
||||||
"integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg=="
|
|
||||||
},
|
|
||||||
"form-data": {
|
|
||||||
"version": "3.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz",
|
|
||||||
"integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==",
|
|
||||||
"requires": {
|
|
||||||
"asynckit": "^0.4.0",
|
|
||||||
"combined-stream": "^1.0.8",
|
|
||||||
"mime-types": "^2.1.12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"inherits": {
|
|
||||||
"version": "2.0.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
|
|
||||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
|
|
||||||
},
|
|
||||||
"is-arrayish": {
|
|
||||||
"version": "0.3.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
|
|
||||||
"integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
|
|
||||||
},
|
|
||||||
"is-stream": {
|
|
||||||
"version": "1.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
|
|
||||||
"integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
|
|
||||||
},
|
|
||||||
"isarray": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
|
||||||
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
|
|
||||||
},
|
|
||||||
"kuler": {
|
|
||||||
"version": "1.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz",
|
|
||||||
"integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==",
|
|
||||||
"requires": {
|
|
||||||
"colornames": "^1.1.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"lodash": {
|
|
||||||
"version": "4.17.15",
|
|
||||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
|
|
||||||
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
|
|
||||||
},
|
|
||||||
"logform": {
|
|
||||||
"version": "2.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz",
|
|
||||||
"integrity": "sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ==",
|
|
||||||
"requires": {
|
|
||||||
"colors": "^1.2.1",
|
|
||||||
"fast-safe-stringify": "^2.0.4",
|
|
||||||
"fecha": "^2.3.3",
|
|
||||||
"ms": "^2.1.1",
|
|
||||||
"triple-beam": "^1.3.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mime-db": {
|
|
||||||
"version": "1.43.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
|
|
||||||
"integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ=="
|
|
||||||
},
|
|
||||||
"mime-types": {
|
|
||||||
"version": "2.1.26",
|
|
||||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
|
|
||||||
"integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
|
|
||||||
"requires": {
|
|
||||||
"mime-db": "1.43.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ms": {
|
|
||||||
"version": "2.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
|
||||||
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
|
||||||
},
|
|
||||||
"node-fetch": {
|
|
||||||
"version": "2.6.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
|
|
||||||
"integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA=="
|
|
||||||
},
|
|
||||||
"one-time": {
|
|
||||||
"version": "0.0.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz",
|
|
||||||
"integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4="
|
|
||||||
},
|
|
||||||
"prism-media": {
|
|
||||||
"version": "1.2.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.1.tgz",
|
|
||||||
"integrity": "sha512-R3EbKwJiYlTvGwcG1DpUt+06DsxOGS5W4AMEHT7oVOjG93MjpdhGX1whHyjnqknylLMupKAsKMEXcTNRbPe6Vw=="
|
|
||||||
},
|
|
||||||
"process-nextick-args": {
|
|
||||||
"version": "2.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
|
|
||||||
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
|
|
||||||
},
|
|
||||||
"readable-stream": {
|
|
||||||
"version": "3.6.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
|
|
||||||
"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
|
|
||||||
"requires": {
|
|
||||||
"inherits": "^2.0.3",
|
|
||||||
"string_decoder": "^1.1.1",
|
|
||||||
"util-deprecate": "^1.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"safe-buffer": {
|
|
||||||
"version": "5.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
|
|
||||||
"integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
|
|
||||||
},
|
|
||||||
"setimmediate": {
|
|
||||||
"version": "1.0.5",
|
|
||||||
"resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
|
|
||||||
"integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
|
|
||||||
},
|
|
||||||
"simple-swizzle": {
|
|
||||||
"version": "0.2.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
|
|
||||||
"integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
|
|
||||||
"requires": {
|
|
||||||
"is-arrayish": "^0.3.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"stack-trace": {
|
|
||||||
"version": "0.0.10",
|
|
||||||
"resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
|
|
||||||
"integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA="
|
|
||||||
},
|
|
||||||
"string_decoder": {
|
|
||||||
"version": "1.3.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
|
|
||||||
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
|
|
||||||
"requires": {
|
|
||||||
"safe-buffer": "~5.2.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"text-hex": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
|
|
||||||
"integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="
|
|
||||||
},
|
|
||||||
"triple-beam": {
|
|
||||||
"version": "1.3.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz",
|
|
||||||
"integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw=="
|
|
||||||
},
|
|
||||||
"tweetnacl": {
|
|
||||||
"version": "1.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
|
|
||||||
"integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw=="
|
|
||||||
},
|
|
||||||
"util-deprecate": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
|
||||||
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
|
|
||||||
},
|
|
||||||
"winston": {
|
|
||||||
"version": "3.2.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz",
|
|
||||||
"integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==",
|
|
||||||
"requires": {
|
|
||||||
"async": "^2.6.1",
|
|
||||||
"diagnostics": "^1.1.1",
|
|
||||||
"is-stream": "^1.1.0",
|
|
||||||
"logform": "^2.1.1",
|
|
||||||
"one-time": "0.0.4",
|
|
||||||
"readable-stream": "^3.1.1",
|
|
||||||
"stack-trace": "0.0.x",
|
|
||||||
"triple-beam": "^1.3.0",
|
|
||||||
"winston-transport": "^4.3.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"winston-transport": {
|
|
||||||
"version": "4.3.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.3.0.tgz",
|
|
||||||
"integrity": "sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A==",
|
|
||||||
"requires": {
|
|
||||||
"readable-stream": "^2.3.6",
|
|
||||||
"triple-beam": "^1.2.0"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"readable-stream": {
|
|
||||||
"version": "2.3.7",
|
|
||||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
|
|
||||||
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
|
|
||||||
"requires": {
|
|
||||||
"core-util-is": "~1.0.0",
|
|
||||||
"inherits": "~2.0.3",
|
|
||||||
"isarray": "~1.0.0",
|
|
||||||
"process-nextick-args": "~2.0.0",
|
|
||||||
"safe-buffer": "~5.1.1",
|
|
||||||
"string_decoder": "~1.1.1",
|
|
||||||
"util-deprecate": "~1.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"safe-buffer": {
|
|
||||||
"version": "5.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
|
||||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
|
|
||||||
},
|
|
||||||
"string_decoder": {
|
|
||||||
"version": "1.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
|
||||||
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
|
||||||
"requires": {
|
|
||||||
"safe-buffer": "~5.1.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ws": {
|
|
||||||
"version": "7.2.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz",
|
|
||||||
"integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ=="
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
11
package.json
11
package.json
@ -1,11 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "rollux",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"description": "A bot that rolls dice",
|
|
||||||
"main": "bot.js",
|
|
||||||
"author": "Mollux",
|
|
||||||
"dependencies": {
|
|
||||||
"discord.js": "^12.1.1",
|
|
||||||
"winston": "^3.2.1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
14
src/lib.rs
Normal file
14
src/lib.rs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
use regex::Regex;
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod lib_test;
|
||||||
|
|
||||||
|
fn parse_dice_segments<'a>(cmd: &'a str) -> Vec<regex::Captures<'a>> {
|
||||||
|
let regex = Regex::new(r#"(?x)
|
||||||
|
(?P<count>\d+)? # count (optional)
|
||||||
|
d
|
||||||
|
(?P<size>\d+) # dice size
|
||||||
|
"#).expect("Failed to compile regex");
|
||||||
|
|
||||||
|
regex.captures_iter(cmd).collect()
|
||||||
|
}
|
||||||
15
src/lib_test.rs
Normal file
15
src/lib_test.rs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_roll_dice() {
|
||||||
|
let mut results = parse_dice_segments("2d6");
|
||||||
|
assert_eq!(results.len(), 1);
|
||||||
|
assert_eq!(results[0]["count"], *"2");
|
||||||
|
assert_eq!(results[0]["size"], *"6");
|
||||||
|
|
||||||
|
results = parse_dice_segments("2d6+1d20");
|
||||||
|
|
||||||
|
assert_eq!(results.len(), 2);
|
||||||
|
assert_eq!(results[1].name("count").map(|i| i.as_str()), Some("1"));
|
||||||
|
assert_eq!(results[1]["size"], *"20");
|
||||||
|
}
|
||||||
3
src/main.rs
Normal file
3
src/main.rs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fn main() {
|
||||||
|
println!("Hello, world!");
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user