File size: 3,431 Bytes
d22af41
 
 
 
e453f41
d22af41
e453f41
d22af41
e453f41
 
d22af41
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e453f41
d22af41
 
 
e453f41
 
 
 
d22af41
e453f41
 
 
 
d22af41
 
e453f41
d22af41
 
e453f41
d22af41
 
 
e453f41
 
d22af41
 
 
e453f41
d22af41
 
 
 
 
 
 
 
 
 
 
 
 
 
e453f41
d22af41
 
 
 
 
 
 
 
e453f41
 
d22af41
e453f41
d22af41
 
e453f41
d22af41
 
 
 
e453f41
 
 
 
d22af41
 
 
e453f41
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
const os = require('os')
const bytes = require('bytes')
const logger = require('morgan')
const express = require('express')
const puppeteer = require('puppeteer')
const CharacterAI = require('node_characterai')
const Parser = require('node_characterai/parser')

const characterAI = new CharacterAI()
characterAI.puppeteerPath = puppeteer.executablePath()

const app = express()
app.set('json spaces', 4)
app.use(logger('dev'))

app.all('/', (req, res) => {
	const obj = {}
	const used = process.memoryUsage()
	for (let key in used) obj[key] = formatSize(used[key])
	
	const totalmem = os.totalmem()
	const freemem = os.freemem()
	obj.memoryUsage = `${formatSize(totalmem - freemem)} / ${formatSize(totalmem)}`
	
	res.json({
		success: true,
		message: 'Hello World!',
		uptime: new Date(process.uptime() * 1000).toUTCString().split(' ')[4],
		status: obj
	})
})

app.get('/api', async (req, res) => {
	try {
		let { characterId, text, sessionId } = req.query
		if (!characterId) return res.json({ success: false, message: 'Input parameter characterId' })
		if (!text) return res.json({ success: false, message: 'Input parameter text' })
		
		if (!sessionId) {
			const request = await characterAI.requester.request('https://beta.character.ai/chat/history/create/', {
				headers: characterAI.getHeaders(), method: 'POST',
				body: Parser.stringify({ character_external_id: characterId })
			})
			if (!request.ok()) return res.json({ success: false, message: 'Couldn\'t create a new chat' })
			
			const json = await Parser.parseJSON(request)
			sessionId = json.external_id
		}
		
		const chat = await characterAI.createOrContinueChat(characterId, sessionId)
		const response = await chat.sendAndAwaitResponse(text, true)
		const urlAvatar = `https://characterai.io/i/80/static/avatars/${response.srcAvatarFileName}`
			
		delete response.chat
		res.json({
			success: true,
			message: '',
			result: { ...response, urlAvatar, sessionId }
		})
	} catch (e) {
		console.log(e)
		res.json({ error: true, message: String(e) === '[object Object]' ? 'Internal Server Error' : String(e) })
	}
})

app.get('/api/chara/info', async (req, res) => {
	try {
		const { characterId } = req.query
		if (!characterId) return res.json({ success: false, message: 'Input parameter characterId' })
		
		const result = await characterAI.fetchCharacterInfo(characterId)
		if (!result) return res.json({ success: false, message: 'Invalid characterId' })
		
		res.json({ success: true, message: '', result })
	} catch (e) {
		console.log(e)
		res.json({ error: true, message: String(e) === '[object Object]' ? 'Internal Server Error' : String(e) })
	}
})

app.get('/api/chara/search', async (req, res) => {
	try {
		const { name } = req.query
		if (!name) return res.json({ success: false, message: 'Input parameter name' })
		
		const { characters } = await characterAI.searchCharacters(name)
		if (!characters.length) return res.json({ success: false, message: 'Character not found' })
		
		res.json({ success: true, message: '', result: characters })
	} catch (e) {
		console.log(e)
		res.json({ error: true, message: String(e) === '[object Object]' ? 'Internal Server Error' : String(e) })
	}
})

const PORT = process.env.PORT || 7860
app.listen(PORT, async () => {
	console.log('App running on port', PORT)
	await characterAI.authenticateWithToken(process.env.cToken)
})

function formatSize(num) {
	return bytes(+num, { unitSeparator: ' ' })
}