/* Credits @xpushz on telegram Copyright 2017-2025 (c) Randy W @xtdevs, @xtsea on telegram from : https://github.com/TeamKillerX Channel : @RendyProjects This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ import express from 'express'; const app = express(); import * as swaggerUi from 'swagger-ui-express'; import * as cheerio from 'cheerio'; import * as lifestyle from './startup/lifestyle.js'; import * as uuid from 'uuid'; import { Database } from './database/database.js' import { Readable } from "stream"; import { randomBytes } from "crypto"; import { CheckMilWare, authenticateApiKey, apiLimiter } from './middleware/midware.js'; import { setup, serve } from './swagger.js'; import { swaggerOptions } from './settingOptions.js'; import path from "path"; import sharp from "sharp"; import cors from 'cors'; import bodyParser from 'body-parser'; import swaggerJsDoc from 'swagger-jsdoc'; // routes import { GempaRoutes } from './plugins/gempa.js'; import { FluxRoutes } from './plugins/fluxai.js'; import { GptRoutes } from './plugins/gptold.js'; import { HentaiRoutes } from './plugins/hentai.js'; import { TebakRoutes } from './plugins/tebak.js'; import { CopilotRoutes } from './plugins/copilot.js'; import { CarbonRoutes } from './plugins/carbon.js'; import { UnblockIpRoutes } from './plugins/unblockip.js'; import { AntibanRoutes } from './plugins/antiban.js'; import { AllDlRoutes } from './plugins/alldownloader.js'; import { GeminiRoutes } from './routes/googleGemini.js'; const __dirname = path.resolve(); const CheckMilWares = new CheckMilWare(); const myUUID = uuid.v4(); function generateAkenoKey() { const randomString = randomBytes(24).toString("base64").replace(/[^a-zA-Z0-9]/g, ""); return `akeno_${randomString}`; } app.use(async (req, res, next) => { await CheckMilWares.handle(req, res, next); }); app.use("/api/v1/", apiLimiter); app.disable("x-powered-by"); app.disable("link") app.use(cors({ origin: '*', methods: ['GET', 'POST'], allowedHeaders: ['Content-Type', 'Authorization'] })); app.use(bodyParser.json()); app.use( bodyParser.urlencoded({ extended: true, }) ); app.use(express.static('public')); // routes app.use(GeminiRoutes); app.use(FluxRoutes); app.use(GptRoutes); app.use(HentaiRoutes); app.use(TebakRoutes); app.use(GempaRoutes); app.use(CopilotRoutes); app.use(UnblockIpRoutes); app.use(CarbonRoutes); app.use(AntibanRoutes); app.use(AllDlRoutes); const specs = swaggerJsDoc(swaggerOptions); app.delete("/api/v1/delete-key", async (req, res) => { const dbClient = new Database("AkenoXJs"); const collection = dbClient.collection("api_keys"); const apiKey = req.query.api_key; if (!apiKey) { return res.status(400).json({ error: "Missing 'api_key' parameter" }); } try { const DocsKey = await collection.deleteOne({ key: apiKey }); if (DocsKey.deletedCount > 0) { res.json({ message: "API key has been successfully deleted" }); } else { res.status(404).json({ message: "API key not found" }); } } catch (err) { res.status(500).json({ error: `Key deletion failed: ${err.message}` }); } }); app.get("/api/v1/test", authenticateApiKey, apiLimiter, async (req, res) => { res.json({ message: "access key" }); }) app.post("/api/v1/revoked-key", async (req, res) => { const dbClient = new Database("AkenoXJs"); const collection = dbClient.collection("api_keys"); try { const userIdString = req.query.user_id; const userIdNumber = Number(userIdString); if (isNaN(userIdNumber)) { return res.status(400).json({ error: "Invalid or missing user_id" }); } const existingUser = await collection.findOne({ owner: userIdNumber }); if (!existingUser) { return res.status(404).json({ error: "API key not found" }); } const newKey = generateAkenoKey(); const result = await collection.updateOne( { owner: userIdNumber }, { $set: { key: newKey, createdAt: new Date() } }, { upsert: false } ); if (result.modifiedCount > 0) { res.json({ message: "API key successfully revoked and regenerated", apiKey: newKey, createdAt: new Date(), owner: userIdNumber }); } else { res.status(500).json({ error: "Failed to update API key" }); } } catch (err) { res.status(500).json({ error: `Key generation failed: ${err.message}` }); } }); app.post('/api/v1/generate-key', async (req, res) => { const dbClient = new Database("AkenoXJs"); const collection = dbClient.collection('api_keys'); try { const newKey = generateAkenoKey(); const userIdString = req.query.user_id; const userIdNumber = Number(userIdString); const email = req.query.email; if (isNaN(userIdNumber)) { return res.status(400).json({ error: "Invalid or missing user_id" }); } const existingUser = await collection.findOne({ owner: userIdNumber }); if (existingUser) { return res.status(200).json({ apiKey: existingUser.key, createdAt: existingUser.createdAt, owner: existingUser.owner }); } const userDocument = { key: newKey, createdAt: new Date(), owner: userIdNumber }; if (email) { userDocument.email = email; } await collection.insertOne(userDocument); res.json({ apiKey: newKey }); } catch (err) { res.status(500).json({ error: `Key generation failed: ${err.message}` }); } }); app.get("/policy", ( req, res ) => { res.sendFile(path.join(__dirname + "/public/policy.html")); }); app.get("/scraper/read", ( req, res ) => { res.sendFile(path.join(__dirname + "/public/docs.html")); }); app.use( '/docs', serve, setup(specs, { customCss: ` .swagger-ui .topbar { display: none; } .swagger-ui .opblock .opblock-summary-path { display: inline-block; word-break: break-word; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; } `, customCssUrl: "https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/4.3.0/swagger-ui.min.css", customSiteTitle: 'AkenoXJs' }) ); app.get('/', (req, res) => { res.redirect('https://t.me/RendyProjects'); }); lifestyle.startServer(app);