// code from goatstore // api: https://store.agi.bd const fs = require("fs-extra"); const path = require("path"); const DATA_PATH = path.join(__dirname, "lottery_data.json"); const STATUS_PATH = path.join(__dirname, "lottery_status.json"); const MAX_TICKETS = 20; const MAX_PER_USER = 3; const TICKET_PRICE = 1_000_000; module.exports = { config: { name: "lottery", version: "2.3.1", author: "Arijit", countDown: 5, role: 0, shortDescription: "Lottery game system", longDescription: "Buy tickets, check info, and draw winner.", category: "game", guide: { en: "{pn} buy 1-3 | draw | info | status" } }, onStart: async function ({ message, event, usersData, args }) { await fs.ensureFile(DATA_PATH); await fs.ensureFile(STATUS_PATH); let data = await fs.readJson(DATA_PATH).catch(() => ({ tickets: [] })); let status = await fs.readJson(STATUS_PATH).catch(() => ({})); const userId = event.senderID; const userData = await usersData.get(userId); const userName = userData?.name || "Unknown"; const subcmd = args[0]; // BUY if (subcmd === "buy") { const count = parseInt(args[1]); if (isNaN(count) || count < 1 || count > MAX_PER_USER) { return message.reply(`āŒ | You can only buy between 1 and ${MAX_PER_USER} tickets.`); } const userTickets = data.tickets.filter(t => t.userId === userId); if (userTickets.length + count > MAX_PER_USER) { return message.reply(`āš ļø | You already have ${userTickets.length} ticket(s). Max allowed is ${MAX_PER_USER}.`); } if (data.tickets.length + count > MAX_TICKETS) { return message.reply(`šŸŽ« | Only ${MAX_TICKETS - data.tickets.length} ticket(s) left.`); } const userBalance = userData?.money || 0; const cost = count * TICKET_PRICE; if (userBalance < cost) { return message.reply( `šŸ’ø šššš›š², š˜šØš® š§šžšžš $${(cost / 1_000_000)}šŒ š­šØ š›š®š² ${count} ticket(s).\nšŸ’¼ š˜šØš® š”šššÆšž: $${(userBalance / 1_000_000)}šŒ` ); } await usersData.set(userId, { ...userData, money: userBalance - cost }); const newTickets = []; for (let i = 0; i < count; i++) { const ticketNumber = data.tickets.length + 1; data.tickets.push({ userId, ticketNumber }); newTickets.push(ticketNumber); } await fs.writeJson(DATA_PATH, data); return message.reply( `āœ… š˜šØš® š©š®š«šœš”ššš¬šžš ${count} ticket(s).\nšŸŽŸ š“š¢šœš¤šžš­ š§š®š¦š›šžš«š¬: ${newTickets.join(", ")}\nšŸ’° š“šØš­ššš„ šœšØš¬š­: $${(cost / 1_000_000)}šŒ` ); } // DRAW else if (subcmd === "draw") { if (data.tickets.length < MAX_TICKETS) { return message.reply(`ā³ | Only ${data.tickets.length}/${MAX_TICKETS} tickets sold. Cannot draw yet.`); } const winnerTicket = data.tickets[Math.floor(Math.random() * data.tickets.length)]; const winnerData = await usersData.get(winnerTicket.userId); const prize = TICKET_PRICE * MAX_TICKETS; const winnerBalance = winnerData?.money || 0; await usersData.set(winnerTicket.userId, { ...winnerData, money: winnerBalance + prize }); await fs.writeJson(STATUS_PATH, { name: winnerData.name, ticketNumber: winnerTicket.ticketNumber, userId: winnerTicket.userId, prize }); await fs.writeJson(DATA_PATH, { tickets: [] }); return message.reply( `╭──────────────⭓\n` + `ā”œ šŸ… š–š¢š§š§šžš« ššš§š§šØš®š§šœšžš\n` + `ā”œ šŸŽ€ š–š¢š§š§šžš«: ${winnerData.name}\n` + `ā”œ šŸŽŸ š“š¢šœš¤šžš­ š§š®š¦š›šžš«: #${winnerTicket.ticketNumber}\n` + `ā”œ šŸ’° šš«š¢š³šž: $${prize / 1_000_000}šŒ\n` + `╰──────────────⭓\n\n• Prize money has been deposited automatically.` ); } // INFO else if (subcmd === "info") { if (data.tickets.length === 0) { return message.reply("šŸ“­ | No tickets have been bought yet."); } const usersMap = {}; for (const ticket of data.tickets) { if (!usersMap[ticket.userId]) usersMap[ticket.userId] = []; usersMap[ticket.userId].push(ticket.ticketNumber); } let infoText = `šŸŽ° š‹šØš­š­šžš«š² š’š­ššš­š®š¬:\n\nšŸŽŸ š“š¢šœš¤šžš­š¬ š¬šØš„š: ${data.tickets.length}/${MAX_TICKETS}\nšŸ’° šš«š¢š³šž š©šØšØš„: $${(data.tickets.length * TICKET_PRICE / 1_000_000)}šŒ\n\n`; for (const [uid, ticketNums] of Object.entries(usersMap)) { const uData = await usersData.get(uid); const name = uData?.name || uid; infoText += `╭─ buy ${name}:\n╰──‣ ${ticketNums.length} Ticket${ticketNums.length > 1 ? "s" : ""}\n`; } return message.reply(infoText.trim()); } // STATUS else if (subcmd === "status") { if (!status.name) { return message.reply("ā„¹ļø | No previous winner yet."); } return message.reply( `šŸ† š‹ššš¬š­ š–š¢š§š§šžš«:\nšŸ‘¤ ${status.name}\nšŸŽ« Ticket: #${status.ticketNumber}\nšŸ’° Prize: $${status.prize / 1_000_000}šŒ` ); } // HELP else { return message.reply( `šŸŽ² | Lottery Command Usage:\n` + `• Buy: lottery buy [1-3]\n` + `• Info: lottery info\n` + `• Draw: lottery draw\n` + `• Status: lottery status` ); } } };