mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-06-05 21:59:27 +02:00
@@ -15,9 +15,9 @@ import storage from 'node-persist';
|
|||||||
|
|
||||||
import { AVATAR_WIDTH, AVATAR_HEIGHT } from '../constants.js';
|
import { AVATAR_WIDTH, AVATAR_HEIGHT } from '../constants.js';
|
||||||
import { default as validateAvatarUrlMiddleware, getFileNameValidationFunction } from '../middleware/validateFileName.js';
|
import { default as validateAvatarUrlMiddleware, getFileNameValidationFunction } from '../middleware/validateFileName.js';
|
||||||
import { deepMerge, humanizedISO8601DateTime, tryParse, extractFileFromZipBuffer, MemoryLimitedMap, getConfigValue } from '../util.js';
|
import { deepMerge, humanizedISO8601DateTime, tryParse, extractFileFromZipBuffer, MemoryLimitedMap, getConfigValue, mutateJsonString } from '../util.js';
|
||||||
import { TavernCardValidator } from '../validator/TavernCardValidator.js';
|
import { TavernCardValidator } from '../validator/TavernCardValidator.js';
|
||||||
import { parse, write } from '../character-card-parser.js';
|
import { parse, read, write } from '../character-card-parser.js';
|
||||||
import { readWorldInfoFile } from './worldinfo.js';
|
import { readWorldInfoFile } from './worldinfo.js';
|
||||||
import { invalidateThumbnail } from './thumbnails.js';
|
import { invalidateThumbnail } from './thumbnails.js';
|
||||||
import { importRisuSprites } from './sprites.js';
|
import { importRisuSprites } from './sprites.js';
|
||||||
@@ -490,10 +490,13 @@ function convertToV2(char, directories) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
function unsetFavFlag(char) {
|
* Removes fields that are not meant to be shared.
|
||||||
|
*/
|
||||||
|
function unsetPrivateFields(char) {
|
||||||
_.set(char, 'fav', false);
|
_.set(char, 'fav', false);
|
||||||
_.set(char, 'data.extensions.fav', false);
|
_.set(char, 'data.extensions.fav', false);
|
||||||
|
_.unset(char, 'chat');
|
||||||
}
|
}
|
||||||
|
|
||||||
function readFromV2(char) {
|
function readFromV2(char) {
|
||||||
@@ -779,7 +782,7 @@ async function importFromCharX(uploadPath, { request }, preservedFileName) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsetFavFlag(card);
|
unsetPrivateFields(card);
|
||||||
card['create_date'] = humanizedISO8601DateTime();
|
card['create_date'] = humanizedISO8601DateTime();
|
||||||
card.name = sanitize(card.name);
|
card.name = sanitize(card.name);
|
||||||
const fileName = preservedFileName || getPngName(card.name, request.user.directories);
|
const fileName = preservedFileName || getPngName(card.name, request.user.directories);
|
||||||
@@ -803,7 +806,7 @@ async function importFromJson(uploadPath, { request }, preservedFileName) {
|
|||||||
if (jsonData.spec !== undefined) {
|
if (jsonData.spec !== undefined) {
|
||||||
console.info(`Importing from ${jsonData.spec} json`);
|
console.info(`Importing from ${jsonData.spec} json`);
|
||||||
importRisuSprites(request.user.directories, jsonData);
|
importRisuSprites(request.user.directories, jsonData);
|
||||||
unsetFavFlag(jsonData);
|
unsetPrivateFields(jsonData);
|
||||||
jsonData = readFromV2(jsonData);
|
jsonData = readFromV2(jsonData);
|
||||||
jsonData['create_date'] = humanizedISO8601DateTime();
|
jsonData['create_date'] = humanizedISO8601DateTime();
|
||||||
const pngName = preservedFileName || getPngName(jsonData.data?.name || jsonData.name, request.user.directories);
|
const pngName = preservedFileName || getPngName(jsonData.data?.name || jsonData.name, request.user.directories);
|
||||||
@@ -886,7 +889,7 @@ async function importFromPng(uploadPath, { request }, preservedFileName) {
|
|||||||
if (jsonData.spec !== undefined) {
|
if (jsonData.spec !== undefined) {
|
||||||
console.info(`Found a ${jsonData.spec} character file.`);
|
console.info(`Found a ${jsonData.spec} character file.`);
|
||||||
importRisuSprites(request.user.directories, jsonData);
|
importRisuSprites(request.user.directories, jsonData);
|
||||||
unsetFavFlag(jsonData);
|
unsetPrivateFields(jsonData);
|
||||||
jsonData = readFromV2(jsonData);
|
jsonData = readFromV2(jsonData);
|
||||||
jsonData['create_date'] = humanizedISO8601DateTime();
|
jsonData['create_date'] = humanizedISO8601DateTime();
|
||||||
const char = JSON.stringify(jsonData);
|
const char = JSON.stringify(jsonData);
|
||||||
@@ -1423,11 +1426,14 @@ router.post('/export', validateAvatarUrlMiddleware, async function (request, res
|
|||||||
|
|
||||||
switch (request.body.format) {
|
switch (request.body.format) {
|
||||||
case 'png': {
|
case 'png': {
|
||||||
const fileContent = await fsPromises.readFile(filename);
|
const rawBuffer = await fsPromises.readFile(filename);
|
||||||
|
const rawData = read(rawBuffer);
|
||||||
|
const mutatedData = mutateJsonString(rawData, unsetPrivateFields);
|
||||||
|
const mutatedBuffer = write(rawBuffer, mutatedData);
|
||||||
const contentType = mime.lookup(filename) || 'image/png';
|
const contentType = mime.lookup(filename) || 'image/png';
|
||||||
response.setHeader('Content-Type', contentType);
|
response.setHeader('Content-Type', contentType);
|
||||||
response.setHeader('Content-Disposition', `attachment; filename="${encodeURI(path.basename(filename))}"`);
|
response.setHeader('Content-Disposition', `attachment; filename="${encodeURI(path.basename(filename))}"`);
|
||||||
return response.send(fileContent);
|
return response.send(mutatedBuffer);
|
||||||
}
|
}
|
||||||
case 'json': {
|
case 'json': {
|
||||||
try {
|
try {
|
||||||
|
17
src/util.js
17
src/util.js
@@ -1054,3 +1054,20 @@ export function setWindowTitle(title) {
|
|||||||
process.stdout.write(`\x1b]2;${title}\x1b\x5c`);
|
process.stdout.write(`\x1b]2;${title}\x1b\x5c`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses a JSON string and applies a mutation function to the parsed object.
|
||||||
|
* @param {string} jsonString JSON string to parse
|
||||||
|
* @param {function(any): void} mutation Mutation function to apply to the parsed JSON object
|
||||||
|
* @returns {string} Mutated JSON string
|
||||||
|
*/
|
||||||
|
export function mutateJsonString(jsonString, mutation) {
|
||||||
|
try {
|
||||||
|
const json = JSON.parse(jsonString);
|
||||||
|
mutation(json);
|
||||||
|
return JSON.stringify(json);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error parsing or mutating JSON:', error);
|
||||||
|
return jsonString;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user