converted ShaiBot casino to Nut Economy

This commit is contained in:
2026-08-19 14:10:38 +02:00
parent a126de21d4
commit 1957991182
55 changed files with 8905 additions and 751 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
const ping = require("../../../src/ping")
const ping = require("../../../utils/ping")
module.exports = {
name: 'ping',
+146 -42
View File
@@ -1,54 +1,158 @@
const { EmbedBuilder } = require('discord.js')
const { mClient } = require('../../../index')
function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }
require('dotenv').config()
const {
EmbedBuilder
} = require("discord.js");
const {
getNutBalance
} = require(
"../../../utils/nutEconomy"
);
function delay(ms) {
return new Promise(
resolve =>
setTimeout(
resolve,
ms
)
);
}
module.exports = {
name: 'checknuts',
description: 'get nuts',
aliases: ['chn'],
async execute(message, args) {
var target = message.author
var addressing = `Du hast`
if (args[0]) {
if (!args[0].startsWith('<@' || !args[0].endsWith('>'))) { return message.reply('Invalid User Specification') }
try {
target = await message.guild.members.fetch(args[0].slice(2, -1))
} catch (error) {
return message.reply({
content: `User: ${args[0]} nicht gefunden!`
}).then(async (msg) => {
await delay(4000)
message.delete()
msg.delete()
})
name:
"checknuts",
description:
"get nuts",
aliases: [
"chn"
],
async execute(
message,
args
) {
let target =
message.author;
let addressing =
"Du hast";
if (
args[0]
) {
if (
!args[0].startsWith("<@")
||
!args[0].endsWith(">")
) {
return message.reply(
"Invalid User Specification"
);
}
if (target.user.id !== message.author.id) {
if (!target.user.globalName) {
addressing = `${target.user.username} hat`
} else {
addressing = `${target.user.globalName} hat`
try {
target =
await message.guild.members.fetch(
args[0].slice(
2,
-1
)
);
} catch (error) {
return message.reply({
content:
`User: ${args[0]} nicht gefunden!`
})
.then(
async msg => {
await delay(
4000
);
message.delete();
msg.delete();
}
);
}
if (
target.user.id !==
message.author.id
) {
if (
!target.user.globalName
) {
addressing =
`${target.user.username} hat`;
}
else {
addressing =
`${target.user.globalName} hat`;
}
}
}
const db = mClient.db(process.env.M_DB)
const nutsColl = db.collection('items_nuts')
var nutsData = await nutsColl.findOne({ userID: target.id })
let content
if (!nutsData) {
content = `${addressing} noch keine Nüsse gesammelt :(`
} else {
content = `${addressing} bereits **${nutsData.nuts}** Nüsse gesammelt!`
const targetId =
target.id
??
target.user?.id;
const balance =
await getNutBalance(
targetId
);
let content;
if (
balance <=
0
) {
content =
`${addressing} noch keine Nüsse gesammelt :(`;
}
const embed = new EmbedBuilder()
.setTitle('Checknuts!')
.setThumbnail(target.displayAvatarURL())
.setDescription(content)
else {
content =
`${addressing} bereits **${balance}** Nüsse gesammelt!`;
}
const embed =
new EmbedBuilder()
.setTitle(
"Checknuts!"
)
.setThumbnail(
target.displayAvatarURL()
)
.setDescription(
content
);
return message.reply({
embeds: [embed]
})
embeds: [
embed
]
});
}
}
};
+82 -25
View File
@@ -1,31 +1,88 @@
const { EmbedBuilder } = require('discord.js')
const { mClient } = require('../../../index')
require('dotenv').config()
module.exports = {
name: 'nutsCooldown',
description: 'shows nut cooldown',
aliases: ['ncd'],
async execute(message, args) {
const db = mClient.db(process.env.M_DB)
const nutsColl = db.collection('items_cooldowns')
const cooldown = await nutsColl.findOne({ userID: message.author.id })
const {
EmbedBuilder
} = require("discord.js");
let content = `Du kannst wieder nussen! :)`
let thumbnail = 'https://cdn-icons-png.flaticon.com/512/7451/7451659.png'
let title = 'Go Nuts!'
if (cooldown) {
content = `<t:${cooldown.cooldown}:R> kannst du wieder nussen! ;)`
thumbnail = 'https://cdn.discordapp.com/attachments/1152723542836772914/1152987472788193361/No-nuts-PhotoRoom.png-PhotoRoom.png'
title = 'To Nut or Not to Nut...'
const {
getCooldown,
getUnixTime
} = require(
"../../../utils/nutEconomy"
);
module.exports = {
name:
"nutsCooldown",
description:
"shows nut cooldown",
aliases: [
"ncd"
],
async execute(
message,
args
) {
const cooldown =
await getCooldown(
message.author.id,
"nut"
);
const now =
getUnixTime();
let content =
"Du kannst wieder nussen! :)";
let thumbnail =
"https://cdn-icons-png.flaticon.com/512/7451/7451659.png";
let title =
"Go Nuts!";
if (
cooldown >
now
) {
content =
`<t:${cooldown}:R> kannst du wieder nussen! ;)`;
thumbnail =
"https://cdn.discordapp.com/attachments/1152723542836772914/1152987472788193361/No-nuts-PhotoRoom.png-PhotoRoom.png";
title =
"To Nut or Not to Nut...";
}
const embed = new EmbedBuilder()
.setThumbnail(thumbnail)
.setTitle(title)
.setDescription(content)
const embed =
new EmbedBuilder()
.setThumbnail(
thumbnail
)
.setTitle(
title
)
.setDescription(
content
);
await message.reply({
embeds: [embed]
})
embeds: [
embed
]
});
}
}
};
+123 -56
View File
@@ -1,64 +1,131 @@
const { mClient } = require('../../../index')
require('dotenv').config()
const {
getCollections,
changeNuts,
claimCooldown,
randomInteger
} = require(
"../../../utils/nutEconomy"
);
module.exports = {
name: 'nuts',
description: 'get nuts',
aliases: ['n', 'nget', 'nutsget'],
async execute(message, args) {
const db = mClient.db(process.env.M_DB)
const nutsColl = db.collection('items_nuts')
const nutsStatsColl = db.collection('stats_nuts')
const cdColl = db.collection('items_cooldowns')
const cdData = await cdColl.findOne({ userID: message.author.id })
name:
"nuts",
if (cdData?.cooldown > (Date.now() / 1000)) {
return await message.reply({
content: `Du kannst erst <t:${Math.floor(cdData?.cooldown)}:R> wieder nussen :(`,
})
}
description:
"get nuts",
let cd = Math.floor((Date.now() + 3600000) / 1000)
await cdColl.findOneAndUpdate({
userID: message.author.id
}, {
$set: {
cooldown: cd,
application: 'nuts'
}
}, {
upsert: true
})
aliases: [
"n",
"nget",
"nutsget"
],
const amount = Math.floor(Math.random() * 10)
await nutsColl.findOneAndUpdate({
userID: message.author.id
}, {
$inc: { nuts: amount }
}, {
upsert: true
})
async execute(
message,
args
) {
const {
db
} =
getCollections();
await nutsStatsColl.findOneAndUpdate(
{ userID: message.author.id },
{ $inc: { [`stat.${amount}`]: 1 } },
{ upsert: true }
)
await nutsStatsColl.findOneAndUpdate(
{ userID: "__global" },
{ $inc: { [`stat.${amount}`]: 1 } },
{ upsert: true }
)
// Helper for singular/plural
const formatNut = (amount) => `${amount === 1 ? 'eine' : amount} ${amount === 1 ? 'Nuss' : 'Nüsse'}`
const nutsStatsColl =
db.collection(
"stats_nuts"
);
let nutText = `Du hast ${formatNut(amount)} bekommen! :chestnut:`
if (amount <= 0) {
nutText = `Du hast keine Nuss bekommen! :yoink_help:`
}
return await message.reply({
content: nutText
})
}
}
const cooldown =
await claimCooldown(
message.author.id,
"nut",
60 * 60
);
if (
!cooldown.claimed
) {
return message.reply({
content:
`Du kannst erst <t:${cooldown.next}:R> wieder nussen :(`
});
}
const amount =
randomInteger(
0,
9
);
await changeNuts(
message.author.id,
amount
);
await nutsStatsColl.findOneAndUpdate(
{
userId:
message.author.id
},
{
$inc: {
[`stat.${amount}`]:
1
}
},
{
upsert:
true
}
);
await nutsStatsColl.findOneAndUpdate(
{
userId:
"__global"
},
{
$inc: {
[`stat.${amount}`]:
1
}
},
{
upsert:
true
}
);
const formatNut =
amount =>
`${amount === 1 ? "eine" : amount} ${amount === 1 ? "Nuss" : "Nüsse"}`;
let nutText =
`Du hast ${formatNut(amount)} bekommen! :chestnut:`;
if (
amount <=
0
) {
nutText =
"Du hast keine Nuss bekommen! :yoink_help:";
}
return message.reply({
content:
nutText
});
}
};
+210 -64
View File
@@ -1,78 +1,224 @@
const { EmbedBuilder } = require('discord.js')
const { mClient } = require('../../../index')
function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }
require('dotenv').config()
const {
EmbedBuilder
} = require("discord.js");
const {
getNutBalance,
transferNuts
} = require(
"../../../utils/nutEconomy"
);
function delay(ms) {
return new Promise(
resolve =>
setTimeout(
resolve,
ms
)
);
}
module.exports = {
name: 'givenuts',
description: 'give nuts',
aliases: ['gn'],
async execute(message, args) {
const from = message.author
if (args[0] == `<@${message.author.id}>` || !args[0]) {
name:
"givenuts",
description:
"give nuts",
aliases: [
"gn"
],
async execute(
message,
args
) {
const from =
message.author;
if (
args[0] ==
`<@${message.author.id}>`
||
!args[0]
) {
return message.reply({
content: "Du musst einen anderen User erwähnen"
}).then(async (msg) => {
await delay(4000)
message.delete()
msg.delete()
content:
"Du musst einen anderen User erwähnen"
})
.then(
async msg => {
await delay(
4000
);
message.delete();
msg.delete();
}
);
}
if (!args[0].startsWith('<@' || !args[0].endsWith('>'))) { return message.reply('Invalid User Specification') }
try {
target = await message.guild.members.fetch(args[0].slice(2, -1))
} catch (error) {
return message.reply({
content: `User: ${args[0]} nicht gefunden!`
}).then(async (msg) => {
await delay(4000)
message.delete()
msg.delete()
})
if (
!args[0].startsWith("<@")
||
!args[0].endsWith(">")
) {
return message.reply(
"Invalid User Specification"
);
}
const to = target
let target;
try {
var amount = Number(args[1])
target =
await message.guild.members.fetch(
args[0].slice(
2,
-1
)
);
} catch (error) {
console.log(error)
return message.reply({
content: 'Du musst eine Menge angeben!'
}).then(async (msg) => {
await delay(4000)
message.delete()
msg.delete()
content:
`User: ${args[0]} nicht gefunden!`
})
}
if (!amount) {
return message.reply({content : 'Danke für nichts, du Hu-'})
.then(
async msg => {
await delay(
4000
);
message.delete();
msg.delete();
}
);
}
const db = mClient.db(process.env.M_DB)
const nutsColl = db.collection('items_nuts')
const yourBalance = await nutsColl.findOne({ userID: from.id })
if (amount <= 0) {
return await message.reply({
content: `Hier wird nicht geklaut >:(\r\nDas gibt **${yourBalance.nuts}** Abzug!`
})
}
if (yourBalance.nuts < amount) {
return await message.reply({
content: 'Du kannst nicht mehr geben als du hast!',
ephemeral: true
})
}
var content = `Du sendest **${amount}** Nüsse an <@${target.id}>`
if (amount == 1) {
content = `Du sendest **eine** Nuss an <@${target.id}>`
}
await nutsColl.findOneAndUpdate({ userID: from.id }, { $inc: { nuts: -amount } }, { upsert: true })
await nutsColl.findOneAndUpdate({ userID: to.id }, { $inc: { nuts: +amount } }, { upsert: true })
const embed = new EmbedBuilder()
.setTitle('Gib Nuss!')
.setDescription(content)
.setThumbnail(target.displayAvatarURL())
return message.reply({ embeds: [embed] })
const to =
target;
let amount;
try {
amount =
Number(
args[1]
);
} catch (error) {
console.log(
error
);
return message.reply({
content:
"Du musst eine Menge angeben!"
})
.then(
async msg => {
await delay(
4000
);
message.delete();
msg.delete();
}
);
}
if (
!amount
) {
return message.reply({
content:
"Danke für nichts, du Hu-"
});
}
const yourBalance =
await getNutBalance(
from.id
);
if (
amount <=
0
) {
return message.reply({
content:
`Hier wird nicht geklaut >:(\r\nDas gibt **${yourBalance}** Abzug!`
});
}
if (
yourBalance <
amount
) {
return message.reply({
content:
"Du kannst nicht mehr geben als du hast!"
});
}
let content =
`Du sendest **${amount}** Nüsse an <@${target.id}>`;
if (
amount ==
1
) {
content =
`Du sendest **eine** Nuss an <@${target.id}>`;
}
await transferNuts(
from.id,
to.id,
amount
);
const embed =
new EmbedBuilder()
.setTitle(
"Gib Nuss!"
)
.setDescription(
content
)
.setThumbnail(
target.displayAvatarURL()
);
return message.reply({
embeds: [
embed
]
});
}
}
};
+159 -46
View File
@@ -1,49 +1,162 @@
const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js')
const { mClient } = require('../../../index')
function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }
require('dotenv').config()
const {
EmbedBuilder,
ActionRowBuilder,
ButtonBuilder,
ButtonStyle
} = require("discord.js");
const {
getCollections
} = require(
"../../../utils/nutEconomy"
);
module.exports = {
name: 'nutsleaderboard',
description: 'show nuts leaderboard',
aliases: ['nl', 'tn', 'topnuts'],
async execute(message, args) {
const row = new ActionRowBuilder()
.addComponents(
new ButtonBuilder()
.setLabel('◄')
.setStyle(ButtonStyle.Primary)
.setCustomId('nuts_leaderboard_left')
)
.addComponents(
new ButtonBuilder()
.setLabel('🧑')
.setStyle(ButtonStyle.Primary)
.setCustomId('nuts_leaderboard_self')
)
.addComponents(
new ButtonBuilder()
.setLabel('►')
.setStyle(ButtonStyle.Primary)
.setCustomId('nuts_leaderboard_right')
)
const db = mClient.db(process.env.M_DB)
const nutsColl = db.collection('items_nuts')
let skip = 0
const nutsData = await nutsColl.find({ nuts: { $gt: 0 } }).sort({ nuts: -1 }).skip(skip).limit(5).toArray()
let fields
let placements = skip + 1
nutsData.forEach((data) => {
fields = (fields ? fields : '') + (`${placements}. <@${data.userID}> : ${data.nuts} Nuts\r\n`)
})
const embed = new EmbedBuilder()
.setTitle('Nuts Leaderboard')
.setThumbnail(message.guild.iconURL({ dynamic: true}))
.setDescription(fields.toString())
.setColor('#5865F2') // Discord's blurple color
.setFooter({ text: 'Use ◄ ► to navigate' });
name:
"nutsleaderboard",
description:
"show nuts leaderboard",
aliases: [
"nl",
"tn",
"topnuts"
],
async execute(
message,
args
) {
const row =
new ActionRowBuilder()
.addComponents(
new ButtonBuilder()
.setLabel(
"◄"
)
.setStyle(
ButtonStyle.Primary
)
.setCustomId(
"nuts_leaderboard_left"
),
new ButtonBuilder()
.setLabel(
"🧑"
)
.setStyle(
ButtonStyle.Primary
)
.setCustomId(
"nuts_leaderboard_self"
),
new ButtonBuilder()
.setLabel(
"►"
)
.setStyle(
ButtonStyle.Primary
)
.setCustomId(
"nuts_leaderboard_right"
)
);
const {
nuts
} =
getCollections();
const skip =
0;
const nutsData =
await nuts
.find({
nuts: {
$gt:
0
}
})
.sort({
nuts:
-1
})
.skip(
skip
)
.limit(
5
)
.toArray();
let fields;
let placements =
skip +
1;
nutsData.forEach(
data => {
fields =
(
fields
?
fields
:
""
)
+
`${placements}. <@${data.userId}> : ${data.nuts} Nuts\r\n`;
placements++;
}
);
const embed =
new EmbedBuilder()
.setTitle(
"Nuts Leaderboard"
)
.setThumbnail(
message.guild.iconURL({
dynamic:
true
})
)
.setDescription(
fields.toString()
)
.setColor(
"#5865F2"
)
.setFooter({
text:
"Use ◄ ► to navigate"
});
await message.reply({
embeds: [embed],
components: [row]
})
embeds: [
embed
],
components: [
row
]
});
}
}
};