nyx

The first CODM discrod bot -- cath.exe Template
git clone https://codeberg.org/night0721/nyx
Log | Files | Refs | LICENSE

commit 940fe839a168559d2d405c86b47ba30a3a2e985a
parent b946d5f41139430a12894a197fa659a956f9de0c
Author: night0721 <[email protected]>
Date:   Mon, 14 Jun 2021 18:53:39 +0800

v2.0.1, added and edited new cmds

Diffstat:
M.gitignore | 4++--
Mcat/Path/fight.js | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------
Acommands/Moderation/pin.js | 26++++++++++++++++++++++++++
Mcommands/Owner/eval.js | 127+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------
Acommands/Utilities/docs.js | 19+++++++++++++++++++
Mevents/guildDelete.js | 16+++++++++-------
Mpackage-lock.json | 2+-
Mpackage.json | 5+++--
Mutil/err.js | 9+++++++++
Dutil/functions/common.js | 767-------------------------------------------------------------------------------
10 files changed, 228 insertions(+), 831 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -1,6 +1,6 @@ node_modules/ /.env -/commands/CODM/ +commands/CODM/ /dashboard/ /util/Data/aliases.json /util/Data/attachments.json @@ -9,6 +9,6 @@ node_modules/ /util/Data/perk.json /util/Data/skins.json /util/Data/weapons.json -/util/functions/common.json +/util/functions/common.js /util/bash.sh /bot.js \ No newline at end of file diff --git a/cat/Path/fight.js b/cat/Path/fight.js @@ -1,35 +1,73 @@ const { Client, Message, MessageEmbed } = require("discord.js"); module.exports = { name: "fight", - description: "Gooooooooooooooooooolag!", - timeout: 10000, + description: "Goooooooooooooooolag!", + timeout: 15000, /** * @param {Client} client * @param {Message} message * @param {String[]} args */ run: async (client, message, args) => { - const Fight = [ - "`Snow Gae`", - "`Not Gae`", - "`Ultimate Gae`", - "`Gae`", - "`Gae beyond repair`", - "`Akimbo Gae`", - "`Mega Gae`", - "`Super Gae`", - "`Ultra Gae`", - "`Terminal Gae`", - "`Dead`", - "`Path Gae`", - "`Cheez Gae`", - "`Zero Gae`", - "`KDR Gae`", - "`! not Gae`", + const gaes = [ + "Gae", + "Super Gae", + "Ultra Gae", + "Snow Gae", + "Ultimate Gae", + "Terminal Gae", + "Akimbo Gae", + "Dead(extended timer)", + "Mega Gae", + "Cheez Gae", + "Gath Gae", + "Koosun Gae", + "KDR Gae", + "Gaezer Gae", + "Big Gae", + "Horni Gae", + "Zero Gae", + "Gae beyond repair", + "Dead×2(extended timer)", + "Not Gae", + "Animus Gae", + "Dust Gae", + "Orcus Gae", + "Gulag Cleaner", + "Kedar Gae", + "Smol Gae", + "Meta Gae", + "Mono Gae", + "Stippled Gae", + "BSA Gae", + "Oreo Gae", + "Random Gae", + "Tortol Gae", + "Amogus Gae", + "Gae×2", + "Dan Gae", + "Real Gae©®™", + "Mastered Ultra Instinct Gae", + "Bamboozled", + "More Gae", + "Morrre Gae", + "Most Gae", + "Undisputable Gae", + "Gae Prince of Horni", + "Gae with Y", + "Phatopenisis Gae", + "Gathophile", + "a Bot", + "locknload with 200 round RPD gae", + "ros gae", ]; - const fightIndex = Fight[Math.floor(Math.random() * Fight.length)]; - message.channel.send( - `**You have taken a chance at redemption in The Gulag, you fight only to find out that you're ${fightIndex}. If you somehow turned out to not be gae, DM an admin to get unmuted early you lucky bastard!!**` - ); + const gae = gaes[Math.floor(Math.random() * gaes.length)]; + const embed = new MessageEmbed() + .setTitle("**Gulag Fight**") + .setDescription( + `**${message.author}has taken a chance at redemption in The Gulag. \nYou fight only to find out that you're \`${gae}\`. If you somehow turned out to not be gae, DM an admin to get your timer halved ||only if your mute is less than 69m||**` + ) + .setColor(5198940); + message.channel.send(embed); }, }; diff --git a/commands/Moderation/pin.js b/commands/Moderation/pin.js @@ -0,0 +1,26 @@ +const { Client, Message, MessageEmbed } = require("discord.js"); + +module.exports = { + name: "pin", + usage: "(Message ID)", + description: "Pin a message in the server", + BotPerm: "MANAGE_MESSAGES", + UserPerm: "MANAGE_MESSAGES", + /** + * @param {Client} client + * @param {Message} message + * @param {String[]} args + */ + run: async (client, message, args) => { + if (!args[0]) return client.err(message, "Moderation", "pin", 27); + try { + const ch = message.guild.channels.cache.get(message.channel.id); + const msgs = await ch.messages.fetch(args[0]); + if (!msgs) return client.err(message, "Moderation", "pin", 52); + await msgs.pin(); + } catch (e) { + console.log(e); + return client.err(message, "Moderation", "pin", 999); + } + }, +}; diff --git a/commands/Owner/eval.js b/commands/Owner/eval.js @@ -1,5 +1,4 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -const util = require("util"); +const Discord = require("discord.js"); module.exports = { name: "eval", category: "Owner", @@ -13,35 +12,105 @@ module.exports = { */ run: async (client, message, args) => { let code = args.join(" "); - const embed = new MessageEmbed(); - if (!code) { - return client.err(message, "Owner", "eval", "Missing 'Code' argument"); + if (!code) return client.err(message, "Owner", "eval", 53); + function CheckFilter(object) { + if (typeof object === "string") { + object = object.replace( + new RegExp(client.token || process.env.TOKEN, "gi"), + "Cannot eval Token" + ); + } else if (typeof object === "object") { + if (Array.isArray(object)) { + for (let i = 0; i < object.length; i++) { + object[i] = CheckFilter(object[i]); + } + } else { + for (let key in object) { + object[key] = CheckFilter(object[key]); + } + } + } + return object; } + let oldSend = Discord.TextChannel.prototype.send; + Discord.TextChannel.prototype.send = async function send(content, options) { + return oldSend.bind(this)(CheckFilter(content), CheckFilter(options)); + }; + let evaled; try { - let evaled = await eval(code), - output; - if (evaled.constructor.name === `Promise`) { - output = `📤 Output (Promise)`; - } else { - output = `📤 Output`; - } - if (evaled.length > 800) { - evaled = evaled.substring(0, 800) + `...`; - } - embed - .addField(`📥 Input`, `\`\`\`\n${code}\n\`\`\``) - .addField(output, `\`\`\`js\n${evaled}\n\`\`\``) - .setColor(client.color) - .addField(`Status`, `\`\`\`diff\n+ Success\`\`\``); - return message.channel.send(embed); - } catch (e) { - console.log(e.stack); - embed - .addField(`📥 Input`, `\`\`\`\n${code}\n\`\`\``) - .addField(`📤 Output`, `\`\`\`js\n${e}\n\`\`\``) - .addField(`Status`, `\`\`\`diff\n- Failed\`\`\``) - .setColor(client.color); - return message.channel.send(embed); + evaled = eval(code); + if (evaled instanceof Promise) evaled = await evaled; + } catch (err) { + evaled = err; } + if (typeof evaled !== "string") evaled = require("util").inspect(evaled); + evaled = new (require("string-toolkit"))().toChunks(evaled, 750); + let reactions = ["❌", "⏪", "◀️", "⏹️", "▶️", "⏩"], + page = 0, + evaledEmbed = new Discord.MessageEmbed() + .setColor(client.color) + .setDescription(`\`\`\`js\n${evaled[0]}\n\`\`\``) + .addField(`Type of`, `\`\`\`js\n${typeof evaled[0]}\n\`\`\``); + let mainMessage = await message.channel.send(evaledEmbed); + Discord.TextChannel.prototype.send = oldSend; + await Promise.all( + (evaled.length === 1 ? ["❌", "⏹️"] : reactions).map(r => + mainMessage.react(r) + ) + ); + let filter = (reaction, user) => + (evaled.length === 1 ? ["❌", "⏹️"] : reactions).some( + e => e === reaction.emoji.name + ) && user.id === message.author.id; + let collector = mainMessage.createReactionCollector(filter, { + time: 300000, + }); + collector.on("collect", async (reaction, user) => { + switch (reaction.emoji.name) { + case "❌": + await collector.stop(); + return mainMessage.delete(); + break; + case "⏪": + if (evaled.length === 1 || page === 0) return; + page = 0; + break; + case "◀️": + if (evaled.length === 1) return; + if (page === 0) { + page = evaled.length - 1; + } else { + page -= 1; + } + break; + case "⏹️": + await collector.stop(); + for (let reaction of mainMessage.reactions.cache.array()) { + await reaction.users.remove(client.user.id); + } + return; + break; + case "▶️": + if (evaled.length === 1) return; + if (page === evaled.length - 1) { + page = 0; + } else { + page += 1; + } + break; + case "⏩": + if (evaled.length === 1 || page === evaled.length - 1) return; + page = evaled.length - 1; + break; + } + evaledEmbed = new Discord.MessageEmbed() + .setColor(message.guild.me.displayColor) + .setDescription(`\`\`\`js\n${evaled[page]}\n\`\`\``) + .addField(`Type of`, `\`\`\`js\n${typeof evaled[page]}\n\`\`\``); + + await mainMessage.edit({ + embed: evaledEmbed, + }); + }); }, }; diff --git a/commands/Utilities/docs.js b/commands/Utilities/docs.js @@ -0,0 +1,19 @@ +const fetch = require("node-fetch"); +module.exports = { + name: "docs", + usage: "(Query)", + description: "Search the discord.js docs for something!", + run: async (client, message, args) => { + const query = args.join(" "); + if (!query) return client.err(message, "Utilities", "docs", 51); + fetch( + `https://djsdocs.sorta.moe/v2/embed?src=stable&q=${encodeURIComponent( + query + )}` + ) + .then(res => res.json()) + .then(data => { + message.inlineReply({ embed: data }); + }); + }, +}; diff --git a/events/guildDelete.js b/events/guildDelete.js @@ -1,6 +1,6 @@ const client = require("../index"); const db = require("../models/guilds"); -const { prefix, Log } = require("../config.json"); +const { prefix } = require("../config.json"); const { MessageEmbed } = require("discord.js"); client.on("guildDelete", async guild => { @@ -9,15 +9,17 @@ client.on("guildDelete", async guild => { new MessageEmbed() .setTitle("Deleted from server") .addField("Server Info", [ - `**>**Server Name: ${guild.name}`, - `**>**Server ID: ${guild.id}`, - `**>**Server Member Count: ${guild.memberCount}`, + `**>Server Name**: \n${guild.name}`, + `**>Server ID**: \n${guild.id}`, + `**>Server Member Count**: \n${guild.memberCount}`, ]) .addField("Owner Info", [ - `Owner Tag: ${guild.owner.user.tag}`, - `Owner ID: ${guild.owner.id}`, + `**>Owner Tag**: \n${guild.owner.user.tag}`, + `**>Owner ID**: \n${guild.owner.id}`, ]) - .setFooter(`Currently in ${client.guilds.cache.size} servers`) + .setFooter( + `${client.user.username} Currently in ${client.guilds.cache.size} servers` + ) .setTimestamp() .setThumbnail(guild.iconURL({ dynamic: true })) .setColor("RED") diff --git a/package-lock.json b/package-lock.json @@ -1,6 +1,6 @@ { "name": "cath.exe", - "version": "1.6.0", + "version": "2.0.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json @@ -1,9 +1,9 @@ { "name": "cath.exe", - "version": "2.0.0", + "version": "2.0.1", "description": "cath.exe bot created by Night", "engines": { - "node": "14.17", + "node": "*", "npm": "*" }, "main": "index.js", @@ -72,6 +72,7 @@ "quickchart-js": "^1.0.7", "reconlx": "^1.2.41", "soundcloud-downloader": "^0.2.4", + "string-toolkit": "^1.4.0", "weky": "^1.4.2", "yt-search": "^2.8.0", "ytdl-core": "^4.8.0", diff --git a/util/err.js b/util/err.js @@ -166,6 +166,15 @@ module.exports = async (message, dir, file, err) => { err = "The error maybe the link isn't a image, or the image size is too big"; break; + case 51: + err = "Missing 'Query' argument"; + break; + case 52: + err = "This message doesn't exist in this channel"; + break; + case 53: + err = "Missing 'Code' argument"; + break; case 404: err = "Error 404 - Not Found"; break; diff --git a/util/functions/common.js b/util/functions/common.js @@ -1,767 +0,0 @@ -const data = require("../Data/data.json"); -const guns = data.cguns; -const QuickChart = require("quickchart-js"); -const nmDt = require("../Data/aliases.json"); -var weaponActualName = nmDt.weaponActualName; -var weaponAlliasName = nmDt.weaponAlliasName; -Object.defineProperty(String.prototype, "Simplify", { - value: function Simplify() { - return this.toLowerCase().replace(/[^0-9a-z]/g, ""); - }, - writable: true, - configurable: true, -}); - -Object.defineProperty(Number.prototype, "IsPositive", { - value: function IsPositive() { - if (this > 0) { - return true; - } - return false; - }, - writable: true, - configurable: true, -}); - -Object.defineProperty(Number.prototype, "IsNegative", { - value: function IsNegative() { - if (this < 0) { - return true; - } - return false; - }, - writable: true, - configurable: true, -}); - -Object.defineProperty(Number.prototype, "ToBool", { - value: function ToBool() { - if (this == 1) { - return true; - } - return false; - }, - writable: true, - configurable: true, -}); - -Object.defineProperty(Number.prototype, "PlusHL", { - value: function PlusHL() { - if (this.toString()[0] == "-") { - return parseFloat(this.toFixed(2)).toString(); - } - return "+" + parseFloat(this.toFixed(2)).toString(); - }, - writable: true, - configurable: true, -}); - -function weaponIdentifier(inpmsg) { - var inpWeaponName = isolator(inpmsg)[0]; - if (inpWeaponName.length < 2) { - return inpmsg - ? "The name `" + inpmsg + "` is too short." - : "Empty weapon name"; - } - var probableWeapons = []; - for (let i = 0; i < guns.length; i++) { - if (inpWeaponName.Simplify() == guns[i].gunname.Simplify()) { - return guns[i]; - } else if (guns[i].gunname.Simplify().includes(inpWeaponName.Simplify())) { - probableWeapons.push(i); - } - } - - if (probableWeapons.length == 1) { - return guns[probableWeapons[0]]; - } - - for (let i = 0; i < weaponAlliasName.length; i++) { - for (let j = 0; j < weaponAlliasName[i].length; j++) { - /*if (weaponAlliasName[i][j].Simplify().includes(inpWeaponName.Simplify())) { - for (let i2 = 0; i2 < guns.length; i2++) { - if (weaponActualName[i].Simplify() == guns[i2].gunname.Simplify()) { - probableWeapons.push(i2); - } - } - }*/ - if (weaponAlliasName[i][j].Simplify() == inpWeaponName.Simplify()) { - for (let i2 = 0; i2 < guns.length; i2++) { - if (weaponActualName[i].Simplify() == guns[i2].gunname.Simplify()) { - return guns[i2]; - } - } - } - } - } - probableWeapons = [...new Set(probableWeapons)]; - if (probableWeapons.length == 1) { - return guns[probableWeapons[0]]; - } - if (probableWeapons.length > 1) { - return ( - "Did you mean `" + - probableWeapons - .map(x => guns[x].gunname) - .reduce((out, x, i) => - [out, x].join(i === probableWeapons.length - 1 ? "` or `" : "`, `") - ) + - "`?" - ); - } - return "Couldn't identify the weapon: `" + '"' + inpWeaponName + '"`'; -} - -function isolator(inpmsg) { - if (inpmsg.includes(" + ")) { - var out = inpmsg - .split(" + ") - .map(x => x.split("+")) - .flat(); - return [out.shift(), out.join(", ")]; - } - return inpmsg.split(" with "); -} - -function hasAttachments(inpmsg) { - if ( - inpmsg.split(" with ").filter(x => x.Simplify()).length > 1 || - inpmsg.split(" + ").filter(x => x.Simplify()).length > 1 - ) { - return true; - } - return false; -} - -function attachmentsIdentifier(inpmsg, attachmentsData) { - var inpmsg1 = inpmsg, - inpmsg3 = inpmsg.split(" ").filter(x => x), - inpmsg2 = inpmsg3.shift().toLowerCase(), - inpmsg5 = inpmsg3.join(" "); - inpmsg = - inpmsg2 == "akim" || inpmsg2 == "akimbo" - ? inpmsg5 + (hasAttachments(inpmsg) ? " + " : ", ") + "akimbo" - : inpmsg; - /*var replacer = [ - 'Stopping Power', - 'Laser' - ].map(x => x.Simplify()); - - var replacee = [ - ['SP'], - ['Lazer'] - ].map(x => x.Simplify()); - replacee.map(x => x.filter(y => inpmsg.includes(y)));*/ - //console.log(inpmsg); - /*console.log(JSON.stringify(inpmsg)); - var g1 = []; - g1 = inpmsg.split(/ with | + /); - console.log(JSON.stringify(g1)); - var givenAttachmentsNames = g1.split(/ & | , /);*/ - - if (!hasAttachments(inpmsg)) { - return []; - } - - var inputAttachmentsNames = isolator(inpmsg)[1] - .split(/ & |, |,| and /) - .filter(x => x); - var tooSmall = inputAttachmentsNames.filter(x => x.length < 3); - inputAttachmentsNames = inputAttachmentsNames.filter(x => !(x.length < 3)); - var errorMsgs = "", - errors = [], - unidentifined = []; - - if (inputAttachmentsNames.length == 00) { - errorMsgs += "\nAttachments are missing!\n"; - } - if (inputAttachmentsNames.length >= 10) { - return "Cocaineeeeee"; - } - - var splitAttachmentsDataName = [], - outAttachments = []; - - for (let i = 0; i < attachmentsData.length; i++) { - splitAttachmentsDataName.push([ - ...new Set( - attachmentsData[i].name - .split(" ") - .filter(x => x) - .map(x => x.trim()) - ), - ]); - if (Math.max(...splitAttachmentsDataName.map(x => x.length)) > 6) { - return "Cocaineeeeee"; - } - for (let j = 0; j < splitAttachmentsDataName[i].length; j++) { - splitAttachmentsDataName[i][j] = - splitAttachmentsDataName[i][j].Simplify(); - } - } - - for (let i = 0; i < inputAttachmentsNames.length; i++) { - var probables = []; - var splitInputAttachmentsName = inputAttachmentsNames[i].split(" "); - - for (let j = 0; j < splitAttachmentsDataName.length; j++) { - for (let i2 = 0; i2 < splitAttachmentsDataName[j].length; i2++) { - for (let i3 = 0; i3 < splitInputAttachmentsName.length; i3++) { - if ( - splitAttachmentsDataName[j][i2].includes( - splitInputAttachmentsName[i3].Simplify() - ) - ) { - var probablePushed = false; - for (let i4 = 0; i4 < probables.length; i4++) { - if (!probables[i4].includes(j)) { - probables[i4].push(j); - probablePushed = true; - break; - } - } - if (!probablePushed) { - probables.push([j]); - } - } - } - } - } - if (probables.length == 0) { - unidentifined.push(inputAttachmentsNames[i]); - continue; - } - - var curr = probables[probables.length - 1]; - var temp1 = probables[probables.length - 1].filter( - x => - attachmentsData[x].name.Simplify() == - inputAttachmentsNames[i].Simplify() - ); - var temp2 = probables[probables.length - 1].filter( - x => - splitAttachmentsDataName[x].length == splitInputAttachmentsName.length - ); - if (temp1.length === 1 && temp2.length !== 1) { - probables.push([temp1]); - } - if (temp1.length !== 1 && temp2.length === 1) { - probables.push([temp2]); - } - if (temp1.length === 1 && temp2.length === 1 && temp1[0] == temp2[0]) { - probables.push([temp1]); - } - //console.log(probables[probables.length - 1].length); - if ( - probables[probables.length - 1].length != 1 || - probables.length < splitInputAttachmentsName.length - ) { - //errors.push(probables[probables.length - 1]); - errors.push( - "`" + - curr - .map(x => attachmentsData[x].name) - .reduce((out, x, i) => - [out, x].join(i === curr.length - 1 ? "` or `" : "`, `") - ) + - '` by `"' + - inputAttachmentsNames[i] + - '"`' - ); - } - outAttachments.push(attachmentsData[probables[probables.length - 1][0]]); - } - //console.log(JSON.stringify(errors)); - /*if (errors.length && unidentifined.length) { - return "Couldn't identify the attachment" + (unidentifined.length === 1 ? "" : "s") + ': `"' + unidentifined.join('"`, `"') + '"`\n\nDid you mean `' + errors.map((p, j) => p.map(x => attachmentsData[x].name).reduce((out, x, i) => [out, x].join(i === p.length - 1 ? '` or `' : '`, `')) + '` by `"' + inputAttachmentsNames[j + unidentifined.length] + '"`').join(";\n`") + "?"; - } - if (errors.length) { - //return "Did you mean " + errors.map((p, j) => p.map(x => attachmentsData[x].name).reduce((out, x, i) => [out, x].join(i === p.length - 1 ? '` or `' : '`, `')) + '` by `"' + inputAttachmentsNames[j] + '"`').join(";\n") + "?"; - return "\nDid you mean " + errors.join(";\n") + "?\n"; - } - if (unidentifined.length) { - return "\nCouldn't identify the attachment" + (unidentifined.length === 1 ? "" : "s") + ': `"' + unidentifined.join('"`, `"') + '"`\n'; - }*/ - - /*var sameAttachments = outAttachments.filter((x,i,a)=> a.indexOf(x)!==i); - if (sameAttachments.length) { - sameAttachments = [...sameAttachments, ...new Set(sameAttachments.map((x, i) => outAttachments.indexOf(x)))]; - } - inputAttachmentsNames.filter();*/ - - var t1 = outAttachments.map(x => x.effects[35]); - var t2 = outAttachments.map(x => x.effects[36] + x.effects[32]); - - errorMsgs += - t1.indexOf(1) !== -1 - ? "Can't equip Muzzle with `" + - '"' + - outAttachments[t1.indexOf(1)].name + - '"`' - : ""; - errorMsgs += - t2.indexOf(1) !== -1 - ? "Can't equip Optics with `" + - '"' + - outAttachments[t2.indexOf(1)].name + - '"`' - : ""; - errorMsgs += errors.length - ? "\nDid you mean " + errors.join(";\n") + "?\n" - : ""; - errorMsgs += unidentifined.length - ? "\nCouldn't identify the attachment" + - (unidentifined.length === 1 ? "" : "s") + - ': `"' + - unidentifined.join('"`, `"') + - '"`\n' - : ""; - errorMsgs += - outAttachments.length > 5 ? "\nCan't equip more than 5 attachments!\n" : ""; - errorMsgs += outAttachments.filter((x, i, a) => a.indexOf(x) !== i).length - ? "\nMultiple of same attachments found!\n" - : ""; - errorMsgs += outAttachments - .map(x => x.type) - .filter((x, i, a) => a.indexOf(x) !== i).length - ? "\nMultiple of attachments the same type found!\n" - : ""; - errorMsgs += tooSmall.length - ? "\nThe name" + - (tooSmall.length === 1 ? "" : "s") + - ': `"' + - tooSmall.reduce((out, x, i) => - [out, x].join(i === curr.length - 1 ? '"` and `"' : '"`, `"') - ) + - '"` ' + - (tooSmall.length === 1 ? "is" : "are") + - " too short\n" - : ""; - - return errorMsgs ? errorMsgs.trim() : outAttachments; -} -//console.log(attachmentsIdentifier("ak with mag, red sight, red dot, ll", data.cguns[0].aments));// makeError(); -//console.log(attachmentsIdentifier("ak with mdfgt, skjs", data.cguns[0].aments)); makeError(); -//console.log(attachmentsIdentifier("117 + 40 round mag", data.cguns[0].aments)); makeError(); -//console.log(attachmentsIdentifier("117 + rtc muzzle brake, rubberized griptape, tac lazer sight, 40 round mag, no stock", data.cguns[1].aments)); makeError(); - -function damageHandler( - currDmgs, - currRngs, - damageMulti, - hp, - tbs, - tbb, - bib, - pellets -) { - //console.log([currDmgs, currRngs, damageMulti, hp, tbs, tbb, bib, pellets]); - //tbs = timeBetweenShots - //tbb = timeBetweenBurst - //bib = bulletsInBurst - - currRngs = currRngs.filter(x => x < 100).map(x => Math.round(x)); - currDmgs.length = currRngs.length + 1; - currDmgs = currDmgs.map(x => Math.round(x * damageMulti)); - var currSTKs = currDmgs.map(x => stk(x)), - currTTKs = currDmgs.map(x => ttk(x)), - currPDmg = null, - n = Math.max(...currTTKs.map(x => x.toString().length)); - n = n < 3 ? 3 : n; - //console.log() - function worker1(inp) { - return inp.map(x => x.toString().padStart(n)).join(" -- ") + "\n"; - } - function worker2(inp) { - return ( - "".padStart(n + 1) + - inp.map(x => x.toString().padStart(2)).join("".padStart(n + 2)) + - "\n" - ); - } - function stk(dmg) { - var out; - if (!pellets) { - out = Math.ceil(hp / dmg); - } else { - out = Math.ceil(hp / (dmg * pellets)); - } - out = out == Infinity ? "∞" : out; - return out; - } - function ttk(dmg) { - var stkVal = stk(dmg); - if (stkVal == "∞") { - return stkVal; - } - if (!bib) { - return Math.round((stkVal - 1) * tbs); - } - var out = 0; - if (dmg > 0) { - if (stkVal % bib == 0) { - for (var i = 0; i < Math.floor(stkVal / bib) - 1; i++) { - out += tbs * (bib - 1) + tbb; - } - out = out + tbs * (bib - 1); - } else if (stkVal % bib != 0) { - for (var i = 0; i <= Math.floor(stkVal / bib) - 1; i++) { - out += tbs * (bib - 1) + tbb; - } - for (var i = 0; i < (stkVal % bib) - 1; i++) { - out += tbs; - } - } - out = Math.round(out); - if (out == Infinity) { - return "∞"; - } - } else { - out = "No"; - } - return out; - } - if (pellets) { - currPDmg = currDmgs.map(x => x + " x" + pellets); - n = Math.max(...currPDmg.map(x => x.toString().length)); - } - return ( - "```Damage : " + - worker1(currPDmg || currDmgs) + - (pellets ? "Total : " + worker1(currDmgs.map(x => x * pellets)) : "") + - "STK : " + - worker1(currSTKs) + - "TTK : " + - worker1(currTTKs) + - "Range : " + - (currRngs.length ? worker2(currRngs) : worker1(["∞"])) + - "```" - ); -} -//console.log(damageHandler([30, 25, 20], [10, 20], 1, 100, 60000 / 720, 0, 0)); makeError(); -//console.log(damageHandler([ 33, 23 ], [ 39 ], 1, 100, 109.0909090909091, 0, 0 )); makeError(); - -function recoilHandler( - xRecoil, - yRecoil, - xMultiplier, - yMultiplier, - bulletCount -) { - if (xRecoil.length != yRecoil.length) { - return "err"; - } - var recoilLength = xRecoil.length; - if (recoilLength == 0) { - return "none"; - } - var recoilPattern = [ - { - x: 0, - y: 0, - }, - ]; - var recoilObj; - for (let i = 0; i < bulletCount; i++) { - var xContinuationVal = - xRecoil[recoilLength - 1] - xRecoil[recoilLength - 2]; - var yContinuationVal = - yRecoil[recoilLength - 1] - yRecoil[recoilLength - 2]; - if (i < recoilLength) { - recoilObj = { - x: xRecoil[i] * (1 + xMultiplier / 100), - y: yRecoil[i] * (1 + yMultiplier / 100), - }; - } else { - recoilObj = { - x: - (recoilPattern[recoilPattern.length - 1].x + xContinuationVal) * - xMultiplier, - y: - (recoilPattern[recoilPattern.length - 1].y + yContinuationVal) * - yMultiplier, - }; - } - recoilPattern.push(recoilObj); - } - var chart = new QuickChart(); - chart - .setConfig({ - type: "scatter", - data: { - datasets: [ - { - data: recoilPattern, - showLine: true, - fill: false, - borderColor: "rgba(0, 200, 0, 1)", - }, - ], - }, - options: { - /*plugins: { - backgroundImageUrl: 'https://www.codmdatabase.ml/display.png' - },*/ - legend: { - display: false, - }, - scales: { - yAxes: [ - { - ticks: { - display: false, - min: 0, - max: 5050, - }, - }, - ], - xAxes: [ - { - ticks: { - display: false, - min: -4495, - max: 4495, - }, - }, - ], - }, - }, - }) - .setWidth(1780) - .setHeight(1000); - - return chart; -} - -function updateStatswithEffects(inpEffects, inpStats) { - //console.log(inpStats.toString()); - var l = inpStats[18] / inpStats[17]; - var outStats = inpStats; - /*if (inpEffects[09] != 0) { inpStats[25] += inpEffects[09]; } - if (inpEffects[29] != 0) { inpStats[00] += inpEffects[29]; } - inpStats[17] += inpEffects[27];*/ - var inpStatsarr = [01, 02, 05, 10, 11, 14, 15, 20, 21, 22, 26, 27, 31]; - var inpEfecsarr = [17, 18, 16, 04, 19, 01, 10, 14, 14, 14, 06, 07, 42]; //Efecs is short for Effects - for (let i = 0; i < inpEffects.length; i++) { - if (inpEffects[inpEfecsarr[i]] != 0) { - outStats[inpStatsarr[i]] *= (inpEffects[inpEfecsarr[i]] + 100) / 100; - } - } - var inpStatsarr = [03, 04, 16, 28, 29, 30]; - var inpEfecsarr = [20, 38, 00, 39, 40, 41]; //Efecs is short for Effects - for (let i = 0; i < inpEffects.length; i++) { - if (inpEffects[inpEfecsarr[i]] != 0) { - outStats[inpStatsarr[i]] = inpEffects[inpEfecsarr[i]]; - } - } - var inpStatsarr = [00, 17, 25]; - var inpEfecsarr = [29, 27, 09]; //Efecs is short for Effects - for (let i = 0; i < inpEffects.length; i++) { - if (inpEffects[inpEfecsarr[i]] != 0) { - outStats[inpStatsarr[i]] += inpEffects[inpEfecsarr[i]]; - } - } - - if (inpEffects[43] != 0 && inpStats[08] != -1) { - outStats[08] *= (inpEffects[43] + 100) / 100; - } - if (inpEffects[16] != 0) { - outStats[07] *= inpEffects[16] / -100 + 1; - } - outStats[18] = inpStats[17] * l; - - outStats[25] = (inpStats[26] * inpStats[25]) / 100; //must occur after inpStats[26] - //no 06, 09, 12, 13, 19, 23, 24 - return outStats; -} - -function attachmentHandler(currEffects, currStats) { - //console.log(JSON.stringify(currEffects)); - var pos = [], - neg = []; - if (currEffects[0] > currStats[16]) { - pos.push( - currEffects[0] + - "% zoom (+" + - (currEffects[0] - currStats[16]) + - "% zoom)" - ); - } else if (currEffects[0] != 0 && currEffects[0] != currStats[16]) { - neg.push( - currEffects[0] + - "% zoom (-" + - (currStats[16] - currEffects[0]) + - "% zoom)" - ); - } - if (currEffects[0] != 0 && currStats[16] <= 110) { - pos.push("Easier to Aim"); - } - negGood1(01, "ADS time"); - negGood1(02, "Vertical Recoil"); - negGood1(03, "Horizontal Recoil"); - negGood1(04, "Bullet Spread"); - negGood1(05, "Moving Bullet Spread"); - posGood1(06, "Mobility"); - posGood1(07, "ADS Mobility"); - negGood1(08, "Recoil when Crouched or Prone"); - posGood1(09, "Sprint Mobility"); - negGood1(10, "Sprint to Fire Time"); - negGood1(11, "Flinch"); - negGood1(12, "Hipfire Spread"); - posGood1(13, "Damage Range"); - negGood1(14, "Reload Time"); - posGood1(15, "Headshot Damage"); - posGood1(16, "Rate of Fire"); - posGood1(17, "Detonation Range"); - posGood1(18, "Explosion Radius"); - negGood1(19, "Idle Sway"); - if (currEffects[20] > currStats[3]) { - pos.push( - currEffects[20].ToString().Replace(".", " ~ ") + " Explosion Damage" - ); - } else if (currEffects[20] != 0 && currEffects[20] != currStats[3]) { - neg.push( - currEffects[20].ToString().Replace(".", " ~ ") + " Explosion Damage" - ); - } - negGood3(21, "+Visible Laser when not ADS-ed"); - negGood3(22, "+Visible Laser when ADS-ed"); - negGood3(23, "+Visible Laser"); - posGood3(24, "+Silenced Gunfire"); - posGood3(25, "-Muzzle Flash"); - posGood3(26, "Reworked Damage"); - posGood2(27, "Rounds/Mag"); - posGood2(28, "Rounds/Tube"); - posGood2(29, "Pellets per Shot"); - posGood2(30, "Damage Over Time"); - posGood3(31, "Damage per Shot"); - posGood3(32, "Reworked ADS"); - posGood3(33, "-Melee QTE Time"); - if (currEffects[34] == 1) { - pos.push("+Damage per Pellet"); - } else if (currEffects[34] == -1) { - neg.push("-Damage per Pellet"); - } - negGood3(35, "Can Not use Muzzle"); - negGood3(36, "Can Not ADS"); - if (currEffects[37] != 0) { - pos.push("New Leathality Profile"); - } - if (currEffects[38] != 0 && currEffects[38] < currStats[4]) { - pos.push( - "Turns to " + - ["Full Auto", "Burst", "Semi Auto", "Pump Action", "Bolt Action"][ - currEffects[38] - 1 - ] - ); - } else if (currEffects[38] != 0 && currEffects[38] != currStats[4]) { - neg.push( - "Turns to " + - ["Full Auto", "Burst", "Semi Auto", "Pump Action", "Bolt Action"][ - currEffects[38] - 1 - ] - ); - } - posGood2(39, "Tick Damage"); - posGood2(40, "Ticks"); - negGood2(41, "ms Tick Interval"); - posGood2(42, "Breath Holding Time"); - posGood1(43, "Bullet Speed"); - if (currEffects[44] == 1) { - pos.push("+Penetraion Damage"); - } else if (currEffects[44] == -1) { - neg.push("-Penetraion Damage"); - } - posGood2(45, "Round" + (currEffects[45] - 1 ? "s" : "") + " in Reserve"); - - function posGood1(i, ext) { - if (currEffects[i].IsPositive()) { - pos.push(currEffects[i].PlusHL() + "% " + ext); - } else if (currEffects[i].IsNegative()) { - neg.push(currEffects[i].PlusHL() + "% " + ext); - } - } - - function negGood1(i, ext) { - if (currEffects[i].IsNegative()) { - pos.push(currEffects[i].PlusHL() + "% " + ext); - } else if (currEffects[i].IsPositive()) { - neg.push(currEffects[i].PlusHL() + "% " + ext); - } - } - - function posGood2(i, ext) { - if (currEffects[i].IsPositive()) { - pos.push(currEffects[i].PlusHL() + " " + ext); - } else if (currEffects[i].IsNegative()) { - neg.push(currEffects[i].PlusHL() + " " + ext); - } - } - - function negGood2(i, ext) { - if (currEffects[i].IsNegative()) { - pos.push(currEffects[i].PlusHL() + " " + ext); - } else if (currEffects[i].IsPositive()) { - neg.push(currEffects[i].PlusHL() + " " + ext); - } - } - - function posGood3(i, ext) { - if (currEffects[i].ToBool()) { - pos.push(ext); - } - } - - function negGood3(i, ext) { - if (currEffects[i].ToBool()) { - neg.push(ext); - } - } - return ( - "\nPositives :\n```ini\n[" + - pos.join("]\n[") + - "]```\nNegatives :\n```css\n[" + - neg.join("]\n[") + - "]\n```" - ); -} -/* -console.log("Full directory : " + __filename); -console.log("Current file : " + __filename.split("/").pop()); -console.log("Without extenstion : " + __filename.split("/").pop().split(".")[0]); -*/ - -function interpretioner(inpAttachments) { - return inpAttachments.length - ? " with " + inpAttachments.map(x => x.name).join(", ") - : ""; -} - -function totaler(inpAttachments) { - var totalEffects = inpAttachments[0].effects; - for (let j = 1; j < inpAttachments.length; j++) { - for (let i2 = 0; i2 < totalEffects.length; i2++) { - totalEffects[i2] += inpAttachments[j].effects[i2]; - } - } - return totalEffects; -} - -function makeError() { - var m; - m.split("L"); -} - -module.exports = { - weaponIdentifier, - attachmentsIdentifier, - recoilHandler, - attachmentHandler, - updateStatswithEffects, - makeError, - interpretioner, - damageHandler, - isolator, - totaler, -};