nyx

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

commit a216a4044d2a10ccbd3681eb37f2a2a264739469
parent 75cd7580d263da20b1f13985d401d2355b03988b
Author: night0721 <[email protected]>
Date:   Fri, 19 Nov 2021 02:09:53 +0800

added missing files

Diffstat:
M.github/changelog.md | 32+++++++-------------------------
Adraw.js | 82+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Astats2.js | 306+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 395 insertions(+), 25 deletions(-)

diff --git a/.github/changelog.md b/.github/changelog.md @@ -1,37 +1,28 @@ <h1 align="center">Changelog</h1> # Release v3.3.0 Name Change +We have changed the name of our bot from **Cath.exe** to **NYX**. We have not yet decided on changing the backend names that includes the api & package. -We have changed the name of our bot from **Cath.exe** to **NYX**. We have not yet decided on changing the backend names that includes the api & package. - -## Added - +## Added - Added guns to be bought using internal currency. - Added more items in the shops. - Updated names of contributers in the bot info. ## Changes / Modification - - Change the footers of embed as we transition from using the Statistics provided by **Project Lighthouse v2** into using Statistics provided by **Round table**. # Release v3.2.6 - ## Added - - Tips - Topics - ## Fixes - - Added Bot avatar in the footer - Added timestamps in embeds -# Release v3.2.0 +# Release v3.2.0 In this version we made the starboard to be globalized, means that you can configure the settings for the starboard per server. - ## Added - - drop - announce - emojiadd @@ -40,15 +31,12 @@ snipe&editsnipe fix To stay up-to-date with our progress, check out our discord server & the Trello page. # Release v3.0.0 - In this version we implement Discord.js v13, which introduces slash commands. we have not implemented all of the commands yet, the moderation commands especially. To stay up-to-date with our progress, check out our discord server & the Trello page. # Release v2.1.0 - New & Improved API for client and commands. - ## Added - Superscript @@ -64,30 +52,24 @@ New & Improved API for client and commands. - Improved economy system # Release v2.0.1 - No Description ## Added - - Docs - Suggest - Dependencies ## Modified/Updates - -- Moderation Commands - - Ban - - Pin +- Moderation Commands + - Ban + - Pin - Dependencies ## Removed - - All the Server specific refrences # Release v2.0-BETA - -Initial Commit + Initial Commit # Release v1.0.0 - The bot was not open source & only Night worked on it. diff --git a/draw.js b/draw.js @@ -0,0 +1,82 @@ +const { MessageEmbed, MessageActionRow, MessageButton } = require("discord.js"); +const draws = require("./util/Data/draws.json"); +module.exports = { + name: "draw", + description: "Buy a lucky draw", + run: async (client, message, args, utils) => { + const embed = new MessageEmbed() + .setTitle("**__Daily Lucky Draw__**") + .setColor(client.color) + .setFooter(`Made by ${client.author}`, client.user.displayAvatarURL()) + .setTimestamp() + .setDescription( + "Welcome to the Lucky Draw,\nclick `Spin`, so that the draw spins and hits a random item.\nClick `Info` to find out how high the probability is\n that a particular item will be unlocked" + ) + .addFields( + draws[0].map(c => { + return { name: c.name, value: c.emoji, inline: true }; + }) + ); + + const button1 = new MessageButton() + .setStyle("SUCCESS") + .setEmoji("🔄") + .setLabel("Spin") + .setCustomId("spin"); + const button2 = new MessageButton() + .setStyle("PRIMARY") + .setEmoji("894962394932064346") + .setLabel("Info") + .setCustomId("spininfo"); + + const row = new MessageActionRow().addComponents([button1, button2]); + const msg = await message.channel.send({ + embeds: [embed], + components: [row], + }); + const filter = i => + ["spin", "spininfo"].includes(i.customId) && + i.user.id === message.author.id; + const collector = msg.createMessageComponentCollector({ + filter, + time: 999999, + }); + function select() { + let pick = Math.floor(Math.random() * 100); + for (const g in draws[0]) { + pick -= draws[0][g].percent; + if (pick <= 0) { + return `You got **${draws[0][g].name}** with propability **${draws[0][g].percent}%**`; + } + } + } + console.log(utils.colorize("test").magenta); + collector.on("collect", i => { + if (i.customId === "spin") { + i.reply({ + content: select(), + }); + } + if (i.customId === "spininfo") { + i.reply({ + embeds: [ + new MessageEmbed() + .setTitle("**__Information Table__**") + .addFields( + draws[0].map(c => { + return { + name: `**${c.name}**`, + value: `Percentage: ${c.percent}%`, + inline: true, + }; + }) + ) + .addField("Name:", "**Item 1**") + .addField("Percent:", "**69**") + .addField("Emoji:", ":bughuntergold:"), + ], + }); + } + }); + }, +}; diff --git a/stats2.js b/stats2.js @@ -0,0 +1,306 @@ +// const common = require("../../util/functions/common"); +// const data = require("../../util/Data/data.json"); +// const Discord = require("discord.js"); + +// // Ignore this for now, it's just a outline of what needs to be changed to fit the new data from Mongo + +// var currGun, +// currStats, +// currAttachments, +// currRecoilArr, +// currDRM, +// interpretion, +// recoilAvailable, +// chart, +// hasError; +// var errMsg = "*Generic placeholder error message*"; +// module.exports = { +// name: "stats", +// description: "Check gun stats", +// usage: "(Gun)", +// category: "CODM", +// options: [ +// { +// type: 3, +// name: "gun_name", +// description: "Name of the gun", +// required: true, +// choices: [], +// }, +// { +// type: 3, +// name: "1st_attchment", +// description: "First attachment", +// }, +// { +// type: 3, +// name: "2nd_attchment", +// description: "Second attachment", +// }, +// { +// type: 3, +// name: "3rd_attchment", +// description: "Third attachment", +// }, +// { +// type: 3, +// name: "4th_attchment", +// description: "Forth attachment", +// }, +// { +// type: 3, +// name: "5th_attchment", +// description: "Fifth attachment", +// }, +// ], +// run: async (client, interaction, args) => { +// recoilAvailable = false; +// hasError = false; +// console.log(args); +// var repEmb = statsHandler(args.join(" ").replace("\n", " ")); +// if (hasError) { +// interaction.followUp({ embeds: [repEmb] }); +// } +// if (recoilAvailable) { //we will use the old recoil graphs untill we can find someone to help update it. +// repEmb.fields.push({ +// name: "**Recoil Graph**", +// value: +// "```\nThe Recoil graph below is dynamic (change based on attachment equipped)```", +// }); +// const recoilImageLink = await chart.getShortUrl(); +// repEmb.image = { url: recoilImageLink }; +// } +// interaction.followUp({ embeds: [repEmb] }); +// }, +// }; + +// // Don't need (use: to split the input by + (which was used to add attachments before slash commands)) +// function inpHandler(inpmsg) { +// statsHandler(inpmsg.split("+")[0]); +// } + +// function statsHandler(inpmsg) { +// // Don't need here, use from json (will be easier to add stuff in future) +// var statsNames = [ +// "Pellets", +// "Detonation Range", +// "Explosion Radius", +// "Explosion Damage", +// "Firing Mode", +// "Rate of Fire", +// "Bullet in Burst", +// "Time Between Burst", +// "Bullet Speed", +// "Penetration Level", +// "Bullet Spread", +// "Idle Sway", +// "Hipfire Pellet Spread", +// "ADS Pellet Spread", +// "ADS Time", +// "Sprint-to-Fire Time", +// "ADS Zoom", +// "Magazine", +// "Reserve", +// "Reload Type", +// "Cancel Reload Time", +// "Reload Time", +// "Full Reload Time", +// "Drop Time", +// "Raise Time", +// "Sprinting Speed", +// "Walking Speed", +// "Straifing Speed", +// "Damage per Tick", +// "Number of Ticks", +// "Time Between Ticks", +// "Breath Hold Time", +// "shouldNeverHappen0", +// "shouldNeverHappen1", +// "shouldNeverHappen2", +// "shouldNeverHappen3", +// "shouldNeverHappen4", +// ], +// out = []; // This stores all the feilds + +// currGun = common.weaponIdentifier(inpmsg); // inpMsg should be replaced by args[0] (i.e the gun name) +// if (typeof currGun == "string") { +// hasError = true; +// return currGun; +// } +// currStats = currGun.stats; // access stats using mongo +// currDRM = currGun.drm[0]; // Same ^ +// currAttachments = []; +// currAttachments = common.attachmentsIdentifier( +// inpmsg, // this was supposed to be the full input msg, but we need to madify it so it just gets a attachment name and uses it so no need for isolator +// currGun.aments, //Sends the stats for all the attachment of that gun +// currStats //sends the base stat of the gun for calculation +// ); +// if (typeof currAttachments == "string") { +// hasError = true; +// return currAttachments; +// } +// currRecoilArr = [1, 1, currGun.stats[17]]; +// if (currAttachments.length != 0) { +// var totalEffects = common.totaler(currAttachments); + +// currStats = common.updateStatswithEffects(totalEffects, currStats); +// currRecoilArr = [totalEffects[2], totalEffects[3], currGun.stats[17]]; //must happen after currStats update +// currDRM = currGun.drm[totalEffects[37]]; +// currDRM.range = currDRM.range.map(x => +// Math.round(x * (1 + totalEffects[13] / 100)) +// ); +// out = common.attachmentHandler(totalEffects, currStats); +// } +// function statsWorker() { +// if (currStats[19] === 2) { +// currStats[21] = +// currStats[20] + currStats[21] * currStats[17] + currStats[22]; +// currStats[20] = 0; +// currStats[22] = 0; +// } +// currStats[25] = (currStats[25] * currStats[26]) / 100; + +// var outReady = currStats.map((x, i) => +// x ? statsNames[i].padEnd(24) + ":".padEnd(3) + beautifier(i) : "" +// ); +// out = [ +// ...[ +// "Basic Stats", +// "ADS Stats", +// "Bullet Stats", +// "Magazine", +// "Handling Stats", +// "Mobility Stats", +// "Miscellaneous Stats", +// ].map((x, i) => +// fieldMaker( +// x, +// [ +// [04, 05, 09], +// [14, 16, 11, 31], +// [00, 06, 07, 08, 10, 12, 13], +// [17, 18, 19, 20, 21, 22], +// [23, 24], +// [25, 26, 27, 15], +// [28, 29, 30, 01, 02, 03], +// ][i] +// ) +// ), +// ...out, +// ]; +// function fieldMaker(inpName, inpIndx) { +// inpIndx = inpIndx.filter(x => outReady[x]); +// return inpIndx.length +// ? { +// name: "**" + inpName + "**", +// value: "```\n" + inpIndx.map(x => outReady[x]).join("\n") + "```", +// } +// : ""; +// } +// } +// statsWorker(); + +// function beautifier(j) { +// switch (j) { +// case 04: +// return data.firingModes[currStats[j] - 1]; +// case 09: +// return data.penetrationLevels[currStats[j] - 1]; +// case 19: +// return data.reloadTypes[currStats[j] - 1]; +// case 08: +// if (currStats[j] == -1) { +// return "Infinity"; +// } else { +// return parseFloat(currStats[j].toFixed(2)).toString() + " m/s"; +// } +// case 03: +// return parseFloat(currStats[j].toFixed(2)) +// .toString() +// .replace(".", " ~ "); +// default: +// return parseFloat(currStats[j].toFixed(2)).toString() + addUnit(j); +// } + +// function addUnit(j) { //Needs modification to match the new layout +// switch (j) { +// case 07: +// case 14: +// case 15: +// case 23: +// case 24: +// case 31: +// return " ms"; +// case 27: +// case 28: +// case 25: +// case 26: +// return " m/s"; +// case 20: +// case 21: +// case 22: +// return " s"; +// case 16: +// return "%"; +// case 06: +// return " Rounds"; +// case 05: +// return " RPM"; +// default: +// return ""; +// } +// } +// } +// interpretion = currGun.gunname + common.interpretioner(currAttachments); +// if (currGun.recoil.hr.length > 2) { +// chart = common.recoilHandler( +// currGun.recoil.hr, +// currGun.recoil.vr, +// currRecoilArr[0], +// currRecoilArr[1], +// currRecoilArr[2] +// ); +// recoilAvailable = true; +// } else { +// recoilAvailable = false; +// } +// if (chart == "none") { +// recoilAvailable = false; +// } +// if (chart == "err" || currAttachments == "err") { +// hasError = true; +// return "Cocaineeee"; +// } +// var dmg = +// common.damageHandler( +// currDRM.damage, +// currDRM.range, +// 1, +// 100, +// 60000 / currStats[5], +// currStats[7], +// currStats[6], +// currStats[0] +// ) || "```This should never happen```"; +// out = [ +// currGun.description +// ? { +// name: "**Description:**", +// value: "```\n" + currGun.description + "```", +// } +// : {}, +// { name: "**Damage Profile:**", value: dmg }, +// ...out, +// ]; +// out = out.filter(x => x.value); +// return { +// title: interpretion, +// color: 5814783, +// fields: out, +// footer: { +// text: "All data courtesy of Round Table", +// icon_url: +// "", //update the icon later +// }, +// }; +// }