← back to browse
goat command

detective

Solve Mini Detective Crime Cases (Reward: $100B / Fine: $20B)

0
views
0
likes
0
installs

Aliases: case, investigate

raw source
const mongoose = require("mongoose");

// Database Schema (Same as DiabloBankUser)
const bankUserSchema = new mongoose.Schema({
  userID: { type: String, required: true, unique: true },
  balance: { type: Number, default: 0 }
});

const BankUser = mongoose.models.DiabloBankUser || mongoose.model("DiabloBankUser", bankUserSchema);

// Memory tracking for limits
global.detectiveGames = global.detectiveGames || {
  cooldowns: new Map()   // 5 Hours / 25 Cases limit tracker
};

const CASES = [
  {
    id: 1,
    title: "চুরি হওয়া ডায়মন্ড রিং 💍",
    story: "রহিম সাহেবের ঘর থেকে রাত ১২টায় একটি মূল্যবান ডায়মন্ড রিং চুরি হয়। ৩ জন সন্দেহভাজন:\n\n১. ড্রাইভার: 'আমি গাড়ির গ্যারেজে ঘুমাচ্ছিলাম।'\n২. রাঁধুনি: 'আমি কালকের সকালের জন্য বরফ জমাচ্ছিলাম।'\n৩. মালি: 'আমি বাগানের গাছে পানি দিচ্ছিলাম।'\n\nবলুন তো আসল চোর কে?",
    options: { A: "ড্রাইভার", B: "রাঁধুনি", C: "মালি" },
    correct: "C",
    reason: "রাত ১২টায় কোনো মালি গাছে পানি দেয় না!"
  },
  {
    id: 2,
    title: "বৃষ্টির দিনের হত্যাকাণ্ড 🌧️",
    story: "বৃষ্টির দিনে ঘরের ভেতরে এক ব্যক্তি খুন হলেন। গোয়েন্দা ৪ জনকে জিজ্ঞাসা করলেন:\n\n১. স্ত্রী: 'আমি বই পড়ছিলাম।'\n২. মালি: 'আমি বাগানে ফুল তুলছিলাম।'\n৩. রাঁধুনি: 'আমি দুপুরের রান্না করছিলাম।'\n৪. কাজের মেয়ে: 'আমি কাপড় শুকাতে দিয়েছিলাম।'\n\nকে মিথ্যা বলছে?",
    options: { A: "স্ত্রী", B: "মালি", C: "কাজের মেয়ে" },
    correct: "C",
    reason: "বৃষ্টির দিনে কেউ বাইরে কাপড় শুকাতে দেয় না!"
  },
  {
    id: 3,
    title: "তুষারপাতের বিষাক্ত কেস ❄️",
    story: "তুষারপাতের দিনে বাড়ির মালিক মৃত উদ্ধার হন। ৩ জন সন্দেহভাজনের বক্তব্য:\n\n১. বন্ধু: 'আমি বাইরে থেকে হেঁটে আসছি।'\n২. কাজের লোক: 'আমি বাইরে বরফ পরিষ্কার করছিলাম।'\n৩. পরিচারিকা: 'আমি ডাকপিয়নের কাছ থেকে চিঠি নিয়েছি।'\n\nকে অপরাধী?",
    options: { A: "বন্ধু", B: "কাজের লোক", C: "পরিচারিকা" },
    correct: "C",
    reason: "তুষারপাতের দিনে বা সরকারি ছুটির দিনে ডাকপিয়ন চিঠি দিতে আসে না!"
  },
  {
    id: 4,
    title: "রহস্যময় ব্যাংকের টাকা 🏦",
    story: "ব্যাংক খোলার ১০ মিনিটের মধ্যে মূল লকার চুরি হয়। ৩ জন সন্দেহভাজন:\n\n১. ক্যাশিয়ার: 'আমি টাকা গুনছিলাম।'\n২. গার্ড: 'আমি চা খেতে বাইরে গিয়েছিলাম।'\n৩. ক্লিনার: 'আমি লকারের চাবি দিয়ে ভেতরের ধুলো পরিষ্কার করছিলাম।'\n\nআসল চোর কে?",
    options: { A: "ক্যাশিয়ার", B: "গার্ড", C: "ক্লিনার" },
    correct: "C",
    reason: "ক্লিনারের কাছে লকারের আসল চাবি থাকার কথা নয়!"
  },
  {
    id: 5,
    title: "স্কুলের শিক্ষক খুন 🏫",
    story: "রোববার সকালে স্কুলের এক শিক্ষক খুন হন। গোয়েন্দার কাছে ৪ জনের উত্তর:\n\n১. পিওন: 'আমি মেইল চেক করছিলাম।'\n২. গণিত শিক্ষক: 'আমি অর্ধবার্ষিক পরীক্ষার খাতা দেখছিলাম।'\n৩. কোচ: 'আমি মাঠে একা ফুটবল খেলছিলাম।'\n৪. হেডমাস্টার: 'আমি অফিসে ঘুমাচ্ছিলাম।'\n\nকে অপরাধী?",
    options: { A: "পিওন", B: "গণিত শিক্ষক", C: "কোচ" },
    correct: "B",
    reason: "রোববার সকালে স্কুল বন্ধ থাকে, শিক্ষক স্কুলে খাতা দেখতে আসার কথা নয়!"
  },
  {
    id: 6,
    title: "সুইমিং পুলের ঘড়ি চুরি ⌚",
    story: "একজন ধনকুবেরের সুইমিং পুলে থাকা অবস্থায় দামী ঘড়ি চুরি হয়। ৩ জনের দাবি:\n\n১. পরিচারক: 'আমি পুলের পানি শুকানোর জন্য রোদে রেখেছিলাম।'\n২. ড্রাইভার: 'আমি গাড়ির তেল চেক করছিলাম।'\n৩. গেইটম্যান: 'আমি গেটে দাঁড়িয়েছিলাম।'\n\nচোর কে?",
    options: { A: "পরিচারক", B: "ড্রাইভার", C: "গেইটম্যান" },
    correct: "A",
    reason: "সুইমিং পুলের পানি রোদে শুকানো যায় না!"
  },
  {
    id: 7,
    title: "অফিসের ল্যাপটপ গায়েব 💻",
    story: "বিদ্যুৎ চলে যাওয়ার পর অফিসের ল্যাপটপ চুরি হয়। ৩ জন কর্মচারী:\n\n১. রনি: 'আমি অন্ধকারে মোমবাতি জ্বালিয়ে কাজ করছিলাম।'\n২. জনি: 'আমি কম্পিউটারে টাইপ করছিলাম।'\n৩. বনি: 'আমি মোবাইল ফ্ল্যাশ দিয়ে ফাইল খুঁজছিলাম।'\n\nকে মিথ্যা বলছে?",
    options: { A: "রনি", B: "জনি", C: "বনি" },
    correct: "B",
    reason: "বিদ্যুৎ না থাকলে কম্পিউটার (ডেস্কটপ) চলতেই পারে না!"
  },
  {
    id: 8,
    title: "শিপের ক্যাপ্টেনের সোনার কয়েন 🪙",
    story: "জাহাজে এক ক্যাপ্টেনের সোনার কয়েন চুরি হয়। ৩ জন নাবিক:\n\n১. প্রথম জন: 'আমি জাহাজের পতাকা উল্টো দেখে সোজা করছিলাম।'\n২. দ্বিতীয় জন: 'আমি সাগরের পানি মাপছিলাম।'\n৩. তৃতীয় জন: 'আমি রান্নাঘরে মাছ কাটছিলাম।'\n\nকে অপরাধী?",
    options: { A: "প্রথম জন", B: "দ্বিতীয় জন", C: "তৃতীয় জন" },
    correct: "A",
    reason: "জাহাজের পতাকা কখনোই উল্টো হয় না, দুই পাশেই সমান!"
  },
  {
    id: 9,
    title: "হোটেল রুমের ব্ল্যাকমেইল 🏨",
    story: "হোটেল রুমের ১০০০ নম্বর রুমে এক ব্যক্তি খুন হন। ৩ জন স্টাফের উত্তর:\n\n১. ওয়েটার: 'আমি বাইরে থেকে খাবারের ট্রলি নিয়ে দাঁড়িয়েছিলাম।'\n২. ম্যানেজার: 'আমি সাউন্ডপ্রুফ রুমে মিটিং করছিলাম।'\n৩. ক্লিনার: 'আমি রুমের জানালা খুলে বাইরের বরফ সাফ করছিলাম।'\n\nকে অপরাধী?",
    options: { A: "ওয়েটার", B: "ম্যানেজার", C: "ক্লিনার" },
    correct: "C",
    reason: "হোটেলের ১০ম তলার জানালা বাইরে থেকে সাফ করা সম্ভব নয়!"
  },
  {
    id: 10,
    title: "রেস্টুরেন্টের বিষাক্ত জুস 🍹",
    story: "রেস্টুরেন্টে ২ জন বন্ধু একই বিষাক্ত জুস খেল। একজন মারা গেল, অন্যজন বেঁচে গেল। পুলিশের তদন্তে জানা গেল জুসের বরফে বিষ ছিল। কারণ কী?",
    options: { A: "যে বেঁচে গেছে সে দ্রুত জুস খেয়ে ফেলেছিল", B: "বিষ জুসের নিচে ছিল", C: "বিষ শুধু একটি গ্লাসে ছিল" },
    correct: "A",
    reason: "যে দ্রুত জুস খেয়ে ফেলেছিল, তার গ্লাসের বরফ গলে বিষ মেশার সময় পায়নি!"
  },
  {
    id: 11,
    title: "বিজ্ঞানী হত্যা মামলা 🧪",
    story: "এক বিখ্যাত বিজ্ঞানী তাঁর ল্যাবে খুন হলেন। তাঁর হাতে লেখা নোটে লেখা ছিল: '53, 58, 2, 7'। পুলিশ তিন সন্দেহভাজনকে ধরল: ১. জনি, ২. বিক্রম, ৩. নিশান্ত। কে খুনী?",
    options: { A: "জনি", B: "বিক্রম", C: "নিশান্ত" },
    correct: "C",
    reason: "পর্যায় সারণি (Periodic Table) অনুযায়ী ৫৩=I, ৫৮=Ce, ২=He, ৭=N। একসাথে করলে হয় IceN (নিশান্ত)!"
  },
  {
    id: 12,
    title: "ব্যবসায়ীর ভল্ট চুরি 🗝️",
    story: "এক ব্যবসায়ীর ভল্ট থেকে নগদ টাকা চুরি হয়েছে। তিনি জানান, চোর ডিজিটাল কোড লক খুলেছে। ৩ সন্দেহভাজন:\n১. পিওন: 'আমি চাবির ফুটো দিয়ে ভেতরে তাকিয়ে চোরকে কোড চাপতে দেখেছি।'\n২. রাঁধুনি: 'আমি খাবার গরম করছিলাম।'\n৩. ড্রাইভার: 'আমি গাড়ির চাকা পাম্প করছিলাম।'\nকে মিথ্যা বলছে?",
    options: { A: "পিওন", B: "রাঁধুনি", C: "ড্রাইভার" },
    correct: "A",
    reason: "ডিজিটাল লকে কোনো চাবির ফুটো (Keyhole) থাকে না!"
  },
  {
    id: 13,
    title: "ফটোগ্রাফারের ক্যানভাস 📸",
    story: "এক ফটোগ্রাফার তাঁর স্টুডিওতে খুন হলেন। পুলিশ এসে দেখে তিনি তাঁর ক্যামেরা আঁকড়ে ধরে আছেন এবং ছবির মেমোরিতে শেষ ছবি ছিল সমুদ্র সৈকতের সূর্যাস্ত। খুনী ৩ জনের একজন: ১. স্ত্রী, ২. অ্যাসিস্ট্যান্ট, ৩. মডেল। খুনী কে?",
    options: { A: "অ্যাসিস্ট্যান্ট", B: "মডেল", C: "স্ত্রী" },
    correct: "A",
    reason: "মেমোরি কার্ড স্টুডিও থেকে গায়েব হওয়া উচিত ছিল কিন্তু অ্যাসিস্ট্যান্ট তড়িঘড়ি করে ছবি ডিলিট করতে ভুলে গেছে!"
  },
  {
    id: 14,
    title: "হাইওয়ে গাড়ির এক্সিডেন্ট 🚗",
    story: "এক গাড়ি সড়ক দুর্ঘটনায় পড়ে। চালক দাবি করেন সামনে হঠাৎ হরিণ আসায় তিনি ব্রেক চাপেন এবং কাদার উপর গাড়ি পিছলে যায়। গোয়েন্দা টায়ার ট্র্যাক দেখে বললেন চালক মিথ্যা বলছেন। কেন?",
    options: { A: "কাদায় গাড়ির কোনো ব্রেক মার্ক ছিল না", B: "হরিণের পায়ের ছাপ ছিল", C: "গাড়ির হেডলাইট ভাঙা ছিল" },
    correct: "A",
    reason: "হঠাৎ সজোরে ব্রেক চাপলে কাদামাটিতে স্পষ্ট চাকার পিছলে যাওয়ার দাগ (Skid marks) থাকবেই!"
  },
  {
    id: 15,
    title: "মিউজিয়ামের পেইন্টিং 🖼️",
    story: "মিউজিয়াম থেকে এক রাতের অন্ধকারে প্রাচীন পেইন্টিং চুরি হলো। গেইটম্যান বললেন, 'আমি লাইট বন্ধ দেখে ভেতরে যাই এবং হারিকেন জ্বেলে খোঁজাখুঁজি করতেই চোর আমাকে ধাক্কা দিয়ে পালিয়ে যায়।' গোয়েন্দা তাকে আটক করলেন কেন?",
    options: { A: "হারিকেন নিভে গিয়েছিল", B: "অন্ধকারে তিনি চোরকে দেখতে পাওয়ার কথা না", C: "তিনি মিউজিয়ামের পাওয়ার লাইট নিজেই বন্ধ করেছিলেন" },
    correct: "C",
    reason: "মিউজিয়ামের অলরেডি লাইট বন্ধ থাকলে তিনি আগে থেকেই ভেতরে হারিকেন নিয়ে ঢুকতেন, সেখানে হারিকেন জ্বালাতেন না!"
  },
  {
    id: 16,
    title: "লাইব্রেরির বিরল বই 📚",
    story: "লাইব্রেরিয়ান দাবি করলেন টেবিল থেকে এক বিরল বই চুরি হয়েছে যখন তিনি ১০ মিনিটের জন্য বাইরে চা খেতে গিয়েছিলেন। তিনি এসে দেখেন টেবিলের বইয়ের ১৫ ও ১৬ নম্বর পৃষ্ঠা ছেঁড়া। গোয়েন্দা বুঝলেন গল্পটি বানিয়ে বলা। কেন?",
    options: { A: "১৫ ও ১৬ নম্বর পৃষ্ঠা একই পাতার এপিঠ-ওপিঠ", B: "বইটি লকারেই ছিল", C: "চা খেতে এত সময় লাগে না" },
    correct: "A",
    reason: "বইয়ের ১৫ ও ১৬ নম্বর পৃষ্ঠা একই পাতার দুই পিঠ, তাই দুটি আলাদা পৃষ্ঠা ছেঁড়া সম্ভব নয়!"
  },
  {
    id: 17,
    title: "শীতের সকালে মর্নিং ওয়াক 🥶",
    story: "কাকডাকা শীতের সকালে এক লোক খুনের শিকার হন। সন্দেহভাজন ব্যক্তি দাবি করলেন তিনি ঘটনার সময় বাইরে হাঁটছিলেন এবং এত ঠান্ডা ছিল যে তাঁর নিঃশ্বাস জমে মুখে বরফ হয়ে গিয়েছিল। গোয়েন্দা তাকে গ্রেপ্তার করলেন কেন?",
    options: { A: "মানুষের নিঃশ্বাস বাতাসে বাষ্প হয় কিন্তু মুখে বরফ জমে না", B: "তিনি জ্যাকেট পরেননি", C: "সকালে তিনি ঘুমাচ্ছিলেন" },
    correct: "A",
    reason: "অতিরিক্ত ঠান্ডায় নিঃশ্বাস বাষ্প আকারে দেখা যায়, কিন্তু মুখে বরফ জমা বৈজ্ঞানিকভাবে অসম্ভব!"
  },
  {
    id: 18,
    title: "লিফটের মধ্যে ছিনতাই 🛗",
    story: "এক ব্যক্তি ২০ তলা ভবনের লিফটে উঠে দাবি করলেন, ১০ তলায় লিফট থামলে এক মুখোশধারী ঢুকে তাঁর মানিব্যাগ ছিনতাই করে সিঁড়ি দিয়ে নেমে যায়। পুলিশ কেন এটা বিশ্বাস করল না?",
    options: { A: "১০ তলা থেকে সিঁড়ি দিয়ে নেমে যাওয়া অসম্ভব", B: "লিফটের সিসিটিভি বন্ধ ছিল", C: "লিফট ১০ তলায় না থেমে সরাসরি ১ তলায় যায়" },
    correct: "A",
    reason: "লিফট ১০ তলা থেকে ১ তলায় নামার চেয়ে সিঁড়ি দিয়ে মানুষের নেমে যাওয়ার গতি অনেক ধীর!"
  },
  {
    id: 19,
    title: "জন্মদিনের বিষাক্ত কেক 🎂",
    story: "জন্মদিনের পার্টিতে কেক কাটার পর ৫ জন অতিথি অসুস্থ হয়ে পড়লেন, কিন্তু যিনি কেক কাটলেন তিনি সম্পূর্ণ সুস্থ ছিলেন। গোয়েন্দা তদন্তে বের হলো কেক ও ছুরি দুটোতেই বিষ ছিল। জন্মদিনের ছেলেটি কীভাবে বাঁচল?",
    options: { A: "সে বিষের অ্যান্টিডোট খেয়েছিল", B: "সে প্রথম পিসটি খেয়েছিল যা ছুরির বিষহীন পাশে কাটা হয়", C: "সে কেক খায়নি" },
    correct: "B",
    reason: "ছুরিটির শুধু এক পাশেই বিষ লাগানো ছিল!"
  },
  {
    id: 20,
    title: "আদালতের বিচারক হত্যা ⚖️",
    story: "বিচারক তাঁর খাস কামরায় খুন হলেন। পুলিশ টেবিলে একটি ক্যালেন্ডার দেখল যেখানে রক্তাক্ত আঙুলে লেখা ছিল: '6, 7, 8, 9, 10'। তিন সন্দেহভাজন হলেন: ১. জেন (Jane), ২. অ্যালেক্স (Alex), ৩. মারিয়া (Maria)। চোর বা খুনী কে?",
    options: { A: "জেন", B: "অ্যালেক্স", C: "মারিয়া" },
    correct: "A",
    reason: "ইংরেজি ৬, ৭, ৮, ৯, ১০ নম্বর মাস হলো: June, July, August, September, October। প্রতিটির প্রথম অক্ষর মেলালে হয় J-A-S-O-N (অথবা JANE)!"
  },
  {
    id: 21,
    title: "জাহাজের মধ্যে চিঠি ✉️",
    story: "সাগরে ভাসমান জাহাজে এক ধনকুবের চিঠি লিখে খুন হন। চিঠিতে লেখা ছিল, 'আমাকে রক্ষা করো, বাতাস খুব জোরে বইছে!' কিন্তু রুমের সব জানালা বন্ধ ছিল এবং এসি চলছিল। মিথ্যা কে বলছেন?",
    options: { A: "ক্যাপ্টেন", B: "ভিকটিম নিজেই নাটক করেছেন", C: "কাজের লোক" },
    correct: "B",
    reason: "সব জানালা বন্ধ ও এসি চালু থাকলে রুমে বাতাস জোরে বওয়ার কোনো সুযোগ নেই!"
  },
  {
    id: 22,
    title: "পাহাড়ি ট্র্যাকিং অ্যাডভেঞ্চার 🏔️",
    story: "দুই বন্ধু পাহাড়ে ঘুরতে যায় কিন্তু একজন ফিরে এসে বলে অন্যজন পাহাড় থেকে নিচে পড়ে মারা গেছে। পুলিশ কল রেকর্ড ঘেঁটে প্রথম বন্ধুকে গ্রেপ্তার করে। কেন?",
    options: { A: "সে বন্ধুটির জন্য শুধু ওয়ান-ওয়ে ট্রাভেল টিকেট কেটেছিল", B: "সে কান্নাকাটি করছিল না", C: "সে পুলিশকে দেরি করে খবর দেয়" },
    correct: "A",
    reason: "সে ট্রাভেল এজেন্ট থেকে নিজের জন্য রাউন্ড-ট্রিট কিন্তু বন্ধুর জন্য কেবল ১টি যাওয়ার টিকিট কিনেছিল!"
  },
  {
    id: 23,
    title: "সোনার বার গায়েব 🧈",
    story: "সোনার দোকান থেকে বার চুরি হলো। সিকিউরিটি গার্ড বললেন, 'সোনার বারটি পড়ে যাওয়ায় হঠাৎ বিকট শব্দ হয় এবং আমি পেছনে তাকাতেই চোর নিয়ে পালায়।' গোয়েন্দা তাকে আটক করলেন কেন?",
    options: { A: "সোনা নরম ধাতু, এটি পড়ে গেলে বিকট শব্দ হয় না", B: "গার্ড ঘুমিয়ে ছিলেন", C: "দোকানের লাইট নেভানো ছিল" },
    correct: "A",
    reason: "সোনা অত্যন্ত ভারী ও নরম ধাতু হওয়ায় এটি মেঝেতে পড়লে বিকট বা ভারী ধাতব শব্দ উৎপন্ন করে না!"
  },
  {
    id: 24,
    title: "ডাকাতের সিসিটিভি ফুটেজ 📹",
    story: "দোকানে ডাকাতির পর ডাকাতরা সিসিটিভির মেমোরি কার্ড খুলে নিয়ে যায়। কিন্তু দোকানদার পুলিশকে ফুটেজ দেখায় এবং বলে সে পেনড্রাইভে লাইভ সেভ করে রেখেছে। পুলিশ তাকেই সন্দেহ করল কেন?",
    options: { A: "সে নিজেই ডাকাতির নাটক করেছিল", B: "পেনড্রাইভ কাজ করছিল না", C: "সিসিটিভি নকল ছিল" },
    correct: "A",
    reason: "সাধারণ সিসিটিভি ক্যামেরা সরাসরি এক্সটার্নাল পেনড্রাইভে লাইভ ব্যাকআপ নেয় না!"
  },
  {
    id: 25,
    title: "সমুদ্রের চরে লাশ 🌊",
    story: "সমুদ্র সৈকতে এক ব্যক্তির লাশ ভেসে আসে। জোয়ারের পানিতে তাঁর পকেটে থাকা মানিব্যাগের কাগজ সম্পূর্ণ শুকনো পাওয়া যায়। গোয়েন্দা এটা হত্যা মামলা ঘোষণা করলেন কেন?",
    options: { A: "লাশটি জলে ডোবার আগেই হত্যা করে পরে শুকনো অবস্থায় তীরে রাখা হয়েছে", B: "পানি নোনা ছিল", C: "মানিব্যাগটি চামড়ার ছিল" },
    correct: "A",
    reason: "পানিতে লাশ ভেসে আসলে পকেটের কাগজ কোনোভাবেই শুকনো থাকা সম্ভব নয়!"
  },
  {
    id: 26,
    title: "অন্ধকারের ফাঁসি 🕯️",
    story: "এক লোক ঘরের ছাদ থেকে ঝুলন্ত অবস্থায় মারা গেছেন। ঘর সম্পূর্ণ ভেতর থেকে লক করা ছিল। ঘরে কোনো চেয়ার, টেবিল বা ওঠার মতো কিছুই নেই, শুধু মেঝেকে ঘিরে ছিল এক লিটার পানির ভেজা দাগ। গোয়েন্দা তৎক্ষণাৎ ধরে ফেললেন এটি আত্মহত্যা নাকি হত্যা। ঘটনাটি আসলে কী?",
    options: { A: "কেউ তাকে ঝুলিয়ে দিয়ে চাবি নিয়ে গেছে", B: "সে এক বিশাল বরফের স্ল্যাবের ওপর দাঁড়িয়ে ফাঁসি দিয়েছিল", C: "সে লাফ দিয়ে দড়ি ধরেছিল" },
    correct: "B",
    reason: "লোকটি বড় বরফের চাঁইয়ের ওপর দাঁড়িয়ে ফাঁসি দেয়, পরে বরফ গলে পানি হয়ে গেছে!"
  },
  {
    id: 27,
    title: "ডিজিটাল পাসওয়ার্ড ক্লু 💻",
    story: "এক সাইবার বিশেষজ্ঞ খুন হওয়ার আগে কম্পিউটারের স্ক্রিনে লিখে গেছেন: '4th of July, 1st of August, 2nd of December, 3rd of April'। পুলিশ ৩ সন্দেহভাজনকে আটক করল: ১. JADA, ২. LILY, ৩. RUBY। খুনী কে?",
    options: { A: "JADA", B: "LILY", C: "RUBY" },
    correct: "A",
    reason: "মাসগুলোর নির্দিষ্ট অক্ষর মেলালে (July-র ৪থ=Y, August-এর ১ম=A, December-এর ২য়=E... বা J-A-D-A) JADA নামটি আসে!"
  },
  {
    id: 28,
    title: "জোড়া জমজের অপরাধ 👯",
    story: "এক জোড়া হুবহু দেখতে জমজ ভাইয়ের মধ্যে একজন ব্যাংকে ডাকাতি করে। সিসিটিভিতে চেহারা স্পষ্ট দেখা গেছে কিন্তু দুজনেরই আঙুলের ছাপ (Fingerprint) না থাকায় পুলিশ বিভ্রান্ত। গোয়েন্দা কীভাবে আসল অপরাধীকে শনাক্ত করলেন?",
    options: { A: "ডিএনএ (DNA) টেস্ট করে", B: "কন্ঠস্বর বা আইরিস স্ক্যান করে", C: "জুতার মাপ দেখে" },
    correct: "B",
    reason: "আইডেন্টিকাল জমজদের ডিএনএ ও ফিঙ্গারপ্রিন্ট এক হলেও চোখের আইরিস প্যাটার্ন ও গলার স্বর আলাদা হয়!"
  },
  {
    id: 29,
    title: "বন্ধ ঘরের বিষাক্ত চা ☕",
    story: "এক ব্যবসায়ী তাঁর অফিসে এক গ্লাস গরম চা খেয়ে মারা যান। বিষটি চা পাতায় ছিল না, পানিতেও ছিল না, এমনকি চিনিতেও ছিল না। চা বানিয়েছিলেন তাঁর পিএ। বিষটি কোথায় লুকানো ছিল?",
    options: { A: "চায়ের কাপের চামচে", B: "টি-ব্যাগের সুতোয়", C: "টি-পটের টিপে" },
    correct: "A",
    reason: "বিষটি চা নাড়ার চামচের মধ্যে ড্রাই-কোটিং করে লাগানো ছিল, যা গরম চায়ে গলে মিশে যায়!"
  },
  {
    id: 30,
    title: "লিফটের খুনের রহস্য 🛗",
    story: "একটি ভবনের ১৫ তলায় লিফটের দরজার সামনে এক লোকের লাশ পাওয়া গেল। পেটে ছুরি মারার দাগ। কিন্তু লিফটের ভেতরে রক্ত বা কোনো চিহ্ন নেই, সিসিটিভিতেও কাউকে ঢুকতে বা বের হতে দেখা যায়নি। খুন কীভাবে হলো?",
    options: { A: "লিফটের ছাদ খোলা রেখে ওপর থেকে মারা হয়েছে", B: "ছুরিটি লিফট চলার সময় খাদের খাঁজ থেকে বিদ্ধ করা হয়েছিল", C: "ভিকটিম নিজেই নিজের গায়ে ছুরি মেরেছেন" },
    correct: "A",
    reason: "খুনী লিফটের ওপরের ইমার্জেন্সি হ্যচ (Roof Hatch) দিয়ে ঢুকে হত্যা করে আবার ছাদে আত্মগোপন করেছিল!"
  },
  {
    id: 31,
    title: "একাকী ট্রাভেলারের পাসপোর্ট 🛂",
    story: "ইমিগ্রেশনে এক আন্তর্জাতিক অপরাধীকে ধরা হলো। তার কাছে ৩টি দেশের পাসপোর্ট ছিল এবং তিনটিই আসল! সে সীমান্ত অফিসারকে বলল, 'আমি এই মাত্র আমেরিকা থেকে আসলাম।' গোয়েন্দা পাসপোর্ট দেখে বললেন, 'তুমি মিথ্যা বলছো, তুমি এশিয়া ছেড়ে যাওনি।' কেন?",
    options: { A: "তার পাসপোর্টে কোনো এক্সিট বা এন্ট্রি সিল ছিল না", B: "আমেরিকার পাসপোর্টের মেয়াদ শেষ ছিল", C: "পাসপোর্টে ছবি মেলেনি" },
    correct: "A",
    reason: "এক দেশ থেকে অন্য দেশে বিমানে ভ্রমণ করলে অবশ্যই পাসপোর্টে এক্সিট ইমিগ্রেশন সিল থাকতে হয়!"
  },
  {
    id: 32,
    title: "মরুভূমির রহস্যময় মৃতদেহ 🏜️",
    story: "মরুভূমির মাঝখানে এক ব্যক্তির লাশ পাওয়া গেল। তার হাতে একটা পোড়া দেশলাই কাঠি। চারপাশে কোনো গাড়ি বা পায়ের ছাপ নেই। আকাশে একটা হট এয়ার বেলুন উধাও হওয়ার খবর পাওয়া গেছে। লোকটির মৃত্যুর কারণ কী?",
    options: { A: "বেলুনের ওজন কমাতে সে নিজের ইচ্ছায় লাফ দিয়েছিল", B: "দেশলাইয়ের ছোট কাঠির লটারিতে হেরে বেলুন থেকে তাকে ফেলে দেওয়া হয়েছিল", C: "সে দুর্ঘটনাবশত পড়ে যায়" },
    correct: "B",
    reason: "বেলুন নিচে নেমে যাচ্ছিল, তাই ওজন কমাতে তারা দেশলাই কাঠি টেনে লটারি করে; যে ছোট কাঠি পায় তাকে লাফ দিতে হয়েছিল!"
  },
  {
    id: 33,
    title: "অন্ধ গায়কের কেস 🎤",
    story: "এক অন্ধ পিয়ানো বাদক দাবি করলেন, তিনি রাতে রুমে একা অনুশীলন করার সময় হঠাৎ লাইট নিভে যায় এবং অন্ধকারের সুযোগ নিয়ে চোর তাঁর সোনার মেডেল চুরি করে। গোয়েন্দা তখনই বুঝে গেলেন তিনি বানাইয়া বলছেন। কেন?",
    options: { A: "তিনি অন্ধ, আলো থাকা বা নেভার সাথে তাঁর দেখা বা চুরি হওয়ার সম্পর্ক নেই", B: "পিয়ানো অন্ধকারে বাজানো যায় না", C: "মেডেলটি পিতলের ছিল" },
    correct: "A",
    reason: "যিনি জন্মগত বা পুরোপুরি অন্ধ, ঘরের আলো জ্বলা বা নেভাতে তাঁর অন্ধকারের অভিজ্ঞতা হওয়ার কথা নয়!"
  },
  {
    id: 34,
    title: "গাড়ির এসি ও বিষাক্ত গ্যাস 🚘",
    story: "এক লোক নিজের বন্ধ গাড়ির ভেতর মৃত অবস্থায় উদ্ধার হন। জানালার কাঁচ পুরোপুরি তোলা ছিল এবং এসি চালু ছিল। ড্যাশবোর্ডে লেখা ছিল 'আই এম সরি'। তবে পুলিশ এটাকে হত্যা মামলা হিসেবে নথিভুক্ত করল। কেন?",
    options: { A: "গাড়ির চাবি বাইরে রাস্তায় পড়ে ছিল", B: "গাড়ির এসি বন্ধ ছিল", C: "গাড়ির তেল শেষ হয়ে গিয়েছিল" },
    correct: "A",
    reason: "গাড়ি বন্ধ অবস্থায় ভেতর থেকে লক থাকলে চাবি বাইরে রাস্তায় থাকা সম্ভব নয়!"
  },
  {
    id: 35,
    title: "ভাসমান জলদস্যুর ডায়রি 🏴‍☠️",
    story: "ডায়রিতে লেখা ছিল: 'ফেব্রুয়ারি ২৯, ২০২১ - আজ আমরা দ্বীপে বিশাল গুপ্তধন পুঁতে রাখলাম।' গোয়েন্দা এক ঝলক দেখেই বললেন এটি ভুয়া ডায়রি। কেন?",
    options: { A: "২০২১ সাল লিপ ইয়ার (Leap Year) ছিল না, তাই ২৯ ফেব্রুয়ারি হতে পারে না", B: "ডায়রির পাতা নতুন ছিল", C: "জলদস্যুরা ইংলিশে লিখত না" },
    correct: "A",
    reason: "২০২১ সালে ফেব্রুয়ারি মাস ছিল ২৮ দিনে, ২৯ ফেব্রুয়ারি তারিখটিই ছিল না!"
  },
  {
    id: 36,
    title: "সাইলেন্ট রিভলভার 🔫",
    story: "এক কোটিপতি নিজের পড়ার ঘরে গুলিতে নিহত হন। ঘরের বাইরে দাঁড়িয়ে থাকা দুজন বডিগার্ড বলল, তারা কোনো গুলির শব্দ শোনেনি। টেবিলে একটি রিভলভার সাইলেন্সারসহ পাওয়া গেল। গোয়েন্দা বললেন বডিগার্ডরা মিথ্যা বলছে। কেন?",
    options: { A: "রিভলভারে সাইলেন্সার ব্যবহার করা যায় না", B: "বডিগার্ডরা কানে তুলো দিয়েছিল", C: "সাইলেন্সার কাজ করছিল না" },
    correct: "A",
    reason: "রিভলভারের সিলিন্ডার ও ব্যারেলের মাঝে ফাঁক থাকায় এতে সাইলেন্সার লাগালেও গুলির বিকট শব্দ বন্ধ হয় না!"
  },
  {
    id: 37,
    title: "জমে যাওয়া হ্রদের চক্রান্ত ❄️",
    story: "পুরো বরফে জমে যাওয়া হ্রদের মাঝখানে এক শিকারীর গুলিবিদ্ধ লাশ পাওয়া গেল। বরফের ওপর কেবল ভিকটিমের জুতার ছাপ ছিল, অন্য কোনো মানুষের বা পশুর ছাপ ছিল না। কিন্তু কাছে কোনো বন্দুকও নেই। খুনী কীভাবে গুলি করল?",
    options: { A: "ড্রোনের সাহায্যে দূর থেকে বন্দুক চালানো হয়েছিল", B: "খুনী আইস-স্কেটিং জুতো পরে এসেছিল যার দাগ বরফে ছিল না", C: "খুনী দূরবীন দিয়ে দেখে বহু দূর থেকে রাইফেল দিয়ে গুলি করেছে" },
    correct: "C",
    reason: "খুনী হ্রদের তীর বা দূর থেকে স্নাইপার/রাইফেল ব্যবহার করে গুলি করে হত্যা করেছিল!"
  },
  {
    id: 38,
    title: "মোমবাতির ঘড়ি 🕯️",
    story: "এক ঘরে দুটো একই আকারের মোমবাতি জ্বলছিল। একটি ৪ ঘণ্টায় পুরো জ্বলে শেষ হয়, অন্যটি ৫ ঘণ্টায়। কতক্ষণ জ্বলার পর একটি মোমবাতির দৈর্ঘ্য অন্যটির দ্বিগুণ হবে?",
    options: { A: "৩ ঘণ্টা ২০ মিনিট", B: "২ ঘণ্টা ৩০ মিনিট", C: "৩ ঘণ্টা ৪৫ মিনিট" },
    correct: "A",
    reason: "গাণিতিক হিসাব অনুযায়ী ৩ ঘণ্টা ২০ মিনিট পর এক মোমবাতি অন্যটির দ্বিগুণ আকারে থাকে!"
  },
  {
    id: 39,
    title: "আয়নাবাজির হোটেল রুম 🪞",
    story: "এক নারী হোটেলে খুন হন। ঘরটিতে বিশাল একটি আয়না ছিল। খুনী নিজেকে বাঁচাতে আয়নার ওপর রক্ত দিয়ে উল্টো করে লিখেছিল 'HELP'। গোয়েন্দা বুঝলেন এটি খুনীর সাজানো নাটক। কেন?",
    options: { A: "জরুরি অবস্থায় কেউ আয়নায় উল্টো করে সোজা পড়ার উপযোগী লেখা লেখে না", B: "রক্ত শুকিয়ে যায়", C: "আয়নায় লিফট দেখা যাচ্ছিল" },
    correct: "A",
    reason: "আয়নায় অন্য পাশ থেকে দেখলে যেন সোজা দেখায়, খুনী আগেই ভেবেচিন্তে আয়নায় আয়নার মতো উল্টো অক্ষরে রক্ত দিয়ে লিখেছিল!"
  },
  {
    id: 40,
    title: "অ্যাম্বুলেন্সের ডাকাতি 🚑",
    story: "রাস্তায় জ্যামের মধ্যে এক অ্যাম্বুলেন্সকে সাইরেন বাজাতে দেখে ট্রাফিক পুলিশ রাস্তা পরিষ্কার করে দিল। কিন্তু একটু পরেই জানা গেল পাশের ব্যাংকে ডাকাতি করে ডাকাতরা অ্যাম্বুলেন্সে করে পালিয়েছে। গোয়েন্দা সিসিটিভি দেখে কীভাবে অ্যাম্বুলেন্সটি নকল চিনলেন?",
    options: { A: "অ্যাম্বুলেন্সের সামনের ‘AMBULANCE’ লেখাটি সোজা লেখা ছিল", B: "সাইরেনের আলো লাল ছিল না", C: "কোনো ডাক্তার ছিল না" },
    correct: "A",
    reason: "আসল অ্যাম্বুলেন্সের সামনে ‘AMBULANCE’ উল্টো করে লেখা থাকে যেন সামনের গাড়ির লুকিং গ্লাসে তা সোজা দেখায়!"
  }
];

