goat
command
mine
mine ores & upgrade pickaxe
0
views
0
likes
0
installs
Aliases: mining
raw source
const mongoose = require("mongoose");
const minerSchema = new mongoose.Schema({
userID: { type: String, required: true, unique: true },
userName: { type: String, default: "Unknown" },
balance: { type: Number, default: 1000 },
xp: { type: Number, default: 0 },
level: { type: Number, default: 1 },
energy: { type: Number, default: 100 },
maxEnergy: { type: Number, default: 100 },
lastMineTime: { type: Number, default: 0 },
title: { type: String, default: "miner" },
pickaxe: { type: String, default: "Wooden Pickaxe" },
inventory: {
stone: { type: Number, default: 0 },
iron: { type: Number, default: 0 },
gold: { type: Number, default: 0 },
diamond: { type: Number, default: 0 },
netherite: { type: Number, default: 0 },
ruby: { type: Number, default: 0 },
emerald: { type: Number, default: 0 }
},
dailyTasks: {
mineCount: { type: Number, default: 0 },
foundDiamond: { type: Number, default: 0 },
upgradedPickaxe: { type: Boolean, default: false },
claimedReward: { type: Boolean, default: false },
lastReset: { type: Number, default: 0 }
}
});
const MinerUser = mongoose.models.DiabloMinerUser || mongoose.model("DiabloMinerUser", minerSchema);
const PICKAXES = {
"Wooden Pickaxe": { price: 0, multiplier: 1, reqLevel: 1 },
"Iron Pickaxe": { price: 5000000, multiplier: 3, reqLevel: 3 },
"Gold Pickaxe": { price: 50000000, multiplier: 6, reqLevel: 5 },
"Diamond Pickaxe": { price: 500000000, multiplier: 12, reqLevel: 10 },
"Laser Drill": { price: 5000000000, multiplier: 30, reqLevel: 20 }
};
const ORES = {
stone: { name: "Stone", emoji: "πͺ¨", value: 50000, xp: 20, chance: 40 },
iron: { name: "Iron", emoji: "βοΈ", value: 250000, xp: 50, chance: 30 },
gold: { name: "Gold", emoji: "πͺ", value: 1000000, xp: 150, chance: 15 },
diamond: { name: "Diamond", emoji: "π", value: 10000000, xp: 500, chance: 8 },
netherite: { name: "Netherite", emoji: "π", value: 100000000, xp: 2000, chance: 3 },
ruby: { name: "Ruby", emoji: "π΄", value: 20000000, xp: 800, chance: 2 },
emerald: { name: "Emerald", emoji: "π’", value: 5000000, xp: 300, chance: 2 }
};
const TITLES = {
1: "miner",
5: "digger",
10: "excavator",
20: "gold miner",
30: "dragon miner",
40: "netherite lord",
50: "gem king",
70: "elite miner",
90: "mythic digger",
100: "immortal miner"
};
module.exports = {
config: {
name: "mine",
aliases: ["mining"],
version: "3.0.0",
author: "protik shah",
countDown: 3,
role: 0,
shortDescription: "mine ores & upgrade pickaxe",
category: "game",
guide: {
en: "βοΈ {p}mine\nπ {p}mine shop\nπ {p}mine inv\nπ {p}mine task\nπ {p}mine top"
}
},
formatMoney: (num) => {
if (num >= 1e9) return (num / 1e9).toFixed(1) + "B";
if (num >= 1e6) return (num / 1e6).toFixed(1) + "M";
if (num >= 1e3) return (num / 1e3).toFixed(1) + "K";
return num.toString();
},
progressBar: (current, max, size = 15) => {
const filled = Math.round((current / max) * size);
const empty = size - filled;
return "[" + "β".repeat(filled) + "β".repeat(empty) + "] " + current + "/" + max;
},
getTitle: (level) => {
let title = "miner";
for (const [lv, t] of Object.entries(TITLES)) {
if (level >= parseInt(lv)) title = t;
}
return title;
},
regenEnergy: (user) => {
const now = Date.now();
const REGEN = 2 * 60 * 1000;
const elapsed = now - (user.lastMineTime || 0);
const added = Math.floor(elapsed / REGEN);
if (added > 0) {
user.energy = Math.min(user.maxEnergy || 100, user.energy + added);
user.lastMineTime = now;
}
},
checkDailyReset: (user) => {
const now = Date.now();
const ONE_DAY = 24 * 60 * 60 * 1000;
if (!user.dailyTasks || now - user.dailyTasks.lastReset > ONE_DAY) {
user.dailyTasks = {
mineCount: 0,
foundDiamond: 0,
upgradedPickaxe: false,
claimedReward: false,
lastReset: now
};
}
},
onStart: async function ({ api, event, args, message }) {
const sendMsg = (txt) => message?.reply ? message.reply(txt) : api.sendMessage(txt, event.threadID, event.messageID);
const { senderID } = event;
const sub = (args[0] || "").toLowerCase();
try {
let user = await MinerUser.findOne({ userID: senderID });
if (!user) {
user = new MinerUser({ userID: senderID });
await user.save();
}
try {
const info = await api.getUserInfo(senderID);
user.userName = info[senderID]?.name || senderID;
await user.save();
} catch (e) {}
this.regenEnergy(user);
this.checkDailyReset(user);
// ===== SHOP =====
if (sub === "shop" || sub === "mineshop") {
const item = args.slice(1).join(" ").trim();
if (!item) {
let txt = "π β[ MINING SHOP ]β π\n\n";
txt += `π€ ${user.userName} | π³ $${this.formatMoney(user.balance)}\n`;
txt += `βοΈ ${user.pickaxe} | Lv.${user.level}\n\n`;
for (const [name, info] of Object.entries(PICKAXES)) {
const owned = user.pickaxe === name ? " β
" : "";
const locked = user.level < info.reqLevel ? " π" : "";
txt += `${info.reqLevel <= user.level ? "π’" : "π΄"} ${name} $${this.formatMoney(info.price)} x${info.multiplier}${owned}${locked}\n`;
}
txt += `\nπ‘ BUY: {p}mine shop <pickaxe name>`;
return sendMsg(txt);
}
const matched = Object.keys(PICKAXES).find(k => k.toLowerCase() === item.toLowerCase());
if (!matched) return sendMsg("β Pickaxe not found.");
const info = PICKAXES[matched];
if (user.level < info.reqLevel) return sendMsg(`β Need level ${info.reqLevel}`);
if (user.balance < info.price) return sendMsg(`β Insufficient funds. Need $${this.formatMoney(info.price)}`);
if (user.pickaxe === matched) return sendMsg("β Already owned.");
user.balance -= info.price;
user.pickaxe = matched;
user.dailyTasks.upgradedPickaxe = true;
await user.save();
return sendMsg(`π Upgraded to **${matched}**! (x${info.multiplier} multiplier)`);
}
// ===== INVENTORY =====
if (sub === "inv" || sub === "mineinv") {
let txt = "π MINING INVENTORY π\n\n";
let total = 0;
for (const [key, amount] of Object.entries(user.inventory)) {
if (amount > 0) {
const ore = ORES[key];
txt += `${ore.emoji} ${ore.name} x${amount} ($${this.formatMoney(amount * ore.value)})\n`;
total += amount * ore.value;
}
}
if (total === 0) txt += "π‘ Inventory empty. Mine some ores!\n";
txt += `\nπ TOTAL VALUE: $${this.formatMoney(total)}`;
txt += `\nπ‘ SELL: {p}mine sell`;
return sendMsg(txt);
}
// ===== SELL =====
if (sub === "sell") {
let total = 0;
for (const [key, amount] of Object.entries(user.inventory)) {
if (amount > 0) {
total += amount * ORES[key].value;
user.inventory[key] = 0;
}
}
if (total === 0) return sendMsg("π‘ Nothing to sell.");
user.balance += total;
await user.save();
return sendMsg(`π° Sold all ores for **$${this.formatMoney(total)}**!\nπ³ NEW BALANCE: $${this.formatMoney(user.balance)}`);
}
// ===== DAILY TASK =====
if (sub === "task" || sub === "minetask") {
const task = user.dailyTasks;
if (args[1] && args[1].toLowerCase() === "claim") {
if (task.claimedReward) return sendMsg("β Already claimed today.");
if (task.mineCount < 5 || task.foundDiamond < 1 || !task.upgradedPickaxe) {
return sendMsg("β Complete all tasks first.");
}
const bonus = 5000000 * user.level;
const bonusXP = 1000 * user.level;
user.balance += bonus;
user.xp += bonusXP;
task.claimedReward = true;
await user.save();
return sendMsg(`π DAILY REWARD CLAIMED π\n\nπ΅ +$${this.formatMoney(bonus)}\nβ +${bonusXP} XP`);
}
let txt = "πDAILY MINING TASKSπ\n\n";
txt += `π€ ${user.userName} | Lv.${user.level}\n\n`;
txt += `1. βοΈ Mine 5 times : ${task.mineCount >= 5 ? "β
" : "β"} [${task.mineCount}/5]\n`;
txt += `2. π Find Diamond : ${task.foundDiamond >= 1 ? "β
" : "β"}\n`;
txt += `3. β¬οΈ Upgrade Pickaxe : ${task.upgradedPickaxe ? "β
" : "β"}\n\n`;
if (task.mineCount >= 5 && task.foundDiamond >= 1 && task.upgradedPickaxe) {
txt += task.claimedReward ? "π Already claimed today!" : "π Type `{p}mine task claim` to collect!";
} else {
txt += "π‘ Complete all tasks to unlock reward!";
}
return sendMsg(txt);
}
// ===== LEADERBOARD =====
if (sub === "top" || sub === "minetop") {
const all = await MinerUser.find({});
const sorted = all
.map(u => ({ ...u, userName: u.userName || u.userID }))
.sort((a, b) => b.level - a.level || b.balance - a.balance)
.slice(0, 10);
let txt = "πβ MINING LEADERBOARDβπ\n\n";
let rank = 1;
for (const u of sorted) {
const name = u.userName || u.userID;
const medal = rank === 1 ? "π₯" : rank === 2 ? "π₯" : rank === 3 ? "π₯" : `#${rank}`;
txt += `${medal} ${name.slice(0, 18)} | Lv.${u.level} | $${this.formatMoney(u.balance)}\n`;
rank++;
}
if (rank === 1) txt += "π‘ No data found.";
return sendMsg(txt);
}
// ===== CORE MINE =====
if (user.energy < 1) {
return sendMsg(`π Out of energy!\nβ‘ ${this.progressBar(0, user.maxEnergy, 15)}\nβ³ Recharges 1 every 2 min.`);
}
const pick = PICKAXES[user.pickaxe] || PICKAXES["Wooden Pickaxe"];
const luck = pick.multiplier;
const rand = Math.random() * 100;
let found = "stone";
for (const [key, ore] of Object.entries(ORES)) {
if (rand < ore.chance * (luck * 0.3)) { found = key; break; }
}
const ore = ORES[found];
user.energy -= 1;
user.lastMineTime = Date.now();
user.inventory[found] = (user.inventory[found] || 0) + 1;
user.xp += ore.xp;
user.dailyTasks.mineCount += 1;
if (found === "diamond") user.dailyTasks.foundDiamond += 1;
let leveled = false;
const reqXP = user.level * 500;
if (user.xp >= reqXP) {
user.level += 1;
user.xp -= reqXP;
user.maxEnergy += 5;
user.energy = user.maxEnergy;
user.title = this.getTitle(user.level);
leveled = true;
}
await user.save();
let msg = "βοΈβMINING RESULTββοΈ\n\n";
msg += `${ore.emoji} Found: **${ore.name}**\n`;
msg += `π° Value: +$${this.formatMoney(ore.value)}\n`;
msg += `β XP: +${ore.xp}\n`;
msg += `β‘ Energy: ${this.progressBar(user.energy, user.maxEnergy, 15)}\n`;
msg += `βοΈ Pickaxe: ${user.pickaxe} (x${luck})\n`;
msg += `π·οΈ Title: ${user.title}`;
if (leveled) msg += `\n\nπ LEVEL UP! Reached **Lv.${user.level}**! (Energy fully restored!)`;
return sendMsg(msg);
} catch (err) {
console.error("Mine Error:", err);
return sendMsg("β Mining error.");
}
}
};