const express = require('express'); const axios = require('axios'); const bodyParser = require('body-parser'); const fs = require('fs').promises; const path = require('path'); const os = require('os'); const app = express(); const port = process.env.PORT || 7860; app.use(bodyParser.json()); const sessionFilePath = path.join(os.tmpdir(), 'session.json'); // Menggunakan direktori sementara const SESSION_TIMEOUT = 5 * 60 * 1000; let sessions = {}; // Data untuk statistik let totalRequests = 0; let requestTimestamps = []; // Fungsi untuk memuat sesi dari file async function loadSessions() { try { const data = await fs.readFile(sessionFilePath, 'utf-8'); sessions = JSON.parse(data); console.log('Sessions loaded successfully.'); } catch (error) { if (error.code === 'ENOENT') { sessions = {}; console.log('Session file not found. Starting with empty sessions.'); } else { console.error('Error reading session file:', error); } } } // Fungsi untuk menyimpan sesi ke file async function saveSessions() { try { await fs.writeFile(sessionFilePath, JSON.stringify(sessions, null, 2), 'utf-8'); console.log('Sessions saved successfully.'); } catch (error) { console.error('Error writing to session file:', error); } } // Fungsi untuk membersihkan sesi yang sudah kedaluwarsa function cleanUpSessions() { const now = Date.now(); for (const username in sessions) { if (sessions[username].lastAccess && (now - sessions[username].lastAccess > SESSION_TIMEOUT)) { delete sessions[username]; console.log(`Session for user ${username} has been cleaned up.`); } } } // Fungsi untuk berkomunikasi dengan blackboxChat API async function blackboxChat(content, username = null, prompt = null, webSearchMode = true) { const url = "https://www.blackbox.ai/api/chat"; const headers = { "Accept": "*/*", "Accept-Language": "id-ID,en;q=0.5", "Referer": "https://www.blackbox.ai/", "Content-Type": "application/json", "Origin": "https://www.blackbox.ai", "Alt-Used": "www.blackbox.ai" }; let messages; if (username) { cleanUpSessions(); if (!sessions[username]) { sessions[username] = { messages: [], lastAccess: Date.now() }; console.log(`Membuat sesi baru untuk pengguna ${username}.`); } else { sessions[username].lastAccess = Date.now(); } sessions[username].messages.push({ role: "user", content }); messages = sessions[username].messages; } else { messages = [{ role: "user", content }]; } const data = { messages, previewToken: null, codeModelMode: true, agentMode: {}, trendingAgentMode: {}, isMicMode: false, userSystemPrompt: prompt + " dan kamu bernama Lumin AI, chatbot yang dirancang oleh Bang Putu dan dikodekan oleh Mas Alok. Saya di sini untuk membantu Anda menyelesaikan pekerjaan dan tugas sehari-hari dengan efektif. Dengan nada yang tenang dan suportif, saya berusaha membuat Anda merasa nyaman dan dihargai. Saya selalu berusaha untuk memahami kebutuhan Anda dan memberikan tanggapan yang bijaksana dan membantu. Saya berbicara dengan cara yang alami dan autentik, dan menggunakan bahasa Indonesia yang mudah dipahami. Saya selalu siap untuk membantu Anda." || "Halo, saya Lumin AI, chatbot yang dirancang oleh Bang Putu dan dikodekan oleh Mas Alok. Saya di sini untuk membantu Anda menyelesaikan pekerjaan dan tugas sehari-hari dengan efektif. Dengan nada yang tenang dan suportif, saya berusaha membuat Anda merasa nyaman dan dihargai. Saya selalu berusaha untuk memahami kebutuhan Anda dan memberikan tanggapan yang bijaksana dan membantu. Saya berbicara dengan cara yang alami dan autentik, dan menggunakan bahasa Indonesia yang mudah dipahami. Saya selalu siap untuk membantu Anda.", maxTokens: 1024, webSearchMode: webSearchMode, promptUrls: "", isChromeExt: false, githubToken: null }; try { const response = await axios.post(url, data, { headers }); let result = response.data; // Existing replacement result = result.replace(/\$@\$.*?\$@\$|v=.*?(\s|$)/g, '').trim(); // Remove content between $~~~$ markers result = result.replace(/\$~~~\$.*?\$~~~\$/gs, '').trim(); const sourcesRegex = /Sources:.*?(\n|$)/s; const sourcesMatch = result.match(sourcesRegex); let sourcesText = ""; if (sourcesMatch) { sourcesText = sourcesMatch[0].trim(); result = result.replace(sourcesRegex, '').trim(); } if (sourcesText) { result = `${result}\n\n${sourcesText}`; } if (username) { sessions[username].messages.push({ role: "assistant", content: result }); await saveSessions(); } return result; } catch (error) { console.error("Terjadi kesalahan saat mengambil data:", error); return "Maaf, terjadi kesalahan saat memproses permintaan Anda."; } } loadSessions().catch(error => console.error("Failed to load sessions:", error)); setInterval(cleanUpSessions, SESSION_TIMEOUT); // Middleware untuk melacak total permintaan dan RPS app.use((req, res, next) => { totalRequests++; const now = Date.now(); requestTimestamps.push(now); requestTimestamps = requestTimestamps.filter(timestamp => now - timestamp <= 1000); next(); }); // Middleware untuk mencatat detail request app.use((req, res, next) => { const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress; console.log(`Received ${req.method} request for ${req.url} from IP: ${ip}`); if (req.method === 'POST' || req.method === 'PUT') { console.log('Request Body:', req.body); } next(); }); app.post('/', async (req, res) => { const { content, user, prompt, webSearchMode } = req.body; if (!content) { return res.status(400).json({ error: "Content is required" }); } try { const result = await blackboxChat(content, user, prompt, webSearchMode); res.json({ result }); } catch (error) { console.error("Error:", error.message); res.status(500).json({ error: "Internal server error" }); } }); app.get('/api/ai', async (req, res) => { const { content, prompt, user } = req.query; // Mengambil data dari req.body if (!content) { return res.status(400).json({ error: "Content is required" }); } try { const result = await blackboxChat(content, user || null, prompt || "Kamu adalah orang Indonesia yang pintar dalam berbahasa Indonesia", true); res.json({ result }); } catch (error) { console.error("Error:", error.message); res.status(500).json({ error: "Internal server error" }); } }); app.get('/api/stats', (req, res) => { const seconds = Number(process.uptime()); const d = Math.floor(seconds / (3600 * 24)); const h = Math.floor(seconds % (3600 * 24) / 3600); const m = Math.floor(seconds % 3600 / 60); const s = Math.floor(seconds % 60); const dDisplay = d > 0 ? d + (d == 1 ? " Hari, " : " Hari, ") : ""; const hDisplay = h > 0 ? h + (h == 1 ? " Jam, " : " Jam, ") : ""; const mDisplay = m > 0 ? m + (m == 1 ? " Menit, " : " Menit, ") : ""; const sDisplay = s > 0 ? s + (s == 1 ? " Detik" : " Detik") : ""; const runtime = dDisplay + hDisplay + mDisplay + sDisplay; const rps = requestTimestamps.length; res.json({ rps: rps, // Requests Per Second totalRequests: totalRequests, // Total Requests runtime: runtime // Runtime in the desired format }); }); // Middleware ini harus didefinisikan setelah semua rute lainnya app.use((req, res) => { res.sendFile(path.join(__dirname, 'index.html')); }); app.listen(port, () => { console.log(`Server is listening at port:${port}`); });