Compare commits

...

4 commits

10 changed files with 450 additions and 125 deletions

View file

@ -4,7 +4,7 @@ const UserEconomy = require("../../models/UserEconomy");
module.exports = { module.exports = {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()
.setName("balance") .setName("balance")
.setDescription("Check your balance"), .setDescription("Check your balance."),
async execute(interaction) { async execute(interaction) {
const { user, guild } = interaction; const { user, guild } = interaction;
@ -18,18 +18,20 @@ module.exports = {
userEconomy = await UserEconomy.create({ userEconomy = await UserEconomy.create({
userId: user.id, userId: user.id,
guildId: guild.id, guildId: guild.id,
balance: 0,
}); });
} }
const embed = new EmbedBuilder() const embed = new EmbedBuilder()
.setColor("#0099ff") .setColor("#0099ff")
.setTitle(`${user.username}'s Balance`) .setTitle(`${user.username}'s Balance`)
.setDescription(`You have **${userEconomy.balance}** coins.`) .setDescription(`Your balance: **${userEconomy.balance}** coins.`)
.setTimestamp()
.setFooter({ .setFooter({
text: `Requested by ${user.username}`, text: `Requested by ${user.username}`,
iconURL: user.displayAvatarURL(), iconURL: user.displayAvatarURL(),
}); })
.setTimestamp();
await interaction.reply({ embeds: [embed] }); await interaction.reply({ embeds: [embed] });
}, },
}; };

View file

