diff --git a/.gitignore b/.gitignore index 9aa9b4b..4f7b827 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,4 @@ node_modules .env .eslintrc.js .eslintrc.json -dsabot.db diff --git a/_public_html/DSA5_Logo_small.png b/_public_html/DSA5_Logo_small.png new file mode 100644 index 0000000..a8baf74 Binary files /dev/null and b/_public_html/DSA5_Logo_small.png differ diff --git a/dsabot.db b/dsabot.db new file mode 100644 index 0000000..d845fc1 --- /dev/null +++ b/dsabot.db @@ -0,0 +1 @@ +{"user":"tobenderzephyr#2509","gold":0,"silver":0,"bronce":0,"iron":0,"hp":0,"character":{"age":"36","armor":[{"amount":1,"equipped":true,"ruleelement":{"id":"lederruestung","type":"armor"}}],"attributes":[{"id":"mut","level":12},{"id":"klugheit","level":11},{"id":"intuition","level":12},{"id":"charisma","level":11},{"id":"fingerfertigkeit","level":12},{"id":"gewandtheit","level":13},{"id":"konstitution","level":12},{"id":"koerperkraft","level":12}],"basevalues":[{"id":"lebensenergie"},{"id":"astralenergie"},{"id":"karmaenergie"},{"id":"seelenkraft"},{"id":"zaehigkeit"},{"id":"ausweichen"},{"id":"initiative"},{"id":"geschwindigkeit"},{"id":"schicksalspunkte"}],"checkrange":true,"combattechniques":[{"id":"dolche","level":8},{"id":"raufen","level":8}],"culture":"suedaventurier","disadvantages":[{"id":"angstvor","level":2,"variant":{"name":"Spinnen","type":"string"}},{"id":"schlechteeigenschaft","variant":{"apcost":-5,"name":"Neugier","type":"stringwithcost"}},{"id":"stigma","variant":{"name":"Grüne Haare","type":"string"}},{"id":"beidhaendig"},{"id":"glueck","level":1},{"id":"kaelteempfindlich"},{"id":"persoenlichkeitsschwaeche","variant":{"apcost":-5,"name":"Neid","type":"stringwithcost"}},{"id":"unscheinbar"},{"id":"herausragendersinngehoer"},{"id":"herausragendersinnsicht"},{"id":"schlechteangewohnheit","variant":{"name":"Raucher","type":"string"}},{"id":"unfaehig","variant":{"ruleelement":{"id":"booteschiffe","type":"skill"},"type":"ruleelement"}},{"id":"unfaehig","variant":{"ruleelement":{"id":"zechen","type":"skill"},"type":"ruleelement"}},{"id":"angstvor","level":1,"variant":{"name":"Schlangen","type":"string"}},{"id":"waffenbegabung","variant":{"ruleelement":{"id":"dolche","type":"combattechnique"},"type":"ruleelement"}}],"eyecolor":"grün","haircolor":"schwarz","height":"17300","meleeweapons":[{"amount":1,"equipped":true,"handling":[],"ruleelement":{"id":"dolch","type":"meleeweapon"}},{"amount":1,"equipped":true,"handling":[],"ruleelement":{"id":"waqqif","type":"meleeweapon"}}],"mothertongues":[{"id":"sprache","level":3,"variant":{"ruleelement":{"id":"garethi","type":"language"},"text":"Brabaci","type":"ruleelement"}}],"name":"Diego Lupinez","otherobjects":[{"amount":4,"ruleelement":{"id":"dietriche","type":"equipment"}},{"amount":2,"ruleelement":{"id":"falscherbart","type":"equipment"}},{"amount":2,"ruleelement":{"id":"peruecke","type":"equipment"}},{"amount":2,"ruleelement":{"id":"dolchscheide","type":"equipment"}},{"amount":1,"ruleelement":{"id":"verband","type":"equipment"}},{"amount":1,"ruleelement":{"id":"kletterseil10schritt","type":"equipment"}},{"amount":3,"ruleelement":{"id":"fesselseil","type":"equipment"}},{"amount":1,"ruleelement":{"id":"gugel","type":"equipment"}},{"amount":1,"ruleelement":{"id":"halstuch","type":"equipment"}},{"amount":1,"ruleelement":{"id":"geldbeutel","type":"equipment"}},{"amount":1,"ruleelement":{"id":"lederrucksack","type":"equipment"}},{"amount":1,"ruleelement":{"id":"geldkatze","type":"equipment"}},{"amount":1,"ruleelement":{"id":"zunder","type":"equipment"}},{"amount":1,"ruleelement":{"id":"papier1blatt","type":"equipment"}},{"amount":1,"ruleelement":{"id":"kohlestift","type":"equipment"}},{"amount":1,"ruleelement":{"id":"siegelwachs","type":"equipment"}},{"amount":1,"ruleelement":{"id":"tinte","type":"equipment"}},{"amount":1,"ruleelement":{"id":"federkiel","type":"equipment"}},{"amount":1,"ruleelement":{"id":"federmesser","type":"equipment"}},{"amount":1,"ruleelement":{"id":"kapuzenumhang","type":"equipment"}},{"amount":1,"ruleelement":{"id":"lederguertel","type":"equipment"}},{"amount":1,"ruleelement":{"id":"unterhosen","type":"equipment"}},{"amount":1,"ruleelement":{"id":"wollstruempfe","type":"equipment"}},{"amount":1,"ruleelement":{"id":"feile","type":"equipment"}},{"amount":1,"ruleelement":{"id":"proviant","type":"equipment"}}],"profession":"spitzel","professionname":"Spitzel","purse":"24945","race":"mittellaender","rangedweapons":[{"amount":2,"ruleelement":{"id":"wurfdolch","type":"rangedweapon"}}],"rules":{"focusrules":[{"choice":-1,"id":"liturgieerweiterungen"},{"choice":-1,"id":"predigtenundvisionen"},{"choice":-1,"id":"myranischesprachen"},{"choice":-1,"id":"kontaktebeiderheldenerschaffung"},{"choice":-1,"id":"spezielleverletzungenundbehandlung"},{"choice":-1,"id":"anbahnung"},{"choice":-1,"id":"uthurischesprachen"},{"choice":-1,"id":"liturgiestile"},{"choice":-1,"id":"sprachspezialisierungen"},{"choice":-1,"id":"trefferzonenregeln1"},{"choice":-1,"id":"zauberstile"},{"choice":-1,"id":"talismane"},{"choice":-1,"id":"zaubererweiterungen"},{"choice":-1,"id":"talentstile"},{"choice":-1,"id":"lebensstilregeln"},{"choice":-1,"id":"startkapitalnacherfahrung"},{"choice":-1,"id":"heldenundmeisterpersonen"},{"choice":-1,"id":"kontakteundverbindungen"},{"choice":-1,"id":"hoehereverteidigung"},{"id":"eigenschaftsobergrenze"},{"choice":-1,"id":"talentgruppenprobe"},{"choice":-1,"id":"merkmalsproben"},{"choice":-1,"id":"praegungen"},{"choice":-1,"id":"kampfstile"}],"rulebooks":["regelwerk"],"rulesystem":"dsa5aventurien","version":"3"},"sex":"male","shields":[],"skills":[{"id":"gaukeleien","level":4},{"id":"klettern","level":6},{"id":"koerperbeherrschung","level":6},{"id":"kraftakt","level":2},{"id":"schwimmen","level":4},{"id":"sinnesschaerfe","level":7},{"id":"taschendiebstahl","level":8},{"id":"verbergen","level":8},{"id":"betoeren","level":1},{"id":"gassenwissen","level":8},{"id":"menschenkenntnis","level":8},{"id":"ueberreden","level":7},{"id":"verkleiden","level":8},{"id":"willenskraft","level":6},{"id":"fesseln","level":6},{"id":"fischenangeln","level":1},{"id":"orientierung","level":4},{"id":"goetterkulte","level":2},{"id":"mechanik","level":5},{"id":"rechnen","level":3},{"id":"rechtskunde","level":3},{"id":"sagenlegenden","level":2},{"id":"booteschiffe","level":1},{"id":"handel","level":6},{"id":"heilkundegift","level":1},{"id":"malenzeichnen","level":8},{"id":"schloesserknacken","level":8}],"specialabilities":[{"id":"sprache","level":3,"variant":{"ruleelement":{"id":"garethi","type":"language"},"text":"Brabaci","type":"ruleelement"}},{"id":"fertigkeitsspezialisierung","variant":{"application":"sich Verstecken","skill":"verbergen","type":"skillspecialization"}},{"id":"dokumentenfaelscher"},{"id":"hehlerei"},{"id":"gelaendekunde","variant":{"name":"Gebirge","type":"string"}},{"id":"attackeverbessern"},{"id":"wachsamkeitverbessern"},{"id":"ausweichenverbessern"},{"id":"kreuzblock"},{"id":"verbessertesausweichen","level":1},{"id":"fallenentschaerfen"},{"id":"haltegriff"}],"uuid":"{271e0de0-eb6e-4855-9d2c-eafedc5c84ff}","weigth":"26800000","xp":{"startinglevel":"unerfahren"}},"_id":"ISYSf3TODovDAItl"} diff --git a/package-lock.json b/package-lock.json index 3875db5..d2acf48 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,6 +37,15 @@ "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", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, "binary-search-tree": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/binary-search-tree/-/binary-search-tree-0.2.5.tgz", @@ -53,6 +62,11 @@ "delayed-stream": "~1.0.0" } }, + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -154,11 +168,42 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" }, + "ow": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/ow/-/ow-0.4.0.tgz", + "integrity": "sha512-kJNzxUgVd6EF5LoGs+s2/etJPwjfRDLXPTCfEgV8At77sRrV+PSFA8lcoW2HF15Qd455mIR2Stee/2MzDiFBDA==" + }, + "ow-lite": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ow-lite/-/ow-lite-0.0.2.tgz", + "integrity": "sha1-359QDmdAtlkKHpqWVzDUmo61l9E=" + }, "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==" }, + "random": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/random/-/random-2.2.0.tgz", + "integrity": "sha512-4HBR4Xye4jJ41QBi6RfIaO1yKQpxVUZafQtdE6NvvjzirNlwWgsk3tkGLTbQtWUarF4ofZsUVEmWqB1TDQlkwA==", + "requires": { + "babel-runtime": "^6.26.0", + "ow": "^0.4.0", + "ow-lite": "^0.0.2", + "seedrandom": "^3.0.5" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" + }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", diff --git a/package.json b/package.json index 96b40aa..722916a 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,8 @@ "discord.js": "^12.5.0", "dotenv": "^8.2.0", "nedb": "^1.8.0", - "node-fetch": "^2.6.1" + "node-fetch": "^2.6.1", + "random": "^2.2.0" }, "devDependencies": { "jest": "^26.6.3" diff --git a/src/commands/HeadsOrTails.js b/src/commands/HeadsOrTails.js new file mode 100644 index 0000000..ef4c6f1 --- /dev/null +++ b/src/commands/HeadsOrTails.js @@ -0,0 +1,7 @@ +const globals = require('../globals'); +const Random = require('random') +module.exports = async (message, args, db) => { + Random.use(message.author.tag) + const coin = Random.int(0,1) + message.reply('Die Münze bleibt auf **' + globals.Coin[coin] + '** liegen.'); +}; \ No newline at end of file diff --git a/src/commands/attribute.js b/src/commands/attribute.js new file mode 100644 index 0000000..a89f345 --- /dev/null +++ b/src/commands/attribute.js @@ -0,0 +1,83 @@ +const globals = require('../globals'); +const Random = require('random') +module.exports = async (message, args, db) => { + try { + // user calls without arguments. + if (!args[0]) { + message.reply('Bitte gib mir ein Attributswert, oder das Attribut auf welches du würfeln möchtest.'); + return; + } + let level = 8; + let attributename; + + await db.find({ + user: message.author.tag, + }, async function(err, docs) { + + // user calls with text. need to gather info from database + if (isNaN(args[0])) { + if (!docs.length > 0) { + message.reply('Sorry, Für dich habe ich keinen Eintrag 😥\n' + + 'Bitte gib mir den Attributswert, auf welchen du würfeln möchtest.'); + return; + } + else { + // try to get id of short formatted attributes. + if (args[0].length == 2) { + for (const i in globals.Werte) { + if (globals.Werte[i].kuerzel == args[0].toUpperCase()) { + attributename = globals.Werte[i].id; + } + } + } + else { + attributename = args[0].toLowerCase(); + } + for (const i in docs[0].character.attributes) { + if (docs[0].character.attributes[i].id == attributename) level = docs[0].character.attributes[i].level; + } + } + } + else { + level = args[0]; + } + Random.use(message.author.tag) + const countOccurrences = (arr, val) => arr.reduce((a, v) => (v === val ? a + 1 : a), 0); + const dice = []; + dice.push(Random.int(1,20)); + if (dice[0] == 1 || dice[0] == 20) { + dice.push(Random.int(1,20)); + } + // handle crits + if (countOccurrences(dice, 1) == 2) { + message.reply('Du hast einen kritischen Erfolg erzielt (' + dice.join(', ') + ')! 🎉🥳🎆'); + return; + } + else if (countOccurrences(dice, 20) == 2) { + message.reply('Du hast einen Patzer (' + dice.join(', ') + ')! 😭 Viel Erfolg beim nächsten mal!'); + return; + } + if ((dice.length == 2 && dice[0] != 20 && dice[1] <= level) || (dice.length == 1 && dice[0] <= level)) { + if (attributename) { + message.reply('Du hast die Probe auf ' + attributename + ' (Stufe ' + level + ') bestanden.\n' + + 'Deine 🎲: ' + dice.join(', ')); + } + else { + message.reply('Du hast die Probe (Stufe ' + level + ') bestanden.\n' + + 'Deine 🎲: ' + dice.join(', ')); + } + } + else if (attributename) { + message.reply('Du hast die Probe auf ' + attributename + ' (Stufe ' + level + ') leider nicht bestanden 😢.\n' + + 'Deine 🎲: ' + dice.join(', ')); + } + else { + message.reply('Du hast die Probe (Stufe ' + level + ') leider nicht bestanden 😢.\n' + + 'Deine 🎲: ' + dice.join(', ')); + } + }); + } + catch (e) { + throw e; + } +}; \ No newline at end of file diff --git a/src/commands/help.js b/src/commands/help.js new file mode 100644 index 0000000..2cbed93 --- /dev/null +++ b/src/commands/help.js @@ -0,0 +1,60 @@ +const Discord = require('discord.js') +const cmdprefix = process.env.CMDPREFIX||'!' +module.exports = async (message, args, db) => { + const Help = new Discord.MessageEmbed() + .setColor('#0099ff') + .setTitle('Hilfe') + .setDescription('Das sind die Befehle, die du verwenden kannst.\n' + + 'Werte in Klammern müssen nicht mit angegeben werden.') + + .addFields({ + name: cmdprefix + 'kopf', + value: 'Wirf eine Münze. Kopf oder Zahl?', + inline: false + }, { + name: cmdprefix + 'roll W ', + value: 'Lass die Würfel rollen. Benötigt wird die Anzahl sowie die Augenzahl auf den Würfeln.', + inline: false + }, { + name: cmdprefix + 'ep/ap ', + value: ' Du machst eine Eigenschaftsprobe / Attributprobe.\n' + + ' Du würfelst mit einem W20 auf deinen Eigenschaftswert.\n' + + ' Bei einer 1 oder 20 wird der Bestätigungswurf ausgeführt.', + inline: false + }, { + name: cmdprefix + 'tp/fp (Fertigkeitswert) (+Erleichtert/-Erschwert)', + value: ' Du machst eine Fertigkeitsprobe.\n' + + ' Es werden drei Würfel auf deine Eigenschaftswerte geworfen. Hast du Boni auf dein Talent und/oder' + + ' ist der Wurf erleichtert oder erschwert, wird dies in die Berechnung einbezogen.', + inline: false + }, { + name: cmdprefix + 'talents', + value: ' Du erhälst eine Liste mit den Talentnamen, die du für ' + + cmdprefix + 'talent/' + cmdprefix + 'skill nutzen kannst.', + inline: false + }, { + name: '\u200B', + value: '\u200B' + }, { + name: '\u200B', + value: 'Wenn du mir deine .tdc Datei zusendest, kannst du folgendes nutzen:' + }, { + name: cmdprefix + 'ep/ap [Klugheit] oder ' + cmdprefix + 'ep/ap [FF]', + value: 'siehe oben. Du brauchst deinen Wert nicht wissen.', + inline: false + }, { + name: cmdprefix + 'talent (+Erleichtert/-Erschwert)', + value: 'siehe tp. Allerdings musst du deine Werte nicht wissen.', + inline: false + }, { + name: cmdprefix + 'skill ', + value: 'Zeigt dir deinen Fertigkeitswert im jeweiligen Talent.', + inline: false + }, { + name: cmdprefix + 'remove', + value: 'Löscht deinen Charakter aus der Datenbank. Sinnvoll, wenn du mir eine neue zusenden möchtest.', + inline: false + } + ) + message.author.send(Help); +}; \ No newline at end of file diff --git a/src/commands/index.js b/src/commands/index.js index 655cd40..1390a3a 100644 --- a/src/commands/index.js +++ b/src/commands/index.js @@ -9,6 +9,14 @@ const tp = require('./tp'); const talent = require('./talent'); const skill = require('./skill'); const createFromFile = require('./createFromFile'); +const kopf = require('./HeadsOrTails'); +const zahl = require('./HeadsOrTails'); +const heads = require('./HeadsOrTails'); +const tails = require('./HeadsOrTails'); +const ep = require('./attribute'); +const ap = require('./attribute'); +const help = require('./help') +const talents = require('./talents') require('dotenv').config(); const cmdprefix = process.env.CMDPREFIX || '!'; @@ -22,7 +30,16 @@ const commands = { skill, tp, talent, + talents, + kopf, + zahl, + heads, + tails, + ep, + ap, + help }; + const Datastore = require('nedb'), db = new Datastore({ filename: 'data/dsabot.db', @@ -30,7 +47,7 @@ const Datastore = require('nedb'), }); module.exports = async (message) => { - console.log(`${new Date().toUTCString()} ${message.author.tag} (size: ${message.attachments.size})`) + console.log(`${new Date().toUTCString()} ${message.author.tag} (size: ${message.attachments.size})`); if ((message.attachments.size > 0) && message.channel.type == 'dm' && !message.author.bot) { try { const response = await fetch(message.attachments.first().url); diff --git a/src/commands/remove.js b/src/commands/remove.js index 662174b..c83ffae 100644 --- a/src/commands/remove.js +++ b/src/commands/remove.js @@ -1,53 +1,6 @@ module.exports = async (message, args, db) => { - let n; - - if(!isNaN(args[0]) && (args[1] === 'GD' || args[1] === 'ST' || args[1] === 'BH' || args[1] === 'EK')) { - // eslint-disable-next-line no-undef - db.query('SELECT * FROM dsageld WHERE userName = ' + '"' + message.author.tag + '"', function(err, row) { // the row is the user's data - if(row && err) { - message.reply('Es gab einen Fehler.'); - } - if(typeof (row) == 'undefined') { // if the user is not in the database - message.reply('Es existiert kein Eintrag für dich füge ihn mit !create hinzu.'); - } - else { // if the user is in the database - - if(args[1] === 'GD') { - n = parseInt(row[0].GD, 10) - parseInt(args[0], 10); - } - else if(args[1] === 'ST') { - n = parseInt(row[0].ST, 10) - parseInt(args[0], 10); - } - else if(args[1] === 'BH') { - n = parseInt(row[0].BH, 10) - parseInt(args[0], 10); - } - else if(args[1] === 'EK') { - n = parseInt(row[0].EK, 10) - parseInt(args[0], 10); - } - else if(args[1] === 'LP') { - n = parseInt(row[0].EK, 10) - parseInt(args[0], 10); - } - - if(n >= 0) { - // eslint-disable-next-line no-undef - db.query('UPDATE dsageld SET' + '`' + args[1] + '`' + ' = (' + n + ') WHERE userName = ' + '"' + message.author.tag + '"'); - // eslint-disable-next-line no-undef - db.query('SELECT * FROM dsageld WHERE userName = ' + '"' + message.author.tag + '"', function(err, row) { // the row is the user's data - message.reply(args[0] + args[1] + ' abgezogen, du hast: ' + row[0].GD + 'GD, ' + row[0].ST + 'ST, ' + row[0].BH + 'BH, ' + row[0].EK + 'EK,' + row[0].LP + 'LeP.'); - }); - } - else if(n < 0 && !(args[1] === 'LP')) { - message.reply('du hast nicht genügend ' + args[1]); - } - else if(n < 0 && args[1] === 'LP') { - // eslint-disable-next-line no-undef - db.query('UPDATE dsageld SET' + '`' + args[1] + '`' + ' = (' + n + ') WHERE userName = ' + '"' + message.author.tag + '"'); - // eslint-disable-next-line no-undef - db.query('SELECT * FROM dsageld WHERE userName = ' + '"' + message.author.tag + '"', function(err, row) { // the row is the user's data - message.reply('Deine LeP sind unter Null: ' + n + ' LeP.'); - }); - } - } - }); - } + db.remove({ user: message.author.tag }, {}, function(err, numRemoved) { + message.reply('Ich habe deine Daten gelöscht.\n' + + 'Wenn dir danach ist, kannst du mir gerne wieder eine neue Datei zusenden.'); + }); }; \ No newline at end of file diff --git a/src/commands/roll.js b/src/commands/roll.js index 9166190..84846f7 100644 --- a/src/commands/roll.js +++ b/src/commands/roll.js @@ -1,18 +1,26 @@ // eslint-disable-next-line no-unused-vars +const globals = require('../globals') +const Random = require('random') module.exports = async (message, args, db) => { - if (!args.length == 3) { - message.reply('Du hast die Würfel nicht korrekt angegeben.'); - } + Random.use(message.author.tag) + let msg; + let arguments = args.join(''); + arguments = arguments.split(globals.DiceRegex); - else if(!isNaN(args[0]) && !isNaN(args[2]) && args[0] > 0 && args[2] > 0) { + if (arguments.length == 2) { + let numberOfDice = arguments[0]; + const diceValues = arguments[1]; const roll = []; - for (let i = 0; i < args[0]; i++) { - const a = Math.floor(Math.random() * args[2]) + 1; + for (let i = 0; i < numberOfDice; i++) { + const a = Random.int(1,diceValues); roll.push(a); } - message.reply('Deine Würfe(' + args[0] + 'W' + args[2] + '): ' + roll.join(', ') + '.'); + if(numberOfDice == 1) { msg = 'n';} + else { msg = ' ' + numberOfDice;} + message.reply('Das sind deine Ergebnisse für deine' + msg + ' ' + diceValues + '-seitigen 🎲: ' + roll.join(', ') + '.'); } else { - message.reply('Du hast die Würfel nicht korrekt angegeben.'); + message.reply('Leider kann ich damit nichts anfangen. Bitte noch einmal so probieren:\n' + + '!roll W '); } }; \ No newline at end of file diff --git a/src/commands/show.js b/src/commands/show.js index 0c13169..3e3f61a 100644 --- a/src/commands/show.js +++ b/src/commands/show.js @@ -20,17 +20,4 @@ module.exports = async (message, args, db) => { catch (e) { throw e; } - - - /* db.query('SELECT * FROM dsageld WHERE userName = ' + '"' + message.author.tag + '"', function(err, row) { //the row is the user's data - if(row && err) { - message.reply('Es gab einen Fehler.'); - } - if(row.length < 1) { //if the user is not in the database - message.reply('Es existiert kein Eintrag für dich füge ihn mit !create hinzu.'); - } else if(row.length >= 1){ - message.reply('du hast: ' + row[0].GD + ' GD, ' + row[0].ST + ' ST, ' + row[0].BH + ' BH, ' + row[0].EK + ' EK.' + row[0].LP + ' LeP.'); - } - } - );*/ }; \ No newline at end of file diff --git a/src/commands/talent.js b/src/commands/talent.js index 1f99f3c..f7d23fb 100644 --- a/src/commands/talent.js +++ b/src/commands/talent.js @@ -1,4 +1,5 @@ const globals = require('../globals'); +const Random = require('random') module.exports = async (message, args, db) => { try { db.find({ @@ -6,7 +7,14 @@ module.exports = async (message, args, db) => { }, function(err, docs) { if (!docs.length > 0) {message.reply('Sorry, Für dich habe ich keinen Eintrag 😥');} else { - if (!args) message.reply('Sorry, du musst mir schon etwas zum prüfen geben.'); + + if (!args){ + message.reply('Sorry, du musst mir schon etwas zum prüfen geben.'); + return + } + + Random.use(message.author.tag) + if (args[1]) { var erschwernis = parseInt(args[1]); } @@ -15,15 +23,31 @@ module.exports = async (message, args, db) => { } const values = []; const roll = []; + let found = false; + let talent let bonus = 0; let ok = 0; let patzer = 0; let crit = 0; - for (i in docs[0].character.skills) { - if (docs[0].character.skills[i].id == args[0]) bonus = docs[0].character.skills[i].level; + + for (i in globals.Talente) + { + if (globals.Talente[i].id.toLowerCase() == args[0].toLowerCase()||globals.Talente[i].name.toLowerCase()==args[0].toLowerCase()) { + found=true + talent = globals.Talente[i].id + break; + } } + if (!found) { + message.reply('Sorry, das Talent ist mir unbekannt.'); + return; + } + for (i in docs[0].character.skills) { + if (docs[0].character.skills[i].id == talent) {bonus = docs[0].character.skills[i].level; found = true;} + } + const bonus_orig = bonus; - const result = globals.Talente.find(talent => talent.id === args[0]); + const result = globals.Talente.find(t => t.id === talent); for (i in result.values) { const kuerzel = globals.Werte.find(wert => wert.kuerzel === result.values[i]); @@ -31,13 +55,9 @@ module.exports = async (message, args, db) => { if (docs[0].character.attributes[val].id == kuerzel.id) values.push(docs[0].character.attributes[val].level); } } - // message.reply(`Du musst mit ${result.values.join(", ")} würfeln. Die werte sind: ${values.join(", ")}. Dein Bonus auf ${result.name}: ${bonus}`) - - // roll dice. for (i = 1; i <= 3; i++) { - const a = Math.floor(Math.random() * 20 + 1); - roll.push(a); + roll.push(Random.int(1,20)); } // compare results for (i = 0; i < 3; i++) { @@ -73,8 +93,6 @@ module.exports = async (message, args, db) => { 'Das waren deine 🎲: ' + roll.join(', ') + '. Damit hast du ' + ok + '/3 Proben bestanden. Dein Bonus: ' + bonus + '/' + bonus_orig + '.', ); } - - } }); } diff --git a/src/commands/talents.js b/src/commands/talents.js new file mode 100644 index 0000000..19b9f9c --- /dev/null +++ b/src/commands/talents.js @@ -0,0 +1,26 @@ +const globals = require('../globals') +const Discord = require('discord.js') +module.exports = async (message, args, db) => { + let fields = [] + for (let i in globals.TalentKategorien) { + let ability = [] + for (let a in globals.Talente) { + if(globals.Talente[a].categoryid == i) { + ability.push(globals.Talente[a].id.charAt(0).toUpperCase() + globals.Talente[a].id.slice(1)); + } + } + ability.sort() + fields.push(ability) + } + + const Embed = new Discord.MessageEmbed() + .setColor('#0099ff') + .setTitle('Talentübersicht') + .setDescription('Das sind die Talente, die ich kenne:') + for (let i in fields) { + Embed.addField(globals.TalentKategorien[i], fields[i].join('\n'), true); + } + message.author.send( + Embed + ); +}; \ No newline at end of file diff --git a/src/commands/tp.js b/src/commands/tp.js index 8ca182f..b350ee3 100644 --- a/src/commands/tp.js +++ b/src/commands/tp.js @@ -1,10 +1,12 @@ // eslint-disable-next-line no-unused-vars +const Random = require('random') module.exports = async (message, args, db) => { if (args.length < 3) { message.reply('Der Talentwurf funktioniert so:\n' + '!tp Eigenschaftswert1 Eigenschaftswert2 Eigenschaftswert3 [Bonus] [Erschwernis]'); } else { + Random.use(message.author.tag) const roll = []; if (args[3]) { var bonus = parseInt(args[3]); @@ -19,8 +21,7 @@ module.exports = async (message, args, db) => { erschwernis = 0; } for (i = 1; i <= 3; i++) { - const a = Math.floor(Math.random() * 20 + 1); - roll.push(a); + roll.push(Random.int(1,20)); } let ok = 0; let patzer = 0; diff --git a/src/globals.js b/src/globals.js index 03fb487..a110030 100644 --- a/src/globals.js +++ b/src/globals.js @@ -1,10 +1,9 @@ const money = [{ 'GD': 'Golddukaten', 'ST': 'Silbertaler', - - }]; - +const DiceRegex = /\s?[DdWw]\s?/; +const Coin = ['Kopf', 'Zahl']; const Werte = [ { id: 'mut', kuerzel: 'MU', name: 'Mut' }, { id: 'klugheit', kuerzel: 'KL', name: 'Klugheit' }, @@ -15,74 +14,75 @@ const Werte = [ { id: 'konstitution', kuerzel: 'KO', name: 'Konstitution' }, { id: 'koerperkraft', kuerzel: 'KK', name: 'Körperkraft' }, ]; +const TalentKategorien = ['Körpertalente','Gesellschaftstalente','Naturtalente','Wissenstalente','Handwerkstalente'] const Talente = [ // Körpertalente - { id: 'fliegen', name: 'Fliegen', values: ['MU', 'IN', 'GE'] }, - { id: 'gaukeleien', name: 'Gaugekleien', values: ['MU', 'CH', 'FF'] }, - { id: 'klettern', name:'Klettern', values: ['MU', 'GE', 'KK'] }, - { id: 'koerperbeherrschung', name: 'Körperbeherrschung', values: ['GE', 'GE', 'KO'] }, - { id: 'kraftakt', name: 'Kraftakt', values: ['KO', 'KK', 'KK'] }, - { id: 'reiten', name: 'Reiten', values: ['CH', 'GE', 'KK'] }, - { id: 'schwimmen', name: 'Schwimmen', values: ['GE', 'KO', 'KK'] }, - { id: 'selbstbeherrschung', name: 'Selbstbeherrschung', values: ['MU', 'MU', 'KO'] }, - { id: 'singen', name: 'Singen', values: ['KL', 'CH', 'KO'] }, - { id: 'sinnesschaerfe', name: 'Sinnesschärfe', values: ['KL', 'IN', 'IN'] }, - { id: 'tanzen', name: 'Tanzen', values: ['KL', 'CH', 'GE'] }, - { id: 'taschendiebstahl', name: 'Taschendiebstahl', values: ['MU', 'FF', 'GE'] }, - { id: 'verbergen', name: 'Verbergen', values: ['MU', 'IN', 'GE'] }, - { id: 'zechen', name: 'Zechen', values: ['KL', 'KO', 'KK'] }, + { id: 'fliegen', name: 'Fliegen', values: ['MU', 'IN', 'GE'], categoryid: 0 }, + { id: 'gaukeleien', name: 'Gaugekleien', values: ['MU', 'CH', 'FF'], categoryid: 0 }, + { id: 'klettern', name:'Klettern', values: ['MU', 'GE', 'KK'], categoryid: 0 }, + { id: 'koerperbeherrschung', name: 'Körperbeherrschung', values: ['GE', 'GE', 'KO'], categoryid: 0 }, + { id: 'kraftakt', name: 'Kraftakt', values: ['KO', 'KK', 'KK'], categoryid: 0 }, + { id: 'reiten', name: 'Reiten', values: ['CH', 'GE', 'KK'], categoryid: 0 }, + { id: 'schwimmen', name: 'Schwimmen', values: ['GE', 'KO', 'KK'], categoryid: 0 }, + { id: 'selbstbeherrschung', name: 'Selbstbeherrschung', values: ['MU', 'MU', 'KO'], categoryid: 0 }, + { id: 'singen', name: 'Singen', values: ['KL', 'CH', 'KO'], categoryid: 0 }, + { id: 'sinnesschaerfe', name: 'Sinnesschärfe', values: ['KL', 'IN', 'IN'], categoryid: 0 }, + { id: 'tanzen', name: 'Tanzen', values: ['KL', 'CH', 'GE'], categoryid: 0 }, + { id: 'taschendiebstahl', name: 'Taschendiebstahl', values: ['MU', 'FF', 'GE'], categoryid: 0 }, + { id: 'verbergen', name: 'Verbergen', values: ['MU', 'IN', 'GE'], categoryid: 0 }, + { id: 'zechen', name: 'Zechen', values: ['KL', 'KO', 'KK'], categoryid: 0 }, // Gesellschaftstalente - { id: 'bekehrenueberzeugen', name: 'Bekehren & Überzeugen', values: ['MU', 'KL', 'CH'] }, - { id: 'betoeren', name: 'Betören', values: ['MU', 'CH', 'CH'] }, - { id: 'einschuechtern', name: 'Einschüchtern', values: ['MU', 'IN', 'CH'] }, - { id: 'etikette', name: 'Etikette', values: ['KL', 'IN', 'CH'] }, - { id: 'gassenwissen', name: 'Gassenwissen', values: ['KL', 'IN', 'CH'] }, - { id: 'menschenkenntnis', name: 'Menschenkenntnis', values: ['KL', 'IN', 'CH'] }, - { id: 'ueberreden', name: 'Überreden', values: ['MU', 'IN', 'CH'] }, - { id: 'willenskraft', name: 'Willenskraft', values: ['MU', 'IN', 'CH'] }, + { id: 'bekehrenueberzeugen', name: 'Bekehren & Überzeugen', values: ['MU', 'KL', 'CH'], categoryid: 1 }, + { id: 'betoeren', name: 'Betören', values: ['MU', 'CH', 'CH'], categoryid: 1 }, + { id: 'einschuechtern', name: 'Einschüchtern', values: ['MU', 'IN', 'CH'], categoryid: 1 }, + { id: 'etikette', name: 'Etikette', values: ['KL', 'IN', 'CH'], categoryid: 1 }, + { id: 'gassenwissen', name: 'Gassenwissen', values: ['KL', 'IN', 'CH'], categoryid: 1 }, + { id: 'menschenkenntnis', name: 'Menschenkenntnis', values: ['KL', 'IN', 'CH'], categoryid: 1 }, + { id: 'ueberreden', name: 'Überreden', values: ['MU', 'IN', 'CH'], categoryid: 1 }, + { id: 'willenskraft', name: 'Willenskraft', values: ['MU', 'IN', 'CH'], categoryid: 1 }, // Naturtalente - { id: 'faehrtensuchen', name: 'Fährtensuchen', values: ['MU', 'IN', 'GE'] }, - { id: 'fesseln', name: 'Fesseln', values: ['KL', 'FF', 'KK'] }, - { id: 'fischenangeln', name: 'Fischen & Angeln', values: ['FF', 'GE', 'KO'] }, - { id: 'orientierung', name: 'Orientierung', values: ['KL', 'IN', 'IN'] }, - { id: 'pflanzenkunde', name: 'Pflanzenkunde', values: ['KL', 'FF', 'KO'] }, - { id: 'tierkunde', name: 'Tierkunde', values: ['MU', 'MU', 'CH'] }, - { id: 'wildnisleben', name: 'Wildnisleben', values: ['MU', 'GE', 'KO'] }, + { id: 'faehrtensuchen', name: 'Fährtensuchen', values: ['MU', 'IN', 'GE'], categoryid: 2 }, + { id: 'fesseln', name: 'Fesseln', values: ['KL', 'FF', 'KK'], categoryid: 2 }, + { id: 'fischenangeln', name: 'Fischen & Angeln', values: ['FF', 'GE', 'KO'], categoryid: 2 }, + { id: 'orientierung', name: 'Orientierung', values: ['KL', 'IN', 'IN'], categoryid: 2 }, + { id: 'pflanzenkunde', name: 'Pflanzenkunde', values: ['KL', 'FF', 'KO'], categoryid: 2 }, + { id: 'tierkunde', name: 'Tierkunde', values: ['MU', 'MU', 'CH'], categoryid: 2 }, + { id: 'wildnisleben', name: 'Wildnisleben', values: ['MU', 'GE', 'KO'], categoryid: 2 }, // Wissenstalente - { id: 'brettspiel', name: 'Brett- & Glücksspiel', values: ['KL', 'KL', 'IN'] }, - { id: 'geographie', name: 'Geographie', values: ['KL', 'KL', 'IN'] }, - { id: 'geschichtswissen', name: 'Geschichtswissen', values: ['KL', 'KL', 'IN'] }, - { id: 'goetterkulte', name: 'Götter & Kulte', values: ['KL', 'KL', 'IN'] }, - { id: 'kriegkunst', name: 'Kriegskunst', values: ['MU', 'KL', 'IN'] }, - { id: 'magiekunde', name: 'Magiekunde', values: ['KL', 'KL', 'IN'] }, - { id: 'mechanik', name: 'Mechanik', values: ['KL', 'KL', 'FF'] }, - { id: 'rechnen', name: 'Rechnen', values: ['KL', 'KL', 'IN'] }, - { id: 'rechtskunde', name: 'Rechtskunde', values: ['KL', 'KL', 'IN'] }, - { id: 'sagenlegenden', name: 'Sagen & Legenden', values: ['KL', 'KL', 'IN'] }, - { id: 'sphaerenkunde', name: 'Sphärenkunde', values: ['KL', 'KL', 'IN'] }, - { id: 'sternkunde', name: 'Sternkunde', values: ['KL', 'KL', 'IN'] }, + { id: 'brettspiel', name: 'Brett- & Glücksspiel', values: ['KL', 'KL', 'IN'], categoryid: 3 }, + { id: 'geographie', name: 'Geographie', values: ['KL', 'KL', 'IN'], categoryid: 3 }, + { id: 'geschichtswissen', name: 'Geschichtswissen', values: ['KL', 'KL', 'IN'], categoryid: 3 }, + { id: 'goetterkulte', name: 'Götter & Kulte', values: ['KL', 'KL', 'IN'], categoryid: 3 }, + { id: 'kriegkunst', name: 'Kriegskunst', values: ['MU', 'KL', 'IN'], categoryid: 3 }, + { id: 'magiekunde', name: 'Magiekunde', values: ['KL', 'KL', 'IN'], categoryid: 3 }, + { id: 'mechanik', name: 'Mechanik', values: ['KL', 'KL', 'FF'], categoryid: 3 }, + { id: 'rechnen', name: 'Rechnen', values: ['KL', 'KL', 'IN'], categoryid: 3 }, + { id: 'rechtskunde', name: 'Rechtskunde', values: ['KL', 'KL', 'IN'], categoryid: 3 }, + { id: 'sagenlegenden', name: 'Sagen & Legenden', values: ['KL', 'KL', 'IN'], categoryid: 3 }, + { id: 'sphaerenkunde', name: 'Sphärenkunde', values: ['KL', 'KL', 'IN'], categoryid: 3 }, + { id: 'sternkunde', name: 'Sternkunde', values: ['KL', 'KL', 'IN'], categoryid: 3 }, // Handwerkstalente - { id: 'alchimie', name: 'Alchimie', values: ['MU', 'KL', 'FF'] }, - { id: 'boote', name: 'Boote & Schiffe', values: ['FF', 'GE', 'KK'] }, - { id: 'fahrzeuge', name: 'Fahrzeuge', values: ['CH', 'FF', 'KO'] }, - { id: 'handel', name: 'Handel', values: ['KL', 'IN', 'CH'] }, - { id: 'heilkundegift', name: 'Heilkunde: Gift', values: ['MU', 'KL', 'IN'] }, - { id: 'heilkundekrankheiten', name: 'Heilkunde: Krankheiten', values: ['MU', 'IN', 'KO'] }, - { id: 'heilkundeseele', name: 'Heilkunde: Seele', values: ['IN', 'CH', 'KO'] }, - { id: 'heilkundewunden', name: 'Heilkunde: Wunden', values: ['KL', 'FF', 'FF'] }, - { id: 'holzbearbeitung', name: 'Holzbearbeitung', values: ['FF', 'GE', 'KK'] }, - { id: 'lebensmittel', name: 'Lebensmittelbearbeitung', values: ['IN', 'FF', 'FF'] }, - { id: 'lederbearbeitung', name: 'Lederbearbeitung', values: ['FF', 'GE', 'KO'] }, - { id: 'malenzeichnen', name: 'Malen & Zeichnen', values: ['IN', 'FF', 'FF'] }, - { id: 'musizieren', name: 'Musizieren', values: ['CH', 'FF', 'KO'] }, - { id: 'schloesserknacken', name: 'Schlösserknacken', values: ['IN', 'FF', 'FF'] }, - { id: 'steinbearbeitung', name: 'Steinbearbeitung', values: ['FF', 'FF', 'KK'] }, - { id: 'stoffbearbeitung', name: 'Stoffbearbeitung', values: ['KL', 'FF', 'FF'] }, + { id: 'alchimie', name: 'Alchimie', values: ['MU', 'KL', 'FF'], categoryid: 4 }, + { id: 'boote', name: 'Boote & Schiffe', values: ['FF', 'GE', 'KK'], categoryid: 4 }, + { id: 'fahrzeuge', name: 'Fahrzeuge', values: ['CH', 'FF', 'KO'], categoryid: 4 }, + { id: 'handel', name: 'Handel', values: ['KL', 'IN', 'CH'], categoryid: 4 }, + { id: 'heilkundegift', name: 'Heilkunde: Gift', values: ['MU', 'KL', 'IN'], categoryid: 4 }, + { id: 'heilkundekrankheiten', name: 'Heilkunde: Krankheiten', values: ['MU', 'IN', 'KO'], categoryid: 4 }, + { id: 'heilkundeseele', name: 'Heilkunde: Seele', values: ['IN', 'CH', 'KO'], categoryid: 4 }, + { id: 'heilkundewunden', name: 'Heilkunde: Wunden', values: ['KL', 'FF', 'FF'], categoryid: 4 }, + { id: 'holzbearbeitung', name: 'Holzbearbeitung', values: ['FF', 'GE', 'KK'], categoryid: 4 }, + { id: 'lebensmittel', name: 'Lebensmittelbearbeitung', values: ['IN', 'FF', 'FF'], categoryid: 4 }, + { id: 'lederbearbeitung', name: 'Lederbearbeitung', values: ['FF', 'GE', 'KO'], categoryid: 4 }, + { id: 'malenzeichnen', name: 'Malen & Zeichnen', values: ['IN', 'FF', 'FF'], categoryid: 4 }, + { id: 'musizieren', name: 'Musizieren', values: ['CH', 'FF', 'KO'], categoryid: 4 }, + { id: 'schloesserknacken', name: 'Schlösserknacken', values: ['IN', 'FF', 'FF'], categoryid: 4 }, + { id: 'steinbearbeitung', name: 'Steinbearbeitung', values: ['FF', 'FF', 'KK'], categoryid: 4 }, + { id: 'stoffbearbeitung', name: 'Stoffbearbeitung', values: ['KL', 'FF', 'FF'], categoryid: 4 }, ]; -module.exports = { Werte, Talente }; \ No newline at end of file +module.exports = { Werte, Talente, Coin, TalentKategorien, DiceRegex }; \ No newline at end of file diff --git a/src/index.js b/src/index.js index b637961..450ab9f 100644 --- a/src/index.js +++ b/src/index.js @@ -1,7 +1,6 @@ require('dotenv').config(); const Discord = require('discord.js'); const client = new Discord.Client(); -const SERVERID = process.env.SERVERID; const commandHandler = require('./commands'); client.on('message', commandHandler); @@ -23,4 +22,4 @@ client.on('disconnect', message => { client.on('reconnecting', message => { console.log('User Reconnecting'); -}); \ No newline at end of file +});