copying from cath.js

This commit is contained in:
NK 2023-04-18 10:47:47 +01:00
parent 4491b1b9f5
commit 33d5b3e19d
75 changed files with 8908 additions and 1861 deletions

View file

@ -6,5 +6,5 @@ SPOTIFY_ID =
SPOTIFY_SECRET =
host = lavalink.darrennathanael.com
port = 2095
password = whatwasthelastthingyousaid
password = whatwasthelastingyousaid
api = http://api.cath.gq

46
.github/README.md vendored
View file

@ -1,4 +1,4 @@
<h1 align="center"> NYX [Cath.exe] </h1>
<h1 align="center"> NYX </h1>
<!-- header -->
<p align="center">
<a href="https://rebrand.ly/cathSupport" target="_blank"><img alt="NYX_banner" src = "https://media.discordapp.net/attachments/896078559293104128/896091759157858394/nyx_banner_3d.png?width=1341&height=447"></a>
@ -18,20 +18,18 @@
<a href="https://rebrand.ly/cathSupport"><img src="https://discordapp.com/api/guilds/718762019586572341/widget.png?style=banner2" alt="Support Server" /></a>
</p>
<!-- description -->
**NYX** _(previously known as Cath)_ is a first and only **COD Mobile Statistics & Gunsmith** Bot which also doubles as a multipurpose discord bot with many features that include but are not limited to Moderation, Music and Economy. <br>
The Call of Duty Stats are courtesy of **Stats on Duty** & **Round Table**<br>
🔺 **Apex Legends Commands** will be added soon, the player stats command will be added after the global launch when the API supports it.
<br><br>
**NYX** *(previously known as Cath)* is a first and only **COD Mobile Statistics & Gunsmith** Bot which also doubles as a multipurpose discord bot with many features that include but are not limited to Moderation, Music and Economy. <br>
The Call of Duty Stats are courtesy of **Round Table** by Cygnoux Familia.<br><br>
If you like this bot, feel free to :star: **Star** this repository.<br>
> ⚠ The Verifed bot instance is current called Cath.exe, we are working on getting it changed
> <br>
<br>
# Features
> _This is a Non-Exhaustive list for commands. To access the full list of commands, check out our [Documentation](https://thunder75.gitbook.io/cath-bot/core/commands)._
> *This is a Non-Exhaustive list for commands. To access the full list of commands, check out our [Documentation](https://thunder75.gitbook.io/cath-bot/core/commands).*
<a href="https://thunder75.gitbook.io/cath-bot/core/commands" ><img src="https://img.shields.io/static/v1?label=List %20OF&message=Commands&color=5865F2&logo=gitbook&logoColor=white&style=for-the-badge&scale=1.4"></a>
@ -45,23 +43,13 @@ If you like this bot, feel free to :star: **Star** this repository.<br>
## <img height="18px" src="../util/assets/images/cod_logo.svg"> **Call of Duty Mobile**
- **Weapon Statistics** courtesy of **Round Table** & **Stats On Duty**
- **Currated Gunsmith Builds** by various content creators like Jokesta, dHitman, Path.exe, Stats On Duty and more comming soon.
- **Weapon Statistics** courtesy of **Round Table** by Cygnoux Familia.
- **Currated Gunsmith Builds** by various content creators like Jokesta, dHitman, Path.exe and more comming soon.
- **Perks** detailed info about the perks.
- **Scorestreak** detailed info about scorestreak with preview videos.
- **Randomly Generated Class** Wanna try something challenging? try our Randomly Generated Gunsmith builds.
> We also provide access to our database that includes In-depth Weapon statistics & Gunsmith Builds from various Content Creators, & other Call of duty related info, please [contact us](https://rebrand.ly/cathSupport) for more info.
## <img height="16px" src="../util/assets/images/apex/apex-legends-logo-white.svg"> **Apex Legends Mobile**
> ⚠ *Coming Soon™*
- **Player Stats** view your in-game stats. <!-- if they support mobile for the stats api -->
- **Legends** detailed info about legends & their abilities.
- **Guns** detailed info about guns.
- **Random Combos** Wanna try something challenging? try to win a game with a random selected legend & Gun combination
- *& many more, coming soon!*
## More Info
[![Top language](https://img.shields.io/github/languages/top/night0721/cath.exe?labelColor=F7DF1E&color=555555&style=for-the-badge&scale=1.4)](https://github.com/night0721/cath.exe)
@ -70,7 +58,8 @@ If you like this bot, feel free to :star: **Star** this repository.<br>
A detailed Deployment guide can be found [here](https://thunder75.gitbook.io/cath-bot/deployment).
<!-- <details>
<details>
<summary>Made With</summary>
[![JavaScript](https://img.shields.io/badge/JavaScript-F7DF1E?style=for-the-badge&logo=javascript&logoColor=black)](https://developer.mozilla.org/en-US/docs/Web/JavaScript)
@ -80,6 +69,15 @@ A detailed Deployment guide can be found [here](https://thunder75.gitbook.io/cat
<img src ="https://forthebadge.com/images/badges/built-with-love.svg" width = "122"><br>
</details>
<details>
<summary>Issues & PRs</summary>
[![Open issues](https://img.shields.io/github/issues-raw/night0721/cath.exe?style=for-the-badge)](https://github.com/night0721/cath.exe/issues)
[![Closed issues](https://img.shields.io/github/issues-closed-raw/night0721/cath.exe?style=for-the-badge)](https://github.com/night0721/cath.exe/issues)
[![Open PRs](https://img.shields.io/github/issues-pr-raw/night0721/cath.exe?style=for-the-badge)](https://github.com/night0721/cath.exe/pulls)
[![Closed PRs](https://img.shields.io/github/issues-pr-closed-raw/night0721/cath.exe?style=for-the-badge)](https://github.com/night0721/cath.exe/pulls)
</details>
<details>
<summary>Github Stats</summary>
@ -87,9 +85,9 @@ A detailed Deployment guide can be found [here](https://thunder75.gitbook.io/cat
![GitHub Discussions](https://img.shields.io/github/discussions/night0721/cath.exe?color=5865F2&logo=github&logoColor=ffffff&style=for-the-badge)
![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/night0721/cath.exe?color=5865F2&logo=github&logoColor=ffffff&style=for-the-badge)
[![Last commit](https://img.shields.io/github/last-commit/night0721/cath.exe?icon=discord&color=5865F2&style=for-the-badge&scale=1.4)](https://github.com/night0721/cath.exe)
<!-- [![Files](https://tokei.rs/b1/github/night0721/cath.exe?category=files&style=for-the-badge)](https://github.com/night0721/cath.exe)
<!-- [![Files](https://tokei.rs/b1/github/night0721/cath.exe?category=files&style=for-the-badge)](https://github.com/night0721/cath.exe) -->
</details> -->
</details>
<h1 align = "center"> Support, Feature Request & Bug Reports </h1>
@ -117,7 +115,5 @@ Contributions are always welcomed, but make sure to read [Contributing.md](/CONT
<p align = "center">
<a href="https://discord.gg/mjVwkCsWY7" target="_blank"><img src="https://discordapp.com/api/guilds/756525751594909797/widget.png?style=banner1"></a>
</p> -->
<!-- <img src="https://socialify.git.ci/night0721/cath.exe/image?description=1&descriptionEditable=A%20Discord.js%20v13%20Template%20based%20on%20cath.exe&font=Raleway&forks=1&issues=1&language=1&owner=1&pattern=Circuit%20Board&pulls=1&stargazers=1&theme=Dark"> -->

110
CODM/builds.js Normal file
View file

@ -0,0 +1,110 @@
const builds = require("../util/Data/builds.json");
const guns = builds.Main;
const Discord = require("discord.js");
const nmDt = require("../util/Data/aliases.json");
const weaponActualName = nmDt.weaponActualName;
const weaponAlliasName = nmDt.weaponAlliasName;
module.exports = {
name: "build",
description: "Check gun builds",
usage: "(Gun)",
category: "CODM",
status: false,
Owner: true,
run: async (client, message, args) => {
const currGun = weaponIdentifier(args.join(" ").replace("\n", " "));
if (!currGun) message.reply({ content: "Please specify a gun" });
if (typeof currGun == "string") {
message.reply({ embeds: [currGun] });
} else {
const attachNames = currGun.Attachments.map(
x => `**${x.Name}** [${builds.AttachmentTypes[x.Type]}]`
);
const embed = new Discord.MessageEmbed()
.setTitle(
`Build for ${currGun.Name} (${builds.WeaponTypes[currGun.Type]})`
)
.setColor(16580400)
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
.setTimestamp()
.setURL(client.web)
.setDescription(
attachNames.reduce(
(t, x, i, a) => t + (i < a.length - 1 ? "\n" : " \n") + x
)
)
.setImage(currGun.URL);
return message.reply({ embeds: [embed] });
}
},
};
function weaponIdentifier(inpWeaponName) {
if (inpWeaponName.length < 2) {
return "The name `" + inpWeaponName + "` is too short.";
}
let probableWeapons = [];
for (let i = 0; i < guns.length; i++) {
if (inpWeaponName.Simplify() == guns[i].Name.Simplify()) {
return guns[i];
} else if (guns[i].Name.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() == inpWeaponName.Simplify()) {
for (let i2 = 0; i2 < guns.length; i2++) {
if (weaponActualName[i].Simplify() == guns[i2].Name.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].Name)
.reduce((out, x, i) =>
[out, x].join(i === probableWeapons.length - 1 ? "` or `" : "`, `")
) +
"`?"
);
}
return "Couldn't identify the weapon: `" + '"' + inpWeaponName + '"`';
}
// ENABLE AFTER Holloween
// run: async (client, interaction, args) => {
// const embed = new MessageEmbed()
// .setTitle(`Prefix commands are now disabled`)
// .setDescription(`Please enable **Application commands** in the channel settings to get access to slash commands, we have discontinued prefix commands.`)
// .setColor(client.color)
// .setThumbnail(interaction.guild.iconURL({ dynamic: true }))
// .addFields(
// {
// name: "Need help ?",
// value: `Join our **[Support Server](https://discord.gg/SR7TeNJG67)**`,
// inline: true,
// },
// {
// name: "Support us <a:donate:896985486260846614>",
// value: `[KoFi](https://ko-fi.com/cathteam)`,
// inline: true,
// }
// )
// .setThumbnail("https://github.com/night0721/cath.js/blob/master/util/assets/images/nyx_logo_transparent.webp")
// .setTimestamp();
// interaction.followUp({ embeds: [embed] });
// },
// };

55
CODM/class.js Normal file
View file

@ -0,0 +1,55 @@
const { MessageEmbed } = require("discord.js");
const model = require("../../models/weapons");
const Attachments = require("../../util/Data/attachments.json");
module.exports = {
name: "class",
description: "Generate random class in CODM",
category: "CODM",
run: async (client, message, args) => {
const data = async () => {
const d = await model.findOne({});
const types = d.Categories;
const names = d.Primary;
const category = types[Math.floor(Math.random() * types.length)];
const weapons = names[0][category];
return `${weapons[Math.floor(Math.random() * weapons.length)]}`;
};
const primary_weapon = await data();
const primary = primary_weapon.replace(/[ -]/g, "_").replace(/\./g, "");
const slots = shuffle(Object.keys(Attachments[primary][0]));
const slot_1 = slots.next().value,
slot_2 = slots.next().value,
slot_3 = slots.next().value,
slot_4 = slots.next().value,
slot_5 = slots.next().value;
const result = new MessageEmbed()
.setColor(client.color)
.setTitle(`🎲Random Class of ${primary_weapon}🎲`)
.setDescription(
`**Attachments**\n**${getAttachment(
primary,
slot_1,
)}**\n**${getAttachment(primary, slot_2)}**\n**${getAttachment(
primary,
slot_3,
)}**\n**${getAttachment(primary, slot_4)}**\n**${getAttachment(
primary,
slot_5,
)}**`,
)
.setURL(client.web)
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
.setTimestamp();
message.reply({ embeds: [result] });
function* shuffle(array) {
let i = array.length;
while (i--) {
yield array.splice(Math.floor(Math.random() * (i + 1)), 1)[0];
}
}
function getAttachment(gun, slot) {
const ca = Attachments[gun][0][slot];
return ca[Math.floor(Math.random() * ca.length)];
}
},
};

118
CODM/damage.js Normal file
View file

@ -0,0 +1,118 @@
const common = require("../../util/functions/common");
let currGun = {},
currStats = [],
currAttachments = {},
currDRM = {},
totalEffects = [],
interpretion = "",
hasError = false;
const errMsg = "*Generic placeholder error message*";
module.exports = {
name: "damage",
description: "Check gun damage",
usage: "(Gun)",
category: "CODM",
run: async (client, message, args) => {
const repEmb = dmg(args.join(" ").replace("\n", " "));
if (hasError) {
message.reply({ embeds: [repEmb] });
}
else {
message.channel.send({ embeds: [repEmb] });
}
},
};
function dmg(inpmsg) {
currGun = common.weaponIdentifier(inpmsg);
if (typeof currGun == "string") {
hasError = true;
return currGun;
}
currDRM = currGun.drm[0];
currStats = currGun.stats;
currAttachments = common.attachmentsIdentifier(
inpmsg,
currGun.aments,
currStats,
);
if (typeof currAttachments == "string") {
hasError = true;
return currAttachments;
}
if (currAttachments.length) {
totalEffects = common.totaler(currAttachments);
currDRM = currGun.drm[totalEffects[37]];
currDRM.range = currDRM.range.map(
x => (x * (totalEffects[13] + 100)) / 100,
);
currStats = common.updateStatswithEffects(totalEffects, currStats);
}
const mn = [
"Head",
"Neck",
"Upper Chest",
"Lower Chest",
"Shoulders",
"Upper Arms",
"Lower Arms",
"Stomach",
"Belly Button",
"Crotch",
"Thighs",
"Calf Muscles",
"Feet",
],
m1 = currDRM.bodymultiplier,
m2 = [...new Set(m1)], // [1.2, 1, 0.9]
m3 = m1.map(x => m2.indexOf(x)), // [0, 1, 1, 1, 1, 1, 2, 2, 2]
m4 = m2
.map(x =>
m3
.map((y, i) => {
if (x === m2[y]) {
return mn[i];
}
})
.filter(y => y),
)
.map(x =>
x.length === m1.length
? ["All"]
: x.length === m1.length - 1
? ["Others"]
: x,
);
interpretion = currGun.gunname + common.interpretioner(currAttachments);
return {
title: "**" + interpretion + "**",
color: 4849497,
fields: m4.map((x, i) => {
return {
name: x.join(", ") + ":",
value: common.damageHandler(
currDRM.damage,
currDRM.range,
m2[i],
100,
60000 / currStats[5],
currStats[7],
currStats[6],
currStats[0],
),
};
}),
footer: {
text: "All the stats courtesy of Project Lighthouse",
icon_url:
"https://media.discordapp.net/attachments/735590814662656102/806960573753327657/cc.png?width=638&height=638",
},
};
}
// console.log(dmg("47 + mono"));
/* console.log(dmg("47"));
console.log(dmg("striker + choke"));
console.log(dmg("striker + choke"));
console.log(dmg("striker"));
common.makeError();*/

168
CODM/effects.js vendored Normal file
View file

@ -0,0 +1,168 @@
const common = require("../util/functions/common");
const data = require("../util/Data/data.json");
let currGun, currAttachments, interpretion, hasError;
const errMsg = "*Generic placeholder error message*";
module.exports = {
name: "effects",
description: "Check gun effects",
usage: "(Gun)",
category: "CODM",
aliases: ["attachements"],
/**
* @param {Client} client
* @param {Message} message
* @param {String[]} args
*/
run: async (client, message, args) => {
const repEmb = attachments(args.join(" ").replace("\n", " "));
if (hasError) {
message.reply({ embeds: [repEmb] });
} else {
message.channel.send({ embeds: [repEmb] });
}
},
};
function attachments(inpmsg) {
const out = "",
at = data.attachmentTypes.map(x => (x.slice(-1) === "s" ? x : x + "s"));
if (inpmsg.includes("+") && inpmsg.includes(":")) {
hasError = true;
return "Bro, can u liek, not do that?";
}
if (inpmsg.includes(":")) {
const inpAll = inpmsg
.split(":")
.map(x => x.trim())
.filter(x => x),
inpType = inpAll.length === 2 ? inpAll[1] : null;
if (!inpType) {
hasError = true;
return inpAll.length < 2
? "Empty " + (inpAll[0] ? "" : "weapon name and ") + "attachment type"
: "Multiple `:`s detected";
}
currGun = common.weaponIdentifier(inpAll[0]);
if (typeof currGun == "string") {
hasError = true;
return currGun;
}
let currAttachmentsType = at.filter(x => simplify(x) == simplify(inpType));
currAttachmentsType = currAttachmentsType.length
? currAttachmentsType
: at.filter(
x => simplify(x.substring(0, x.length - 1)) == simplify(inpType)
);
currAttachmentsType = currAttachmentsType.length
? currAttachmentsType
: at.filter(x => simplify(x).includes(simplify(inpType)));
if (currAttachmentsType.length === 0) {
hasError = true;
return "Couldn't identify `" + inpType + "`";
} else if (currAttachmentsType.length === 1) {
currAttachmentsType = at.indexOf(currAttachmentsType[0]);
} else {
hasError = true;
return (
"Did you mean `" +
currAttachmentsType.reduce((out, x, i) =>
[out, x].join(
i === currAttachmentsType.length - 1 ? "` or `" : "`, `"
)
) +
"`"
);
}
return {
title: currGun.gunname,
color: 11348938,
fields: [
{
name:
"**" +
currGun.gunname +
"** has the following " +
at[currAttachmentsType],
value:
"```\n" +
currGun.aments
.filter(x => x.type - 1 === currAttachmentsType)
.map(x => x.name)
.join("\n") +
"```",
},
],
footer: {
text: "All the stats courtesy of Project Lighthouse",
icon_url:
"https://media.discordapp.net/attachments/735590814662656102/806960573753327657/cc.png?width=638&height=638",
},
};
function simplify(v) {
return v.toLowerCase().replace(/[^0-9a-z]/g, "");
}
}
currGun = common.weaponIdentifier(inpmsg);
if (typeof currGun == "string") {
hasError = true;
return currGun;
}
hasAttachments = common.hasAttachments(inpmsg);
currAttachments = [];
if (hasAttachments) {
currAttachments = common.attachmentsIdentifier(
inpmsg,
currGun.aments,
currGun.stats
);
if (typeof currAttachments == "string") {
hasError = true;
return currAttachments;
}
return {
title: currGun.gunname + common.interpretioner(currAttachments),
color: 11348938,
fields: common.attachmentHandler(
common.totaler(currAttachments),
currGun.stats
),
footer: {
text: "All the stats courtesy of Project Lighthouse",
icon_url:
"https://media.discordapp.net/attachments/735590814662656102/806960573753327657/cc.png?width=638&height=638",
},
};
} else {
const availableAttachmentTypes = [
...new Set(currGun.aments.map(x => x.type)),
];
return {
title: currGun.gunname,
color: 11348938,
fields: [
{
name:
"**" + currGun.gunname + "** has the following attachment types:",
value:
"```\n" +
availableAttachmentTypes.map(x => at[x - 1]).join(",\n") +
"```",
},
],
footer: {
text: "All the stats courtesy of Project Lighthouse",
icon_url:
"https://media.discordapp.net/attachments/735590814662656102/806960573753327657/cc.png?width=638&height=638",
},
};
}
}
// console.log(attachments("Peacekeeper:muzzle")); //common.makeError();
/* console.log(attachments(":")); //common.makeError();
console.log(attachments("47:optics")); //common.makeError();
console.log(attachments("47")); //common.makeError();
console.log(attachments("47 + ")); //common.makeError();
console.log(attachments("47 + :")); //common.makeError();
console.log(attachments("47 + red dot")); common.makeError();*/

111
CODM/sgrelo.js Normal file
View file

@ -0,0 +1,111 @@
module.exports = {
name: "sgrelo",
descriptiom: "Calculate reload time for shotgun",
run: async (client, message, args) => {
let err = "",
wrn = "",
interpretedAs = [];
function mather(inp) {
const inpArr = interpreter(inp),
outArr = [];
inpArr.map((x, i, a) => {
for (let j = i + 1; j < a.length; j++) {
outArr.push(worker(x, a[j]));
}
});
const aArr = outArr.map(x => x.a),
iArr = outArr.map(x => x.i);
return (
"Input: `" +
interpretedAs.join("`, `") +
"`" +
(aArr.length == 1
? "\nOpening and Closing Animation Time: " +
beautifier(aArr[0]) +
"\nReload Time: " +
beautifier(iArr[0])
: "\nAll Opening and Closing Animation Time: " +
aArr.map(x => beautifier(x)).join(", ") +
"\nAll Reload Time: " +
iArr.map(x => beautifier(x)).join(", ") +
"\nAverage Opening and Closing Animation Time: " +
beautifier(aArr.reduce((t, x) => t + x, 0) / aArr.length) +
"\nAverage Reload Time: " +
beautifier(iArr.reduce((t, x) => t + x, 0) / iArr.length))
);
}
function interpreter(inp) {
let out = [
...new Set(
inp
.split(/\n|, |,/g)
.filter(x => x)
.map(x => x.toLowerCase().replace(/[^0-9a-z]/g, ""))
),
];
out = out
.map(x => {
interpretedAs.push(x);
const obj = {
b: 0,
f: 0,
};
if (
x.split(/b/g).length > 2 ||
x.split(/f/g).length > 2 ||
x.split(/[a-z]/g).length > 3
) {
err += "Unknown identifier `" + x + "`\n";
} else if (x.indexOf("b") === -1 || x.indexOf("f") === -1) {
err += "Missing identifier `" + x + "`\n";
} else if (x.indexOf("b") === x.length - 1) {
obj.b = parseFloat(x.split("f")[1].trim());
obj.f = parseFloat(x.split("f")[0].trim());
} else if (x.indexOf("f") === x.length - 1) {
obj.b = parseFloat(x.split("b")[0].trim());
obj.f = parseFloat(x.split("b")[1].trim());
} else {
err += "Unknown identifier `" + x + "`\n";
}
if (!obj.b && obj.f) {
err += "Couldn't interpret `" + x + "`\n";
} else if (!Number.isInteger(obj.b)) {
err += "Decimal bullet count found `" + x + "`\n";
} else if (!Number.isInteger(obj.f)) {
wrn += "Decimal value found `" + x + "`\n";
}
return obj;
})
.filter(x => JSON.stringify(x).length && x);
if (out.length === 1) {
err += "Single equation found\n";
}
return err || !out.length ? [] : out;
}
function worker(o1, o2) {
const out = {
i: 0,
a: 0,
};
out.i = (o1.f - o2.f) / (o1.b - o2.b);
out.a = o1.f - out.i * o1.b;
return out;
}
function beautifier(num) {
return parseFloat(num.toFixed(2)).toString() + "s";
}
const msg = mather(args.join(" "));
if (err !== "") {
message.reply(err);
} else if (wrn !== "") {
message.reply({ content: wrn + "\n" + msg });
} else {
message.channel.send({ content: msg });
}
},
};

274
CODM/stats.js Normal file
View file

@ -0,0 +1,274 @@
const common = require("../util/functions/common");
const data = require("../util/Data/data.json");
const Discord = require("discord.js");
let currGun,
currStats,
currAttachments,
currRecoilArr,
currDRM,
interpretion,
recoilAvailable,
chart,
hasError;
const errMsg = "*Generic placeholder error message*";
module.exports = {
name: "stats",
description: "Check gun stats",
usage: "(Gun)",
category: "CODM",
/**
* @param {Client} client
* @param {Message} message
* @param {String[]} args
*/
run: async (client, message, args) => {
recoilAvailable = false;
hasError = false;
const repEmb = statsHandler(args.join(" ").replace("\n", " "));
if (hasError) {
message.reply({ embeds: [repEmb] });
}
if (recoilAvailable) {
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 };
}
message.reply({ embeds: [repEmb] });
},
};
function inpHandler(inpmsg) {
statsHandler(inpmsg.split("+")[0]);
}
function statsHandler(inpmsg) {
let 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 = [];
currGun = common.weaponIdentifier(inpmsg);
if (typeof currGun == "string") {
hasError = true;
return currGun;
}
currStats = currGun.stats;
currDRM = currGun.drm[0];
currAttachments = [];
currAttachments = common.attachmentsIdentifier(
inpmsg,
currGun.aments,
currStats
);
if (typeof currAttachments == "string") {
hasError = true;
return currAttachments;
}
currRecoilArr = [1, 1, currGun.stats[17]];
if (currAttachments.length != 0) {
const 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;
const 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) {
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";
}
const 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 Project Lighthouse and CoDM Research Crew",
icon_url:
"https://media.discordapp.net/attachments/735590814662656102/806960573753327657/cc.png?width=638&height=638",
},
};
}
// console.log(statsHandler("Holger").fields);

View file

@ -1,2 +1,2 @@
const { CODMClient } = require("cath");
module.exports = new CODMClient(process.env.CODM_API_KEY);
module.exports = new CODMClient("Gae");

View file

@ -14,7 +14,7 @@ class NYX extends Client {
presence: {
activities: [
{
name: `/help`,
name: `v${require("../package.json").version} | /help`,
type: "STREAMING",
url: "https://www.youtube.com/watch?v=YSKDu1gKntY",
},
@ -22,7 +22,6 @@ class NYX extends Client {
},
shard: "auto",
restTimeOffset: 0,
restRequestTimeout: 99999,
partials: ["MESSAGE", "CHANNEL", "REACTION", "GUILD_MEMBER"],
intents: 24207,
}
@ -46,12 +45,13 @@ class NYX extends Client {
"556808365574193194", // chunchunmaru
"746753527338238115", // mightyful
];
this.currency = "<:nyx_currency:918584872333893703>";
this.currency = "<:cp:840231933933387797>"; // <a:pumpkin:898975476863877170>
this.xp = "<:nyx_xp:900309007472926720>";
this.path = [
"614423108388126731", // Camper on Duty
"767173194943168542", // Dark Bonker
"718762019586572341", // NYX Nation
"869583978108157972", // Lighthouse Community
"840225563193114624", // Command Test
];
const client = this;

View file

@ -1,10 +1,9 @@
const { MessageEmbed } = require("discord.js");
const moment = require("moment");
const axios = require("axios");
const moment = require("moment");
module.exports = {
name: "build",
description: "Get gunsmith builds",
usage: "[Weapon Name] [Author] [Tag]",
type: "CHAT_INPUT",
category: "CODM",
options: [
@ -20,109 +19,101 @@ module.exports = {
required: true,
choices: [
{
name: "Type 25",
value: "A01",
name: "AK117",
value: "ak117",
},
{
name: "M16",
value: "A02",
value: "m16",
},
{
name: "AK117",
value: "A03",
name: "Type 25",
value: "type25",
},
{
name: "AK-47",
value: "A04",
value: "ak47",
},
{
name: "ASM10",
value: "A05",
value: "asm10",
},
{
name: "M4",
value: "A06",
value: "m4",
},
{
name: "BK57",
value: "A07",
value: "bk57",
},
{
name: "LK24",
value: "A08",
},
{
name: "ICR-1",
value: "A09",
value: "lk24",
},
{
name: "Man-o-War",
value: "A10",
value: "manowar",
},
{
name: "ICR-1",
value: "icr1",
},
{
name: "KN-44",
value: "A11",
value: "kn44",
},
{
name: "HBRa3",
value: "A12",
value: "hbra3",
},
{
name: "HVK-30",
value: "A13",
value: "hvk30",
},
{
name: "DR-H",
value: "A14",
value: "drh",
},
{
name: "Peacekeeper MK2",
value: "A15",
value: "peacekeepermk2",
},
{
name: "FR .556",
value: "A16",
value: "fr556",
},
{
name: "AS VAL",
value: "A17",
value: "asval",
},
{
name: "CR-56 AMAX",
value: "A18",
value: "cr56amax",
},
{
name: "M13",
value: "A19",
value: "m13",
},
{
name: "Swordfish",
value: "A20",
},
{
name: "Kilo 141",
value: "A21",
value: "swordfish",
},
],
},
{
type: 3,
name: "author",
name: "youtuber",
description: "Select a Content Creator",
required: true,
choices: [
{
name: "path.exe",
value: "path.exe",
name: "Path.exe",
value: "path",
},
{
name: "Jokesta",
value: "Jokesta",
value: "jokesta",
},
// {
// name: "Stats On Duty",
// value: "Stats On Duty",
// },
],
},
{
@ -133,19 +124,19 @@ module.exports = {
choices: [
{
name: "Aggressive",
value: "Aggressive",
value: "aggressive",
},
{
name: "Passive",
value: "Passive",
value: "passive",
},
{
name: "Search And Destroy",
value: "Search And Destroy",
name: "Search & Destroy",
value: "snd",
},
{
name: "Respawn",
value: "Respawn",
value: "respawn",
},
],
},
@ -163,88 +154,80 @@ module.exports = {
required: true,
choices: [
{
name: "RUS-79U",
value: "D01",
},
{
name: "Chicom",
value: "D02",
name: "RUS-79u",
value: "rus79u",
},
{
name: "PDW-57",
value: "D03",
value: "pdw57",
},
{
name: "Razorback",
value: "D04",
value: "razorback",
},
{
name: "MSMC",
value: "D05",
value: "msmc",
},
{
name: "HG40",
value: "D06",
value: "hg40",
},
{
name: "Pharo",
value: "D07",
value: "pharo",
},
{
name: "GKS",
value: "D08",
value: "gks",
},
{
name: "Cordite",
value: "D09",
value: "cordite",
},
{
name: "QQ9",
value: "D10",
value: "qq9",
},
{
name: "Fennec",
value: "D11",
value: "fennec",
},
{
name: "Chicom",
value: "chicom",
},
{
name: "AGR 556",
value: "D12",
value: "agr556",
},
{
name: "QXR",
value: "D13",
value: "qxr",
},
{
name: "PP19 Bizon",
value: "D14",
value: "pp19bizon",
},
{
name: "MX9",
value: "D15",
},
{
name: "CBR4",
value: "D16",
},
{
name: "PPSh 41",
value: "D17",
value: "mx9",
},
],
},
{
type: 3,
name: "author",
name: "youtuber",
description: "Select a Content Creator",
required: true,
choices: [
{
name: "path.exe",
value: "path.exe",
name: "Path.exe",
value: "path",
},
{
name: "Jokesta",
value: "Jokesta",
value: "jokesta",
},
],
},
@ -256,19 +239,19 @@ module.exports = {
choices: [
{
name: "Aggressive",
value: "Aggressive",
value: "aggressive",
},
{
name: "Passive",
value: "Passive",
value: "passive",
},
{
name: "Search And Destroy",
value: "Search And Destroy",
name: "Search & Destroy",
value: "snd",
},
{
name: "Respawn",
value: "Respawn",
value: "respawn",
},
],
},
@ -285,54 +268,54 @@ module.exports = {
description: "Name of the Gun",
required: true,
choices: [
// {
// name: "XPR-50",
// value: "B01",
// },
{
name: "Arctic .50",
value: "B02",
value: "arctic50",
},
{
name: "M21 EBR",
value: "B03",
value: "m21ebr",
},
{
name: "DL Q33",
value: "B04",
value: "dlq33",
},
{
name: "Locus",
value: "B05",
value: "locus",
},
// {
// name: "XPR-50",
// value: "xpr50",
// },
// {
// name: "NA-45",
// value: "B06",
// value: "na45",
// },
{
name: "Outlaw",
value: "B07",
value: "outlaw",
},
{
name: "Rytec AMR",
value: "B08",
},
{
name: "SVD",
value: "B09",
value: "rytecamr",
},
],
},
{
type: 3,
name: "author",
name: "youtuber",
description: "Select a Content Creator",
required: true,
choices: [
{
name: "path.exe",
value: "path.exe",
name: "Path.exe",
value: "path",
},
// {
// name: "little_b",
// value: "littleb",
// },
],
},
{
@ -343,19 +326,19 @@ module.exports = {
choices: [
{
name: "Aggressive",
value: "Aggressive",
value: "aggressive",
},
{
name: "Passive",
value: "Passive",
value: "passive",
},
{
name: "Search And Destroy",
value: "Search And Destroy",
name: "Search & Destroy",
value: "snd",
},
{
name: "Respawn",
value: "Respawn",
value: "respawn",
},
],
},
@ -374,47 +357,43 @@ module.exports = {
choices: [
{
name: "S36",
value: "C01",
value: "s36",
},
{
name: "UL736",
value: "C02",
value: "ul736",
},
{
name: "RPD",
value: "C03",
value: "rpd",
},
{
name: "M4 LMG",
value: "C04",
value: "m4lmg",
},
{
name: "Chopper",
value: "C05",
value: "chopper",
},
{
name: "Holger 26",
value: "C06",
value: "holger26",
},
{
name: "Hades",
value: "C07",
},
{
name: "PKM",
value: "C08",
value: "hades",
},
],
},
{
type: 3,
name: "author",
name: "youtuber",
description: "Select a Content Creator",
required: true,
choices: [
{
name: "path.exe",
value: "path.exe",
name: "Path.exe",
value: "path",
},
],
},
@ -426,19 +405,19 @@ module.exports = {
choices: [
{
name: "Aggressive",
value: "Aggressive",
value: "aggressive",
},
{
name: "Passive",
value: "Passive",
value: "passive",
},
{
name: "Search And Destroy",
value: "Search And Destroy",
name: "Search & Destroy",
value: "snd",
},
{
name: "Respawn",
value: "Respawn",
value: "respawn",
},
],
},
@ -457,47 +436,43 @@ module.exports = {
choices: [
{
name: "HS2126",
value: "E01",
value: "hs2126",
},
{
name: "BY15",
value: "E02",
},
{
name: "HS0405",
value: "E03",
value: "by15",
},
{
name: "Striker",
value: "E04",
value: "striker",
},
{
name: "KRM 262",
value: "E05",
name: "KRM_262",
value: "krm262",
},
{
name: "Echo",
value: "E06",
value: "echo",
},
{
name: "HS0405",
value: "hs0405",
},
{
name: "R9-0",
value: "E07",
},
{
name: "JAK-12",
value: "E08",
value: "r90",
},
],
},
{
type: 3,
name: "author",
name: "youtuber",
description: "Select a Content Creator",
required: true,
choices: [
{
name: "path.exe",
value: "path.exe",
name: "Path.exe",
value: "path",
},
{
name: "dHitman",
@ -513,11 +488,11 @@ module.exports = {
choices: [
{
name: "ADS",
value: "ADS",
value: "ads",
},
{
name: "Hipfire",
value: "Hipfire",
value: "hipfire",
},
],
},
@ -536,36 +511,36 @@ module.exports = {
choices: [
{
name: "Kilo Bolt-Action",
value: "F01",
value: "kiloboltaction",
},
{
name: "SKS",
value: "F02",
value: "sks",
},
{
name: "SP-R 208",
value: "F03",
value: "spr208",
},
{
name: "MK2",
value: "F04",
value: "mk2",
},
],
},
{
type: 3,
name: "author",
name: "youtuber",
description: "Select a Content Creator",
required: true,
choices: [
{
name: "path.exe",
value: "path.exe",
},
{
name: "Stats On Duty",
value: "Stats On Duty",
name: "Path.exe",
value: "path",
},
// {
// name: "Little_b",
// value: "littleb",
// },
],
},
{
@ -576,15 +551,15 @@ module.exports = {
choices: [
{
name: "Aggressive",
value: "Aggressive",
value: "aggressive",
},
{
name: "Passive",
value: "Passive",
value: "passive",
},
{
name: "Respawn",
value: "Respawn",
value: "respawn",
},
],
},
@ -603,44 +578,40 @@ module.exports = {
choices: [
{
name: "J358",
value: "G01",
value: "j358",
},
{
name: "MW11",
value: "G02",
value: "mw11",
},
{
name: ".50 GS",
value: "G03",
value: "gs50",
},
{
name: "Renetti",
value: "G04",
value: "renetti",
},
{
name: "Shorty",
value: "G05",
value: "shorty",
},
{
name: "Crossbow",
value: "G06",
value: "crossbow",
},
],
},
{
type: 3,
name: "author",
name: "youtuber",
description: "Select a Content Creator",
required: true,
choices: [
{
name: "path.exe",
value: "path.exe",
name: "Path.exe",
value: "path",
},
// {
// name: "Stats On Duty",
// value: "Stats On Duty",
// },
],
},
{
@ -651,7 +622,7 @@ module.exports = {
choices: [
{
name: "Respawn",
value: "Respawn",
value: "respawn",
},
],
},
@ -659,43 +630,141 @@ module.exports = {
},
],
run: async (client, interaction, args) => {
const cwts = args[1];
const allguns = {
ak117: "AK117",
m16: "M16",
type25: "Type 25",
ak47: "AK-47",
asm10: "ASM10",
m4: "M4",
bk57: "BK57",
lk24: "LK24",
manowar: "Man-O-War",
icr1: "ICR-1",
kn44: "KN-44",
hbra3: "HBRa3",
hvk30: "HVK-30",
drh: "DR-H",
peacekeepermk2: "Peacekeeper MK2",
fr556: "FR .556",
asval: "AS VAL",
cr56amax: "CR-56 AMAX",
m13: "M13",
swordfish: "Swordfish",
j358: "J358",
gs50: ".50 GS",
mw11: "MW11",
renetti: "Renetti",
shorty: "Shorty",
crossbow: "Crossbow",
kiloboltaction: "Kilo Bolt-Action",
sks: "SKS",
spr208: "SP-R 208",
mk2: "mk2",
s36: "S36",
ul736: "UL736",
rpd: "RPD",
m4lmg: "M4LMG",
chopper: "Chopper",
holger26: "Holger 26",
hades: "Hades",
arctic50: "Arctic .50",
m21ebr: "M21 EBR",
dlq33: "DL Q33",
locus: "Locus",
// na45: "NA 45",
// xpr50: "XPR-50",
locus: "Locus",
outlaw: "Outlaw",
rytecamr: "Rytec AMR",
hs2126: "HS2126",
by15: "BY15",
striker: "Striker",
krm262: "KRM 262",
echo: "Echo",
hs0405: "HS0405",
r90: "R9-0",
rus79u: "RUS-79U",
hg40: "HG-40",
pdw57: "PDW-57",
chicom: "Chicom",
razorback: "Razorback",
msmc: "MSMC",
pharo: "Pharo",
gks: "GKS",
cordite: "Cordite",
qq9: "QQ9",
fennec: "Fennec",
agr556: "AGR 556",
qxr: "QXR",
pp19bizon: "PP19 Bizon",
mx9: "MX9",
};
const all = {
assault_rifle: "Assault Rifle",
sniper_rifle: "Sniper Rifle",
marksman_rifle: "Marksman Rifle",
shotgun: "Shotgun",
light_machine_gun: "Light Machine Gun",
sub_machine_gun: "Sub Machine Gun",
path: "Path.exe",
dhitman: "dHitman",
jokesta: "Jokesta",
// littleb:"Little B",
aggressive: "Aggressive",
passive: "Passive",
snd: "Search And Destroy",
respawn: "Respawn",
ads: "ADS",
hipfire: "Hipfire",
};
const gun = args[1];
const cc = args[2];
const tag = args[3];
const data = await axios
.get(
`${process.env.api}/api/v1/codm/build?cwts=${cwts}&cc=${cc}&tag=${tag}`,
`${process.env.api}/api/v1/codm/builds?name=${gun}&cc=${cc}&tag=${tag}`,
{
headers: {
Authorization: process.env.CODM_API_KEY,
Authorization: "Gae",
},
}
)
.then(res => res.data)
.catch(e => null);
if (!data?.cwts) {
const embed = new MessageEmbed()
.catch();
const unavaliable = new MessageEmbed()
.setDescription(
`<:nyx_not_available:897378400031879188> We don't have a **${tag}** gunsmith build for the gun with **CWTS 🆔 ${cwts}** by **${cc}**, Please try another tag or a differnt content creator`
`<:nyx_not_available:897378400031879188> We don't have a ${all[tag]} **${allguns[gun]}** gunsmith build by **${all[cc]}**, Please try another tag or a differnt content creator`
)
.setColor(client.color);
interaction.followUp({ embeds: [embed] });
if (!data) {
interaction.followUp({ embeds: [unavaliable] });
} else {
const arr = [];
data.attachments.map((e, i) => {
return arr.push(`**${i + 1}:** ${e}`);
return arr.push(`**${i + 1}: ${e}**`);
});
const embed = new MessageEmbed()
.setTitle(`${tag} build for ${data.weaponName} from ${data.author}`)
.setTitle(
`${data.weaponName}(${data.weaponType})'s ${all[tag]} build from ${data.author}`
)
.setDescription(
`<:nyx_description:897379659665264650> **Description** \`\`\`\n${data.notes}\n \`\`\``
`<:nyx_description:897379659665264650> Description \`\`\`\n${data.notes}\n\`\`\``
)
.setColor(16580400)
.setImage(data.imageUrl)
.setFooter({
text: `Builds Aggregated by ${client.author}`,
iconURL: client.user.displayAvatarURL(),
})
.setFooter(
`Builds Aggregated by ${client.author}`,
client.user.displayAvatarURL()
)
.setTimestamp()
.addFields(
{
@ -731,3 +800,29 @@ module.exports = {
}
},
};
// ENABLE AFTER Holloween
// run: async (client, interaction, args) => {
// const embed = new MessageEmbed()
// .setTitle(`Prefix commands are now disabled`)
// .setDescription(`Please enable **Application commands** in the channel settings to get access to slash commands, we have discontinued prefix commands.`)
// .setColor(client.color)
// .setThumbnail(interaction.guild.iconURL({ dynamic: true }))
// .addFields(
// {
// name: "Need help ?",
// value: `Join our **[Support Server](https://discord.gg/SR7TeNJG67)**`,
// inline: true,
// },
// {
// name: "Support us <a:donate:896985486260846614>",
// value: `[KoFi](https://ko-fi.com/cathteam)`,
// inline: true,
// }
// )
// .setThumbnail("../../util/assets/images/nyx_logo_transparent.webp")
// .setTimestamp();
// interaction.followUp({ embeds: [embed] });
// },
// };

View file

@ -8,10 +8,10 @@ module.exports = {
run: async (client, interaction) => {
const data = async () => {
const d = await model.findOne({});
const weapons =
d.Primary[0][
d.Categories[Math.floor(Math.random() * d.Categories.length)]
];
const types = d.Categories;
const names = d.Primary;
const category = types[Math.floor(Math.random() * types.length)];
const weapons = names[0][category];
return `${weapons[Math.floor(Math.random() * weapons.length)]}`;
};
const primary_weapon = await data();

View file

@ -15,7 +15,7 @@ module.exports = {
category: "CODM",
options: [
{
type: 3,
type: 7,
name: "gun",
description: "Gun name",
required: true,
@ -39,7 +39,11 @@ function dmg(inpmsg) {
}
currDRM = currGun.drm[0];
currStats = currGun.stats;
currAttachments = common.attachmentsIdentifier(inpmsg, currGun);
currAttachments = common.attachmentsIdentifier(
inpmsg,
currGun.aments,
currStats
);
if (typeof currAttachments == "string") {
hasError = true;
return currAttachments;

View file

@ -114,7 +114,11 @@ function attachments(inpmsg) {
hasAttachments = common.hasAttachments(inpmsg);
currAttachments = [];
if (hasAttachments) {
currAttachments = common.attachmentsIdentifier(inpmsg, currGun);
currAttachments = common.attachmentsIdentifier(
inpmsg,
currGun.aments,
currGun.stats
);
if (typeof currAttachments == "string") {
hasError = true;
return currAttachments;

View file

@ -1,5 +1,6 @@
const { MessageEmbed } = require("discord.js");
const c = require("../../client/CODMClient");
const { CODMClient } = require("cath");
const c = new CODMClient("Gae");
module.exports = {
name: "perk",
description: "Get perk stats",

View file

@ -1,6 +1,6 @@
const common = require("../../util/functions/common");
const data = require("../../util/Data/data.json");
const { MessageEmbed } = require("discord.js");
const Discord = require("discord.js");
let currGun,
currStats,
@ -11,6 +11,7 @@ let currGun,
recoilAvailable,
chart,
hasError;
const errMsg = "*Generic placeholder error message*";
module.exports = {
name: "stats",
description: "Check gun stats",
@ -51,17 +52,13 @@ module.exports = {
},
],
run: async (client, interaction, args) => {
repEmb = null;
recoilAvailable = false;
hasError = false;
if (args.length == 1)
repEmb = statsHandler(args.join(" ").replace("\n", " "));
else repEmb = statsHandler(args.join(" + ").replace("\n", " "));
console.log(args);
const repEmb = statsHandler(args.join(" ").replace("\n", " "));
if (hasError) {
interaction.followUp({
content: `**${repEmb || "An error has occured"}**`,
});
} else {
interaction.followUp({ embeds: [repEmb] });
}
if (recoilAvailable) {
repEmb.fields.push({
name: "**Recoil Graph**",
@ -71,8 +68,7 @@ module.exports = {
const recoilImageLink = await chart.getShortUrl();
repEmb.image = { url: recoilImageLink };
}
interaction.followUp({ embeds: [new MessageEmbed(repEmb)] });
}
interaction.followUp({ embeds: [repEmb] });
},
};
@ -82,38 +78,38 @@ function inpHandler(inpmsg) {
function statsHandler(inpmsg) {
let statsNames = [
"Pellets", //0
"Detonation Range", //1
"Explosion Radius", //2
"Explosion Damage", //3
"Firing Mode", //4
"Rate of Fire", //5
"Bullet in Burst", //6
"Time Between Burst", //7
"Bullet Speed", //8
"Penetration Level", //9
"Bullet Spread", //10
"Idle Sway", //11
"Hipfire Pellet Spread", //12
"ADS Pellet Spread", //13
"ADS Time", //14
"Sprint-to-Fire Time", //15
"ADS Zoom", //16
"Magazine", //17
"Reserve", //18
"Reload Type", //19
"Cancel Reload Time", //20
"Reload Time", //21
"Full Reload Time", //22
"Drop Time", //23
"Raise Time", //24
"Sprinting Speed", //25
"Walking Speed", //26
"Straifing Speed", //27
"Damage per Tick", //28
"Number of Ticks", //29
"Time Between Ticks", //30
"Breath Hold Time", //31
"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",
@ -130,7 +126,11 @@ function statsHandler(inpmsg) {
currStats = currGun.stats;
currDRM = currGun.drm[0];
currAttachments = [];
currAttachments = common.attachmentsIdentifier(inpmsg, currGun);
currAttachments = common.attachmentsIdentifier(
inpmsg,
currGun.aments,
currStats
);
if (typeof currAttachments == "string") {
hasError = true;
return currAttachments;
@ -188,8 +188,8 @@ function statsHandler(inpmsg) {
inpIndx = inpIndx.filter(x => outReady[x]);
return inpIndx.length
? {
name: `**${inpName}**`,
value: `\`\`\`\n${inpIndx.map(x => outReady[x]).join("\n")}\`\`\``,
name: "**" + inpName + "**",
value: "```\n" + inpIndx.map(x => outReady[x]).join("\n") + "```",
}
: "";
}
@ -220,17 +220,17 @@ function statsHandler(inpmsg) {
function addUnit(j) {
switch (j) {
case 7:
case 07:
case 14:
case 15:
case 23:
case 24:
case 31:
return " ms";
case 25:
case 26:
case 27:
case 28:
case 25:
case 26:
return " m/s";
case 20:
case 21:
@ -238,9 +238,9 @@ function statsHandler(inpmsg) {
return " s";
case 16:
return "%";
case 6:
case 06:
return " Rounds";
case 5:
case 05:
return " RPM";
default:
return "";
@ -257,11 +257,16 @@ function statsHandler(inpmsg) {
currRecoilArr[2]
);
recoilAvailable = true;
} else recoilAvailable = false;
if (chart == "none") recoilAvailable = false;
if (chart == "err") hasError = true;
} else {
recoilAvailable = false;
}
if (chart == "none") {
recoilAvailable = false;
}
if (chart == "err" || currAttachments == "err") {
hasError = true;
return "Cocaineeee";
}
const dmg =
common.damageHandler(
currDRM.damage,
@ -277,7 +282,7 @@ function statsHandler(inpmsg) {
currGun.description
? {
name: "**Description:**",
value: `\`\`\`\n${currGun.description}\`\`\``,
value: "```\n" + currGun.description + "```",
}
: {},
{ name: "**Damage Profile:**", value: dmg },
@ -291,7 +296,7 @@ function statsHandler(inpmsg) {
footer: {
text: "[OUTDATED] All data courtesy of Project Lighthouse 2.0 and CoDM Research Crew",
icon_url:
"https://media.discordapp.net/attachments/735590814662656102/806960573753327657/cc.png",
"https://media.discordapp.net/attachments/735590814662656102/806960573753327657/cc.png?width=638&height=638",
},
};
}

View file

@ -8,7 +8,7 @@ module.exports = {
category: "Config",
options: [
{
type: "SUB_COMMAND",
type: 1,
name: "muterole",
description: "Configure mute role settings for the server",
options: [
@ -21,7 +21,7 @@ module.exports = {
],
},
{
type: "SUB_COMMAND",
type: 1,
name: "prefix",
description: "Configure prefix settings for the server",
options: [
@ -35,7 +35,7 @@ module.exports = {
],
},
{
type: "SUB_COMMAND",
type: 1,
name: "welcome",
description: "Configure welcome channel settings for the server",
options: [
@ -49,7 +49,7 @@ module.exports = {
],
},
{
type: "SUB_COMMAND",
type: 1,
name: "goodbye",
description: "Configure goodbye channel settings for the server",
options: [
@ -63,7 +63,7 @@ module.exports = {
],
},
{
type: "SUB_COMMAND",
type: 1,
name: "starboard",
description: "Configure starboard channel settings for the server",
options: [
@ -83,7 +83,7 @@ module.exports = {
],
},
{
type: "SUB_COMMAND",
type: 1,
name: "chatbot",
description: "Configure chatbot channel settings for the server",
options: [
@ -97,7 +97,7 @@ module.exports = {
],
},
{
type: "SUB_COMMAND",
type: 1,
name: "log",
description: "Configure log channel settings for the server",
options: [
@ -116,7 +116,7 @@ module.exports = {
description: "Enable commands/category for the server",
options: [
{
type: "SUB_COMMAND",
type: 1,
name: "command",
description: "To enable commands",
options: [
@ -129,7 +129,7 @@ module.exports = {
],
},
{
type: "SUB_COMMAND",
type: 1,
name: "category",
description: "To enable categories",
options: [
@ -179,7 +179,7 @@ module.exports = {
description: "Disable commands/category for the server",
options: [
{
type: "SUB_COMMAND",
type: 1,
name: "command",
description: "To disable commands",
options: [
@ -192,7 +192,7 @@ module.exports = {
],
},
{
type: "SUB_COMMAND",
type: 1,
name: "category",
description: "To disable categories",
options: [
@ -237,7 +237,7 @@ module.exports = {
],
},
{
type: "SUB_COMMAND",
type: 1,
name: "level",
description: "Configure level settings for the server",
options: [
@ -250,7 +250,7 @@ module.exports = {
],
},
{
type: "SUB_COMMAND",
type: 1,
name: "nsfw",
description: "Configure nsfw settings for the server",
options: [
@ -263,7 +263,7 @@ module.exports = {
],
},
{
type: "SUB_COMMAND",
type: 1,
name: "tips",
description: "Configure tips settings for the server",
options: [
@ -276,7 +276,7 @@ module.exports = {
],
},
{
type: "SUB_COMMAND",
type: 1,
name: "overall",
description: "See overall settings for the server",
options: [],

View file

@ -6,7 +6,7 @@ module.exports = {
description: "Configure Weapon Master System settings",
options: [
{
type: "SUB_COMMAND",
type: 1,
name: "select",
description: "Select the gun for the game",
options: [
@ -29,13 +29,13 @@ module.exports = {
],
},
{
type: "SUB_COMMAND",
type: 1,
name: "list",
description: "See the information for the guns",
options: [],
},
{
type: "SUB_COMMAND",
type: 1,
name: "info",
description: "See the stats of your gun",
},

73
command/Fun/choose.js Normal file
View file

@ -0,0 +1,73 @@
module.exports = {
name: "choose",
description: "Choose random things",
usage: "(Choices)",
category: "Fun",
type: "CHAT_INPUT",
options: [
{
type: 3,
name: "first",
description: "The first choice",
required: true,
},
{
type: 3,
name: "second",
description: "The second choice",
required: true,
},
{
type: 3,
name: "third",
description: "The third choice",
required: false,
},
{
type: 3,
name: "forth",
description: "The forth choice",
required: false,
},
{
type: 3,
name: "fifth",
description: "The fifth choice",
required: false,
},
{
type: 3,
name: "sixth",
description: "The sixth choice",
required: false,
},
{
type: 3,
name: "seventh",
description: "The seventh choice",
required: false,
},
{
type: 3,
name: "eighth",
description: "The eighth choice",
required: false,
},
{
type: 3,
name: "ninth",
description: "The ninth choice",
required: false,
},
{
type: 3,
name: "tenth",
description: "The tenth choice",
required: false,
},
],
run: async (client, interaction, args) => {
const choices = args[Math.floor(Math.random() * args.length)];
interaction.followUp(`I will choose - \`${choices}\``);
},
};

View file

@ -1,20 +1,18 @@
const { MessageEmbed } = require("discord.js");
const tnd = require("../../util/Data/tnd.json");
const dares = require("../../util/Data/dares.json");
module.exports = {
name: "dare",
description: "The maturity level of the topics the question can relate to",
run: async (client, interaction) => {
const embed = new MessageEmbed()
.setAuthor({
name: interaction.user.tag,
iconURL: interaction.user.displayAvatarURL({ dyamic: true }),
})
.setTitle(tnd.dare[Math.round(Math.random() * tnd.dare.length - 1)])
.setAuthor(
interaction.user.tag,
interaction.user.displayAvatarURL({ dyamic: true })
)
.setTitle(dares[Math.round(Math.random() * (dares.length - 1))])
.setColor(client.color)
.setFooter({
text: `Made by ${client.author}`,
iconURL: client.user.displayAvatarURL(),
})
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
.setTimestamp();
interaction.followUp({ embeds: [embed] });
},

130
command/Fun/fun.js Normal file
View file

@ -0,0 +1,130 @@
const { MessageEmbed, MessageAttachment } = require("discord.js");
const { random8ball } = require("cath");
module.exports = {
name: "fun",
description: "Fun commands",
options: [
{
type: 1,
name: "8ball",
description: "8ball an answer",
options: [
{
type: 3,
name: "question",
description: "The question you want to ask",
required: true,
},
],
},
{
type: 1,
name: "rickroll",
description: "Rickroll?",
},
{
type: 1,
name: "emojify",
description: "Emojify a sentence",
options: [
{
type: 3,
name: "text",
description: "The text you want to convert",
required: true,
},
],
},
{
type: 1,
name: "pp",
description: "Check how long is the user",
options: [
{
type: 6,
name: "user",
description: "The user you want to see",
required: false,
},
],
},
],
run: async (client, interaction, args) => {
if (args[0] == "8ball") {
const data = await random8ball();
const embed = new MessageEmbed()
.setAuthor(
`🎱 ${interaction.user.tag} asks`,
interaction.user.displayAvatarURL({ dynamic: true })
)
.setDescription(
`**🎱Question:** \n${args[1]} \n**🎱Answer:** \n ${data}`
)
.setColor(client.color)
.setTimestamp()
.setURL(client.web)
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL());
interaction.followUp({ embeds: [embed] });
} else if (args[0] === "rickroll") {
const roll = [
"Never gonna give you up",
"Never gonna let you down",
"Never gonna run around and desert you",
"Never gonna make you cry",
"Never gonna say goodbye",
"Never gonna tell a lie and hurt you",
];
const rick = roll[Math.floor(Math.random() * roll.length)];
interaction.followUp({
content: `**${rick}**`,
files: [
new MessageAttachment(
"https://i.pinimg.com/originals/88/82/bc/8882bcf327896ab79fb97e85ae63a002.gif"
),
],
});
} else if (args[0] === "emojify") {
const mapping = {
" ": " ",
0: ":zero:",
1: ":one:",
2: ":two:",
3: ":three:",
4: ":four:",
5: ":five:",
6: ":six:",
7: ":seven:",
8: ":eight:",
9: ":nine:",
"!": ":grey_exclamation:",
"?": ":grey_question:",
"#": ":hash:",
"*": ":asterisk:",
};
"abcdefghijklmnopqrstuvwxyz".split("").forEach(c => {
mapping[c] = mapping[c.toUpperCase()] = ` :regional_indicator_${c}:`;
});
interaction.followUp(
args[1]
.split("")
.map(c => mapping[c] || c)
.join("")
);
} else if (args[0] === "pp") {
const { user } =
interaction.guild.members.cache.get(args[1]) || interaction.member;
const embed = new MessageEmbed()
.addField(
`${user.username}'s peepee`,
`8${"=".repeat(Math.floor(Math.random() * 20))}D`
)
.setColor(client.color)
.setTitle("Peepee size machine")
.setTimestamp()
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL());
interaction.followUp({
embeds: [embed],
});
}
},
};

138
command/Fun/hack.js Normal file
View file

@ -0,0 +1,138 @@
const { MessageEmbed } = require("discord.js");
module.exports = {
name: "hack",
description: "Hack a user",
usage: "(User)",
category: "Fun",
options: [
{
type: 6,
name: "user",
description: "The user you want to hack",
required: true,
},
],
type: "CHAT_INPUT",
run: async (client, interaction, args, utils) => {
const answers = [
"@yousuck.noob",
"@hesnoob.haha",
"@thisguy.suck",
"@paypal.removed",
"@noob.haha",
"@hacked.xyz",
"@susmate.com",
"@gmail.sus",
"@why-im.withyou",
"@someone-end.me",
"@isnoob.io",
"@username-is.noob",
"@hahaget.lost",
"@yahoo.sus",
"@botmail.zip",
"@gmail.com",
"@yahoo.com",
];
const passwords = [
"Disb****",
"disc******",
"pass**********",
"get****",
"mails***",
"endm****",
"gamer***********",
"asegeio*********",
"whys*******",
"Brot******",
"imwith*******",
"luckyyougotthispasswordlolnocencor",
"starb*******",
"egghunt2***",
"secr*****",
];
const ips = [
"10.313.523.502.00.1",
"25.537.753.462.29.2",
"21.175.866.974.07.08",
"32.653.587.825.35.5",
"12.172.764.781.22.8",
"91.723.242.452.09.3",
"92.743.116.896.85.6",
"84.091.000.853.54.7",
"51.071.124.129.12.0",
];
const answer = answers[Math.floor(Math.random() * answers.length)];
const passwrd = passwords[Math.floor(Math.random() * passwords.length)];
const ip = ips[Math.floor(Math.random() * ips.length)];
const taggedUser = interaction.guild.members.cache.get(args[0]);
await interaction.deleteReply();
interaction.channel
.send(`Hacking ${taggedUser.user.username}...`)
.then(async msg => {
utils.sleep(100);
msg.edit("Status: ■□□□□□□□□□□ 0%");
utils.sleep(100);
msg.edit("Status: ■■□□□□□□□□□ 7%: Hacking Email...");
utils.sleep(600);
msg.edit(
`Status: ■■■□□□□□□□□ 8%:\n \`Email: ${taggedUser.user.username}@yousuck.noob\`\n \`Password: ${passwrd}\` `
);
utils.sleep(600);
msg.edit("Status: ■■□□□□□□□□□ 9%: Logging in to the Email...");
utils.sleep(2000);
msg.edit("Status: ■■■□□□□□□□□ 12%: Turning off the antivirus");
utils.sleep(1000);
msg.edit("Status: ■■■■□□□□□□ 14%: Downloading SYNAPSE X");
utils.sleep(100);
msg.edit("Status: ■■■□□□□□□□□ 17%: Deleting Captcha...");
utils.sleep(100);
msg.edit("Status: ■■□□□□□□□□□ 20%: Deleting Paypal account...");
utils.sleep(10);
msg.edit("Status: ■■■□□□□□□□□ 21%");
utils.sleep(12);
msg.edit("Status: ■■■■□□□□□□□ 22%");
utils.sleep(100);
msg.edit("Status: ■■■■■□□□□□□ 24%: Paypal account deleted");
utils.sleep(1000);
msg.edit("Status: ■■■■□□□□□□ 29%: Hacking is almost ready...");
utils.sleep(80);
msg.edit("Status: ■■■□□□□□□□□ 31%");
utils.sleep(80);
msg.edit("Status: ■■■■□□□□□□□ 36%");
utils.sleep(40);
msg.edit("Status: ■■■■■□□□□□□ 41%");
utils.sleep(60);
msg.edit("Status: ■■■■□□□□□□□ 47%");
utils.sleep(50);
msg.edit("Status: ■■■■■■□□□□□ 53%");
utils.sleep(3000);
msg.edit(
`Status: ■■■■■■■□□□□ 58%: Email password changed so ${taggedUser.user.username} can not login`
);
utils.sleep(500);
msg.edit("Status: ■■■■■■□□□□□ 66%");
utils.sleep(60);
msg.edit("Status: ■■■■■□□□□□□ 74%");
utils.sleep(20);
msg.edit(`Status: ■■■■■□□□□□□ 79%: IP address found: ${ip}`);
utils.sleep(83);
msg.edit("Status: ■■■■■■□□□□ 80%");
utils.sleep(50);
msg.edit("Status: ■■■■■■■□□□ 85%");
utils.sleep(14);
msg.edit("Status: ■■■■■■■■■□□ 93%");
utils.sleep(70);
msg.edit("Status: ■■■■■■■■■■□ 97%");
utils.sleep(90);
msg.edit("Status: ■■■■■■■■■■■ 100%");
const embed = new MessageEmbed()
.setDescription(`${taggedUser} has been hacked!`)
.addField("Email", `${taggedUser.user.username}${answer}`)
.addField("Password", `${passwrd}`)
.addField("IP address", `${ip}`)
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
.setColor(client.color);
await msg.edit({ embeds: [embed] });
});
},
};

63
command/Fun/image.js Normal file
View file

@ -0,0 +1,63 @@
const { MessageEmbed } = require("discord.js");
const { getreddit } = require("cath");
module.exports = {
name: "image",
description: "Generate images",
options: [
{
type: 1,
name: "meme",
description: "Get a meme from reddit",
},
{
type: 1,
name: "cat",
description: "Get a cat from reddit",
},
],
run: async (client, interaction, args) => {
if (args[0] == "meme") {
const subreddits = ["comedyheaven", "dank", "meme", "memes"];
const subreddit =
subreddits[Math.floor(Math.random() * subreddits.length)];
const data = await getreddit(subreddit);
interaction.followUp({
embeds: [
new MessageEmbed({
title: data.title,
url: data.url,
image: { url: data.image },
timestamp: Date.now(),
footer: { text: data.footer },
color: client.color,
author: {
name: interaction.user.tag,
iconURL: interaction.user.displayAvatarURL({ dynamic: true }),
},
}),
],
});
} else if (args[0] === "cat") {
const subreddits = ["cat", "cats"];
const subreddit =
subreddits[Math.floor(Math.random() * subreddits.length)];
const data = await getreddit(subreddit);
interaction.followUp({
embeds: [
new MessageEmbed({
title: data.title,
url: data.url,
image: { url: data.image },
timestamp: Date.now(),
footer: { text: data.footer },
color: client.color,
author: {
name: interaction.user.tag,
iconURL: interaction.user.displayAvatarURL({ dynamic: true }),
},
}),
],
});
}
},
};

43
command/Fun/kiss.js Normal file
View file

@ -0,0 +1,43 @@
const { MessageEmbed } = require("discord.js");
module.exports = {
name: "kiss",
description: "Kiss someone",
category: "Fun",
usage: "(User)",
options: [
{
type: 6,
name: "user",
description: "The user you want to kiss",
required: true,
},
{
type: 3,
name: "words",
description: "The words you want to say",
required: false,
},
],
type: "CHAT_INPUT",
run: async (client, interaction, args) => {
const user = interaction.guild.members.cache.get(args[0]);
words = args[1];
if (user.id === interaction.user.id) {
return interaction.followUp("You can't kiss yourself");
}
const embed = new MessageEmbed()
.setDescription(`${interaction.user} **kisses** ${user}`)
.setImage(
`https://media.discordapp.net/attachments/814310468906123274/817656819416825896/image0.gif`
)
.setColor(client.color)
.setTimestamp()
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL());
if (words) {
embed.addField("Words:", words);
}
await interaction
.followUp({ embeds: [embed] })
.then(msg => msg.react("💕"));
},
};

223
command/Fun/rps.js Normal file
View file

@ -0,0 +1,223 @@
const Discord = require("discord.js");
module.exports = {
name: "rockpaperscissors",
description: "Play RPS with someone",
usage: "(User)",
category: "Fun",
options: [
{
type: 6,
name: "user",
description: "The user you want to play with",
required: true,
},
],
type: "CHAT_INPUT",
run: async (client, interaction, args, utils) => {
const user = interaction.guild.members.cache.get(args[0]);
if (user.user.id == interaction.user.id) {
return interaction.followUp("You can't play with yourself");
}
if (user.user.bot) return interaction.followUp("You can't play with bots");
const embed = new Discord.MessageEmbed()
.setDescription(`Wait for **${user.user.username}** to accept your game`)
.setColor(client.color)
.setTimestamp()
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL());
const confirm = new Discord.MessageActionRow().addComponents(
new Discord.MessageButton()
.setLabel("Accept")
.setStyle("SUCCESS")
.setCustomId("accept")
.setEmoji("808683134786863124"),
new Discord.MessageButton()
.setLabel("Decline")
.setStyle("DANGER")
.setCustomId("decline")
.setEmoji("808683573544353792")
);
await interaction
.followUp({
content: `<@!${user.user.id}>`,
embeds: [embed],
components: [confirm],
})
.then(async m => {
const filter = button => button.user.id == user.user.id;
const collector = m.createMessageComponentCollector({
filter,
type: "BUTTON",
time: 60000,
});
collector.on("collect", button => {
if (button.customId == "decline") {
button.deferUpdate();
return collector.stop("decline");
}
button.deferUpdate();
const pick = new Discord.MessageEmbed()
.setTitle(`${interaction.user.username} VS ${user.user.username}`)
.setColor(client.color)
.setDescription("Choose either 🪨, 📄, or ✂️")
.setTimestamp();
const choices = new Discord.MessageActionRow().addComponents(
new Discord.MessageButton()
.setCustomId("rock")
.setStyle("SECONDARY")
.setEmoji("🪨"),
new Discord.MessageButton()
.setCustomId("paper")
.setStyle("SECONDARY")
.setEmoji("📄"),
new Discord.MessageButton()
.setCustomId("scissors")
.setStyle("SECONDARY")
.setEmoji("✂️")
);
m.edit({
embeds: [pick],
components: [choices],
});
collector.stop();
const users = new Set();
users.add(interaction.user.id);
users.add(user.user.id);
let ping, pong;
const filter = b => users.has(b.user.id);
const collect = m.createMessageComponentCollector({
filter,
type: "BUTTON",
time: 60000,
});
collect.on("collect", async b => {
users.delete(b.user.id);
if (b.user.id == user.user.id) {
ping = b.customId;
await b.reply({
content: `You have choosen **${utils.format(ping)}**`,
ephemeral: true,
});
}
if (b.user.id == interaction.user.id) {
pong = b.customId;
await b.reply({
content: `You have choosen **${utils.format(pong)}**`,
ephemeral: true,
});
}
if (users.size == 0) return collect.stop();
});
collect.on("end", (c, reason) => {
if (reason == "time") {
const timeout = new Discord.MessageEmbed()
.setTitle("Timeout")
.setColor("RED")
.setDescription(
"Game cancelled since a player didn't react in time"
);
m.edit({
embeds: [timeout],
});
} else {
const sit1 = ping == "rock" && pong == "scissors";
const sit2 = ping == "scissors" && pong == "rock";
const sit3 = ping == "scissors" && pong == "paper";
const sit4 = ping == "paper" && pong == "scissors";
const sit5 = ping == "paper" && pong == "rock";
const sit6 = ping == "rock" && pong == "paper";
if (sit1 || sit3 || sit5) {
const embed = new Discord.MessageEmbed()
.setTitle(`${user.user.username} wins!`)
.setColor("GREEN")
.setFooter(
`Made by ${client.author}`,
client.user.displayAvatarURL()
)
.addField(
`${user.user.username} choice`,
`${utils.format(ping)}`
)
.addField(
`${interaction.user.username} choice`,
`${utils.format(pong)}`
)
.setTimestamp();
m.edit({
embeds: [embed],
components: [],
});
} else if (sit2 || sit4 || sit6) {
const embed = new Discord.MessageEmbed()
.setTitle(`${interaction.user.username} wins!`)
.setColor("GREEN")
.setFooter(
`Made by ${client.author}`,
client.user.displayAvatarURL()
)
.addField(
`${interaction.user.username} choice`,
`${utils.format(pong)}`
)
.addField(
`${user.user.username} choice`,
`${utils.format(ping)}`
)
.setTimestamp();
m.edit({
embeds: [embed],
components: [],
});
} else {
const embed = new Discord.MessageEmbed()
.setTitle(`Tie!`)
.setColor("GREY")
.setFooter(
`Made by ${client.author}`,
client.user.displayAvatarURL()
)
.addField(
`${interaction.user.username} choice`,
`${utils.format(pong)}`
)
.addField(
`${user.user.username} choice`,
`${utils.format(ping)}`
)
.setTimestamp();
m.edit({ embeds: [embed], components: [] });
}
}
});
});
collector.on("end", (collected, reason) => {
if (reason == "time") {
const embed = new Discord.MessageEmbed()
.setTitle("Timeout")
.setColor("RED")
.setDescription(
`**${user.user.username}** did not confirm before 60 seconds of time`
);
m.edit({
embeds: [embed],
components: [],
});
}
if (reason == "decline") {
const embed = new Discord.MessageEmbed()
.setTitle("Declined")
.setColor("RED")
.setDescription(
`**${user.user.username}** has declined your game of RPS`
);
m.edit({
embeds: [embed],
components: [],
});
}
});
});
},
};

View file

@ -27,7 +27,7 @@ module.exports = {
const user2 = interaction.guild.members.cache.get(args[1]).user.username;
const loveEmbed = new MessageEmbed()
.setColor("dd2e44")
.setFooter({ text: `Shipped by ${interaction.user.tag}` })
.setFooter(`Shipped by ${interaction.user.tag}`)
.setTimestamp()
.setTitle(`💘 | Shipping ${user1} and ${user2} | 💘`)
.setDescription(`🔻 | ${user1} \n${ship()}\n🔺 | ${user2}`);

View file

@ -22,10 +22,7 @@ module.exports = {
.setTitle(`${user.user.username}'s simp rate`)
.setDescription(`${user.user.username} is a ${simp}% simp`)
.setColor(client.color)
.setFooter({
text: `Made by ${client.author}`,
iconURL: client.user.displayAvatarURL(),
})
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
.setTimestamp(),
],
});

View file

@ -1,20 +1,18 @@
const { MessageEmbed } = require("discord.js");
const tnd = require("../../util/Data/tnd.json");
const truth = require("../../util/Data/truth.json");
module.exports = {
name: "truth",
description: "Gives a random question that has to be answered truthfully",
run: async (client, interaction, args) => {
const embed = new MessageEmbed()
.setAuthor({
name: interaction.user.tag,
iconURL: interaction.user.displayAvatarURL({ dyamic: true }),
})
.setTitle(tnd.truth[Math.round(Math.random() * tnd.truth.length - 1)])
.setAuthor(
interaction.user.tag,
interaction.user.displayAvatarURL({ dyamic: true })
)
.setTitle(truth[Math.round(Math.random() * truth.length)])
.setColor(client.color)
.setFooter({
text: `Made by ${client.author}`,
iconURL: client.user.displayAvatarURL(),
})
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
.setTimestamp();
interaction.followUp({ embeds: [embed] });
},

View file

@ -1,5 +1,6 @@
const { MessageEmbed } = require("discord.js");
const questions = require("../../util/Data/wyr.json");
module.exports = {
name: "wyr",
description: "Send some would-you rather questions",
@ -14,15 +15,12 @@ module.exports = {
.setDescription(
`🇦 ${Option1} \n\n **OR** \n\n :regional_indicator_b: ${Option2}`
)
.setAuthor({
name: interaction.user.tag,
iconURL: interaction.user.displayAvatarURL({ dyamic: true }),
})
.setAuthor(
interaction.user.tag,
interaction.user.displayAvatarURL({ dynamic: true })
)
.setColor(client.color)
.setFooter({
text: `Made by ${client.author}`,
iconURL: client.user.displayAvatarURL(),
})
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
.setTimestamp();
wyrmessage = await interaction.followUp({ embeds: [embed] });
wyrmessage.react("🇦");

View file

@ -0,0 +1,144 @@
const GiveawaysClient = require("../../client/GiveawaysClient");
module.exports = {
name: "giveaway",
description: "Giveaway",
UserPerms: ["MANAGE_MESSAGES"],
options: [
{
type: "SUB_COMMAND",
name: "start",
description: "Start a giveaway",
options: [
{
type: 3,
name: "prize",
description: "The prize of the giveaway",
required: true,
choices: [],
},
{
type: 4,
name: "winners",
description: "The amount of winners of the giveaway",
required: true,
},
{
type: 3,
name: "time",
description: "The amount of time of the giveaway",
required: true,
},
{
type: 7,
name: "channel",
description: "The channel of the giveaway",
required: true,
channelTypes: ["GUILD_TEXT"],
},
{
type: 8,
name: "role1",
description: "The required role to join the giveaway",
},
{
type: 8,
name: "role2",
description: "The required role to join the giveaway",
},
{
type: 8,
name: "role3",
description: "The required role to join the giveaway",
},
],
},
{
type: "SUB_COMMAND",
name: "reroll",
description: "Reroll a giveaway",
options: [
{
type: 3,
name: "message",
description: "The message ID of the giveaway",
required: true,
choices: [],
},
],
},
{
type: "SUB_COMMAND",
name: "end",
description: "End a giveaway",
options: [
{
type: 3,
name: "message",
description: "The message ID of the giveaway",
required: true,
choices: [],
},
],
},
],
run: async (client, interaction, args, utils) => {
if (args[0] == "start") {
const [, prize, winners, time, channel, roles1, roles2, roles3] = args;
if (!utils.ms(time)) {
interaction.followUp({
content: "Time must be a valid time to parse (Example: 10m, 100s)",
});
}
await GiveawaysClient.create(client, {
prize,
host: interaction.user.id,
winners,
endAfter: time,
requirements: roles1
? {
Enabled: true,
Roles: [roles1],
}
: roles2 && roles1
? {
Enabled: true,
Roles: [roles1, roles2],
}
: roles1 && roles2 && roles3
? {
Enabled: true,
Roles: [roles1, roles2, roles3],
}
: { Enabled: false },
Channel: channel,
});
interaction.followUp({
content: `Giveaway is started in ${interaction.guild.channels.cache.get(
channel
)}`,
});
} else if (args[0] == "reroll") {
const giveaway = await GiveawaysClient.getByMessage(args[1]);
const m = await client.guilds.cache
.get(giveaway.Guild)
.channels.cache.get(giveaway.Channel)
.messages.fetch(args[1]);
if (!m) {
interaction.followUp({ content: "Unable to find the giveaway ⚠" });
} else {
await GiveawaysClient.end(m, giveaway, m);
}
} else {
const giveaway = await GiveawaysClient.getByMessage(args[1]);
const m = await client.guilds.cache
.get(giveaway.Guild)
.channels.cache.get(giveaway.Channel)
.messages.fetch(args[1]);
if (!m) {
interaction.followUp({ content: "Unable to find the giveaway ⚠" });
} else {
await GiveawaysClient.end(m, giveaway, m);
}
}
},
};

View file

@ -17,10 +17,10 @@ module.exports = {
const member =
interaction.guild.members.cache.get(args[0]) || interaction.member;
const embed = new MessageEmbed()
.setAuthor({
name: member.user.tag,
iconURL: member.user.displayAvatarURL({ dynamic: true, size: 1024 }),
})
.setAuthor(
member.user.tag,
member.user.displayAvatarURL({ dynamic: true, size: 1024 })
)
.setColor(client.color)
.setTitle(`${member.user.username}'s Avatar`)
.setDescription(
@ -41,10 +41,7 @@ module.exports = {
.setImage(
member.user.avatarURL({ size: 2048, dynamic: true, format: "png" })
)
.setFooter({
text: `Made by ${client.author}`,
iconURL: client.user.displayAvatarURL(),
})
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
.setURL(client.web)
.setTimestamp();
interaction.followUp({ embeds: [embed] });

View file

@ -0,0 +1,52 @@
const { MessageEmbed } = require("discord.js");
module.exports = {
name: "banner",
description: "Show user's banner",
type: "CHAT_INPUT",
usage: "{User}",
category: "Information",
options: [
{
type: 6,
name: "user",
description: "The user you want to see",
required: false,
},
],
run: async (client, interaction, args) => {
const { user } =
interaction.guild.members.cache.get(args[0]) || interaction.member;
const data = await user.fetch();
if (data?.banner) {
const extension = data.banner.startsWith("a_") ? ".gif" : ".png";
const url = `https://cdn.discordapp.com/banners/${user.id}/${data.banner}${extension}?size=2048`;
const embed = new MessageEmbed()
.setDescription(`[Link to Banner](${url})`)
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
.setTimestamp()
.setTitle(`${user.tag}'s Banner`)
.setImage(url)
.setColor(data?.hexAccentColor || client.color);
interaction.followUp({ embeds: [embed] });
} else if (data?.hexAccentColor) {
const embed = new MessageEmbed()
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
.setTimestamp()
.setDescription(
`**${user.tag}** does not have a banner but they have an accent color`
)
.setColor(data?.hexAccentColor);
interaction.followUp({ embeds: [embed] });
} else {
const embed = new MessageEmbed()
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
.setTimestamp()
.setDescription(
`Seems like **${user.username}** doesn't have a banner or an accent color.`
)
.setColor(client.color);
interaction.followUp({ embeds: [embed] });
}
},
};

View file

@ -1,12 +1,14 @@
const { MessageEmbed, version: djsversion } = require("discord.js");
const version = require("../../package.json").version;
const { utc } = require("moment");
const os = require("os");
module.exports = {
name: "botinfo",
description: "Check the info of the bot",
category: "Information",
type: "CHAT_INPUT",
run: async (client, interaction) => {
run: async (client, interaction, args, utils) => {
const core = os.cpus()[0];
const embed = new MessageEmbed()
.setTitle(`NYX - CODM Gunsmith Bot`)
.setURL(
@ -36,28 +38,39 @@ module.exports = {
.reduce((a, b) => a + b.memberCount, 0)
.toLocaleString()}
Channels \`${client.channels.cache.size.toLocaleString()}\`
Commands \`${client.slashCommands.size}\`
Commands \`${client.commands.size}\`
`,
inline: true,
}
)
.addFields({
.addFields(
{
name: `Platform`,
value: `
NYX \`v${version}\`
Discord.js \`v${djsversion}\`
Node.js \`${process.version}\``,
})
},
{
name: `Hardware`,
value: `
Uptime:** ${utils.timer(os.uptime() * 1000, { long: true })}
Platform:** ${process.platform}
CPU:**
\u3000 Cores: ${os.cpus().length}
\u3000 Model: ${core.model}
\u3000 Speed: ${core.speed}MHz
**`,
inline: true,
}
)
.addFields({
name: `**${client.author}**`,
value: `**Development Management**\n\u3000Ń1ght#0001\n\u3000Cat drinking a cat#0795\n\u3000mightyful#6536\n\u3000Thunder#2128\n\u3000mobo#9277\n
**Research & Documentation**\n\u3000𝔔𝓻𝔦𝔁𝔖𝔦ӄø#0690\n\u3000Thunder#2128\n
**Website**\n\u3000Chunchunmaru#8570`,
})
.setFooter({
text: `Made by ${client.author}`,
iconURL: client.user.displayAvatarURL(),
})
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
.setTimestamp();
interaction.followUp({ embeds: [embed] });
},

View file

@ -80,10 +80,10 @@ module.exports = {
.setThumbnail(
"https://media.discordapp.net/attachments/896078559293104128/896392631565828146/nyx_logo_transparent.webp"
)
.setFooter({
text: `Requested by ${interaction.user.tag}`,
iconURL: interaction.user.displayAvatarURL({ dynamic: true }),
});
.setFooter(
`Requested by ${interaction.user.tag}`,
interaction.user.displayAvatarURL({ dynamic: true })
);
const components = state => [
new Discord.MessageActionRow().addComponents(
new Discord.MessageSelectMenu()
@ -122,9 +122,7 @@ module.exports = {
)
.setTimestamp()
.setColor(client.color)
.setFooter({
text: `Please use /help (Command Name) for more details`,
})
.setFooter(`Please use /help (Command Name) for more details`)
.setDescription(
category.commands
.map(cmd => {
@ -170,26 +168,28 @@ module.exports = {
"**Command**:",
command.name ? `\`${command.name}\`` : "N/A"
);
if (command.usage)
if (command.usage) {
embed.addField("**Usage**:", `\`/${command.name} ${command.usage}\``);
else embed.addField("**Usage**:", `\`/${command.name}\``);
if (command.description)
} else {
embed.addField("**Usage**:", `\`/${command.name}\``);
}
if (command.description) {
embed.addField("**Description**:", command.description);
if (command.timeout)
}
if (command.timeout) {
embed.addField("**Cooldown**:", utils.timer(command.timeout));
if (command.UserPerms)
}
if (command.UserPerms) {
embed.addField("**Required User Permission**:", UserPerms);
if (command.BotPerms)
}
if (command.BotPerms) {
embed.addField("**Required Bot Permission**:", BotPerms);
}
embed
.setFooter({
text: `Requested by ${interaction.user.tag}`,
iconURL: interaction.user.displayAvatarURL({ dynamic: true }),
})
.setFooter(
`Requested by ${interaction.user.tag}`,
interaction.user.displayAvatarURL({ dynamic: true })
)
.setTimestamp()
.setURL(client.web)
.setColor(client.color);

View file

@ -0,0 +1,185 @@
const { MessageEmbed } = require("discord.js");
const moment = require("moment");
const filterLevels = {
DISABLED: "Off",
MEMBERS_WITHOUT_ROLES: "No Role",
ALL_MEMBERS: "Everyone",
};
const verificationLevels = {
NONE: "None",
LOW: "Low",
MEDIUM: "Medium",
HIGH: "High",
VERY_HIGH: "Very High",
};
const regions = {
brazil: "Brazil",
europe: "Europe",
hongkong: "Hong Kong",
india: "India",
japan: "Japan",
russia: "Russia",
singapore: "Singapore",
southafrica: "South Africa",
sydeny: "Sydeny",
"us-central": "US Central",
"us-east": "US East",
"us-west": "US West",
"us-south": "US South",
};
module.exports = {
name: "serverinfo",
description: "Check the info of the server",
category: "Information",
type: "CHAT_INPUT",
options: [
{
type: 3,
name: "server",
description: "The server you want to see (Paste Server ID)",
required: false,
},
],
run: async (client, interaction, args, utils) => {
try {
const g = client.guilds.cache.get(args[0]) || interaction.guild;
const vanityCode = g.vanityURLCode;
let vanityInvite = `https://discord.gg/${vanityCode}`;
if (vanityCode === null) vanityInvite = "No custom URL";
const members = g.members.cache;
const roles = g.roles.cache
.sort((a, b) => b.position - a.position)
.map(role => role.toString());
const owner = await g.fetchOwner();
const voiceChannel = g.channels.cache.filter(
ch => ch.type === "GUILD_VOICE"
).size;
const textChannel = g.channels.cache.filter(
ch => ch.type === "GUILD_TEXT"
).size;
const categoryChannel = g.channels.cache.filter(
ch => ch.type === "GUILD_CATEGORY"
).size;
const embed = new MessageEmbed()
.setTimestamp()
.setTitle("**Server Information**")
.setAuthor(`${g.name}`, g.iconURL({ dynamic: true }))
.setColor(client.color)
.setDescription(g.description || "No Description")
.setThumbnail(g.iconURL({ dynamic: true, size: 1024 }))
.addFields(
{
name: `<:nyx_owner:897418259433943120> Owner Info`,
value: `
**Owner ** ${owner}
🆔 **Owner ID ** \`${owner.id}\`
`,
inline: true,
},
{
name: `Misc Info`,
value: `
**🆔 Server ID ** \`${g.id}\`
**🌐 Region ** ${regions[g.regions]}
**🔗 Vanity Link ** [${vanityCode}](${vanityInvite})
`,
inline: true,
},
{
name: `<a:nyx_last_update:897381474330873887> Creation Date`,
value: `
${moment(g.createdTimestamp).format("LL")} ${moment(
g.createdTimestamp
).format("LTS")} (${moment(g.createdTimestamp).fromNow()})`,
inline: true,
},
// Row 2
{
name: `<:4chanluv:836623612689121320> Emojies ${g.emojis.cache}`,
value: `
**Static ** ${g.emojis.cache.size.toString()}
**Animated ** ${g.emojis.cache
.filter(emoji => emoji.animated)
.size.toString()}`,
inline: true,
},
{
name: `Member Statistics`,
value: `
👥 **Total** ${g.memberCount.toString()}
🚶 **Users** ${members
.filter(member => !member.user.bot)
.size.toString()}
🤖 **Bots** ${members
.filter(member => member.user.bot)
.size.toString()}`,
inline: true,
},
{
name: `Channel Info`,
value: `
📁 **Categories ** ${categoryChannel}
# **Text** ${textChannel}
🔊 **Voice** ${voiceChannel}`,
inline: true,
},
// Row 3
{
name: `Server Specification`,
value: `
**<:partner:840231939944480829> Partnered ** ${
g.partnered
? "<a:nyx_checkmark:897240322411724841>"
: "<a:nyx_cross:897244999211696198>"
}
**<:verifiedserver:897410018234728449> Verified ** ${
g.verified
? "<a:nyx_checkmark:897240322411724841>"
: "<a:nyx_cross:897244999211696198>"
}
**🚥 Verification Level ** ${verificationLevels[g.verificationLevel]}
**💢 Explicit Filter ** ${filterLevels[g.explicitContentFilter]}
**Tier ** ${
g.premiumTier == "TIER_3"
? "3 <:nyx_tier3:897406181511946261>"
: g.premiumTier == "TIER_2"
? "2 <:nyx_tier2:897406181541281792>"
: g.premiumTier == "TIER_1"
? "1 <:nyx_tier1:897406181558067210>"
: "0"
}
**Count ** ${g.premiumSubscriptionCount || "0"}`,
inline: true,
},
{
name: `<a:nyx_community:897419330478825512> Community Features`,
value: `${
utils.fixFeatures(g.features) || "No Community Features"
}`,
inline: true,
},
{
name: `👔 Role Info [${roles.length}]`,
value: `${
roles.length < 10
? roles.join(" **|** ")
: roles.length > 10
? `${roles.slice(0, 10).join(" **|** ")}\n+${
roles.length - 10
} roles...`
: "None"
}`,
inline: true,
}
)
.setURL(vanityCode ? vanityInvite : "https://cath.gq/")
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL());
interaction.followUp({ embeds: [embed] });
} catch (e) {
console.log(e);
}
},
};

View file

@ -3,7 +3,7 @@ module.exports = {
name: "kick",
description: "Kick an user",
UserPerms: ["KICK_MEMBERS"],
BotPerms: ["KICK_MEMBERS"],
BotPems: ["KICK_MEMBERS"],
usage: "(User) {Reason}",
category: "Moderation",
options: [

View file

@ -8,7 +8,7 @@ module.exports = {
category: "Moderation",
options: [
{
type: "SUB_COMMAND",
type: 1,
name: "add",
description: "Warn a user",
options: [
@ -27,7 +27,7 @@ module.exports = {
],
},
{
type: "SUB_COMMAND",
type: 1,
name: "list",
description: "Show a list of warnings of an user",
options: [
@ -40,7 +40,7 @@ module.exports = {
],
},
{
type: "SUB_COMMAND",
type: 1,
name: "remove",
description: "Remove a latest warn for an user",
options: [
@ -59,7 +59,7 @@ module.exports = {
],
},
{
type: "SUB_COMMAND",
type: 1,
name: "clear",
description: "Clear an user's warns",
options: [

View file

@ -4,13 +4,13 @@ module.exports = {
category: "Music",
options: [
{
type: "SUB_COMMAND",
type: 1,
name: "track",
description: "Loop the track",
options: [],
},
{
type: "SUB_COMMAND",
type: 1,
name: "queue",
description: "Loop the whole queue",
options: [],

40
command/NSFW/ass.js Normal file
View file

@ -0,0 +1,40 @@
const { MessageEmbed } = require("discord.js");
const { getreddit } = require("cath");
module.exports = {
name: "ass",
description: "Get some ass images",
run: async (client, interaction) => {
if (!interaction.channel.nsfw) {
const embed = new MessageEmbed()
.setTitle(`AYO Calm Yo Cheeks`)
.setDescription("This command only works in NSFW Channels!")
.setImage(
"https://media.discordapp.net/attachments/851761493815853060/893777701599584266/warning.gif"
)
.setColor(client.color)
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
.setTimestamp();
interaction.followUp({ embeds: [embed] });
} else {
const subreddits = ["ass", "BestBooties", "BootyGIFs", "booty_queens"];
const reddit = subreddits[Math.round(Math.random() * subreddits.length)];
const data = await getreddit(reddit);
interaction.followUp({
embeds: [
new MessageEmbed({
title: data.title,
url: data.url,
image: { url: data.image },
timestamp: Date.now(),
footer: { text: data.footer },
color: client.color,
author: {
name: interaction.user.tag,
iconURL: interaction.user.displayAvatarURL({ dynamic: true }),
},
}),
],
});
}
},
};

48
command/NSFW/blowjob.js Normal file
View file

@ -0,0 +1,48 @@
const { MessageEmbed } = require("discord.js");
const { getreddit } = require("cath");
module.exports = {
name: "blowjob",
description: "Get some blowjob images",
run: async (client, interaction) => {
if (!interaction.channel.nsfw) {
const embed = new MessageEmbed()
.setTitle(`AYO Calm Yo Cheeks`)
.setDescription("This command only works in NSFW Channels!")
.setImage(
"https://media.discordapp.net/attachments/851761493815853060/893777701599584266/warning.gif"
)
.setColor(client.color)
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
.setTimestamp();
interaction.followUp({ embeds: [embed] });
} else {
const subreddits = [
"BlowJob",
"blowjobs",
"blowjobgifs",
"OralSex",
"PushHerHead",
"ThroatFuck",
];
const reddit = subreddits[Math.round(Math.random() * subreddits.length)];
const data = await getreddit(reddit);
interaction.followUp({
embeds: [
new MessageEmbed({
title: data.title,
url: data.url,
image: { url: data.image },
timestamp: Date.now(),
footer: { text: data.footer },
color: client.color,
author: {
name: interaction.user.tag,
iconURL: interaction.user.displayAvatarURL({ dynamic: true }),
},
}),
],
});
}
},
};

40
command/NSFW/boobs.js Normal file
View file

@ -0,0 +1,40 @@
const { MessageEmbed } = require("discord.js");
const { getreddit } = require("cath");
module.exports = {
name: "boobs",
description: "Get some boobie images",
run: async (client, interaction) => {
if (!interaction.channel.nsfw) {
const embed = new MessageEmbed()
.setTitle(`AYO Calm Yo Cheeks`)
.setDescription("This command only works in NSFW Channels!")
.setImage(
"https://media.discordapp.net/attachments/851761493815853060/893777701599584266/warning.gif"
)
.setColor(client.color)
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
.setTimestamp();
interaction.followUp({ embeds: [embed] });
} else {
const subreddits = ["boobs", "GrabHerTitties", "titfuck"];
const reddit = subreddits[Math.round(Math.random() * subreddits.length)];
const data = await getreddit(reddit);
interaction.followUp({
embeds: [
new MessageEmbed({
title: data.title,
url: data.url,
image: { url: data.image },
timestamp: Date.now(),
footer: { text: data.footer },
color: client.color,
author: {
name: interaction.user.tag,
iconURL: interaction.user.displayAvatarURL({ dynamic: true }),
},
}),
],
});
}
},
};

40
command/NSFW/hentai.js Normal file
View file

@ -0,0 +1,40 @@
const { MessageEmbed } = require("discord.js");
const { getreddit } = require("cath");
module.exports = {
name: "hentai",
description: "Get some hentai images",
run: async (client, interaction) => {
if (!interaction.channel.nsfw) {
const embed = new MessageEmbed()
.setTitle(`AYO Calm Yo Cheeks`)
.setDescription("This command only works in NSFW Channels!")
.setImage(
"https://media.discordapp.net/attachments/851761493815853060/893777701599584266/warning.gif"
)
.setColor(client.color)
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
.setTimestamp();
interaction.followUp({ embeds: [embed] });
} else {
const subreddits = ["hentai", "HentaiAnime", "nekogirls"];
const reddit = subreddits[Math.round(Math.random() * subreddits.length)];
const data = await getreddit(reddit);
interaction.followUp({
embeds: [
new MessageEmbed({
title: data.title,
url: data.url,
image: { url: data.image },
timestamp: Date.now(),
footer: { text: data.footer },
color: client.color,
author: {
name: interaction.user.tag,
iconURL: interaction.user.displayAvatarURL({ dynamic: true }),
},
}),
],
});
}
},
};

40
command/NSFW/milf.js Normal file
View file

@ -0,0 +1,40 @@
const { MessageEmbed } = require("discord.js");
const { getreddit } = require("cath");
module.exports = {
name: "milf",
description: "Get some milf images",
run: async (client, interaction) => {
if (!interaction.channel.nsfw) {
const embed = new MessageEmbed()
.setTitle(`AYO Calm Yo Cheeks`)
.setDescription("This command only works in NSFW Channels!")
.setImage(
"https://media.discordapp.net/attachments/851761493815853060/893777701599584266/warning.gif"
)
.setColor(client.color)
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
.setTimestamp();
interaction.followUp({ embeds: [embed] });
} else {
const subreddits = ["milf", "OnlyHotMilfs", "realmoms"];
const reddit = subreddits[Math.round(Math.random() * subreddits.length)];
const data = await getreddit(reddit);
interaction.followUp({
embeds: [
new MessageEmbed({
title: data.title,
url: data.url,
image: { url: data.image },
timestamp: Date.now(),
footer: { text: data.footer },
color: client.color,
author: {
name: interaction.user.tag,
iconURL: interaction.user.displayAvatarURL({ dynamic: true }),
},
}),
],
});
}
},
};

42
command/NSFW/pussy.js Normal file
View file

@ -0,0 +1,42 @@
const { MessageEmbed } = require("discord.js");
const { getreddit } = require("cath");
module.exports = {
name: "pussy",
description: "Get some vagina images",
run: async (client, interaction) => {
if (!interaction.channel.nsfw) {
const embed = new MessageEmbed()
.setTitle(`AYO Calm Yo Cheeks`)
.setDescription("This command only works in NSFW Channels!")
.setImage(
"https://media.discordapp.net/attachments/851761493815853060/893777701599584266/warning.gif"
)
.setColor(client.color)
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
.setTimestamp();
interaction.followUp({ embeds: [embed] });
return;
} else {
const subreddits = ["vagina", "GodPussy", "peachlips"];
const reddit = subreddits[Math.round(Math.random() * subreddits.length)];
const data = await getreddit(reddit);
interaction.followUp({
embeds: [
new MessageEmbed({
title: data.title,
url: data.url,
image: { url: data.image },
timestamp: Date.now(),
footer: { text: data.footer },
color: client.color,
author: {
name: interaction.user.tag,
iconURL: interaction.user.displayAvatarURL({ dynamic: true }),
},
}),
],
});
}
},
};

42
command/NSFW/thighs.js Normal file
View file

@ -0,0 +1,42 @@
const { MessageEmbed } = require("discord.js");
const { getreddit } = require("cath");
module.exports = {
name: "thighs",
description: "Get some thighs images",
run: async (client, interaction) => {
if (!interaction.channel.nsfw) {
const embed = new MessageEmbed()
.setTitle(`AYO Calm Yo Cheeks`)
.setDescription("This command only works in NSFW Channels!")
.setImage(
"https://media.discordapp.net/attachments/851761493815853060/893777701599584266/warning.gif"
)
.setColor(client.color)
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
.setTimestamp();
interaction.followUp({ embeds: [embed] });
return;
} else {
const subreddits = ["thighs", "PerfectThighs", "thickthighs"];
const reddit = subreddits[Math.round(Math.random() * subreddits.length)];
const data = await getreddit(reddit);
interaction.followUp({
embeds: [
new MessageEmbed({
title: data.title,
url: data.url,
image: { url: data.image },
timestamp: Date.now(),
footer: { text: data.footer },
color: client.color,
author: {
name: interaction.user.tag,
iconURL: interaction.user.displayAvatarURL({ dynamic: true }),
},
}),
],
});
}
},
};

View file

@ -1,13 +1,9 @@
module.exports = {
name: "economy",
category: "Owner",
description: "Add/Remove coins from someone",
Owner: true,
options: [
{
type: "SUB_COMMAND",
name: "add",
description: "Remove coins from someone",
category: "Owner",
usage: "(Number)",
description: "Add coins from someone",
Owner: true,
options: [
{
type: 6,
@ -22,29 +18,7 @@ module.exports = {
required: true,
},
],
},
{
type: "SUB_COMMAND",
name: "rmv",
description: "Remove coins from someone",
options: [
{
type: 6,
name: "user",
description: "The user you want to remove",
required: true,
},
{
type: 4,
name: "cp",
description: "The amount of CP you want to remove",
required: true,
},
],
},
],
run: async (client, interaction, args) => {
if (args[0] === "add") {
await client.add(args[0], args[1], interaction);
interaction.followUp({
content: `<a:nyx_checkmark:897240322411724841> Successfully added **${interaction.options.getInteger(
@ -53,16 +27,5 @@ module.exports = {
interaction.options.getUser("user").username
}**'s balance`,
});
}
if (args[0] === "rmv") {
await client.rmv(args[0], args[1]);
interaction.followUp({
content: `<a:nyx_checkmark:897240322411724841> Successfully removed **${interaction.options.getInteger(
"cp"
)}** ${client.currency} from **${
interaction.options.getUser("user").username
}**'s balance`,
});
}
},
};

View file

@ -2,7 +2,7 @@ module.exports = {
name: "blacklist",
category: "Owner",
usage: "(User) (Toggle) (Reason)",
description: "Manage Blacklisted Users",
description: "Blacklist someone from the bot",
Owner: true,
options: [
{
@ -13,8 +13,8 @@ module.exports = {
},
{
type: 5,
name: "blacklist",
description: "Whether to blacklist or whitelist",
name: "yesno",
description: "Whether blacklist or whitelist",
required: true,
},
{
@ -26,34 +26,18 @@ module.exports = {
],
run: async (client, interaction) => {
const user = interaction.options.getUser("user");
const toggle = interaction.options.getBoolean("blacklist");
const toggle = interaction.options.getBoolean("yesno");
const reason = interaction.options.getString("reason");
if (toggle === true) {
await client.data.BK(user.id, toggle, reason);
const embed = new MessageEmbed()
.setTitle(
"<a:nyx_checkmark:897240322411724841> Successfully Blacklisted"
)
.setDescription(
`**User:** ${user.user.tag} \`(${user.id})\`\n**Reason:** ${reason} \n**Blacklisted by:** ${interaction.member}`
)
.setURL(client.web)
.setColor(client.color)
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
.setTimestamp();
interaction.followUp({ embeds: [embed] });
interaction.followUp({
content: `**Blacklisted** ${user.username}.\n**Reason: **${reason}`,
});
} else {
await client.data.BK(user.id, toggle, reason);
const embed = new MessageEmbed()
.setTitle("<a:nyx_checkmark:897240322411724841> Removed From Blacklist")
.setDescription(
`**User:** ${user.user.tag} \`(${user.id})\`\n**Reason:** ${reason} \n**Whitelisted by:** ${interaction.member}`
)
.setURL(client.web)
.setColor(client.color)
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
.setTimestamp();
interaction.followUp({ embeds: [embed] });
interaction.followUp({
content: `Removed blacklist from ${user.username}`,
});
}
},
};

View file

@ -47,22 +47,19 @@ module.exports = {
evaled = err;
}
if (typeof evaled !== "string") evaled = require("util").inspect(evaled);
console.log(evaled);
evaled = chunk([evaled], 750);
console.log(evaled);
evaled = utils.chunk(evaled, 750);
let reactions = ["❌", "⏪", "◀️", "⏹️", "▶️", "⏩"],
page = 0,
evaledEmbed = new Discord.MessageEmbed()
.setColor(client.color)
.setDescription(`\`\`\`js\n${evaled[0]}\n\`\`\``)
.setTimestamp()
.setAuthor({
name: `Evaled by ${interaction.user.tag}`,
iconURL: interaction.user.displayAvatarURL({ dynamic: true }),
});
const mainMessage = await interaction.channel.send({
embeds: [evaledEmbed],
});
.setAuthor(
`Evaled by ${interaction.user.tag}`,
interaction.user.displayAvatarURL({ dynamic: true })
)
.addField(`Type of`, `\`\`\`js\n${typeof evaled[0]}\n\`\`\``);
const mainMessage = await interaction.channel.send({ embeds: [evaledEmbed] });
Discord.TextChannel.prototype.send = oldSend;
await Promise.all(
(evaled.length === 1 ? ["❌", "⏹️"] : reactions).map(r =>
@ -115,17 +112,12 @@ module.exports = {
}
evaledEmbed = new Discord.MessageEmbed()
.setColor(interaction.guild.me.displayColor)
.setDescription(`\`\`\`js\n${evaled[page]}\n\`\`\``);
.setDescription(`\`\`\`js\n${evaled[page]}\n\`\`\``)
.addField(`Type of`, `\`\`\`js\n${typeof evaled[page]}\n\`\`\``);
await mainMessage.edit({
embeds: [evaledEmbed],
});
});
},
};
function chunk(arr, size) {
let c;
Array.from({ length: Math.ceil(arr.length / size) }, (v, i) => {
c = arr.slice(i * size, i * size + size);
});
return c;
}

View file

@ -19,18 +19,6 @@ module.exports = {
.setTitle("Guilds")
.setDescription(description)
.setColor(client.color)
.addFields(
{
name: `Total Guilds`,
value: client.guilds.cache.size,
inline: true,
},
{
name: `Total Members`,
value: client.users.cache.size,
inline: true,
}
)
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
.setTimestamp();
interaction.followUp({ embeds: [embed] });

31
command/Owner/rmv.js Normal file
View file

@ -0,0 +1,31 @@
module.exports = {
name: "rmv",
category: "Owner",
usage: "(Number)",
description: "Remove coins from someone",
Owner: true,
options: [
{
type: 6,
name: "user",
description: "The user you want to remove",
required: true,
},
{
type: 4,
name: "cp",
description: "The amount of CP you want to remove",
required: true,
},
],
run: async (client, interaction, args) => {
await client.rmv(args[0], args[1]);
interaction.followUp({
content: `<a:nyx_checkmark:897240322411724841> Successfully removed **${interaction.options.getInteger(
"cp"
)}** ${client.currency} from **${
interaction.options.getUser("user").username
}**'s balance`,
});
},
};

View file

@ -23,15 +23,12 @@ module.exports = {
`${interaction.user.username} is set into AFK.\nStatus : ${content}`
)
.setTimestamp()
.setFooter({
text: `Made by ${client.author}`,
iconURL: client.user.displayAvatarURL(),
})
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
.setColor(client.color)
.setAuthor({
text: interaction.user.username,
iconURL: interaction.user.displayAvatarURL({ dynamic: true }),
})
.setAuthor(
interaction.user.username,
interaction.user.displayAvatarURL({ dynamic: true })
)
.setURL(client.web);
interaction.followUp({ embeds: [embed] });
},

View file

@ -0,0 +1,17 @@
const CodeClient = require("../../client/CodeClient");
module.exports = {
name: "Create Code Bin",
type: "MESSAGE",
run: async (client, interaction) => {
const msg = await interaction.channel.messages.fetch(interaction.targetId);
if (!msg.content) {
interaction.followUp({ content: "The message must have a content" });
} else {
const title = "Code";
const description = msg.author.tag;
const code = msg.content;
const link = await CodeClient.createBin(title, description, code);
interaction.followUp({ content: link });
}
},
};

27
command/Utilities/docs.js Normal file
View file

@ -0,0 +1,27 @@
const axios = require("axios");
module.exports = {
name: "docs",
usage: "(Query)",
description: "Search the discord.js docs for something!",
type: "CHAT_INPUT",
options: [
{
type: 3,
name: "query",
description: "The query you want to search",
required: true,
},
],
run: async (client, interaction, args) => {
const query = args.join(" ");
await axios
.get(
`https://djsdocs.sorta.moe/v2/embed?src=stable&q=${encodeURIComponent(
query
)}`
)
.then(async data => {
interaction.followUp({ embeds: [data.data] });
});
},
};

View file

@ -10,10 +10,10 @@ module.exports = {
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
.setColor(client.color)
.setTimestamp()
.setAuthor({
text: interaction.user.tag,
iconURL: interaction.user.displayAvatarURL({ dynamic: true }),
})
.setAuthor(
interaction.user.tag,
interaction.user.displayAvatarURL({ dynamic: true })
)
.setTitle(`Support/Invite`)
.setThumbnail(
"https://github.com/night0721/cath.js/blob/master/util/assets/images/nyx_logo_transparent.webp"

View file

@ -0,0 +1,35 @@
const URLClient = require("../../client/URLClient");
module.exports = {
name: "shorten-url",
description: "Shorten a URL",
options: [
{
type: 3,
name: "short-name",
description:
"The short name that for the shorten-url (For example, https://url.cath.gq/youtube)",
required: true,
},
{
type: 3,
name: "link",
description:
"The link for the shorten-url (For example, https://youtube.com)",
required: true,
},
],
run: async (client, interaction, args) => {
if (!args[1].includes("https://")) {
interaction.followUp({ content: "The link must contain 'https://'" });
} else {
const shortName = args[0];
const targetURL = args[1];
const cc = await URLClient.createShortURL(shortName, targetURL);
if (!cc) {
interaction.followUp({ content: `URL already exist` });
} else {
interaction.followUp({ content: `https://url.cath.gq/${cc}` });
}
}
},
};

View file

@ -7,11 +7,11 @@ module.exports = {
Welcome: "837913442228371456",
DMLog: "900549765534736394",
CMDLog: "848613827226239046",
ErrorLog: "938538311537012796",
ErrorLog: "900509758786773022",
ServerLog: "848613714537873518",
Lavalink: {
Host: "lavalink-repl.thunderemperor.repl.co",
Port: 443,
Password: "0638xxtXRH887UQQ",
Host: "lavalink.darrennathanael.com",
Port: 2095,
Password: "whatwasthelastingyousaid",
},
};

View file

@ -10,9 +10,9 @@ client.on("messageCreate", async message => {
nothahaa.setNickname(`${message.author.username}`).catch();
await client.data.DelAFK(message.author.id);
}
if (message.mentions.users.first()?.id) {
if (message.mentions.users.first()) {
const data1 = await client.data.getUser(
message.mentions.members.first()?.id
message.mentions.members.first().id
);
if (data1?.AFK) {
message.reply({

View file

@ -12,7 +12,7 @@ client.on("interactionCreate", async interaction => {
if (option.type === "SUB_COMMAND_GROUP") {
if (option.name) args.push(option.name);
option.options?.forEach(x => {
if (x.type === 1) {
if (x.type === "SUB_COMMAND") {
if (x.name) args.push(x.name);
x.options?.forEach(y => {
if (y.value) args.push(y.value);
@ -63,19 +63,19 @@ client.on("interactionCreate", async interaction => {
embeds: [
new MessageEmbed()
.setURL(client.web)
.setAuthor({
name: interaction.user.tag,
iconURL: interaction.user.displayAvatarURL({ dynamic: true }),
})
.setAuthor(
interaction.user.tag,
interaction.user.displayAvatarURL({ dynamic: true })
)
.setColor(client.color)
.setDescription(
`You aren't a premium user. You can either boost support server or subscribe to developer's team [Ko-fi](https://ko-fi.com/cathteam) or gift a nitro to one of the developer team to be premium user`
)
.setTimestamp()
.setFooter({
text: `Made by ${client.author}`,
iconURL: client.user.displayAvatarURL(),
}),
.setFooter(
`Made by ${client.author}`,
client.user.displayAvatarURL()
),
],
});
}
@ -83,7 +83,11 @@ client.on("interactionCreate", async interaction => {
if (cmd.Level) {
if (!data.Guild.Level) return;
}
if (cmd.directory == "NSFW" && !data.Guild?.NSFW) {
interaction.followUp({
content: "NSFW commands have been disabled in this server",
});
}
if (!interaction.guild.me.permissions.has(cmd.BotPerms || [])) {
return interaction.followUp({
content: `You can't use this command. I need to have ${cmd.BotPerms} permission to use this command.`,
@ -111,12 +115,7 @@ client.on("interactionCreate", async interaction => {
}
}
const random = utils.rndint(3, 6);
if (cmd.name == "nsfw" && !data.Guild?.NSFW) {
interaction.followUp({
content: "NSFW commands have been disabled in this server",
});
return;
}
try {
if (cmd.timeout) {
const current_time = Date.now();
const cooldown_amount = cmd.timeout;
@ -134,9 +133,7 @@ client.on("interactionCreate", async interaction => {
{ User: interaction.user.id, CMD: cmd.name },
{ Time: current_time }
);
cmd
.run(client, interaction, args, utils, data)
.catch(e => sendE(e));
cmd.run(client, interaction, args, utils, data);
client.addcmdsused(interaction.user.id);
client.channels.cache.get(client.config.CMDLog).send({
content: `\`${interaction.user.tag}(${interaction.user.id})\`\n has used \n**${cmd.name}**\n command in \n\`${interaction.guild.name}(${interaction.guild.id})\``,
@ -145,9 +142,7 @@ client.on("interactionCreate", async interaction => {
}
} else {
if (data.Guild.Tips) utils.tips(interaction, client);
cmd
.run(client, interaction, args, utils, data)
.catch(e => sendE(e));
cmd.run(client, interaction, args, utils, data);
client.channels.cache.get(client.config.CMDLog).send({
content: `\`${interaction.user.tag}(${interaction.user.id})\`\n has used \n**${cmd.name}**\n command in \n\`${interaction.guild.name}(${interaction.guild.id})\``,
});
@ -164,13 +159,25 @@ client.on("interactionCreate", async interaction => {
);
} else {
if (data.Guild.Tips) utils.tips(interaction, client);
cmd.run(client, interaction, args, utils, data).catch(e => sendE(e));
cmd.run(client, interaction, args, utils, data);
client.channels.cache.get(client.config.CMDLog).send({
content: `\`${interaction.user.tag}(${interaction.user.id})\`\n has used \n**${cmd.name}**\n command in \n\`${interaction.guild.name}(${interaction.guild.id})\``,
});
client.addcmdsused(interaction.user.id);
// await client.addXP(interaction.user.id, random, interaction);
}
} catch (e) {
const embed = new MessageEmbed()
.setTitle("Command Error")
.setDescription(`\`\`\`ini\n${e.stack}\`\`\``)
.setTimestamp()
.setColor(client.color)
.setFooter(client.user.username);
client.channels.cache
.get(client.config.ErrorLog)
.send({ embeds: [embed] });
console.error(e);
}
}
if (interaction.isContextMenu()) {
await interaction.deferReply({ ephemeral: false });
@ -185,7 +192,7 @@ client.on("interactionCreate", async interaction => {
if (!ownercmd) return;
const args = [];
for (const option of interaction.options.data) {
if (option.type === 1) {
if (option.type === "SUB_COMMAND") {
if (option.name) args.push(option.name);
option.options?.forEach(x => {
if (x.value) args.push(x.value);
@ -197,20 +204,14 @@ client.on("interactionCreate", async interaction => {
interaction.member = interaction.guild.members.cache.get(
interaction.user.id
);
ownercmd.run(client, interaction, args, utils).catch(e => sendE(e));
try {
ownercmd.run(client, interaction, args, utils);
client.channels.cache.get(client.config.CMDLog).send({
content: `\`${interaction.user.tag}(${interaction.user.id})\`\n has used \n**${ownercmd.name}**\n command in \n\`${interaction.guild.name}(${interaction.guild.id})\``,
});
client.addcmdsused(interaction.user.id);
} catch (e) {
console.log(e);
}
}
});
function sendE(e) {
const embed = new MessageEmbed()
.setTitle("Command Error")
.setDescription(`\`\`\`yaml\n${e.stack}\`\`\``)
.setTimestamp()
.setColor(client.color)
.setFooter({ text: client.user.username });
interaction.channel.send({ embeds: [embed] });
client.channels.cache.get(client.config.ErrorLog).send({ embeds: [embed] });
}

View file

@ -1,7 +1,7 @@
const client = require("..");
const { MessageEmbed } = require("discord.js");
const utils = require("../util/functions/function");
const domains = require("../util/Data/domains.json");
const scams = require("../util/Data/scam.json");
client.on("messageCreate", async message => {
if (message.author.bot || !message.guild) return;
const data = {};
@ -47,7 +47,7 @@ client.on("messageCreate", async message => {
},
{
name: "<a:booster:896527475063025704> **Premium**",
value: `You can either boost the support server or subscribe to developer's team [Ko-Fi](https://ko-fi.com/cathteam).\n Another option would be to gift a nitro subscription to one of the developers.`,
value: `You can either boost support server or subscribe to developer's team [Ko-Fi](https://ko-fi.com/cathteam) or gift a nitro to one of the developer team.`,
inline: false,
}
)
@ -66,27 +66,7 @@ client.on("messageCreate", async message => {
}
if (data.User?.Blacklist) return;
if (
domains.iplogger.includes(
message.content
.toLowerCase()
.match(
/(https|http):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+~-]*[\w.,@?^=%&:/~+~-])+/g
)?.[0]
.replace(/(https|http):\/\/+/g, "")
.match(/\s*([^)]+?)\s*\/+/g, "")[0]
.slice(0, -1)
) ||
domains.scam.includes(
message.content
.toLowerCase()
.match(
/(https|http):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+~-]*[\w.,@?^=%&:/~+~-])+/g
)?.[0]
.replace(/(https|http):\/\/+/g, "")
.match(/\s*([^)]+?)\s*\/+/g, "")[0]
.slice(0, -1)
) ||
domains.ngrok.includes(
scams.includes(
message.content
.toLowerCase()
.match(
@ -97,59 +77,14 @@ client.on("messageCreate", async message => {
.slice(0, -1)
)
) {
const _ = new MessageEmbed()
.setTitle(`Scam/IP Grabber detected`)
.setTimestamp()
.setColor(client.color)
.addFields(
{
name: "User",
value: `${message.author.tag} (${message.author.id})`,
inline: true,
},
{
name: "Scam/IP Logger URL",
value: `||https://${message.content
.toLowerCase()
.match(
/(https|http):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+~-]*[\w.,@?^=%&:/~+~-])+/g
)?.[0]
.replace(/(https|http):\/\/+/g, "")
.match(/\s*([^)]+?)\s*\/+/g, "")[0]
.slice(0, -1)}||`,
inline: true,
}
)
.setFooter({
text: `Tactical Protection by ${client.author}`,
icon_url: client.user.displayAvatarURL(),
});
message.delete();
message.channel.send({
embeds: [_],
content: `**${message.author.tag}** has sent a scam link and I have deleted it to prevent spread`,
});
client.channels.cache.get("936986641585799178").send({
embeds: [
_.addFields(
{
name: "Message",
value: message.content,
inline: false,
},
{
name: "Guild",
value: message.guild ? message.guild.name : "None",
inline: true,
}
),
],
});
message.delete().catch(() => {});
}
if (
message?.content.startsWith(data.Guild.Prefix) ||
message?.content.startsWith("C.") ||
message?.content.startsWith("c.")
message?.content.startsWith("C.")
) {
const embed = new MessageEmbed()
.setTitle(`Message commands are now disabled`)
@ -222,15 +157,7 @@ client.on("messageCreate", async message => {
}
if (message.content) {
client.channels.cache.get(client.config.DMLog).send({
embeds: [
new MessageEmbed()
.setDescription(message.content)
.setColor(client.color)
.setAuthor({
name: message.author.tag,
iconURL: message.author.displayAvatarURL({ dynamic: true }),
}),
],
content: `\`${message.author.tag}(${message.author.id})\`: ${message.content}`,
});
}
}

View file

@ -13,5 +13,5 @@ client.on("ready", async () => {
};
})
);
console.log(`${client.user.username}`);
console.log(`${client.user.username}\nVersion: v${version}`);
});

View file

@ -1,5 +1,7 @@
const NYX = require("./client/NYX");
const client = new NYX();
module.exports = client;
process.on("unhandledRejection", () => {}); // add // when need to debug
process.on("unhandledRejection", err => {
console.log(err);
});
client.start();

View file

@ -1,5 +1,3 @@
// Do we still need this ?
const mongoose = require("mongoose");
module.exports = mongoose.model(
"weapons",

View file

@ -1,6 +1,6 @@
{
"name": "cath.exe",
"version": "0.0.1",
"version": "3.4.0",
"description": "NYX bot created by Team NYX",
"engines": {
"node": "*",
@ -11,7 +11,7 @@
"dev": "nodemon .",
"start": "node .",
"lint": "eslint .",
"node-update": "npm i --save-dev node@17 && npm config set prefix=$(pwd)/node_modules/node && export PATH=$(pwd)/node_modules/node/bin:$PATH",
"node-update": "npm i --save-dev node@16 && npm config set prefix=$(pwd)/node_modules/node && export PATH=$(pwd)/node_modules/node/bin:$PATH",
"node-clean": "rm -rf node_modules && rm package-lock.json && npm cache clear --force && npm cache clean --force && npm i",
"all": "npm run node-update && npm run node-clean"
},
@ -37,18 +37,18 @@
"url": "https://ko-fi.com/cathteam"
},
"devDependencies": {
"node": "^18.7.0"
"node": "^19.3.0"
},
"dependencies": {
"axios": "^0.27.2",
"cath": "^1.4.7",
"discord.js": "^13.6.0",
"dotenv": "^16.0.0",
"axios": "^1.2.2",
"cath": "^1.4.6",
"discord.js": "^14.7.1",
"dotenv": "^16.0.1",
"erela.js": "^2.3.3",
"erela.js-spotify": "^1.2.0",
"goosecache": "^9.0.14",
"goosecache": "^10.0.0",
"moment": "^2.29.1",
"mongoose": "^5.13.14",
"quickchart-js": "^3.0.0"
"mongoose": "^5.13.13",
"quickchart-js": "^3.0.2"
}
}

306
stats2.js Normal file
View file

@ -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
// },
// };
// }

View file

@ -26,10 +26,7 @@
"CR-56 AMAX",
"Shorty",
"Crossbow",
"R9-0",
"PPSh-41",
"CBR4",
"SVD"
"R9-0"
],
"weaponAlliasName": [
["MoW"],
@ -51,17 +48,14 @@
["Slow Outlaw", "Slower Outlaw"],
["bae"],
["Reneti", "Renneti", "Rennetti", "Burst Pistol"],
["pp bizon", "pp19"],
["pp bizon", "pp"],
["AUG"],
["AKBP", "Vepr"],
["AN94"],
["CR56", "AMAX"],
["725"],
["cb", "bow"],
["r9", "R9-O"],
["ppsh", "pp41"],
["p90"],
["Dragonov"]
["r9", "R9-O"]
],
"attachmentActualName": [
["akimbo", "Stopping Power"],

View file

@ -179,8 +179,7 @@
"MIP Light Barrel (Short)",
"MIP Extended Light Barrel",
"OWC Ranger",
"OWC Marksman",
"GRU Combo Grip"
"OWC Marksman"
],
"optic": [
"Red Dot Sight",
@ -608,8 +607,7 @@
"YKM Light Stock",
"RTC Steady Stock",
"OWC Skeleton Stock",
"No Stock",
"Thunderbolt Sling"
"No Stock"
],
"perk": [
"Tough",
@ -999,157 +997,6 @@
]
}
],
"Swordfish": [
{
"muzzle": [
"Tactical Suppressor",
"OWC Light Suppressor",
"OWC Light Compensator",
"Monolithic Suppressor",
"MIP Light FLash Guard",
"RTC Light Muzzle Brake"
],
"barrel": ["MIP Light", "MIP Extended Light Barrel", "OWC Ranger"],
"optic": [
"Red Dot Sight",
"Holographic Sight",
"3x Tactical Scope",
"4x Tactical Scope",
"4.4x Tactical Scope"
],
"stock": ["YKM Light Stock", "OWC Skeleton Stock", "RTC Steady Stock"],
"perk": [
"FMJ",
"Sleight of Hand",
"Wounding",
"Full Ammo",
"Disable",
"Tough",
"Long Shot",
"Melee Master"
],
"laser": ["RTC Laser 1mW", "MIP Laser 5mW", "OWC Laser - Tactical"],
"underbarrel": [
"Strike Foregrip",
"Merc Foregrip",
"Operator Foregrip",
"Ranger Foregrip",
"Tactical Foregrip A",
"Bipod"
],
"ammo": ["Extended Mag A", "Fast Reload", "Halberd Mag"],
"rear_grip": [
"Granulated Grip Tape",
"Ruberized Grip Tape",
"Stippled Grip Tape"
]
}
],
"Kilo_141": [
{
"muzzle": [
"Tactical Suppressor",
"OWC Light Suppressor",
"OWC Light Compensator",
"Monolithic Suppressor",
"MIP Light FLash Guard",
"RTC Light Muzzle Brake"
],
"barrel": [
"YKM Integral Suppressor Light",
"MIP Light Extended Barrel",
"OWC Marksman"
],
"optic": [
"Red Dot Sight",
"Holographic Sight",
"3x Tactical Scope",
"4x Tactical Scope",
"4.4x Tactical Scope"
],
"stock": [
"No Stock",
"YKM Combat Stock",
"OWC Skeleton Stock",
"RTC Steady Stock"
],
"perk": [
"FMJ",
"Sleight of Hand",
"Wounding",
"Full Ammo",
"Disable",
"Tough",
"Long Shot",
"Melee Master"
],
"laser": ["RTC Laser 1mW", "MIP Laser 5mW", "OWC Laser - Tactical"],
"underbarrel": [
"Strike Foregrip",
"Merc Foregrip",
"Operator Foregrip",
"Ranger Foregrip",
"Tactical Foregrip A",
"Bipod"
],
"ammo": [
"Extended Mag A",
"Large Extended Mag B",
"100 round LMG Drum Mag"
],
"rear_grip": [
"Granulated Grip Tape",
"Ruberized Grip Tape",
"Stippled Grip Tape"
]
}
],
"Oden": [
{
"muzzle": [
"Tactical Suppressor",
"OWC Light Suppressor",
"RTC Huge Suppressor",
"Monolithic Suppressor",
"OWC Light Compensator",
"MIP Light FLash Guard",
"RTC Light Muzzle Brake"
],
"barrel": ["MIP Light Barrel (Short)", "OWC Marksman", "OWC Ranger"],
"optic": [
"Red Dot Sight",
"Holographic Sight",
"3x Tactical Scope",
"4x Tactical Scope",
"4.4x Tactical Scope"
],
"stock": ["YKM Light Stock", "YKM Combat Stock", "RTC Steady Stock"],
"perk": [
"Tough",
"FMJ",
"Sleight of Hand",
"Long Shot",
"Melee Master",
"Wounding",
"Full Ammo",
"Disable"
],
"laser": ["RTC Laser 1mW", "MIP Laser 5mW", "OWC Laser - Tactical"],
"underbarrel": [
"Strike Foregrip",
"Merc Foregrip",
"Operator Foregrip",
"Ranger Foregrip",
"Tactical Foregrip A"
],
"ammo": ["Extended Mag A", "Large Extended Mag B", "Damage Mag", "12.7 mm Duplex Rounds"],
"rear_grip": [
"Stippled Grip Tape",
"Granulated Grip Tape",
"Ruberized Grip Tape"
]
}
],
"XPR_50": [
{
"muzzle": [
@ -1494,64 +1341,6 @@
]
}
],
"SVD": [
{
"muzzle": [
"Tactical Suppressor",
"OWC Light Suppressor",
"Monolithic Suppressor",
"RTC Compensator",
"MIP Light FLash Guard",
"RTC Light Muzzle Brake"
],
"barrel": ["RTC 510mm Light", "RTC 600mm Heavy"],
"optic": ["3x Tactical Scope", "4x Tactical Scope", "6x Tactical Scope"],
"stock": ["YKM Light Stock", "OWC Skeleton Stock", "RTC Steady Stock"],
"perk": [
"FMJ",
"Sleight of Hand",
"Wounding",
"Full Ammo",
"Disable",
"Bullet Return",
"Headshot Slow"
],
"laser": ["OWC Laser - Tactical"],
"underbarrel": ["Bipod"],
"ammo": ["15 Round Extended Mag", "20 Round Extended Mag"]
}
],
"Koshka": [
{
"muzzle": [
"Tactical Suppressor",
"OWC Light Suppressor",
"Monolithic Suppressor",
"MIP Light FLash Guard",
"RTC Light Muzzle Brake"
],
"barrel": ["Enhanced Barrel", "MIP Light Barrel (Short)"],
"optic": ["3x Tactical Scope", "4x Tactical Scope", "6x Tactical Scope"],
"stock": ["Mobility Stock", "OWC Skeleton Stock", "RTC Steady Stock"],
"perk": [
"FMJ",
"Sleight of Hand",
"Wounding",
"Full Ammo",
"Disable",
"Bullet Return",
"Headshot Slow"
],
"laser": ["OWC Laser - Tactical", "Fast Aim Laser"],
"underbarrel": ["Bipod"],
"ammo": ["10 Round Extended Mag", "8 Round Fast Mag", "Armour Piercer Mag"],
"rear_grip": [
"Stippled Grip Tape",
"Granulated Grip Tape",
"Ruberized Grip Tape"
]
}
],
"S36": [
{
"muzzle": [
@ -1910,54 +1699,6 @@
]
}
],
"PKM": [
{
"muzzle": [
"OWC Light Suppressor",
"Agency Suppressor",
"Infantry Compensator",
"MIP Flashguard",
"OWC Eliminator",
"RTC Muzzle Brake"
],
"barrel": [
"Rapid Fire Barrel",
"Long-Range Barrel",
"MIP Extended Light Barrel"
],
"optic": [
"Red Dot Sight",
"Holographic Sight",
"3x Tactical Scope",
"4x Tactical Scope",
"4.4x Tactical Scope"
],
"stock": [
"Light Weight Stock",
"Marathon Stock",
"No Stock",
"Agile Stock"
],
"perk": [
"FMJ",
"Sleight of Hand",
"Wounding",
"Full Ammo",
"Disable",
"Headshot XP",
"Empty Reload"
],
"laser": ["1mW Steady Aim Laser", "5mW Combat Laser", "Aim Assist Laser"],
"underbarrel": ["Crossbar"],
"ammo": ["84 Round Hybrid Mag"],
"rear_grip": [
"Sturdy Grip Tape",
"Rustle Grip Tape",
"Firm Grip Tape",
"Non-Slip Foregrip"
]
}
],
"RUS_79U": [
{
"muzzle": [
@ -2692,142 +2433,6 @@
"rear_grip": ["Rustle Grip Tape", "Sturdy Grip Tape", "Firm Grip Tape"]
}
],
"CBR4": [
{
"muzzle": [
"Tactical Suppressor",
"OWC Light Suppressor",
"Monolithic Suppressor",
"OWC Light Compensator",
"MIP Light FLash Guard",
"RTC Light Muzzle Brake"
],
"barrel": ["MIP Extended Light Barrel", "OWC Marksman"],
"optic": [
"Red Dot Sight",
"Holographic Sight",
"Tactical Scope",
"3x Tactical Scope"
],
"stock": ["YKM Light Stock", "YKM Combat Stock", "RTC Steady Stock"],
"perk": [
"FMJ",
"Sleight of Hand",
"Wounding",
"Full Ammo",
"Disable",
"Wild Hip Fire",
"Double Kill",
"Fast Reload Kill"
],
"laser": ["RTC Laser 1mW", "MIP Laser 5mW", "OWC Laser - Tactical"],
"rear_grip": [
"Granulated Grip Tape",
"Ruberized Grip Tape",
"Stippled Grip Tape"
]
}
],
"PPSh_41": [
{
"muzzle": [
"Tactical Suppressor",
"OWC Light Suppressor",
"Monolithic Suppressor",
"OWC Light Compensator",
"MIP Light FLash Guard",
"RTC Light Muzzle Brake"
],
"barrel": ["Gurrilla Light Short", "Last Stand Light", "Banner Heavy"],
"optic": [
"Red Dot Sight",
"Holographic Sight",
"Tactical Scope",
"3x Tactical Scope"
],
"stock": ["No Stock", "OWC Skeleton Stock", "RTC Steady Stock"],
"perk": [
"FMJ",
"Sleight of Hand",
"Wounding",
"Full Ammo",
"Disable",
"Wild Hip Fire",
"Double Kill",
"Fast Reload Kill"
],
"laser": ["RTC Laser 1mW", "MIP Laser 5mW", "OWC Laser - Tactical"],
"underbarrel": [
"Focused Foregrip",
"Tough Foregrip",
"Resilient Foregrip",
"Tactical Foregrip A",
"Operator Foregrip"
],
"ammo": ["35 Round Fast Reload", "55 Round Light Reload"],
"rear_grip": [
"Sturdy Grip Tape",
"Ruberized Grip Tape",
"Rustle Grip Tape"
]
}
],
"MAC_10": [
{
"muzzle": [
"RTC Muzzle Brake",
"MIP Flashguard",
"OWC Light Suppressor",
"Infantry Compensator",
"OWC Eliminator",
"Agency Suppressor"
],
"barrel": [
"6.5\" Rifling Barrel",
"6.1\" Reinforced Heavy",
"Taskforce Barrel",
"5.5\" Extended Barrel",
"6.2\" Cavalry Barrel"
],
"optic": [
"Red Dot Sight",
"Holographic Sight",
"3x Tactical Scope",
"4x Tactical Scope"
],
"stock": [
"Steel Stock",
"Swift Stock",
"No Stock",
"SAS Combat Stock"
],
"perk": [
"Sleight of Hand",
"Wild Hip Fire",
"Double Kill",
"Fast Reload Kill",
"Wounding",
"Full Ammo",
"Disable"
],
"laser": ["1mW Steady Aim Laser", "5mW Combat Laser", "Aim Assist Laser"],
"underbarrel": [
"BD Foregrip",
"Red Cell Foregrip",
"Striker Foregrip",
"Patrol Foregrip",
"Field Agent Foregrip",
"SFDD Fast Foregrip"
],
"ammo": [
"Fast Reload",
"43 Round Fast Reload",
"43 Fast Reload",
"STANAG 53 Round Extended Reload"
],
"rear_grip": ["Rustle Grip Tape", "Sturdy Grip Tape", "Firm Grip Tape"]
}
],
"HS2126": [
{
"muzzle": [
@ -3145,58 +2750,6 @@
]
}
],
"JAK_12": [
{
"muzzle": [
"Tactical Suppressor",
"Monolithic Suppressor",
"OWC Light Compensator",
"Choke",
"RTC Light Muzzle Brake",
"Flash Guard",
"Marauder Suppressor"
],
"barrel": ["MIP Extended Light Barrel", "MIP Light Barrel (Short)", "OWC Marksman"],
"optic": [
"Red Dot Sight",
"Holographic Sight",
"Tactical Scope",
"3x Tactical Scope"
],
"stock": [
"YKM Light Stock",
"YKM Combat Stock",
"MIP Stalker Stock"
],
"ammo": [
"FRAG-12 Explosive Mag",
"Extended Mag C",
"Large Extended Mag D",
"Slug Reload"
],
"perk": [
"Sleight of Hand",
"Speed Up Kill",
"Slide Flak Jacket",
"Wounding",
"Full Ammo",
"Disable"
],
"laser": ["RTC Laser 1mW", "OWC Laser - Tactical", "MIP Laser 5mW"],
"underbarrel": [
"Ranger Foregrip",
"Operator Foregrip",
"Merc Foregrip",
"Strike Foregrip",
"Tactical Foregrip A"
],
"rear_grip": [
"Stippled Grip Tape",
"Granulated Grip Tape",
"Ruberized Grip Tape"
]
}
],
"Kilo_Bolt_Action": [
{
"muzzle": [

772
util/Data/builds.json Normal file
View file

@ -0,0 +1,772 @@
{
"Main": [
{
"Name": "AK-47",
"Type": 0,
"Attachments": [
{ "Name": "MIP Extended Light Barrel", "Type": 5 },
{ "Name": "No Stock", "Type": 6 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "5.45 Large Caliber", "Type": 7 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": "https://media.discordapp.net/attachments/772099026195316746/847174280823308308/image3.png?width=937&height=562"
},
{
"Name": "AK117",
"Type": 0,
"Attachments": [
{ "Name": "YKM Integral Supprssor", "Type": 5 },
{ "Name": "No Stock", "Type": 6 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "Tactical Foregrip B", "Type": 1 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
]
},
{
"Name": "ASM10",
"Type": 0,
"Attachments": [
{ "Name": "MIP Light Flash Guard", "Type": 4 },
{ "Name": "No Stock", "Type": 6 },
{ "Name": "Slight of Hand", "Type": 8 },
{ "Name": "40 Round Extended Mag", "Type": 7 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": "https://media.discordapp.net/attachments/691133003866439701/861887618820472842/Screenshot_20210706-1353282.png"
},
{
"Name": "BK57",
"Type": 0,
"Attachments": [
{ "Name": "MIP Extended Light Barrel", "Type": 5 },
{ "Name": "YKM Combat Stock", "Type": 6 },
{ "Name": "40 Round Fast Reload", "Type": 7 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": "https://media.discordapp.net/attachments/772099026195316746/847174279287668776/image0.png?width=937&height=562"
},
{
"Name": "DR-H",
"Type": 0,
"Attachments": [
{ "Name": "No Stock", "Type": 6 },
{ "Name": "Granulated Grip Tape", "Type": 3 },
{ "Name": "25 Round OTM Mag", "Type": 7 },
{ "Name": "Tactical Foregrip A", "Type": 1 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": "https://media.discordapp.net/attachments/772099026195316746/847174261193965648/image3.png?width=937&height=562"
},
{
"Name": "HBRa3",
"Type": 0,
"Attachments": [
{ "Name": "MIP Light", "Type": 5 },
{ "Name": "No Stock", "Type": 6 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "Tactical Foregrip A", "Type": 1 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": "https://media.discordapp.net/attachments/772099026195316746/847174262041346128/image5.png?width=937&height=562"
},
{
"Name": "HVK-30",
"Type": 0,
"Attachments": [
{ "Name": "Monolithic Suppressor", "Type": 4 },
{ "Name": "MIP Light", "Type": 5 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "Large Caliber Ammo", "Type": 7 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": "https://media.discordapp.net/attachments/772099026195316746/847174261705146458/image4.png?width=937&height=562"
},
{
"Name": "ICR-1",
"Type": 0,
"Attachments": [
{ "Name": "YKM Integral Supprssor Light", "Type": 5 },
{ "Name": "No Stock", "Type": 6 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "Tactical Foregrip A", "Type": 1 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": "https://media.discordapp.net/attachments/772099026195316746/847174263286661140/image8.png?width=937&height=562"
},
{
"Name": "KN-44",
"Type": 0,
"Attachments": [
{ "Name": "MIP Light Muzzle Brake", "Type": 4 },
{ "Name": "MIP Light Barrel(Short)", "Type": 5 },
{ "Name": "No Stock", "Type": 6 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": "https://media.discordapp.net/attachments/772099026195316746/847174262397075516/image6.png?width=937&height=562"
},
{
"Name": "LK24",
"Type": 0,
"Attachments": [
{ "Name": "YKM Integral Suppressor Light", "Type": 5 },
{ "Name": "No Stock", "Type": 6 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "Tactical Foregrip A", "Type": 1 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": "https://media.discordapp.net/attachments/772099026195316746/847174263684857907/image9.png?width=937&height=562"
},
{
"Name": "M4",
"Type": 0,
"Attachments": [
{ "Name": "YKM Integral Suppressor Light", "Type": 5 },
{ "Name": "No Stock", "Type": 6 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "Tactical Foregrip A", "Type": 1 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": "https://media.discordapp.net/attachments/772099026195316746/847174279689928714/image1.png?width=937&height=562"
},
{
"Name": "M16",
"Type": 0,
"Attachments": [
{ "Name": "OWC Light Compensator", "Type": 4 },
{ "Name": "MIP Strike Stock", "Type": 6 },
{ "Name": "Rubberized Grip Tape", "Type": 2 },
{ "Name": "Operator Foregrip", "Type": 1 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": "https://media.discordapp.net/attachments/772099026195316746/847174281255190568/image4.png?width=937&height=562"
},
{
"Name": "Man-O-War",
"Type": 0,
"Attachments": [
{ "Name": "MIP Light Barrel(Short)", "Type": 5 },
{ "Name": "YKM Combat Stock", "Type": 6 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "Tactical Foregrip A", "Type": 1 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": "https://media.discordapp.net/attachments/772099026195316746/847174262841540658/image7.png?width=937&height=562"
},
{
"Name": "Peacekeeper MK2",
"Type": 0,
"Attachments": [
{ "Name": "Taskforce Barrel", "Type": 5 },
{ "Name": "Agile Stock", "Type": 6 },
{ "Name": "Firm Grip Tape", "Type": 2 },
{ "Name": "Extended Mag A", "Type": 7 },
{ "Name": "Field Agent Foregrip", "Type": 1 }
],
"URL": "https://media.discordapp.net/attachments/772099026195316746/847174260522090516/image2.png?width=937&height=562"
},
{
"Name": "Type 25",
"Type": 0,
"Attachments": [
{ "Name": "MIP Light Barrel(Short)", "Type": 5 },
{ "Name": "YKM Light Stock", "Type": 6 },
{ "Name": "Stopping Power Reload", "Type": 7 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": "https://media.discordapp.net/attachments/772099026195316746/847174281698738216/image5.png?width=937&height=562"
},
{
"Name": "ASVAL",
"Type": 0,
"Attachments": [
{ "Name": "MIP Quick Response Barrel", "Type": 5 },
{ "Name": "OWC Skeleton Stock", "Type": 6 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "Large Extended Mag B", "Type": 7 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": "https://media.discordapp.net/attachments/772099026195316746/847174259708657695/image0.png?width=937&height=562"
},
{
"Name": "FR .556",
"Type": 0,
"Attachments": [
{ "Name": "MIP Light Barrel(Short)", "Type": 5 },
{ "Name": "RTC Steady Stock", "Type": 6 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "OWC Laser-Tactical", "Type": 3 },
{ "Name": "Long Shot", "Type": 8 }
],
"URL": "https://media.discordapp.net/attachments/772099026195316746/847174260052459540/image1.png?width=937&height=562"
},
{
"Name": "CR-56 AMAX",
"Type": 0,
"Attachments": [
{ "Name": "Gunner Stock", "Type": 6 },
{ "Name": "Red Dot Sight", "Type": 0 },
{ "Name": "OWC Laser-Tactical", "Type": 3 },
{ "Name": "M67 Ammo", "Type": 7 },
{ "Name": "Granulated Grip Tape", "Type": 2 }
],
"URL": "https://media.discordapp.net/attachments/691133003866439701/861891137254326272/brave_8pS8PhHl4P.png?width=1128&height=634"
},
{
"Name": "AGR 556",
"Type": 1,
"Attachments": [
{ "Name": "OWC Light Compensator", "Type": 4 },
{ "Name": "MIP Extended Light Barrel", "Type": 5 },
{ "Name": "YKM Light Stock", "Type": 6 },
{ "Name": "30 Round 5.56mm Mag", "Type": 7 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": "https://media.discordapp.net/attachments/691133003866439701/861887638419931176/Screenshot_20210706-1402032.png?width=881&height=495"
},
{
"Name": "Chicom",
"Type": 1,
"Attachments": [
{ "Name": "MIP Light", "Type": 5 },
{ "Name": "YKM Combat Stock", "Type": 6 },
{ "Name": "Stippled Grip Tape", "Type": 2 },
{ "Name": "Strike Foregrip", "Type": 1 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": ""
},
{
"Name": "Cordite",
"Type": 1,
"Attachments": [
{ "Name": "MIP Extended Light Barrel", "Type": 5 },
{ "Name": "YKM Combat Stock", "Type": 6 },
{ "Name": "Stippled Grip Tape", "Type": 2 },
{ "Name": "OWC Laser-Tactical", "Type": 3 },
{ "Name": "Sleight of Hand", "Type": 8 }
],
"URL": ""
},
{
"Name": "Fennec",
"Type": 1,
"Attachments": [
{ "Name": "Monolithic Supprssor", "Type": 4 },
{ "Name": "No Stock", "Type": 6 },
{ "Name": "Extended Mag A", "Type": 7 },
{ "Name": "Operator Foregrip", "Type": 1 },
{ "Name": "MIP Laser 5mW", "Type": 3 }
],
"URL": "https://media.discordapp.net/attachments/767456294981992488/862753085985914930/image0.png?width=1104&height=630"
},
{
"Name": "GKS",
"Type": 1,
"Attachments": [
{ "Name": "YKM Integral Supprssor", "Type": 5 },
{ "Name": "YKM Combat Stock", "Type": 6 },
{ "Name": "32 Round Fast Reload", "Type": 7 },
{ "Name": "Strike Foregrip", "Type": 1 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": ""
},
{
"Name": "HG 40",
"Type": 1,
"Attachments": [
{ "Name": "YKM Integral Supprssor", "Type": 5 },
{ "Name": "No Stock", "Type": 6 },
{ "Name": "Rubberized Grip Tape", "Type": 2 },
{ "Name": "40 Round Fast Reload", "Type": 7 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": ""
},
{
"Name": "MSMC",
"Type": 1,
"Attachments": [
{ "Name": "No Stock", "Type": 6 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "36 Round Extended Mag", "Type": 7 },
{ "Name": "OWC Laser-Tactical", "Type": 3 },
{ "Name": "Sleight of Hand", "Type": 8 }
],
"URL": ""
},
{
"Name": "MX9",
"Type": 1,
"Attachments": [
{ "Name": "MIP Extended Light Barrel", "Type": 5 },
{ "Name": "Agile Stock", "Type": 6 },
{ "Name": "5mW Combat Laser", "Type": 2 },
{ "Name": "Strike Foregrip", "Type": 1 },
{ "Name": "Large Caliber Ammo", "Type": 7 }
],
"URL": ""
},
{
"Name": "PDW-57",
"Type": 1,
"Attachments": [
{ "Name": "MIP Light Flash Guard", "Type": 4 },
{ "Name": "YKM Combat Stock", "Type": 6 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "OWC Laser-Tactical", "Type": 3 },
{ "Name": "Sleight of Hand", "Type": 8 }
],
"URL": ""
},
{
"Name": "Pharo",
"Type": 1,
"Attachments": [
{ "Name": "MIP Light Barrel (Short)", "Type": 5 },
{ "Name": "MIP Strike Stock", "Type": 6 },
{ "Name": "Stippled Grip Tape", "Type": 2 },
{ "Name": "36 Round Fast Reload", "Type": 7 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": ""
},
{
"Name": "QQ9",
"Type": 1,
"Attachments": [
{ "Name": "RTC Recon Tac Long", "Type": 5 },
{ "Name": "No Stock", "Type": 6 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "45 Round Extended Mag", "Type": 7 },
{ "Name": "MIP Laser 5mW", "Type": 3 }
],
"URL": "https://media.discordapp.net/attachments/842014909264953354/853663337824780348/image2.png"
},
{
"Name": "QXR",
"Type": 1,
"Attachments": [
{ "Name": "MIP Light Flash Guard", "Type": 4 },
{ "Name": "MIP Light Barrel (Short)", "Type": 5 },
{ "Name": "YKM Light Stock", "Type": 6 },
{ "Name": "OWC Laser-Tactical", "Type": 3 },
{ "Name": "Enhanced Bolt", "Type": 8 }
],
"URL": "https://media.discordapp.net/attachments/691133003866439701/861883636013727774/Screenshot_20210706-1344422.png"
},
{
"Name": "Razorback",
"Type": 1,
"Attachments": [
{ "Name": "YKM Combat Stock", "Type": 6 },
{ "Name": "Extended Mag A", "Type": 7 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "OWC Laser-Tactical", "Type": 3 },
{ "Name": "Rapid Fire", "Type": 8 }
],
"URL": "https://media.discordapp.net/attachments/842014909264953354/852922742705881098/image0.png?width=1001&height=563"
},
{
"Name": "RUS-79U",
"Type": 1,
"Attachments": [
{ "Name": "MIP Light Barrel (Short)", "Type": 5 },
{ "Name": "No Stock", "Type": 6 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "38 Round Fast Reload", "Type": 7 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": ""
},
{
"Name": "PP19 Bizon",
"Type": 1,
"Attachments": [
{ "Name": "Monolithic Suppressor", "Type": 4 },
{ "Name": "OWC Skeleton Stock", "Type": 6 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "Large Caliber Ammo A", "Type": 7 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": "https://media.discordapp.net/attachments/691133003866439701/861887619049717770/Screenshot_20210706-1351142.png?width=881&height=487"
},
{
"Name": "Chopper",
"Type": 2,
"Attachments": [
{ "Name": "RTC Light Muzzle Brake", "Type": 4 },
{ "Name": "Chopper Infatry", "Type": 5 },
{ "Name": "Heavy Handle", "Type": 1 },
{ "Name": "OWC Laser-Tactical", "Type": 3 },
{ "Name": "FMJ", "Type": 8 }
],
"URL": ""
},
{
"Name": "M4LMG",
"Type": 2,
"Attachments": [
{ "Name": "MIP Ultralight Barrel", "Type": 5 },
{ "Name": "No Stock", "Type": 6 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "40 Round Light Reload", "Type": 7 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": ""
},
{
"Name": "RPD",
"Type": 2,
"Attachments": [
{ "Name": "No Stock", "Type": 6 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "Snatch Foregrip", "Type": 1 },
{ "Name": "OWC Laser-Tactical", "Type": 3 },
{ "Name": "FMJ", "Type": 8 }
],
"URL": ""
},
{
"Name": "S36",
"Type": 2,
"Attachments": [
{ "Name": "404", "Type": 8 },
{ "Name": "404", "Type": 8 },
{ "Name": "404", "Type": 8 },
{ "Name": "404", "Type": 8 },
{ "Name": "404", "Type": 8 }
],
"URL": ""
},
{
"Name": "UL736",
"Type": 2,
"Attachments": [
{ "Name": "RTC 12.4\" Light Barrel", "Type": 5 },
{ "Name": "RTC Steady Stock", "Type": 6 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "60 Round Reload", "Type": 7 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": ""
},
{
"Name": "Holger 26",
"Type": 2,
"Attachments": [
{ "Name": "MIP Light", "Type": 5 },
{ "Name": "NO Stock", "Type": 6 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "Holger-26C Lightweight Polymer Mag", "Type": 7 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": "https://media.discordapp.net/attachments/540218400413188116/856109420311740436/Screenshot_20210620-151957.png?width=881&height=407"
},
{
"Name": "Arctic .50",
"Type": 4,
"Attachments": [
{ "Name": "OWC Light Suppressor", "Type": 4 },
{ "Name": "Assassin Short", "Type": 5 },
{ "Name": "OWC Skeleton Stock", "Type": 6 },
{ "Name": "Stippled Grip Tape", "Type": 2 },
{ "Name": "FMJ", "Type": 8 }
],
"URL": ""
},
{
"Name": "DL Q33",
"Type": 4,
"Attachments": [
{ "Name": "OWC Light Suppressor", "Type": 4 },
{ "Name": "MIP Light", "Type": 5 },
{ "Name": "YKM Combat Stock", "Type": 6 },
{ "Name": "OWC Laser-Tactical", "Type": 3 },
{ "Name": "FMJ", "Type": 8 }
],
"URL": ""
},
{
"Name": "Locus",
"Type": 4,
"Attachments": [
{ "Name": "OWC Light Suppressor", "Type": 4 },
{ "Name": "YKM Lightweight Short", "Type": 5 },
{ "Name": "OWC Skeleton Stock", "Type": 6 },
{ "Name": "FMJ", "Type": 8 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": "https://media.discordapp.net/attachments/691133003866439701/861887618546139146/Screenshot_20210706-1357422.png?width=881&height=480"
},
{
"Name": "M21 EBR",
"Type": 4,
"Attachments": [
{ "Name": "404", "Type": 8 },
{ "Name": "404", "Type": 8 },
{ "Name": "404", "Type": 8 },
{ "Name": "404", "Type": 8 },
{ "Name": "404", "Type": 8 }
],
"URL": ""
},
{
"Name": "NA-45",
"Type": 4,
"Attachments": [
{ "Name": "404", "Type": 8 },
{ "Name": "404", "Type": 8 },
{ "Name": "404", "Type": 8 },
{ "Name": "404", "Type": 8 },
{ "Name": "404", "Type": 8 }
],
"URL": ""
},
{
"Name": "Outlaw",
"Type": 4,
"Attachments": [
{ "Name": "MIP Memorial Cowboy", "Type": 5 },
{ "Name": "MIP Stalker Stock", "Type": 6 },
{ "Name": "Stippled Grip Tape", "Type": 2 },
{ "Name": "OWC Laser-Tactical", "Type": 3 },
{ "Name": "FMJ", "Type": 8 }
],
"URL": ""
},
{
"Name": "XPR-50",
"Type": 4,
"Attachments": [
{ "Name": "404", "Type": 8 },
{ "Name": "404", "Type": 8 },
{ "Name": "404", "Type": 8 },
{ "Name": "404", "Type": 8 },
{ "Name": "404", "Type": 8 }
],
"URL": ""
},
{
"Name": "Kilo Bolt-Action",
"Type": 5,
"Attachments": [
{ "Name": "YKM Combat Stock", "Type": 5 },
{ "Name": "Stippled Grip Tape", "Type": 2 },
{ "Name": "Fast Reload", "Type": 7 },
{ "Name": "OWC Laser-Tactical", "Type": 3 },
{ "Name": "Sleight of Hand", "Type": 8 }
],
"URL": "https://media.discordapp.net/attachments/842014909264953354/852922652452454460/image0.png?width=1001&height=563"
},
{
"Name": "SP-R 208",
"Type": 5,
"Attachments": [
{ "Name": "RTC Light Barrel", "Type": 5 },
{ "Name": "OWC Skeleton Stock", "Type": 6 },
{ "Name": "Light Bolt", "Type": 9 },
{ "Name": "Extended Mag A", "Type": 7 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": "https://media.discordapp.net/attachments/842014909264953354/852922699063885864/image0.png?width=1001&height=563"
},
{
"Name": "SKS",
"Type": 5,
"Attachments": [
{ "Name": "MIP Light", "Type": 5 },
{ "Name": "No Stock", "Type": 6 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "Operator Foregrip", "Type": 1 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": "https://media.discordapp.net/attachments/842014909264953354/852922602674454538/image0.png?width=1001&height=563"
},
{
"Name": "MK 2",
"Type": 5,
"Attachments": [
{ "Name": "OWC Light Suppressor", "Type": 4 },
{ "Name": "18.0 Sport Barrel", "Type": 5 },
{ "Name": "MIP Sport Stock", "Type": 6 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "OWC Laser-Tactical", "Type": 3 }
],
"URL": "https://media.discordapp.net/attachments/540218400413188116/856114522922156082/Screenshot_20210620-153228.png?width=1283&height=592"
},
{
"Name": "BY15",
"Type": 3,
"Attachments": [
{ "Name": "Marauder Suppressor", "Type": 4 },
{ "Name": "Extended Barrel(+2)", "Type": 5 },
{ "Name": "No Stock", "Type": 6 },
{ "Name": "MIP Laser 5mW", "Type": 3 },
{ "Name": "Sleight of Hand", "Type": 8 }
],
"URL": ""
},
{
"Name": "Echo",
"Type": 3,
"Attachments": [
{ "Name": "Choke", "Type": 4 },
{ "Name": "No Stock", "Type": 6 },
{ "Name": "Extended Mag C", "Type": 7 },
{ "Name": "MIP Laser 5mW", "Type": 3 },
{ "Name": "Sleight of Hand", "Type": 8 }
],
"URL": ""
},
{
"Name": "HS0405",
"Type": 3,
"Attachments": [
{ "Name": "Choke", "Type": 4 },
{ "Name": "RTC Extended Light Barrel", "Type": 5 },
{ "Name": "No Stock", "Type": 6 },
{ "Name": "MIP Laser 5mW", "Type": 3 },
{ "Name": "Speed Up Kill", "Type": 8 }
],
"URL": "https://media.discordapp.net/attachments/842014909264953354/852922783414616104/image0.png?width=1001&height=563"
},
{
"Name": "HS2126",
"Type": 3,
"Attachments": [
{ "Name": "404", "Type": 8 },
{ "Name": "404", "Type": 8 },
{ "Name": "404", "Type": 8 },
{ "Name": "404", "Type": 8 },
{ "Name": "404", "Type": 8 }
],
"URL": ""
},
{
"Name": "KRM-262",
"Type": 3,
"Attachments": [
{ "Name": "Marauder Suppressor", "Type": 4 },
{ "Name": "Extended Barrel(+2)", "Type": 5 },
{ "Name": "No Stock", "Type": 6 },
{ "Name": "MIP Laser 5mW", "Type": 3 },
{ "Name": "Sleight of Hand", "Type": 8 }
],
"URL": ""
},
{
"Name": "Striker",
"Type": 3,
"Attachments": [
{ "Name": "404", "Type": 8 },
{ "Name": "404", "Type": 8 },
{ "Name": "404", "Type": 8 },
{ "Name": "404", "Type": 8 },
{ "Name": "404", "Type": 8 }
],
"URL": ""
},
{
"Name": ".50 GS ",
"Type": 6,
"Attachments": [
{ "Name": "Monolithic Suppressor", "Type": 4 },
{ "Name": "Granulated Grip Tape", "Type": 2 },
{ "Name": "Lightweight Trigger", "Type": 1 },
{ "Name": "OWC Laser - Tactical", "Type": 3 },
{ "Name": "Sleight of Hand", "Type": 8 }
],
"URL": ""
},
{
"Name": "J358",
"Type": 6,
"Attachments": [
{ "Name": "RTC Light Muzzle Brake", "Type": 4 },
{ "Name": "J358 Custom Light", "Type": 5 },
{ "Name": "Red Dot Sight 2", "Type": 0 },
{ "Name": "Stopping Power Reload", "Type": 7 },
{ "Name": "Lightweight Trigger", "Type": 10 }
],
"URL": "https://media.discordapp.net/attachments/842014909264953354/852922819507126272/image0.png?width=1001&height=563"
},
{
"Name": "MW11",
"Type": 6,
"Attachments": [
{ "Name": "MIP Light Flash Guard", "Type": 4 },
{ "Name": "Rubberized Grip Tape", "Type": 2 },
{ "Name": "15 Round Reload", "Type": 7 },
{ "Name": "Lightweight Trigger", "Type": 10 },
{ "Name": "MIP Laser 5mW", "Type": 3 }
],
"URL": ""
},
{
"Name": "Renetti",
"Type": 6,
"Attachments": [
{ "Name": "RTC Compensator", "Type": 4 },
{ "Name": "MIP Light", "Type": 5 },
{ "Name": "Handmade Grip Tape", "Type": 2 },
{ "Name": "MIP Laser 5mW", "Type": 3 },
{ "Name": "Full Ammo", "Type": 8 }
],
"URL": "https://pbs.twimg.com/media/E2f2W6eXEAM1Yb1?format=jpg&name=large"
},
{
"Name": "Shorty",
"Type": 6,
"Attachments": [
{ "Name": "Marauder Suppressor", "Type": 4 },
{ "Name": "RTC Steady Stock", "Type": 6 },
{ "Name": "OWC Stable", "Type": 11 },
{ "Name": "MIP Laser 5mW", "Type": 3 },
{ "Name": "Slight of Hand", "Type": 8 }
],
"URL": "https://media.discordapp.net/attachments/692227531235000400/866204001065369620/image0.png?width=840&height=630"
},
{
"Name": "Crossbow",
"Type": 6,
"Attachments": [
{ "Name": "28 Bow String", "Type": 12 },
{ "Name": "Heavy Limb", "Type": 13 },
{ "Name": "Archer Stock", "Type": 6 },
{ "Name": "Gas Grenade Bolt", "Type": 7 },
{ "Name": "Full Ammo", "Type": 8 }
],
"URL": "https://media.discordapp.net/attachments/785461568464748593/882503628538126336/image0.png"
}
],
"WeaponTypes": [
"Assault",
"SMG",
"LMG",
"Shotgun",
"Sniper",
"Marksman",
"Pistol"
],
"AttachmentTypes": [
"Optic",
"Underbarrel",
"Rear Grip",
"Laser",
"Muzzle",
"Barrel",
"Stock",
"Ammunition",
"Perk",
"Bolt",
"Trigger Action",
"Guard",
"Bowstring",
"Limb"
]
}

26
util/Data/dares.json Normal file
View file

@ -0,0 +1,26 @@
[
"Shave your arms and send me a pic.",
"Record yourself singing a song and post it on YouTube.",
"Try to lick your own foot!",
"Message someone you havent talked to in at least 1 year on Facebook or Instagram and take a screenshot.",
"Text your crush and ask them out on a date.",
"Cut a piece of your hair.",
"List everyone as the emoji(s) you think best fits them.",
"Change your nickname/username to whatever the group wants.",
"Send me a screenshot of your messages with the last person besides me you texted.",
"Brush your teeth with peanut butter or another condiment and send me a pic.",
"Rate everyone here 1-10 in terms of personality.",
"Take a really unflattering picture and make it your profile picture for one full day.",
"Send me a screenshot of your selfies gallery.",
"Text a random number and write “I see dead people”.",
"Tell the group in detail about your first kiss.",
"Tell a joke until it makes everyone laugh.",
"Tell your girlfriend that your friends dont like her so you cant be with her anymore.",
"Brush your teeth with your best friends toothbrush.",
"Show everyone your unshaved legs.",
"Break a raw egg on your forehead.",
"Call 5 different people and talk to them in 5 different accents.",
"Set your crushs picture as your FB profile picture.",
"Show everyone your search history for the past week."
]

1
util/Data/giveaways.json Normal file
View file

@ -0,0 +1 @@
[]

4102
util/Data/scam.json Normal file

File diff suppressed because it is too large Load diff

1
util/Data/skins.json Normal file

File diff suppressed because one or more lines are too long

63
util/Data/truth.json Normal file
View file

@ -0,0 +1,63 @@
[
"When was the last time you lied?",
"When was the last time you cried?",
"What's your biggest fear?",
"What's your biggest fantasy?",
"Do you have any fetishes?",
"What's something you're glad your mum doesn't know about you?",
"Have you ever cheated on someone?",
"What's the worst thing you've ever done?",
"What's a secret you've never told anyone?",
"Do you have a hidden talent?",
"Who was your first celebrity crush?",
"What are your thoughts on polyamory?",
"What's the worst intimate experience you've ever had?",
"What's the best intimate experience you've ever had?",
"Have you ever cheated in an exam?",
"What's the most drunk you've ever been?",
"Have you ever broken the law?",
"What's the most embarrassing thing you've ever done?",
"What's your biggest insecurity?",
"Have you ever stayed friends with someone because it benefitted you beyond just the friendship?",
"What's the biggest mistake you've ever made?",
"What's the most disgusting thing you've ever done?",
"Who would you like to kiss in this room?",
"What's one thing you hate people knowing about you?",
"What's the worst thing anyone's ever done to you?",
"What's the best thing anyone's ever done for you?",
"Have you ever had a run in with the law?",
"What's your worst habit?",
"What's the most embarrassing thing you've done in a taxi?",
"What's the worst thing you've ever said to anyone?",
"Have you ever peed in the shower?",
"What's the strangest dream you've had?",
"Have you ever been caught doing something you shouldn't have?",
"What's the worst date you've been on?",
"What's the best date you've been on?",
"What happened on the latest night out you've ever had?",
"What's your biggest regret?",
"What's the biggest misconception about you?",
"Have you ever said something you regret about someone in this room?",
"What's one thing you wish people knew about you?",
"Where's the weirdest place you've had sex?",
"Why did your last relationship break down?",
"Have you ever lied to get out of a bad date?",
"What's the most trouble you've been in?",
"When did you last have sex outside?",
"What's the worst thing you've lied about?",
"What's one thing you wish you'd lied about?",
"What's the best piece of advice you've been given?",
"What's the most you've spent on a night out?",
"Name a time you think you were a bad partner",
"What's your guilty pleasure?",
"What's one thing you only do when you're alone?",
"If you had to get back with an ex, who would you choose?",
"If you had to cut one friend out of your life, who would it be?",
"Do you have a favourite friend?",
"Do you have a favourite sibling?",
"What's the strangest rumour you've heard about yourself?",
"What's your biggest turn on?",
"What's the silliest reason you've left a club early?",
"What have you purchased that's been the biggest waste of money?",
"If you could swap lives with someone in this room, who would it be?"
]

45
util/dist/handler.js vendored
View file

@ -28,28 +28,27 @@ module.exports = async client => {
ownercmds.push(file);
});
client.on("ready", async () => {
await client.guilds.cache.get("840225563193114624").commands.set(ownercmds);
await client.application.commands.set(cmds);
// .then(async cmd => {
// client.guilds.cache.forEach(g => {
// const getroles = name => {
// const perms = cmds.find(n => n.name == name).UserPerms;
// if (!perms) return null;
// return g.roles.cache.filter(
// z => z.permissions.has(perms) && !z.managed
// );
// };
// const fullPermissions = cmd.reduce((accumulator, v) => {
// const roles = getroles(v.name);
// if (!roles) return accumulator;
// const permissions = roles.reduce((a, w) => {
// return [...a, { id: w.id, type: "ROLE", permission: true }];
// }, []);
// return [...accumulator, { id: v.id, permissions }];
// }, []);
// g.commands.permissions.set({ fullPermissions }).catch(null);
// });
// })
// .catch(null);
const gg = client.guilds.cache.get("840225563193114624");
await gg.commands.set(ownercmds);
await client.application.commands.set(cmds).then(async cmd => {
client.guilds.cache.forEach(g => {
const getroles = name => {
const perms = cmds.find(n => n.name == name).UserPerms;
if (!perms) return null;
return g.roles.cache.filter(
z => z.permissions.has(perms) && !z.managed
);
};
const fullPermissions = cmd.reduce((accumulator, v) => {
const roles = getroles(v.name);
if (!roles) return accumulator;
const permissions = roles.reduce((a, w) => {
return [...a, { id: w.id, type: "ROLE", permission: true }];
}, []);
return [...accumulator, { id: v.id, permissions }];
}, []);
g.commands.permissions.set({ fullPermissions });
});
});
});
};

View file

@ -4,8 +4,6 @@ const nmDt = require("../Data/aliases.json");
const weaponActualName = nmDt.weaponActualName;
const weaponAlliasName = nmDt.weaponAlliasName;
Object.defineProperty(String.prototype, "Simplify", {
// Function to remove all characters except 0-9 and a-z
// Eg "AK-47" -> "ak47"
value: function Simplify() {
return this.toLowerCase().replace(/[^0-9a-z]/g, "");
},
@ -14,30 +12,33 @@ Object.defineProperty(String.prototype, "Simplify", {
});
Object.defineProperty(Number.prototype, "IsPositive", {
// Function to check the number is positive or not
value: function IsPositive() {
if (this > 0) return true;
else return false;
if (this > 0) {
return true;
}
return false;
},
writable: true,
configurable: true,
});
Object.defineProperty(Number.prototype, "IsNegative", {
// Function to check the number is negative or not
value: function IsNegative() {
if (this < 0) return true;
else return false;
if (this < 0) {
return true;
}
return false;
},
writable: true,
configurable: true,
});
Object.defineProperty(Number.prototype, "ToBool", {
// Function to check the number is one or not
value: function ToBool() {
if (this == 1) return true;
else return false;
if (this == 1) {
return true;
}
return false;
},
writable: true,
configurable: true,
@ -48,19 +49,15 @@ Object.defineProperty(Number.prototype, "PlusHL", {
if (this.toString()[0] == "-") {
return parseFloat(this.toFixed(2)).toString();
}
return `+${parseFloat(this.toFixed(2)).toString()}`;
return "+" + parseFloat(this.toFixed(2)).toString();
},
writable: true,
configurable: true,
});
/* Function to fix the input statement */
function inpFixer(inpmsg) {
const parts = PartSpliter(inpmsg);
// parts will be an array
//eg: ["fennec", "akimbo, mono"]
const parts = partExtracter(inpmsg);
nmDt.attachmentAlliasName[0].map((x, i) =>
// x is the content of each index, i is the number of each index
x.map(y => {
if (parts[0].startsWith(y + " ") || parts[0].endsWith(" " + y)) {
inpmsg =
@ -68,30 +65,24 @@ function inpFixer(inpmsg) {
(parts[1] ? ", " : " + ") +
nmDt.attachmentActualName[0][i];
}
})
}),
);
// so it fking only fix akimbo and stopping power wtf
return inpmsg;
}
// Function to split weapon name and the attachments from the input statement
function PartSpliter(inpmsg) {
function partExtracter(inpmsg) {
if (inpmsg.includes(" + ")) {
// If the input statement has multiple attachments joined by "+", split them and output them as an array of strings [0] is the weapon name, [1] is the attachments
// Eg: "M4A1 + Silencer + Flashlight" -> ["M4A1", "Silencer + Flashlight"]
const out = inpmsg
.split(" + ")
.map(x => x.split("+"))
.flat();
return [out.shift(), out.join(", ")];
}
// If there is only one attachment, output it as an array of strings [0] is the weapon name, [1] is the attachment
// Eg: "M4A1 with Flashlight" -> ["M4A1", "Flashlight"]
return inpmsg.split(" with ");
}
function hasAttachments(inpmsg) {
inpmsg = inpFixer(inpmsg);
// If the input statement has multiple attachments joined by "+" or "with", split them and output them as an array of strings [0] is the weapon name, [1] is the attachments
if (
inpmsg.split(" with ").filter(x => x.Simplify()).length > 1 ||
inpmsg.split(" + ").filter(x => x.Simplify()).length > 1
@ -102,202 +93,174 @@ function hasAttachments(inpmsg) {
}
function isolator(inpmsg) {
return PartSpliter(inpFixer(inpmsg));
return partExtracter(inpFixer(inpmsg));
}
// identifying the weapon
function weaponIdentifier(inpmsg) {
const inpWeaponName = isolator(inpmsg)[0];
// ["ak", "mono"] -> inpWeaponName: "ak"
// if weapon name is too short, return the error
if (inpWeaponName.length < 2) {
return inpmsg.trim().length
? `The name ${inpmsg.trim()} is too short.`
: "There isn't any weapon name.";
? "The name `" + inpmsg.trim() + "` is too short."
: "Empty weapon name";
}
let probableWeapons = [];
// Loop through all the weapons to find the probable weapons
// Eg: "ak"
for (let i = 0; i < data.cguns.length; i++) {
if (inpWeaponName.Simplify() == data.cguns[i].gunname.Simplify()) {
// if the simplified name of the weapon is the same as the weapon name in the database, return the only one stats object
return JSON.parse(JSON.stringify(data.cguns[i]));
} else if (
}
else if (
data.cguns[i].gunname.Simplify().includes(inpWeaponName.Simplify())
) {
// If the weapon name is included in the actual name of the weapon
// push the weapon to the probableWeapons array
probableWeapons.push(i);
}
}
// if there is only one probable weapon, mean the gun has already been identified
if (probableWeapons.length == 1) {
// if there is only one probable weapon, return the only one stats object
return JSON.parse(JSON.stringify(data.cguns[probableWeapons[0]]));
}
// continue loop when there is no identified weapons or there are more than one identfied weaponds
// detecting aliases
// getting total number of weapons that had added aliases
for (let i = 0; i < weaponAlliasName.length; i++) {
// getting the number of aliases of each weapon
for (let j = 0; j < weaponAlliasName[i].length; j++) {
// weaponAliases[i][j] is the each alias of each weapon
// finding if simplified alias is same as input weapon name
if (weaponAlliasName[i][j].Simplify() == inpWeaponName.Simplify()) {
// if simplified alias is same as input weapon name
// eg "mow" == "mow", run the loop
for (let i2 = 0; i2 < data.cguns.length; i2++) {
if (weaponActualName[i] == data.cguns[i2].gunname) {
// use the actual name of the weapon to find the weapon
if (
weaponActualName[i].Simplify() == data.cguns[i2].gunname.Simplify()
) {
return JSON.parse(JSON.stringify(data.cguns[i2]));
}
}
}
}
}
// removing duplicates in the array
probableWeapons = [...new Set(probableWeapons)];
// if there is only one probable weapon, return the only one stats object
if (probableWeapons.length == 1)
if (probableWeapons.length == 1) {
return JSON.parse(JSON.stringify(data.cguns[probableWeapons[0]]));
else if (probableWeapons.length > 1) {
// reply with the question of probable weapons
return `Did you mean ${probableWeapons
}
if (probableWeapons.length > 1) {
return (
"Did you mean `" +
probableWeapons
.map(x => data.cguns[x].gunname)
.reduce((out, x, i) =>
[out, x].join(i === probableWeapons.length - 1 ? "` or `" : "`, `")
)}
?`;
} else return `Couldn't identify the weapon: "${inpWeaponName}"`;
[out, x].join(i === probableWeapons.length - 1 ? "` or `" : "`, `"),
) +
"`?"
);
}
return "Couldn't identify the weapon: `" + '"' + inpWeaponName + '"`';
}
function attachmentsIdentifier(inpmsg, attachmentsData, inpStats) {
if (!hasAttachments(inpmsg)) {
return [];
}
// identifying attachments and return array or error
function attachmentsIdentifier(inpmsg, gun) {
if (!hasAttachments(inpmsg)) return [];
// no need for isolator because using slash commands, we get individual attachment
let inputAttachmentsNames = isolator(inpmsg)[1]
.split(/ & |, |,| and /)
.filter(x => x);
const tooSmall = inputAttachmentsNames.filter(x => x.length < 3);
// filter all elements thats shorter than 2 characters
inputAttachmentsNames = inputAttachmentsNames.filter(x => !(x.length < 3));
let errorMsgs = "",
errors = [],
unidentifined = [];
if (inputAttachmentsNames.length == 0)
if (inputAttachmentsNames.length == 00) {
errorMsgs += "\nAttachments are missing!\n";
// if (inputAttachmentsNames.length >= 10) return "Cocaineeeeee"; ?????????
}
if (inputAttachmentsNames.length >= 10) {
return "Cocaineeeeee";
}
// Can directly use args[] to return, no need for isolator, partExtractor, inpFixer
const splitAttachmentsDataName = [],
outAttachments = [];
for (let i = 0; i < gun.aments.length; i++) {
// Eg: "Stippled Grip Tape" -> ["Stippled", "Grip", "Tape"]
for (let i = 0; i < attachmentsData.length; i++) {
splitAttachmentsDataName.push([
...new Set(
gun.aments[i].name
attachmentsData[i].name
.split(" ")
.filter(x => x)
.map(x => x.trim())
),
]);
// splitAttachmentsDataName[i] = ["Stippled", "Grip", "Tape"]
if (Math.max(...splitAttachmentsDataName.map(x => x.length)) > 6) {
return "Cocaineeeeee";
}
for (let j = 0; j < splitAttachmentsDataName[i].length; j++) {
// simplify the attachments name
// Eg: ["Stippled", "Grip", "Tape"] -> ["stippled", "grip", "tape"]
splitAttachmentsDataName[i][j] =
splitAttachmentsDataName[i][j].Simplify();
}
}
// inputAttachmentsNames = [["stippled", "grip", "tape"]
for (let i = 0; i < inputAttachmentsNames.length; i++) {
let probables = [];
// loop through all the input attachments and split them into words
var probables = [];
var splitInputAttachmentsName = inputAttachmentsNames[i]
.split(" ")
.filter(x => x);
function finder() {
//splitInputAttachmentsName = [["stippled", "grip", "tape"], ["545", "ammo"], ["owc","lazer", "tactical"]]
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 simplified input attachment name is included in the real attachments name
if (
splitAttachmentsDataName[j][i2].includes(
splitInputAttachmentsName[i3].Simplify()
splitInputAttachmentsName[i3].Simplify(),
)
) {
// if probables list doesn't include the attachment, push
let probablePushed = false;
for (let i4 = 0; i4 < probables.length; i4++) {
// push another attachment that also probable to the probables list to the same array that identified last loop
// Eg: probables = [ [32]] // as user input mag and first loop it identfified extended mag
// then as it got more possible, it will push large extended mag to the same array -> [ [32,33] ]
if (!probables[i4].includes(j)) {
probables[i4].push(j);
// make it true so that it doesn't push again in the next condition
probablePushed = true;
break;
}
}
// push if the attachment isn't been identified yet
if (!probablePushed) probables.push([j]);
if (!probablePushed) {
probables.push([j]);
}
}
}
}
}
}
finder();
// finding magazines attachments
if (
(inputAttachmentsNames[i].includes(" rounds mag") ||
inputAttachmentsNames[i].includes(" round mag") ||
inputAttachmentsNames[i].includes(" round") ||
inputAttachmentsNames[i].includes(" rounds")) &&
inputAttachmentsNames[i].includes(" round mag")) &&
inputAttachmentsNames[i].startsWith(
inputAttachmentsNames[i].replace(/\D/g, "")
inputAttachmentsNames[i].replace(/\D/g, ""),
)
) {
var tmp1 = parseInt(inputAttachmentsNames[i]);
// calculating the sum of number of rounds and see if it matches the input number of rounds
const tmp2 = gun.aments.filter(
const tmp2 = attachmentsData.filter(
x =>
x.type === 8 && x.effects[27] + x.effects[28] + gun.stats[17] === tmp1
x.type === 8 && x.effects[27] + x.effects[28] + inpStats[17] === tmp1,
);
// push if the magazine is found
if (tmp2.length === 1) {
outAttachments.push(tmp2[0]);
continue;
}
}
// if probables is empty or there is more than one identified attachment
if (
probables.length === 0 ||
probables[probables.length - 1].length !== 1 ||
probables.length < splitInputAttachmentsName.length
) {
// empty probables as can't indentify the attachment
probables = [];
// the splitInputAttachmentsName isn't simplified pls rmb
splitInputAttachmentsName.map((x, i5) => {
// finding aliases
nmDt.attachmentAlliasName[1].map((y, i6) => {
splitInputAttachmentsName.map((x, i5) =>
nmDt.attachmentAlliasName[1].map((y, i6) =>
y.map(z => {
if (z.Simplify().includes(x.Simplify())) {
if (x.Simplify() === z.Simplify()) {
splitInputAttachmentsName[i5] = nmDt.attachmentActualName[1][i6];
}
});
});
});
// simple iteration to make the array again
}),
),
);
splitInputAttachmentsName = splitInputAttachmentsName
.join(" ")
.split(" ")
.filter(x => x);
// find one more time as we do aliases already
finder();
if (
probables.length === 0 ||
@ -311,30 +274,29 @@ function attachmentsIdentifier(inpmsg, gun) {
finder();
}
}
if (probables.length === 0) {
// push to unidentifined list as can't be identified after serveral times
unidentifined.push(inputAttachmentsNames[i]);
continue;
}
// curr is the most probable attachment
var curr = probables[probables.length - 1];
const temp1 = probables[probables.length - 1].filter(
x => gun.aments[x].name.Simplify() == inputAttachmentsNames[i].Simplify()
x =>
attachmentsData[x].name.Simplify() ==
inputAttachmentsNames[i].Simplify(),
);
// see if the length of the array is the same or not
// Eg: splitAttachmentsDataName[x] = ["stippled", "grip", "tape"] and splitInputAttachmentsName = ["stippled", "grip", "tape"]
// then it it equal
const temp2 = probables[probables.length - 1].filter(
x =>
splitAttachmentsDataName[x].length == splitInputAttachmentsName.length
splitAttachmentsDataName[x].length == splitInputAttachmentsName.length,
);
// if found probable, push it
if (temp1.length === 1 && temp2.length !== 1) {
/**/ if (temp1.length === 1 && temp2.length !== 1) {
probables.push([temp1]);
} else if (temp1.length !== 1 && temp2.length === 1) {
}
else if (temp1.length !== 1 && temp2.length === 1) {
probables.push([temp2]);
} else if (
}
else if (
temp1.length === 1 &&
temp2.length === 1 &&
temp1[0] == temp2[0]
@ -345,23 +307,20 @@ function attachmentsIdentifier(inpmsg, gun) {
probables[probables.length - 1].length != 1 ||
probables.length < splitInputAttachmentsName.length
) {
// ask the user if he means xxx = which attachment
errors.push(
"`" +
curr
.map(x => gun.aments[x].name)
.map(x => attachmentsData[x].name)
.reduce((out, x, i) =>
[out, x].join(i === curr.length - 1 ? "` or `" : "`, `")
[out, x].join(i === curr.length - 1 ? "` or `" : "`, `"),
) +
'` by `"' +
inputAttachmentsNames[i] +
'"`'
'"`',
);
}
// push the attachment to the output list
outAttachments.push(gun.aments[probables[probables.length - 1][0]]);
outAttachments.push(attachmentsData[probables[probables.length - 1][0]]);
}
const outAttachmentsTypes = outAttachments.map(x => x.type - 1),
t1 = outAttachments
.map(x => x.effects[35])
@ -371,7 +330,7 @@ function attachmentsIdentifier(inpmsg, gun) {
.toString()
.split("")
.map((x, i) =>
parseInt(x) !== 0 && outAttachmentsTypes.includes(i) ? parseInt(i) : -1
parseInt(x) !== 0 && outAttachmentsTypes.includes(i) ? parseInt(i) : -1,
)
.filter(x => x !== -1);
@ -380,21 +339,25 @@ function attachmentsIdentifier(inpmsg, gun) {
t1
.map(x => data.attachmentTypes[x])
.reduce((out, x, i, a) =>
[out, x].join(i === a.length - 1 ? "` or `" : "`, `")
[out, x].join(i === a.length - 1 ? "` or `" : "`, `"),
) +
"` with " +
outAttachments
.filter(x => x.effects[35])
.map(x => x.name)
.reduce((out, x, i, a) =>
[out, x].join(i === a.length - 1 ? " and " : ", ")
[out, x].join(i === a.length - 1 ? " and " : ", "),
)
: "";
errorMsgs += errors.length ? `\nDid you mean ${errors.join(";\n")}?\n` : "";
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`
? "\nCouldn't identify the attachment" +
(unidentifined.length === 1 ? "" : "s") +
': `"' +
unidentifined.join('"`, `"') +
'"`\n'
: "";
errorMsgs +=
outAttachments.length > 5 ? "\nCan't equip more than 5 attachments!\n" : "";
@ -411,7 +374,7 @@ function attachmentsIdentifier(inpmsg, gun) {
(tooSmall.length === 1 ? "" : "s") +
': `"' +
tooSmall.reduce((out, x, i) =>
[out, x].join(i === curr.length - 1 ? '"` and `"' : '"`, `"')
[out, x].join(i === curr.length - 1 ? '"` and `"' : '"`, `"'),
) +
'"` ' +
(tooSmall.length === 1 ? "is" : "are") +
@ -420,11 +383,10 @@ function attachmentsIdentifier(inpmsg, gun) {
return errorMsgs ? errorMsgs.trim() : outAttachments;
}
// console.log(attachmentsIdentifier("chopper with heavy handle, red sight, granulated", data.cguns[38].aments)); makeError();
// console.log(attachmentsIdentifier("ak + 5mw lazer", data.cguns[0].aments)); makeError();
// console.log(attachmentsIdentifier("ak + 5mw lazer", data.cguns[0].aments)); //makeError();
// console.log(attachmentsIdentifier("117 + 40 round mag", data.cguns[0].aments, data.cguns[0].stats)); makeError();
// console.log(attachmentsIdentifier("117 + rtc muzzle brake, rubberized griptape, tac lazer sight, 40 round mag, no stock", data.cguns[1].aments)); makeError();
// console.log(attachmentsIdentifier("47 + stipplied grip tape", data.cguns[0]));
// makeError();
function damageHandler(
currDmgs,
currRngs,
@ -433,7 +395,7 @@ function damageHandler(
tbs,
tbb,
bib,
pellets
pellets,
) {
currDmgs = [...currDmgs];
currRngs = [...currRngs];
@ -458,15 +420,23 @@ function damageHandler(
}
function stk(dmg) {
let out;
if (!pellets) out = Math.ceil(hp / dmg);
else out = Math.ceil(hp / (dmg * pellets));
return out == Infinity ? "∞" : out;
if (!pellets) {
out = Math.ceil(hp / dmg);
}
else {
out = Math.ceil(hp / (dmg * pellets));
}
out = out == Infinity ? "∞" : out;
return out;
}
function ttk(dmg) {
const stkVal = stk(dmg);
if (stkVal == "∞") return stkVal;
if (!bib) return Math.round((stkVal - 1) * tbs);
if (stkVal == "∞") {
return stkVal;
}
if (!bib) {
return Math.round((stkVal - 1) * tbs);
}
let out = 0;
if (dmg > 0) {
if (stkVal % bib == 0) {
@ -474,7 +444,8 @@ function damageHandler(
out += tbs * (bib - 1) + tbb;
}
out = out + tbs * (bib - 1);
} else if (stkVal % bib != 0) {
}
else if (stkVal % bib != 0) {
for (var i = 0; i <= Math.floor(stkVal / bib) - 1; i++) {
out += tbs * (bib - 1) + tbb;
}
@ -486,7 +457,8 @@ function damageHandler(
if (out == Infinity) {
return "∞";
}
} else {
}
else {
out = "No";
}
return out;
@ -517,13 +489,15 @@ function recoilHandler(
yRecoil,
xMultiplier,
yMultiplier,
bulletCount
bulletCount,
) {
if (xRecoil.length != yRecoil.length) return "err";
if (xRecoil.length != yRecoil.length) {
return "err";
}
const recoilLength = xRecoil.length;
if (recoilLength == 0) return "none";
if (recoilLength == 0) {
return "none";
}
const recoilPattern = [
{
x: 0,
@ -541,7 +515,8 @@ function recoilHandler(
x: xRecoil[i] * (1 + xMultiplier / 100),
y: yRecoil[i] * (1 + yMultiplier / 100),
};
} else {
}
else {
recoilObj = {
x:
(recoilPattern[recoilPattern.length - 1].x + xContinuationVal) *
@ -652,14 +627,15 @@ function attachmentHandler(currEffects, currStats) {
currEffects[0] +
"% zoom (+" +
(currEffects[0] - currStats[16]) +
"% zoom)"
"% zoom)",
);
} else if (currEffects[0] != 0 && currEffects[0] != currStats[16]) {
}
else if (currEffects[0] != 0 && currEffects[0] != currStats[16]) {
neg.push(
currEffects[0] +
"% zoom (-" +
(currStats[16] - currEffects[0]) +
"% zoom)"
"% zoom)",
);
}
if (currEffects[0] != 0 && currStats[16] <= 110) {
@ -686,11 +662,12 @@ function attachmentHandler(currEffects, currStats) {
negGood1(19, "Idle Sway");
if (currEffects[20] > currStats[3]) {
pos.push(
currEffects[20].ToString().Replace(".", " ~ ") + " Explosion Damage"
currEffects[20].ToString().Replace(".", " ~ ") + " Explosion Damage",
);
} else if (currEffects[20] != 0 && currEffects[20] != currStats[3]) {
}
else if (currEffects[20] != 0 && currEffects[20] != currStats[3]) {
neg.push(
currEffects[20].ToString().Replace(".", " ~ ") + " Explosion Damage"
currEffects[20].ToString().Replace(".", " ~ ") + " Explosion Damage",
);
}
atrPush3(21, "Visible Laser when not ADS-ed");
@ -713,7 +690,7 @@ function attachmentHandler(currEffects, currStats) {
.toString()
.split("")
.map((x, i) => (parseInt(x) !== 0 ? data.attachmentTypes[i] : 0))
.filter(x => x)
.filter(x => x),
);
}
atrPush3(36, "Can't ADS");
@ -722,7 +699,8 @@ function attachmentHandler(currEffects, currStats) {
}
if (currEffects[38] != 0 && currEffects[38] < currStats[4]) {
pos.push("Turns to " + data.firingModes[currEffects[38] - 1]);
} else if (currEffects[38] != 0 && currEffects[38] != currStats[4]) {
}
else if (currEffects[38] != 0 && currEffects[38] != currStats[4]) {
neg.push("Turns to " + data.firingModes[currEffects[38] - 1]);
}
posGood2(39, "Tick Damage");
@ -732,15 +710,17 @@ function attachmentHandler(currEffects, currStats) {
posGood1(43, "Bullet Speed");
if (currEffects[44] == 1) {
atr.push("Higher Penetraion Damage");
} else if (currEffects[44] == -1) {
}
else if (currEffects[44] == -1) {
atr.push("Lower Penetraion Damage");
}
posGood2(45, `Round ${currEffects[45] - 1 ? "s" : ""} in Reserve`);
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()) {
}
else if (currEffects[i].IsNegative()) {
neg.push(currEffects[i].PlusHL() + "% " + ext);
}
}
@ -748,7 +728,8 @@ function attachmentHandler(currEffects, currStats) {
function negGood1(i, ext) {
if (currEffects[i].IsNegative()) {
pos.push(currEffects[i].PlusHL() + "% " + ext);
} else if (currEffects[i].IsPositive()) {
}
else if (currEffects[i].IsPositive()) {
neg.push(currEffects[i].PlusHL() + "% " + ext);
}
}
@ -756,7 +737,8 @@ function attachmentHandler(currEffects, currStats) {
function posGood2(i, ext) {
if (currEffects[i].IsPositive()) {
pos.push(currEffects[i].PlusHL() + " " + ext);
} else if (currEffects[i].IsNegative()) {
}
else if (currEffects[i].IsNegative()) {
neg.push(currEffects[i].PlusHL() + " " + ext);
}
}
@ -764,7 +746,8 @@ function attachmentHandler(currEffects, currStats) {
function negGood2(i, ext) {
if (currEffects[i].IsNegative()) {
pos.push(currEffects[i].PlusHL() + " " + ext);
} else if (currEffects[i].IsPositive()) {
}
else if (currEffects[i].IsPositive()) {
neg.push(currEffects[i].PlusHL() + " " + ext);
}
}
@ -774,26 +757,26 @@ function attachmentHandler(currEffects, currStats) {
atr.push(ext);
}
}
// Return the attributes when there is and use algorithms to join them
return [
pos.length
? {
name: "**Positives:**",
value: `\`\`\`ini\n[${pos.join("]\n[")}]\n\`\`\``,
value: "```ini\n[" + pos.join("]\n[") + "]\n```",
inline: true,
}
: 0,
neg.length
? {
name: "**Negatives:**",
value: `\`\`\`css\n[${neg.join("]\n[")}]\n\`\`\``,
value: "```css\n[" + neg.join("]\n[") + "]\n```",
inline: true,
}
: 0,
atr.length
? {
name: "**Attributes:**",
value: `\`\`\`fix\n[${atr.join("]\n[")}]\n\`\`\``,
value: "```fix\n[" + atr.join("]\n[") + "]\n```",
}
: 0,
].filter(x => x);
@ -816,7 +799,8 @@ function totaler(inpAttachments) {
}
function makeError() {
undefined.split("L");
let m;
m.split("L");
}
module.exports = {

View file

@ -408,7 +408,7 @@ function tips(interaction, client) {
const all = [
"You can report bugs by using `/report` and send a suggestion by `/suggest` !",
"If a gun isn't there, please be paitent and wait for the us to get the stats",
"We all recruiting for Javascript bot developers (Total: 4) Please DM the bot for more info",
"We all recruiting for bot developers (Total: 4) Please DM the bot for more info",
];
const ran = Math.floor(Math.random() * 50) + 2;
const rTip = all[Math.floor(Math.random() * all.length)];
@ -503,7 +503,6 @@ const leven = (te, t) => {
function chunk(arr, size) {
Array.from({ length: Math.ceil(arr.length / size) }, (v, i) => {
arr.slice(i * size, i * size + size);
return arr;
});
}
function progressBar(value, maxValue, size) {