// code from goatstore // api: https://store.agi.bd const MAX_MEMORIES = 50; const MAX_LENGTH = 500; module.exports = { config: { name: "memory", aliases: ["mem", "note", "notes"], version: "1.0", author: "Zihad", countDown: 3, role: 0, shortDescription: { en: "Save & manage your personal memories" }, longDescription: { en: "Save notes/memories, view, search, edit and delete them. Stored per user." }, category: "utility", guide: { en: "{pn} add - save a memory\n" + "{pn} list [page] - show your memories\n" + "{pn} view - view one memory\n" + "{pn} edit - edit a memory\n" + "{pn} del - delete a memory\n" + "{pn} search - search memories\n" + "{pn} clear - delete all memories\n" + "Tip: reply to a message with {pn} add to save that message." } }, onStart: async function ({ message, event, args, usersData, prefix }) { const uid = event.senderID; const sub = (args[0] || "").toLowerCase(); let memories = (await usersData.get(uid, "data.memories")) || []; const save = () => usersData.set(uid, memories, "data.memories"); const fmt = (m, i) => `${i + 1}. ${m.text}\n šŸ•’ ${m.date}`; const now = () => new Date().toLocaleString("en-GB", { timeZone: "Asia/Dhaka", hour12: true }); switch (sub) { case "add": case "save": { let text = args.slice(1).join(" ").trim(); if (!text && event.messageReply?.body) text = event.messageReply.body.trim(); if (!text) return message.reply("āŒ Write something to save.\nExample: memory add Buy milk"); if (text.length > MAX_LENGTH) return message.reply(`āŒ Max ${MAX_LENGTH} characters allowed.`); if (memories.length >= MAX_MEMORIES) return message.reply(`āŒ Memory full (${MAX_MEMORIES}). Delete some first.`); memories.push({ text, date: now() }); await save(); return message.reply(`āœ… Saved as #${memories.length}`); } case "list": case "all": { if (!memories.length) return message.reply("šŸ“­ You have no memories yet."); const perPage = 8; const pages = Math.ceil(memories.length / perPage); const page = Math.min(Math.max(parseInt(args[1]) || 1, 1), pages); const start = (page - 1) * perPage; const body = memories .slice(start, start + perPage) .map((m, i) => fmt(m, start + i)) .join("\n\n"); return message.reply( `🧠 YOUR MEMORIES (${memories.length})\n━━━━━━━━━━━━━━\n${body}\n━━━━━━━━━━━━━━\nPage ${page}/${pages}` ); } case "view": case "get": { const n = parseInt(args[1]); if (!n || !memories[n - 1]) return message.reply("āŒ Invalid number."); return message.reply(`🧠 Memory #${n}\n━━━━━━━━━━━━━━\n${memories[n - 1].text}\n\nšŸ•’ ${memories[n - 1].date}`); } case "edit": { const n = parseInt(args[1]); const text = args.slice(2).join(" ").trim(); if (!n || !memories[n - 1]) return message.reply("āŒ Invalid number."); if (!text) return message.reply("āŒ Write the new text."); if (text.length > MAX_LENGTH) return message.reply(`āŒ Max ${MAX_LENGTH} characters allowed.`); memories[n - 1] = { text, date: now() }; await save(); return message.reply(`āœļø Memory #${n} updated.`); } case "del": case "delete": case "remove": { const n = parseInt(args[1]); if (!n || !memories[n - 1]) return message.reply("āŒ Invalid number."); const [removed] = memories.splice(n - 1, 1); await save(); return message.reply(`šŸ—‘ļø Deleted #${n}: ${removed.text.slice(0, 60)}`); } case "search": case "find": { const q = args.slice(1).join(" ").toLowerCase().trim(); if (!q) return message.reply("āŒ Write a keyword to search."); const found = memories .map((m, i) => ({ m, i })) .filter(({ m }) => m.text.toLowerCase().includes(q)); if (!found.length) return message.reply("šŸ” No memory found."); return message.reply( `šŸ” Results for "${q}"\n━━━━━━━━━━━━━━\n` + found.map(({ m, i }) => fmt(m, i)).join("\n\n") ); } case "clear": { if (!memories.length) return message.reply("šŸ“­ Nothing to clear."); return message.reply( `āš ļø Delete all ${memories.length} memories?\nReply to this message with "yes" to confirm.`, (err, info) => { global.GoatBot.onReply.set(info.messageID, { commandName: "memory", messageID: info.messageID, author: uid }); } ); } default: return message.reply( `🧠 MEMORY\n━━━━━━━━━━━━━━\n` + `${prefix}memory add \n${prefix}memory list [page]\n${prefix}memory view \n` + `${prefix}memory edit \n${prefix}memory del \n${prefix}memory search \n${prefix}memory clear` ); } }, onReply: async function ({ message, event, Reply, usersData }) { if (event.senderID !== Reply.author) return; if ((event.body || "").trim().toLowerCase() !== "yes") return message.reply("āŽ Cancelled."); await usersData.set(event.senderID, [], "data.memories"); return message.reply("šŸ—‘ļø All memories deleted."); } };