ut / cai.js
aseli's picture
Update cai.js
232c03b verified
const express = require('express');
const CharacterAI = require('node_characterai');
const app = express();
const PORT = 7860;
const DEFAULT_TOKEN = process.env['TOKEN_CAI']; // ganti dengan token default Anda
const SESSION_DURATION = 14400000; // 4 jam dalam milidetik
let sessions = [];
const createSession = async (token) => {
const existingSession = sessions.find(v => v.token === token);
if (existingSession) {
return existingSession;
}
const characterAI = new CharacterAI();
await characterAI.authenticateWithToken(token);
const session = {
token,
characterAI,
lastUsed: Date.now(), // Tambahkan waktu terakhir digunakan
browser: characterAI.unauthenticate, // Simpan instance browser
isDefault: token === DEFAULT_TOKEN
};
sessions.push(session);
return session;
};
const getSession = async (token) => {
let session = sessions.find(s => s.token === token);
if (session) {
session.lastUsed = Date.now(); // Update waktu terakhir digunakan
return session;
} else {
return await createSession(token);
}
};
const cleanExpiredSessions = async () => {
const now = Date.now(); // Ambil waktu saat ini
const expiredSessions = sessions.filter(session => !session.isDefault && session.lastUsed <= now - SESSION_DURATION);
// Tutup browser dari sesi yang tidak digunakan lebih dari 1 jam
for (const session of expiredSessions) {
if (session.browser) {
await session.browser();
}
}
// Hapus sesi yang tidak digunakan lebih dari 1 jam dari array sessions
sessions = sessions.filter(session => session.isDefault || session.lastUsed > now - SESSION_DURATION);
};
// Jalankan pembersihan sesi tidak digunakan setiap 10 menit
setInterval(cleanExpiredSessions, 10 * 60 * 1000);
app.use(express.json());
app.set('json spaces', 4);
app.get('/', async (req, res) => {
res.send('halo dunia')
console.log(sessions)
console.log(new Date().toLocaleString('id-ID', { year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit', second: '2-digit' }));
})
app.get('/api', async (req, res) => {
const { token, text, characterId, sessionId } = req.query;
console.log("token access: " + (token || DEFAULT_TOKEN))
try {
const session = token ? await getSession(token) : await createSession(DEFAULT_TOKEN);
const chat = await session.characterAI.createOrContinueChat(characterId);
sessionId ? await chat.changeToConversationId(sessionId, true) : await chat.saveAndStartNewChat()
const response = await chat.sendAndAwaitResponse(text, true);
console.log(response)
response.sessionId = response?.chat?.externalId
response.characterId = response?.chat?.characterId
delete response.chat
res.send({ success: true, result: response });
console.log('api done')
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.get('/api/chara/search', async (req, res) => {
const { name, token } = req.query;
try {
const session = token ? await getSession(token) : await createSession(DEFAULT_TOKEN);
const characters = await session.characterAI.searchCharacters(name);
res.send({ success: true, result: characters.characters });
console.log('search done')
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.get('/api/chara/info', async (req, res) => {
const { characterId, token } = req.query;
try {
const session = token ? await getSession(token) : await createSession(DEFAULT_TOKEN);
const characterInfo = await session.characterAI.fetchCharacterInfo(characterId);
res.json({ success: true, result: characterInfo });
console.log('info done')
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});