Add /api/worldinfo/list endpoint

cdfe873984f66fc4623d96addb63908f16301b96

Cohee <18619528+Cohee1207@users.noreply.github.com>

2 files changed, +32 -1Showing whitespace changes
src/endpoints/chats.js+1 -1
@@ -409,7 +409,7 @@ export async function getChatInfo(pathToFile, additionalData = {}, isGroup = fal
409409 rl.on('line', (line) => {
410410 if (withMetadata && itemCounter === 0) {
411411 const jsonData = tryParse(line);
412412 if (jsonData && _.isObjectisObjectLike(jsonData.chat_metadata)) {
413413 chatData.chat_metadata = jsonData.chat_metadata;
414414 }
415415 }
src/endpoints/worldinfo.js+31 -0
@@ -3,7 +3,9 @@ import path from 'node:path';
33
44import express from 'express';
55import sanitize from 'sanitize-filename';
6+import _ from 'lodash';
67import { sync as writeFileAtomicSync } from 'write-file-atomic';
8+import { tryParse } from '../util.js';
79
810/**
911 * Reads a World Info file and returns its contents
@@ -34,6 +36,35 @@ export function readWorldInfoFile(directories, worldInfoName, allowDummy) {
3436
3537export const router = express.Router();
3638
39+router.post('/list', async (request, response) => {
40+ try {
41+ const data = [];
42+ const jsonFiles = (await fs.promises.readdir(request.user.directories.worlds, { withFileTypes: true }))
43+ .filter((file) => file.isFile() && path.extname(file.name).toLowerCase() === '.json')
44+ .sort((a, b) => a.name.localeCompare(b.name));
45+
46+ for (const file of jsonFiles) {
47+ try {
48+ const filePath = path.join(request.user.directories.worlds, file.name);
49+ const fileContents = await fs.promises.readFile(filePath, 'utf8');
50+ const fileExtensions = tryParse(fileContents)?.extensions || {};
51+ const fileData = {
52+ name: path.parse(file.name).name,
53+ extensions: _.isObjectLike(fileExtensions) ? fileExtensions : {},
54+ };
55+ data.push(fileData);
56+ } catch (err) {
57+ console.warn(`Error reading or parsing World Info file ${file.name}:`, err);
58+ }
59+ }
60+
61+ return response.send(data);
62+ } catch (err) {
63+ console.error('Error reading World Info directory:', err);
64+ return response.sendStatus(500);
65+ }
66+});
67+
3768router.post('/get', (request, response) => {
3869 if (!request.body?.name) {
3970 return response.sendStatus(400);