From 47345b3694c0ee336af8ebcfdd7943fee0d3b776 Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Mon, 13 Jul 2020 16:38:24 +0200 Subject: [PATCH] Experimenting with webhooks. --- .../api/creature/actions/applyAttack.js | 21 ++++ .../api/creature/actions/applyDamage.js | 14 ++- .../api/creature/actions/applyProperties.js | 4 + app/imports/api/parenting/parenting.js | 16 ++- app/imports/math.js | 4 +- app/imports/server/discord/webhook.js | 7 ++ app/package-lock.json | 99 +++++++++++++++++++ app/package.json | 1 + 8 files changed, 152 insertions(+), 14 deletions(-) create mode 100644 app/imports/api/creature/actions/applyAttack.js create mode 100644 app/imports/server/discord/webhook.js diff --git a/app/imports/api/creature/actions/applyAttack.js b/app/imports/api/creature/actions/applyAttack.js new file mode 100644 index 00000000..8cbb971c --- /dev/null +++ b/app/imports/api/creature/actions/applyAttack.js @@ -0,0 +1,21 @@ +import math from '/imports/math.js'; +if (Meteor.isServer){ + var sendWebhook = require('/imports/server/discord/webhook.js').default; +} + +export default function applyAttack({ + prop, + //children, + creature, + //targets, + //actionContext +}){ + let result = math.roll(1, 20) + prop.rollBonusResult; + if (Meteor.isClient){ + console.log(`${creature.name} makes a ${prop.name} attack! Rolls ${result} to hit`); + } + if (Meteor.isServer) sendWebhook({ + webhook: creature.webhook, + message: `${creature.name} makes a ${prop.name} attack! Rolls ${result} to hit`, + }); +} diff --git a/app/imports/api/creature/actions/applyDamage.js b/app/imports/api/creature/actions/applyDamage.js index 0caa31d2..4980b6a8 100644 --- a/app/imports/api/creature/actions/applyDamage.js +++ b/app/imports/api/creature/actions/applyDamage.js @@ -1,12 +1,16 @@ import evaluateAndRollString from '/imports/api/creature/computation/afterComputation/evaluateAndRollString.js'; +if (Meteor.isServer){ + var sendWebhook = require('/imports/server/discord/webhook.js').default; +} + export default function applyDamage({ prop, creature, - targets, + //targets, actionContext }){ - let damageTargets = prop.target === 'self' ? [creature] : targets; + //let damageTargets = prop.target === 'self' ? [creature] : targets; let scope = { ...creature.variables, ...actionContext, @@ -14,6 +18,10 @@ export default function applyDamage({ let {result, errors} = evaluateAndRollString(prop.amount, scope); if (Meteor.isClient){ errors.forEach(e => console.error(e)); - console.log(result); + console.log(`${result} ${prop.damageType}${prop.damageType !== 'healing'? ' damage': ''}`); } + if (Meteor.isServer) sendWebhook({ + webhook: creature.webhook, + message: `${result} ${prop.damageType}${prop.damageType !== 'healing'? ' damage': ''}`, + }); } diff --git a/app/imports/api/creature/actions/applyProperties.js b/app/imports/api/creature/actions/applyProperties.js index 7aa98f4c..390c91f1 100644 --- a/app/imports/api/creature/actions/applyProperties.js +++ b/app/imports/api/creature/actions/applyProperties.js @@ -1,4 +1,5 @@ import applyAction from '/imports/api/creature/actions/applyAction.js'; +import applyAttack from '/imports/api/creature/actions/applyAttack.js'; import applyDamage from '/imports/api/creature/actions/applyDamage.js'; import applyBuff from '/imports/api/creature/actions/applyBuff.js'; @@ -15,7 +16,10 @@ function applyProperty(options){ switch (prop.type){ case 'action': case 'spell': + applyAction(options); + return true; case 'attack': + applyAttack(options); applyAction(options); return true; case 'damage': diff --git a/app/imports/api/parenting/parenting.js b/app/imports/api/parenting/parenting.js index 6c902d84..0c9132c3 100644 --- a/app/imports/api/parenting/parenting.js +++ b/app/imports/api/parenting/parenting.js @@ -205,7 +205,7 @@ export function getName(doc){ } export function nodeArrayToTree(nodes){ - // Store a dict of all the nodes + // Store a dict and list of all the nodes let nodeIndex = {}; let nodeList = []; nodes.forEach( node => { @@ -233,13 +233,11 @@ export function nodeArrayToTree(nodes){ return forest; } -export function nodesToTree({collection, ancestorId, filter, options}){ - if (!options) options = {}; - options.sort = {order: 1}; - let nodes = collection.find({ - 'ancestors.id': ancestorId, - removed: {$ne: true}, - ...filter, - }, options); +export function nodesToTree({collection, ancestorId, filter = {}, options = {}}){ + if (!('ancestors.id' in filter)) filter['ancestors.id'] = ancestorId; + if (!('removed' in filter)) filter['removed'] = {$ne: true}; + if (!options.sort) options.sort = {order: 1}; + if (!('order' in options.sort)) options.sort.order = 1; + let nodes = collection.find(filter, options); return nodeArrayToTree(nodes); } diff --git a/app/imports/math.js b/app/imports/math.js index 4b985968..19a9a821 100644 --- a/app/imports/math.js +++ b/app/imports/math.js @@ -1,5 +1,4 @@ import { create, all } from 'mathjs'; -import { Random } from 'meteor/random' const math = create(all); math.import({ @@ -7,11 +6,12 @@ math.import({ return pred ? a : b; }, 'roll': function(number, diceSize){ + let randomSrc = DDP.randomStream('diceRoller'); if (number > 100) throw 'Can only roll 100 dice at a time'; let rollTotal = 0; let i, roll; for (i = 0; i < number; i++){ - roll = ~~(Random.fraction() * diceSize) + 1 + roll = ~~(randomSrc.fraction() * diceSize) + 1 rollTotal += roll; } return rollTotal; diff --git a/app/imports/server/discord/webhook.js b/app/imports/server/discord/webhook.js new file mode 100644 index 00000000..3c4d1c25 --- /dev/null +++ b/app/imports/server/discord/webhook.js @@ -0,0 +1,7 @@ +import Discord from 'discord.js' +export default function sendWebhook({webhook, message}){ + // const hook = new Discord.WebhookClient(webhook.id, webhook.token); + const hook = new Discord.WebhookClient('420492135716880394', 'KHmRsf9QHd81C4LZOyQe_cUw5ua4ugSaIlpDMNWo3vcNHs0p0JBOHfeGWtHKqPXMYgkk'); + // Send a message using the webhook + hook.send(message); +} diff --git a/app/package-lock.json b/app/package-lock.json index e3b62748..3efcd45b 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -43,6 +43,21 @@ "resolved": "https://registry.npmjs.org/@chenfengyuan/vue-countdown/-/vue-countdown-1.1.5.tgz", "integrity": "sha512-BB0taTfJzxsXFUPioREWLKpMDdHOoD8EiSW6lhB3yCdJh3I7jiNQzC8Hw5dPxoPNgZekeEPMQwsdPkjQPyxIeA==" }, + "@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==" + }, + "@discordjs/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -54,6 +69,14 @@ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, + "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" + } + }, "acorn": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", @@ -142,6 +165,11 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", @@ -330,6 +358,14 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "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" + } + }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -428,6 +464,11 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -448,6 +489,21 @@ "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=" }, + "discord.js": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.2.0.tgz", + "integrity": "sha512-Ueb/0SOsxXyqwvwFYFe0msMrGqH1OMqpp2Dpbplnlr4MzcRrFWwsBM9gKNZXPVBHWUKiQkwU8AihXBXIvTTSvg==", + "requires": { + "@discordjs/collection": "^0.1.5", + "@discordjs/form-data": "^3.0.1", + "abort-controller": "^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" + } + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -670,6 +726,11 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "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==" + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -2020,6 +2081,19 @@ } } }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, "mimic-fn": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.0.0.tgz", @@ -2130,6 +2204,11 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, "node-pre-gyp": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", @@ -2321,6 +2400,11 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, + "prism-media": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.2.tgz", + "integrity": "sha512-I+nkWY212lJ500jLe4tN9tWO7nRiBAVdMv76P9kffZjYhw20raMlW1HSSvS+MLXC9MmbNZCazMrAr+5jEEgTuw==" + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -2503,6 +2587,11 @@ "resolved": false, "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -2720,6 +2809,11 @@ "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", "dev": true }, + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -2918,6 +3012,11 @@ "mkdirp": "^0.5.1" } }, + "ws": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", + "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==" + }, "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", diff --git a/app/package.json b/app/package.json index 0c3f037b..5023311c 100644 --- a/app/package.json +++ b/app/package.json @@ -25,6 +25,7 @@ "css-box-shadow": "^1.0.0-3", "date-fns": "^1.30.1", "ddp-rate-limiter-mixin": "^1.1.10", + "discord.js": "^12.2.0", "dompurify": "^2.0.10", "lodash": "^4.17.15", "marked": "^0.8.2",