BOT / index.js
sh4lu-z's picture
Update index.js
2f3e291 verified
const express = require('express');
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const cors = require('cors');
const crypto = require('crypto');
const path = require('path');
const app = express();
app.use(bodyParser.json());
app.use(cors());
// Public Folder (Dashboard එක පෙන්වීමට)
app.use(express.static('public'));
// 1. DATABASE CONNECTION
// (Settings > Secrets වල MONGO_URL දාන්න අමතක කරන්න එපා)
const mongoUri = process.env.MONGO_URL;
if (!mongoUri) {
console.error("❌ ERROR: MONGO_URL not found in Settings!");
} else {
mongoose.connect(mongoUri)
.then(() => console.log("✅ Database Connected Successfully!"))
.catch(err => console.error("❌ Database Error:", err));
}
// 2. SCHEMA (Database එකේ ඩේටා තියන විදිය)
const licenseSchema = new mongoose.Schema({
key: String, // The License Key
clientName: String, // Customer Name (DB only)
expires: Date, // Expiry Date
active: { type: Boolean, default: true }, // Is Banned?
isOnline: { type: Boolean, default: false }, // Single Session Check
lastSeen: { type: Date, default: null } // Heartbeat Timestamp
});
const License = mongoose.model('License', licenseSchema);
// 3. ADMIN PASSWORD (Settings > Secrets වල ADMIN_PASS දාන්න)
const ADMIN_PASS = process.env.ADMIN_PASS || "admin123";
// ================= ROUTES (API) ================= //
// A. KEY GENERATE (අලුත් Format එක: CYPHER_MD-dilu-XXXX...)
app.post('/generate', async (req, res) => {
const { password, clientName, days, keyTag } = req.body;
// පාස්වර්ඩ් චෙක් කිරීම
if (password !== ADMIN_PASS) {
return res.json({ success: false, message: "❌ Wrong Password!" });
}
try {
// 1. ප්‍රධාන Prefix එක
const mainPrefix = "CYPHER_MD";
// 2. යූසර්ගේ ටැග් එක (Ex: dilu) - විශේෂ අකුරු අයින් කරනවා
const userTag = (keyTag || "USER").replace(/[^a-zA-Z0-9]/g, "");
// 3. Random කෑලි 16 (Hex) හදනවා
const rand = crypto.randomBytes(8).toString('hex').toUpperCase();
// 4. කෑලි 4 ට කඩනවා
const p1 = rand.substring(0, 4);
const p2 = rand.substring(4, 8);
const p3 = rand.substring(8, 12);
const p4 = rand.substring(12, 16);
// 5. සම්පූර්ණ කී එක හදනවා
const newKey = `${mainPrefix}-${userTag}-${p1}-${p2}-${p3}-${p4}`;
// 6. දවස් ගාන හදනවා
const expireDate = new Date();
expireDate.setDate(expireDate.getDate() + parseInt(days));
// 7. Database එකට Save කරනවා
const newLicense = new License({
key: newKey,
clientName: clientName || userTag,
expires: expireDate
});
await newLicense.save();
console.log(`🎉 New Key Generated: ${newKey}`);
res.json({
success: true,
key: newKey,
expires: expireDate.toISOString().split('T')[0]
});
} catch (e) {
res.json({ success: false, message: e.message });
}
});
// B. VERIFY ROUTE (බොට් ලොග් වෙන තැන)
app.post('/verify', async (req, res) => {
const { key } = req.body;
// හිස් කී එව්වොත් එලවනවා
if (!key || key.trim() === "") return res.json({ valid: false, message: "KEY_MISSING" });
try {
const license = await License.findOne({ key: key });
// Basic Checks
if (!license) return res.json({ valid: false, message: "KEY_INVALID" });
if (!license.active) return res.json({ valid: false, message: "KEY_BANNED" });
if (new Date() > license.expires) return res.json({ valid: false, message: "KEY_EXPIRED" });
// 🔥 SINGLE SESSION CHECK (එක්කෙනයි)
const now = new Date();
const isSessionDead = license.lastSeen && ((now - new Date(license.lastSeen)) > 20000);
if (license.isOnline && !isSessionDead) {
return res.json({ valid: false, message: "ALREADY_IN_USE" });
}
// Login Success -> Update Status
license.isOnline = true;
license.lastSeen = now;
await license.save();
return res.json({ valid: true, expires: license.expires });
} catch (e) {
res.status(500).json({ valid: false, error: e.message });
}
});
// C. PING ROUTE (Heartbeat - මම තාම ඉන්නවා කියන්න)
app.post('/ping', async (req, res) => {
const { key } = req.body;
try {
await License.findOneAndUpdate({ key: key }, {
isOnline: true,
lastSeen: new Date()
});
res.json({ status: "OK" });
} catch (e) { res.json({ status: "ERROR" }); }
});
// Serve Dashboard
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, 'public/index.html'));
});
const port = 7860;
app.listen(port, () => console.log(`🚀 Server running on port ${port}`));