-
Notifications
You must be signed in to change notification settings - Fork 2
/
ft_dicebot.js
117 lines (112 loc) · 4.08 KB
/
ft_dicebot.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
/*
* Shadowrun 1e GameBot by Discord user AstroMacGuffin#1486 (Nathan Hawks)
* https://github.com/NathanHawks/SR1eGameBot
* Yes I do regret baking 1e into the name
* version 0.3, yeah that sounds good
* Released under the terms of the UnLicense. This work is in the public domain.
* Released as-is with no warranty or claim of usability for any purpose.
*/
const {
lastChar, rollDice, getTNFromArgs, getOpposedSetupArr, getModifierFromArgs,
addMaintenanceStatusMessage, prepRollNote, makeOpposedOutput
} = require('./api');
const {logError, logWrite} = require('./log');
async function handleRollCommand(msg, cmd, args, user, override=null) {
let numDiceInt = 0;
// allow multiple roll commands separated by semicolon
let cmdArr = null;
if (override !== null) cmdArr = override.split(";");
else cmdArr = msg.content.split(";");
let output = '';
for (let x = 0; x < cmdArr.length; x++) {
if (output !== '') output += `\nRoll #${x+1}: `;
// kill preceding or trailing space before it kills my parsing
cmdArr[x] = cmdArr[x].trim();
args = cmdArr[x].split(' ');
cmd = args[0];
args = args.splice(1);
cmd = cmd.toLowerCase();
if (cmd.substring(0, 1) === '!') cmd = cmd.substring(1);
// SETUP: how many dice, and do we explode?
let isTestBool = false;
let isTotalBool = false;
let lastchar = lastChar(cmd);
let modifier = 0;
if (lastchar == '!') {
isTestBool = true;
numDiceInt = cmd.substring(0, cmd.length-1);
} else if (lastchar == 't') {
isTotalBool = true;
numDiceInt = cmd.substring(0, cmd.length-1);
// look for a modifier
modifier = getModifierFromArgs(args);
}
else {
numDiceInt = cmd.substring(0, cmd.length);
}
// SETUP: was a TN given?
let tnInt = getTNFromArgs(args);
// SETUP: is this an opposed roll?
let retarr = getOpposedSetupArr(args);
let isOpposedBool = retarr[0];
let opponentDiceInt = retarr[1];
let opponentTNInt = retarr[2];
let isOpposedTestBool = retarr[3];
if (isOpposedTestBool === true && opponentTNInt === -1) {
msg.reply(await addMaintenanceStatusMessage(msg, ":no_entry_sign: You ordered an opposed test without an "
+ "opponent TN (the **otn** option).\nExample: **!6! tn4 vs5! *otn4***"))
.catch((e) => { logError(e); });
return;
}
// SETUP: anything remaining is a note; prepare to pass it thru
let note = prepRollNote(cmd, args, tnInt);
// GO: Roll the bones ============================================
retarr = rollDice(numDiceInt, isTestBool, tnInt);
let successesInt = retarr[0];
let rollsIntArr = retarr[1];
// handle opposed roll
let opponentRollsIntArr, opponentSuccessesInt;
if (isOpposedBool) {
let retarr = rollDice(opponentDiceInt, isOpposedTestBool, opponentTNInt);
opponentSuccessesInt = retarr[0];
opponentRollsIntArr = retarr[1];
}
// prep output and deliver it ====================================
// handle total'd roll
if (isTotalBool) {
let total = 0;
rollsIntArr.map((roll)=>{total+=roll;})
if (modifier) total += modifier;
output += `[Total: ${total}] | `;
}
if (isOpposedBool) {
output += makeOpposedOutput(successesInt,
opponentSuccessesInt, user, rollsIntArr, opponentRollsIntArr, note
);
}
else {
let successesFormattedString = "";
if (successesInt > 0) {
successesFormattedString = successesInt + ' successes ';
}
output += `${user}` + ', you rolled ' + successesFormattedString
+ '(' +rollsIntArr+ ') ' + note;
}
// end of for cmdArr loop
}
// avoid false positives e.g. when chatting about Astral Tabeltop dice formats
if (numDiceInt > 0) {
// modify output for maintenance mode status
output = await addMaintenanceStatusMessage(msg, output);
// post results
msg.channel.send(output).catch((e) => { logError(e); });
// log activity
logWrite('🎲');
// provide reroll ui (dice reaction)
msg.react('🎲').catch((e) => { logError(e); });
// no return
}
}
module.exports = {
handleRollCommand
}