module.exports = {
  config: {
    name: "detective",
    aliases: ["case", "investigate"],
    version: "1.3.0",
    author: "Pratik Shah",
    countDown: 20,
    role: 0,
    shortDescription: "Solve Mini Detective Crime Cases (Reward: $100B / Fine: $20B)",
    category: "game",
    guide: {
      en: "{p}detective\nReply with option letter (A, B, or C) to solve the case!"
    }
  },

  formatMoney: function (num) {
    if (num >= 1000000000) return (num / 1000000000).toFixed(1).replace(/\.0$/, "") + "ʙ";
    if (num >= 1000000) return (num / 1000000).toFixed(1).replace(/\.0$/, "") + "ᴍ";
    if (num >= 1000) return (num / 1000).toFixed(1).replace(/\.0$/, "") + "ᴋ";
    return num.toLocaleString();
  },

  checkLimit: function (userID) {
    const now = Date.now();
    const FIVE_HOURS = 5 * 60 * 60 * 1000;
    let userData = global.detectiveGames.cooldowns.get(userID);

    if (!userData || (now - userData.startTime > FIVE_HOURS)) {
      userData = { count: 0, startTime: now };
    }

    if (userData.count >= 25) {
      const remainingTime = Math.ceil((FIVE_HOURS - (now - userData.startTime)) / (60 * 1000));
      return { allowed: false, remainingTime };
    }

    return { allowed: true, userData };
  },

  onStart: async function ({ api, event, message }) {
    const sendMsg = (txt) => message && typeof message.reply === "function" ? message.reply(txt) : api.sendMessage(txt, event.threadID, event.messageID);
    const { senderID } = event;

    try {
      // Limit Check
      const limitInfo = this.checkLimit(senderID);
      if (!limitInfo.allowed) {
        return sendMsg(`❌ ʟɪᴍɪᴛ ʀᴇᴀᴄʜᴇᴅ!\n⏱️ ʏᴏᴜ ʜᴀᴠᴇ sᴏʟᴠᴇᴅ 25/25 ᴄᴀsᴇs.\n💡 ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ ${limitInfo.remainingTime} ᴍɪɴᴜᴛᴇs.`);
      }

      let user = await BankUser.findOne({ userID: senderID });
      if (!user) await BankUser.create({ userID: senderID, balance: 1000 });

      const randomCase = CASES[Math.floor(Math.random() * CASES.length)];

      let caseText = `🔍 ───[ ᴅᴇᴛᴇᴄᴛɪᴠᴇ ᴄᴀsᴇ #${randomCase.id} ]─── 🔍\n\n`;
      caseText += `📌 ᴛɪᴛʟᴇ : ${randomCase.title}\n\n`;
      caseText += `📖 sᴛᴏʀʏ :\n${randomCase.story}\n\n`;
      caseText += `⚙️ ᴏᴘᴛɪᴏɴs :\n`;
      for (const [key, val] of Object.entries(randomCase.options)) {
        caseText += ` [${key}] ${val}\n`;
      }
      caseText += `\n💡 ʀᴇᴘʟʏ ᴡɪᴛʜ A, B, ᴏʀ C ᴛᴏ sᴏʟᴠᴇ!\n🏆 ʀᴇᴡᴀʀᴅ : $100ʙ | 💸 ғɪɴᴇ : $20ʙ`;

      const res = await message.reply(caseText);

      // GoatBot v2 / FCA-Unofficial onReply Handler Registration
      if (global.GoatBot && global.GoatBot.onReply) {
        global.GoatBot.onReply.set(res.messageID, {
          commandName: this.config.name,
          messageID: res.messageID,
          author: senderID,
          correctOption: randomCase.correct,
          reason: randomCase.reason,
          userData: limitInfo.userData
        });
      }

    } catch (err) {
      console.error("Detective Game Error:", err);
      return sendMsg("❌ ᴅᴇᴛᴇᴄᴛɪᴠᴇ ɢᴀṁᴇ ᴇʀʀᴏʀ!");
    }
  },

  onReply: async function ({ api, event, message, Reply }) {
    const sendMsg = (txt) => message && typeof message.reply === "function" ? message.reply(txt) : api.sendMessage(txt, event.threadID, event.messageID);
    const { senderID, body } = event;

    if (!Reply) return;

    if (Reply.author !== senderID) {
      return sendMsg("❌ ᴛʜɪs ɪs ɴᴏᴛ ʏᴏᴜʀ ᴄᴀsᴇ! sᴛᴀʀᴛ ʏᴏᴜʀ ᴏᴡɴ ᴡɪᴛʜ #case");
    }

    const userAns = (body || "").toUpperCase().trim();
    if (!["A", "B", "C"].includes(userAns)) {
      return sendMsg("❌ ɪɴᴠᴀʟɪᴅ ᴏᴘᴛɪᴏɴ! ᴘʟᴇᴀsᴇ ʀᴇᴘʟʏ ᴡɪᴛʜ A, B, ᴏʀ C.");
    }

    // Remove event listener after answer
    if (global.GoatBot && global.GoatBot.onReply) {
      global.GoatBot.onReply.delete(Reply.messageID);
    }

    try {
      let user = await BankUser.findOne({ userID: senderID });
      const REWARD = 100000000000; // $100B
      const FINE = 20000000000;    // $20B

      const isCorrect = userAns === Reply.correctOption;

      if (isCorrect) {
        user.balance += REWARD;
      } else {
        user.balance = Math.max(0, user.balance - FINE);
      }

      await user.save();

      // Update Cooldown
      Reply.userData.count += 1;
      global.detectiveGames.cooldowns.set(senderID, Reply.userData);

      const BANK_NAME = "🏛️ ᴅɪ-ᴀʙʟᴏ ᴊɪ-sᴏᴏ ʀᴏʏᴀʟ ᴠᴀᴜʟᴛ 🏛️";

      const msgText = isCorrect
        ? `🎉 ───[ ᴄᴀsᴇ sᴏʟᴠᴇᴅ! ]─── 🎉\n\n` +
          `🧠 ɢʀᴇᴀᴛ ᴊᴏʙ! ʏᴏᴜ ғᴏᴜɴᴅ ᴛʜᴇ ᴄᴏʀʀᴇᴄᴛ ᴄʟᴜᴇ.\n` +
          `💡 ʀᴇᴀsᴏɴ   : ${Reply.reason}\n\n` +
          `💰 ʀᴇᴡᴀʀᴅ   : +$${this.formatMoney(REWARD)}\n` +
          `💳 ʙᴀʟᴀɴᴄᴇ  : $${user.balance.toLocaleString()}\n` +
          `🏦 ʙᴀɴᴋ     : ${BANK_NAME}`
        : `❌ ───[ ᴄᴀsᴇ ғᴀɪʟᴇᴅ! ]─── ❌\n\n` +
          `💀 ᴡʀᴏɴɢ ɢᴜᴇss! ᴛʜᴇ ᴄʀɪᴍɪɴᴀʟ ᴇsᴄᴀᴘᴇᴅ.\n` +
          `💡 ʀᴇᴀsᴏɴ   : ${Reply.reason}\n\n` +
          `💸 ғɪɴᴇ     : -$${this.formatMoney(FINE)}\n` +
          `💳 ʙᴀʟᴀɴᴄᴇ  : $${user.balance.toLocaleString()}\n` +
          `🏦 ʙᴀɴᴋ     : ${BANK_NAME}`;

      return sendMsg(msgText);

    } catch (err) {
      console.error("Detective Reply Error:", err);
      return sendMsg("❌ ᴇʀʀᴏʀ ᴘʀᴏᴄᴇssɪɴɢ ʏᴏᴜʀ ᴀɴsᴡᴇʀ!");
    }
  }
};

View raw file