File size: 3,744 Bytes
76fd8b6
 
 
 
 
a8490d3
76fd8b6
b96545e
a8608fa
76fd8b6
 
 
a8608fa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76fd8b6
 
 
a8608fa
 
 
 
 
 
 
76fd8b6
 
 
a8608fa
 
 
 
 
 
 
 
 
 
 
 
76fd8b6
 
a8608fa
76fd8b6
 
 
f286a82
1198abf
 
8e99c3d
c0fe9a0
1198abf
d9633b6
a8608fa
232c03b
a8608fa
 
 
 
 
 
 
 
 
 
 
 
 
 
76fd8b6
 
57b2ce5
a8608fa
 
 
 
 
 
 
 
 
 
76fd8b6
 
57b2ce5
a8608fa
 
 
 
 
 
 
 
 
 
76fd8b6
 
 
a8608fa
76fd8b6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
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}`);
});