akkun3704 commited on
Commit
d22af41
·
1 Parent(s): 0757136

Create index.js

Browse files
Files changed (1) hide show
  1. index.js +144 -0
index.js ADDED
@@ -0,0 +1,144 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const os = require('os')
2
+ const uuid = require('uuid')
3
+ const bytes = require('bytes')
4
+ const logger = require('morgan')
5
+ const express = require('express')
6
+ const CharacterAI = require('node_characterai')
7
+ const { executablePath } = require('puppeteer')
8
+
9
+ const sessions = new Map()
10
+
11
+ const app = express()
12
+ app.set('trust proxy', 1)
13
+ app.set('json spaces', 4)
14
+ app.use(logger('dev'))
15
+
16
+ app.use(async (req, res, next) => {
17
+ for (let [sessionId, characterAI] of sessions) {
18
+ const timeReset = 10 * 60 * 1000 // 10 min
19
+ if (Date.now() - characterAI.lastFetch > timeReset) {
20
+ await characterAI.unauthenticate()
21
+ sessions.delete(sessionId)
22
+ }
23
+ }
24
+ next()
25
+ })
26
+
27
+ app.all('/', (req, res) => {
28
+ const obj = {}
29
+ const used = process.memoryUsage()
30
+ for (let key in used) obj[key] = formatSize(used[key])
31
+
32
+ const totalmem = os.totalmem()
33
+ const freemem = os.freemem()
34
+ obj.memoryUsage = `${formatSize(totalmem - freemem)} / ${formatSize(totalmem)}`
35
+
36
+ res.json({
37
+ success: true,
38
+ message: 'Hello World!',
39
+ uptime: new Date(process.uptime() * 1000).toUTCString().split(' ')[4],
40
+ status: obj
41
+ })
42
+ })
43
+
44
+ app.get('/ip', (req, res) => res.send(req.ip))
45
+
46
+ app.get('/sessions', (_, res) => res.send(eval(Array.from(sessions))))
47
+
48
+ app.get('/api', async (req, res) => {
49
+ try {
50
+ const { characterId, text, sessionId } = req.query
51
+ if (!characterId) return res.json({ success: false, message: 'Input parameter characterId' })
52
+ if (!text) return res.json({ success: false, message: 'Input parameter text' })
53
+
54
+ if (sessionId) {
55
+ if (!sessions.has(sessionId)) return res.json({ success: false, message: 'sessionId not found' })
56
+ const characterAI = sessions.get(sessionId)
57
+ sessions.set(sessionId, Object.assign(characterAI, { lastFetch: Date.now() }))
58
+
59
+ const chat = await characterAI.createOrContinueChat(characterId)
60
+ const response = await chat.sendAndAwaitResponse(text, true)
61
+ const urlAvatar = `https://characterai.io/i/80/static/avatars/${response.srcAvatarFileName}`
62
+
63
+ delete response.chat
64
+ res.json({
65
+ success: true,
66
+ message: 'sessionId will be deleted in 10 minutes if not used',
67
+ result: { ...response, urlAvatar, sessionId }
68
+ })
69
+ return
70
+ }
71
+
72
+ const id = uuid.v4()
73
+ const characterAI = new CharacterAI()
74
+ characterAI.requester.puppeteerPath = executablePath()
75
+ await characterAI.authenticateWithToken(process.env.cToken)
76
+ sessions.set(id, Object.assign(characterAI, { lastFetch: Date.now() }))
77
+
78
+ const chat = await characterAI.createOrContinueChat(characterId)
79
+ const response = await chat.sendAndAwaitResponse(text, true)
80
+ const urlAvatar = `https://characterai.io/i/80/static/avatars/${response.srcAvatarFileName}`
81
+
82
+ delete response.chat
83
+ res.json({
84
+ success: true,
85
+ message: 'sessionId will be deleted in 10 minutes if not used',
86
+ result: { ...response, urlAvatar, sessionId: id }
87
+ })
88
+ } catch (e) {
89
+ console.log(e)
90
+ res.json({
91
+ error: true,
92
+ message: String(e) === '[object Object]' ? 'Internal Server Error' : String(e)
93
+ })
94
+ }
95
+ })
96
+
97
+ app.get('/api/chara/info', async (req, res) => {
98
+ try {
99
+ const { characterId } = req.query
100
+ if (!characterId) return res.json({ success: false, message: 'Input parameter characterId' })
101
+
102
+ const characterAI = new CharacterAI()
103
+ characterAI.requester.puppeteerPath = executablePath()
104
+ await characterAI.authenticateWithToken(process.env.cToken)
105
+ const result = await characterAI.fetchCharacterInfo(characterId)
106
+ if (!result) return res.json({ success: false, message: 'Invalid characterId' })
107
+
108
+ res.json({ success: true, message: '', result })
109
+ } catch (e) {
110
+ console.log(e)
111
+ res.json({
112
+ error: true,
113
+ message: String(e) === '[object Object]' ? 'Internal Server Error' : String(e)
114
+ })
115
+ }
116
+ })
117
+
118
+ app.get('/api/chara/search', async (req, res) => {
119
+ try {
120
+ const { name } = req.query
121
+ if (!name) return res.json({ success: false, message: 'Input parameter name' })
122
+
123
+ const characterAI = new CharacterAI()
124
+ characterAI.requester.puppeteerPath = executablePath()
125
+ await characterAI.authenticateWithToken(process.env.cToken)
126
+ const result = await characterAI.searchCharacters(name)
127
+ if (!result.characters.length) return res.json({ success: false, message: 'Character not found' })
128
+
129
+ res.json({ success: true, message: '', result: result.characters })
130
+ } catch (e) {
131
+ console.log(e)
132
+ res.json({
133
+ error: true,
134
+ message: String(e) === '[object Object]' ? 'Internal Server Error' : String(e)
135
+ })
136
+ }
137
+ })
138
+
139
+ const PORT = process.env.PORT || 7860
140
+ app.listen(PORT, () => console.log('App running on port', PORT))
141
+
142
+ function formatSize(num) {
143
+ return bytes(+num, { unitSeparator: ' ' })
144
+ }