@ -4,11 +4,13 @@ const UserEconomy = require("../../models/UserEconomy");
module.exports = { module.exports = {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()
.setName("daily") .setName("daily")
.setDescription("Claim your daily reward"), .setDescription("Claim your daily reward and start a streak!"),
async execute(interaction) { async execute(interaction) {
const { user, guild } = interaction; const { user, guild } = interaction;
const dailyReward = 100; const dailyBaseReward = 100;
const streakBonus = 10;
const rareItemChance = 0.1;
const oneDay = 24 * 60 * 60 * 1000; const oneDay = 24 * 60 * 60 * 1000;
let userEconomy = await UserEconomy.findOne({ let userEconomy = await UserEconomy.findOne({
@ -20,10 +22,13 @@ module.exports = {
userEconomy = await UserEconomy.create({ userEconomy = await UserEconomy.create({
userId: user.id, userId: user.id,
guildId: guild.id, guildId: guild.id,
streak: 0,
balance: 0,
}); });
} }
const now = new Date(); const now = new Date();
if (userEconomy.lastDaily && now - userEconomy.lastDaily < oneDay) { if (userEconomy.lastDaily && now - userEconomy.lastDaily < oneDay) {
const remainingTime = const remainingTime =
new Date(userEconomy.lastDaily.getTime() + oneDay) - now; new Date(userEconomy.lastDaily.getTime() + oneDay) - now;
@ -35,37 +40,50 @@ module.exports = {
.setColor("#ff0000") .setColor("#ff0000")
.setTitle("Daily Reward Claim") .setTitle("Daily Reward Claim")
.setDescription( .setDescription(
`You have already claimed your daily reward today. Come back in **${hours}h ${minutes}m ${seconds}s**!` `Come back in **${hours}h ${minutes}m ${seconds}s** for your next reward!`
) )
.setTimestamp()
.setFooter({ .setFooter({
text: `Requested in ${guild.name}`, text: `Requested by ${user.username}`,
iconURL: guild.iconURL() || null, iconURL: user.displayAvatarURL(),
}); });
await interaction.reply({ embeds: [errorEmbed] }); await interaction.reply({ embeds: [errorEmbed] });
return; return;
} }
userEconomy.balance += dailyReward; if (userEconomy.lastDaily && now - userEconomy.lastDaily >= oneDay) {
userEconomy.streak = 0;
}
userEconomy.streak += 1;
const reward = dailyBaseReward + userEconomy.streak * streakBonus;
userEconomy.lastDaily = now; userEconomy.lastDaily = now;
userEconomy.balance += reward;
const rareItemEarned = Math.random() < rareItemChance;
const rareItemMessage = rareItemEarned
? "\nYou also found a **rare item** in your reward!"
: "";
await userEconomy.save(); await userEconomy.save();
const successEmbed = new EmbedBuilder() const successEmbed = new EmbedBuilder()
.setColor("#00ff00") .setColor("#00ff00")
.setTitle("Daily Reward Claimed!") .setTitle("Daily Reward Claimed!")
.setDescription( .setDescription(
`You claimed your daily reward of **${dailyReward}** coins!` `You've claimed **${reward}** coins and extended your streak!${rareItemMessage}`
) )
.addFields({ .addFields({
name: "Total Balance", name: "Streak Bonus",
value: `You now have **${userEconomy.balance}** coins.`, value: `Current streak: **${userEconomy.streak}** days`,
inline: true, inline: true,
}) })
.setTimestamp()
.setFooter({ .setFooter({
text: `Requested by ${user.username}`, text: `Requested by ${user.username}`,
iconURL: user.displayAvatarURL(), iconURL: user.displayAvatarURL(),
}); })
.setTimestamp();
await interaction.reply({ embeds: [successEmbed] }); await interaction.reply({ embeds: [successEmbed] });
}, },

View file

@ -5,11 +5,10 @@ const ShopItem = require("../../models/ShopItem");
module.exports = { module.exports = {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()
.setName("inventory") .setName("inventory")
.setDescription("View your inventory"), .setDescription("View your inventory with item rarity"),
async execute(interaction) { async execute(interaction) {
const { user, guild } = interaction; const { user, guild } = interaction;
const inventory = await UserInventory.find({ const inventory = await UserInventory.find({
userId: user.id, userId: user.id,
guildId: guild.id, guildId: guild.id,
@ -20,9 +19,10 @@ module.exports = {
.setColor("#ff0000") .setColor("#ff0000")
.setTitle("Inventory") .setTitle("Inventory")
.setDescription("Your inventory is empty.") .setDescription("Your inventory is empty.")
.setTimestamp()
.setFooter({ .setFooter({
text: `Requested in ${guild.name}`, text: `Requested by ${user.username}`,
iconURL: guild.iconURL() || null, iconURL: user.displayAvatarURL(),
}); });
await interaction.reply({ embeds: [emptyEmbed] }); await interaction.reply({ embeds: [emptyEmbed] });
@ -32,8 +32,17 @@ module.exports = {
const itemDetails = await Promise.all( const itemDetails = await Promise.all(
inventory.map(async (item) => { inventory.map(async (item) => {
const shopItem = await ShopItem.findOne({ itemId: item.itemId }); const shopItem = await ShopItem.findOne({ itemId: item.itemId });
if (!shopItem) {
return null;
}
if (item.quantity > 0) { if (item.quantity > 0) {
return `${shopItem.name} (x${item.quantity})`; return `${shopItem.name} (x${item.quantity}) - **Rarity**: ${
shopItem.rarity
} - **Type**: ${shopItem.type} - **Category**: ${
shopItem.category || "N/A"
}`;
} }
return null; return null;
}) })
@ -41,24 +50,12 @@ module.exports = {
const filteredItemDetails = itemDetails.filter((detail) => detail !== null); const filteredItemDetails = itemDetails.filter((detail) => detail !== null);
if (filteredItemDetails.length === 0) {
const noItemsEmbed = new EmbedBuilder()
.setColor("#ff0000")
.setTitle("Inventory")
.setDescription("Your inventory is empty.")
.setFooter({
text: `Requested in ${guild.name}`,
iconURL: guild.iconURL() || null,
});
await interaction.reply({ embeds: [noItemsEmbed] });
return;
}
const inventoryEmbed = new EmbedBuilder() const inventoryEmbed = new EmbedBuilder()
.setColor("#00ff00") .setColor("#00ff00")
.setTitle(`${user.username}'s Inventory`) .setTitle(`${user.username}'s Inventory`)
.setDescription(filteredItemDetails.join("\n")) .setDescription(
filteredItemDetails.join("\n") || "No items in inventory."
)
.setTimestamp() .setTimestamp()
.setFooter({ .setFooter({
text: `Requested by ${user.username}`, text: `Requested by ${user.username}`,

208
commands/economy/sell.js Normal file
View file

@ -0,0 +1,208 @@
const {
SlashCommandBuilder,
EmbedBuilder,
ActionRowBuilder,
StringSelectMenuBuilder,
} = require("discord.js");
const UserInventory = require("../../models/UserInventory");
const ShopItem = require("../../models/ShopItem");
const UserEconomy = require("../../models/UserEconomy");
module.exports = {
data: new SlashCommandBuilder()
.setName("sell")
.setDescription("Sell an item from your inventory."),
async execute(interaction) {
const { user, guild } = interaction;
const userInventory = await UserInventory.find({
userId: user.id,
guildId: guild.id,
});
if (userInventory.length === 0) {
const errorEmbed = new EmbedBuilder()
.setColor("#ff0000")
.setTitle("🛑 Inventory Empty")
.setDescription("You have no items in your inventory to sell.")
.setTimestamp()
.setFooter({
text: `Requested by ${user.username}`,
iconURL: user.displayAvatarURL(),
});
await interaction.reply({ embeds: [errorEmbed], ephemeral: false });
return;
}
const selectMenu = new StringSelectMenuBuilder()
.setCustomId("sell_item")
.setPlaceholder("Select an item to sell")
.addOptions(
userInventory.map((item) => ({
label: item.itemId,
value: item.itemId,
}))
);
const row = new ActionRowBuilder().addComponents(selectMenu);
const promptEmbed = new EmbedBuilder()
.setColor("#00ffff")
.setTitle("📦 Select Item to Sell")
.setDescription(
"Choose an item from your inventory to sell. The selling price is 50% less than the original item price."
)
.setTimestamp()
.setFooter({
text: `Requested by ${user.username}`,
iconURL: user.displayAvatarURL(),
});
await interaction.reply({ embeds: [promptEmbed], components: [row] });
const filter = (i) => {
return i.user.id === user.id;
};
const collector = interaction.channel.createMessageComponentCollector({
filter,
time: 15000,
});
collector.on("collect", async (i) => {
if (i.customId === "sell_item") {
const selectedItemId = i.values[0];
const selectedItem = userInventory.find(
(item) => item.itemId === selectedItemId
);
const shopItem = await ShopItem.findOne({
itemId: selectedItemId,
guildId: guild.id,
});
if (!shopItem) {
await i.reply({
content: "Item not found in the shop.",
ephemeral: false,
});
return;
}
const sellingPrice = Math.floor(shopItem.price / 2);
const quantityPrompt = new EmbedBuilder()
.setColor("#ffff00")
.setTitle(`💰 Selling ${shopItem.name}`)
.setDescription(
`How many of **${shopItem.name}** would you like to sell?`
)
.addFields({
name: "Sell Price",
value: `Each item sells for **${sellingPrice}** coins.`,
inline: true,
})
.setTimestamp()
.setFooter({
text: `Requested by ${user.username}`,
iconURL: user.displayAvatarURL(),
});
await i.reply({ embeds: [quantityPrompt], ephemeral: false });
const quantityFilter = (response) => {
return (
response.author.id === user.id &&
!isNaN(response.content) &&
response.content > 0
);
};
const quantityCollector = interaction.channel.createMessageCollector({
filter: quantityFilter,
time: 15000,
});
quantityCollector.on("collect", async (response) => {
const quantityToSell = parseInt(response.content);
if (quantityToSell > selectedItem.quantity) {
await response.reply({
content: `You do not have enough **${shopItem.name}** to sell!`,
ephemeral: false,
});
return;
}
let userEconomy = await UserEconomy.findOne({
userId: user.id,
guildId: guild.id,
});
if (!userEconomy) {
userEconomy = await UserEconomy.create({
userId: user.id,
guildId: guild.id,
balance: 0,
});
}
userEconomy.balance += sellingPrice * quantityToSell;
await userEconomy.save();
selectedItem.quantity -= quantityToSell;
if (selectedItem.quantity === 0) {
await UserInventory.deleteOne({
userId: user.id,
itemId: selectedItemId,
});
} else {
await selectedItem.save();
}
const successEmbed = new EmbedBuilder()
.setColor("#00ff00")
.setTitle("🎉 Item Sold!")
.setDescription(
`You sold **${quantityToSell}** of **${shopItem.name}** for **${
sellingPrice * quantityToSell
}** coins!`
)
.addFields({
name: "New Balance",
value: `${userEconomy.balance} coins`,
inline: true,
})
.setFooter({
text: `Requested by ${user.username}`,
iconURL: user.displayAvatarURL(),
})
.setTimestamp();
await response.reply({ embeds: [successEmbed], ephemeral: false });
quantityCollector.stop();
});
quantityCollector.on("end", async (collected) => {
if (collected.size === 0) {
await i.followUp({
content: "You did not respond in time to sell the item.",
ephemeral: false,
});
}
});
}
});
collector.on("end", async (collected) => {
if (collected.size === 0) {
await interaction.followUp({
content: "You did not select an item in time.",
ephemeral: false,
});
}
});
},
};

View file

@ -6,103 +6,150 @@ const UserInventory = require("../../models/UserInventory");
module.exports = { module.exports = {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()
.setName("shop") .setName("shop")
.setDescription("View the shop and buy items") .setDescription("Browse the shop for items with rarity and discounts!")
.addStringOption((option) => .addStringOption((option) =>
option.setName("item").setDescription("The ID of the item to buy") option
.setName("item")
.setDescription("The item you want to buy (use item name)")
.setRequired(false)
), ),
async execute(interaction) { async execute(interaction) {
const { user, guild } = interaction; const { user, guild } = interaction;
const itemId = interaction.options.getString("item"); const discountChance = 0.3;
const itemName = interaction.options.getString("item");
if (!itemId) { const items = await ShopItem.find({ guildId: guild.id });
const items = await ShopItem.find();
const itemDescriptions = items.map(
(item) => `**${item.itemId}**: ${item.name} - **${item.price}** coins`
);
const shopEmbed = new EmbedBuilder() if (items.length === 0) {
.setColor("#00bfff") const emptyEmbed = new EmbedBuilder()
.setColor("#ff0000")
.setTitle("🛒 Shop Items") .setTitle("🛒 Shop Items")
.setDescription( .setDescription("No items in the shop currently.")
itemDescriptions.length > 0 .setTimestamp()
? itemDescriptions.join("\n")
: "No items available at the moment."
)
.setFooter({ .setFooter({
text: `Requested in ${guild.name}`, text: `Requested by ${user.username}`,
iconURL: guild.iconURL() || null, iconURL: user.displayAvatarURL(),
}); });
await interaction.reply({ embeds: [shopEmbed] }); await interaction.reply({ embeds: [emptyEmbed] });
return; return;
} }
const shopItem = await ShopItem.findOne({ itemId }); if (itemName) {
if (!shopItem) { const item = items.find(
const notFoundEmbed = new EmbedBuilder() (item) => item.name.toLowerCase() === itemName.toLowerCase()
.setColor("#ff0000") );
.setTitle("❌ Item Not Found") if (!item) {
.setDescription("The specified item could not be found in the shop.") await interaction.reply({
.setFooter({ content: "Item not found in the shop!",
text: `Requested in ${guild.name}`, ephemeral: false,
iconURL: guild.iconURL() || null,
}); });
return;
}
await interaction.reply({ embeds: [notFoundEmbed] }); let userEconomy = await UserEconomy.findOne({
return;
}
const userEconomy = await UserEconomy.findOne({
userId: user.id,
guildId: guild.id,
});
if (!userEconomy || userEconomy.balance < shopItem.price) {
const insufficientFundsEmbed = new EmbedBuilder()
.setColor("#ff0000")
.setTitle("💸 Insufficient Funds")
.setDescription("You don't have enough coins to purchase this item.")
.setFooter({
text: `Requested in ${guild.name}`,
iconURL: guild.iconURL() || null,
});
await interaction.reply({ embeds: [insufficientFundsEmbed] });
return;
}
userEconomy.balance -= shopItem.price;
await userEconomy.save();
let userInventory = await UserInventory.findOne({
userId: user.id,
guildId: guild.id,
itemId,
});
if (userInventory) {
userInventory.quantity += 1;
} else {
userInventory = new UserInventory({
userId: user.id, userId: user.id,
guildId: guild.id, guildId: guild.id,
itemId,
quantity: 1,
}); });
} if (!userEconomy) {
await userInventory.save(); userEconomy = await UserEconomy.create({
userId: user.id,
guildId: guild.id,
});
}
const successEmbed = new EmbedBuilder() const discount = Math.random() < discountChance ? 0.8 : 1;
const discountedPrice = Math.floor(item.price * discount);
if (userEconomy.balance < discountedPrice) {
const insufficientFundsEmbed = new EmbedBuilder()
.setColor("#ff0000")
.setTitle("💸 Insufficient Funds")
.setDescription(
`You don't have enough coins to buy **${item.name}**!`
)
.addFields(
{
name: "Your Balance",
value: `${userEconomy.balance} coins`,
inline: true,
},
{
name: "Item Price",
value: `${discountedPrice} coins`,
inline: true,
}
)
.setTimestamp()
.setFooter({
text: `Requested by ${user.username}`,
iconURL: user.displayAvatarURL(),
});
await interaction.reply({
embeds: [insufficientFundsEmbed],
ephemeral: false,
});
return;
}
userEconomy.balance -= discountedPrice;
await userEconomy.save();
const userInventory = await UserInventory.findOne({
userId: user.id,
guildId: guild.id,
itemId: item.itemId,
});
if (userInventory) {
userInventory.quantity += 1;
await userInventory.save();
} else {
await UserInventory.create({
userId: user.id,
guildId: guild.id,
itemId: item.itemId,
quantity: 1,
});
}
const successEmbed = new EmbedBuilder()
.setColor("#00ff00")
.setTitle("🎉 Purchase Successful")
.setDescription(
`You bought **${item.name}** for **${discountedPrice}** coins!`
)
.setTimestamp()
.setFooter({
text: `Requested by ${user.username}`,
iconURL: user.displayAvatarURL(),
});
await interaction.reply({ embeds: [successEmbed], ephemeral: false });
return;
}
const shopItemsDetails = items.map((item) => {
const discount = Math.random() < discountChance ? 0.8 : 1;
const price = Math.floor(item.price * discount);
const discountText = discount < 1 ? " (Discounted!)" : "";
return `${item.name} - **${price}** coins${discountText} - Rarity: ${
item.rarity
} - Type: ${item.type} - Category: ${item.category || "N/A"}`;
});
const shopEmbed = new EmbedBuilder()
.setColor("#00ff00") .setColor("#00ff00")
.setTitle("🎉 Purchase Successful") .setTitle("🛒 Shop Items")
.setDescription( .setDescription(shopItemsDetails.join("\n"))
`You've successfully purchased **${shopItem.name}** for **${shopItem.price}** coins!`
)
.setTimestamp() .setTimestamp()
.setFooter({ .setFooter({
text: `Requested by ${user.username}`, text: `Requested by ${user.username}`,
iconURL: user.displayAvatarURL(), iconURL: user.displayAvatarURL(),
}); });
await interaction.reply({ embeds: [successEmbed] }); await interaction.reply({ embeds: [shopEmbed] });
}, },
}; };

View file

@ -4,29 +4,35 @@ const UserEconomy = require("../../models/UserEconomy");
module.exports = { module.exports = {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()
.setName("work") .setName("work")
.setDescription("Work to earn coins!"), .setDescription("Work to earn coins and experience random events!"),
async execute(interaction) { async execute(interaction) {
const { user, guild } = interaction; const { user, guild } = interaction;
const workReward = 100; const jobs = [
const cooldownTime = 60 * 60 * 1000; { name: "Farmer", reward: 100 },
{ name: "Miner", reward: 150 },
{ name: "Chef", reward: 120 },
{ name: "Artist", reward: 130 },
];
const randomJob = jobs[Math.floor(Math.random() * jobs.length)];
const randomBonus =
Math.random() < 0.1 ? Math.floor(Math.random() * 200) : 0;
const workReward = randomJob.reward + randomBonus;
let userEconomy = await UserEconomy.findOne({ let userEconomy = await UserEconomy.findOne({
userId: user.id, userId: user.id,
guildId: guild.id, guildId: guild.id,
}); });
const cooldownTime = 60 * 60 * 1000;
if (!userEconomy) { if (!userEconomy) {
userEconomy = await UserEconomy.create({ userEconomy = await UserEconomy.create({
userId: user.id, userId: user.id,
guildId: guild.id, guildId: guild.id,
lastWork: null,
balance: 0,
}); });
} }
const now = new Date(); const now = new Date();
if (userEconomy.lastWork && now - userEconomy.lastWork < cooldownTime) { if (userEconomy.lastWork && now - userEconomy.lastWork < cooldownTime) {
const remainingTime = cooldownTime - (now - userEconomy.lastWork); const remainingTime = cooldownTime - (now - userEconomy.lastWork);
const remainingMinutes = Math.ceil(remainingTime / (60 * 1000)); const remainingMinutes = Math.ceil(remainingTime / (60 * 1000));
@ -54,12 +60,9 @@ module.exports = {
const successEmbed = new EmbedBuilder() const successEmbed = new EmbedBuilder()
.setColor("#00ff00") .setColor("#00ff00")
.setTitle("Work Success") .setTitle("Work Success")
.setDescription(`You worked hard and earned **${workReward}** coins!`) .setDescription(
.addFields({ `You worked as a **${randomJob.name}** and earned **${workReward}** coins!`
name: "Total Balance", )
value: `${userEconomy.balance} coins`,
inline: true,
})
.setTimestamp() .setTimestamp()
.setFooter({ .setFooter({
text: `Requested by ${user.username}`, text: `Requested by ${user.username}`,

View file

@ -62,11 +62,14 @@ client.once("ready", async () => {
console.log(`🤖 Logged in as ${client.user.tag}`); console.log(`🤖 Logged in as ${client.user.tag}`);
console.log(`==============================`); console.log(`==============================`);
// Seed the shop items
await seedShopItems();
// Register commands for all existing guilds // Register commands for all existing guilds
const guilds = client.guilds.cache.map((guild) => guild.id); const guilds = client.guilds.cache.map((guild) => guild.id);
// Seed the shop items
for (const guildId of guilds) {
await seedShopItems(guildId); // Pass guildId to seedShopItems
}
for (const guildId of guilds) { for (const guildId of guilds) {
await registerCommands(guildId); await registerCommands(guildId);
} }
@ -87,6 +90,9 @@ client.on("guildCreate", async (guild) => {
await ServerSettings.create({ guildId: guild.id }); await ServerSettings.create({ guildId: guild.id });
console.log(`✅ Registered new server: ${guild.name} (ID: ${guild.id})`); console.log(`✅ Registered new server: ${guild.name} (ID: ${guild.id})`);
// seed items for new guild with guildId
await seedShopItems(guild.id);
// Register slash commands for the new guild // Register slash commands for the new guild
await registerCommands(guild.id); await registerCommands(guild.id);
} catch (error) { } catch (error) {

View file

@ -1,10 +1,18 @@
const mongoose = require("mongoose"); const mongoose = require("mongoose");
const shopItemSchema = new mongoose.Schema({ const shopItemSchema = new mongoose.Schema({
itemId: { type: String, required: true, unique: true }, itemId: { type: String, required: true },
guildId: { type: String, required: true },
name: { type: String, required: true }, name: { type: String, required: true },
price: { type: Number, required: true }, price: { type: Number, required: true },
description: { type: String, required: true }, description: { type: String, required: true },
rarity: {
type: String,
enum: ["Common", "Rare", "Epic", "Legendary"],
default: "Common",
},
type: { type: String, required: true },
category: { type: String },
}); });
module.exports = mongoose.model("ShopItem", shopItemSchema); module.exports = mongoose.model("ShopItem", shopItemSchema);

View file

@ -6,6 +6,7 @@ const userEconomySchema = new mongoose.Schema({
balance: { type: Number, default: 200 }, balance: { type: Number, default: 200 },
lastDaily: { type: Date, default: null }, lastDaily: { type: Date, default: null },
lastWork: { type: Date, default: null }, lastWork: { type: Date, default: null },
streak: { type: Number, default: 0 },
}); });
module.exports = mongoose.model("UserEconomy", userEconomySchema); module.exports = mongoose.model("UserEconomy", userEconomySchema);

View file

@ -1,6 +1,6 @@
const ShopItem = require("../models/ShopItem"); const ShopItem = require("../models/ShopItem");
async function seedShopItems() { async function seedShopItems(guildId) {
const items = [ const items = [
// Valorant Skins // Valorant Skins
{ {
@ -9,6 +9,9 @@ async function seedShopItems() {
price: 1200, price: 1200,
description: description:
"A futuristic skin for the Vandal with a sleek design and special effects.", "A futuristic skin for the Vandal with a sleek design and special effects.",
rarity: "Rare",
type: "Skin",
category: "Valorant",
}, },
{ {
itemId: "reaver_vandal", itemId: "reaver_vandal",
@ -16,6 +19,9 @@ async function seedShopItems() {
price: 1500, price: 1500,
description: description:
"One of the most popular Vandal skins with a haunting aesthetic and special animations.", "One of the most popular Vandal skins with a haunting aesthetic and special animations.",
rarity: "Epic",
type: "Skin",
category: "Valorant",
}, },
{ {
itemId: "sovereign_ghost", itemId: "sovereign_ghost",
@ -23,6 +29,9 @@ async function seedShopItems() {
price: 800, price: 800,
description: description:
"Golden elegance for the Ghost pistol with unique sound effects.", "Golden elegance for the Ghost pistol with unique sound effects.",
rarity: "Common",
type: "Skin",
category: "Valorant",
}, },
{ {
itemId: "araxys_operator", itemId: "araxys_operator",
@ -30,6 +39,9 @@ async function seedShopItems() {
price: 2000, price: 2000,
description: description:
"A top-tier sniper skin with alien-like animations and sound effects.", "A top-tier sniper skin with alien-like animations and sound effects.",
rarity: "Legendary",
type: "Skin",
category: "Valorant",
}, },
{ {
itemId: "glitchpop_bulldog", itemId: "glitchpop_bulldog",
@ -37,6 +49,9 @@ async function seedShopItems() {
price: 900, price: 900,
description: description:
"A flashy skin for the Bulldog with vibrant colors and cyberpunk vibe.", "A flashy skin for the Bulldog with vibrant colors and cyberpunk vibe.",
rarity: "Rare",
type: "Skin",
category: "Valorant",
}, },
// CS2 Skins // CS2 Skins
@ -46,6 +61,9 @@ async function seedShopItems() {
price: 2500, price: 2500,
description: description:
"A legendary skin for the AWP with dragon designs, a rare and coveted item.", "A legendary skin for the AWP with dragon designs, a rare and coveted item.",
rarity: "Legendary",
type: "Skin",
category: "CS2",
}, },
{ {
itemId: "ak47_redline", itemId: "ak47_redline",
@ -53,6 +71,9 @@ async function seedShopItems() {
price: 1000, price: 1000,
description: description:
"A simple yet iconic AK-47 skin with red and black color scheme.", "A simple yet iconic AK-47 skin with red and black color scheme.",
rarity: "Common",
type: "Skin",
category: "CS2",
}, },
{ {
itemId: "m4a4_howl", itemId: "m4a4_howl",
@ -60,6 +81,9 @@ async function seedShopItems() {
price: 2200, price: 2200,
description: description:
"A rare and valuable skin for the M4A4 with a striking wolf design.", "A rare and valuable skin for the M4A4 with a striking wolf design.",
rarity: "Epic",
type: "Skin",
category: "CS2",
}, },
{ {
itemId: "desert_eagle_kumicho_dragon", itemId: "desert_eagle_kumicho_dragon",
@ -67,6 +91,9 @@ async function seedShopItems() {
price: 800, price: 800,
description: description:
"A Desert Eagle skin with an intricate dragon design and a metallic finish.", "A Desert Eagle skin with an intricate dragon design and a metallic finish.",
rarity: "Rare",
type: "Skin",
category: "CS2",
}, },
{ {
itemId: "usp_kill_confirmed", itemId: "usp_kill_confirmed",
@ -74,14 +101,22 @@ async function seedShopItems() {
price: 1100, price: 1100,
description: description:
"A detailed skin for the USP-S with a unique comic-style design.", "A detailed skin for the USP-S with a unique comic-style design.",
rarity: "Epic",
type: "Skin",
category: "CS2",
}, },
]; ];
// Upsert each item with guildId included, so changes to price, rarity, etc., get updated
for (const item of items) { for (const item of items) {
await ShopItem.updateOne({ itemId: item.itemId }, item, { upsert: true }); await ShopItem.updateOne(
{ itemId: item.itemId, guildId },
{ ...item, guildId },
{ upsert: true }
);
} }
console.log("✅ Shop items seeded!"); console.log(`✅ Shop items seeded with rarity for guild: ${guildId}`);
} }
module.exports = seedShopItems; module.exports = seedShopItems;