Use shared constant for default avatar path

b3077c463538fbbc542bb279baced49cc7f27021

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

3 files changed, +11 -10Ignore whitespace
src/constants.js+1 -0
@@ -328,6 +328,7 @@ export const OPENAI_KEYS = [
328328
329export const AVATAR_WIDTH = 512;329export const AVATAR_WIDTH = 512;
330export const AVATAR_HEIGHT = 768;330export const AVATAR_HEIGHT = 768;
331export const DEFAULT_AVATAR_PATH = './public/img/ai4.png';
331332
332export const OPENROUTER_HEADERS = {333export const OPENROUTER_HEADERS = {
333 'HTTP-Referer': 'https://sillytavern.app',334 'HTTP-Referer': 'https://sillytavern.app',
src/endpoints/characters.js+8 -9
@@ -12,7 +12,7 @@ import mime from 'mime-types';
12import { Jimp, JimpMime } from '../jimp.js';12import { Jimp, JimpMime } from '../jimp.js';
13import storage from 'node-persist';13import storage from 'node-persist';
1414
15import { AVATAR_WIDTH, AVATAR_HEIGHT } from '../constants.js';15import { AVATAR_WIDTH, AVATAR_HEIGHT, DEFAULT_AVATAR_PATH } from '../constants.js';
16import { default as validateAvatarUrlMiddleware, getFileNameValidationFunction } from '../middleware/validateFileName.js';16import { default as validateAvatarUrlMiddleware, getFileNameValidationFunction } from '../middleware/validateFileName.js';
17import { deepMerge, humanizedISO8601DateTime, tryParse, extractFileFromZipBuffer, MemoryLimitedMap, getConfigValue, mutateJsonString } from '../util.js';17import { deepMerge, humanizedISO8601DateTime, tryParse, extractFileFromZipBuffer, MemoryLimitedMap, getConfigValue, mutateJsonString } from '../util.js';
18import { TavernCardValidator } from '../validator/TavernCardValidator.js';18import { TavernCardValidator } from '../validator/TavernCardValidator.js';
@@ -22,7 +22,6 @@ import { invalidateThumbnail } from './thumbnails.js';
22import { importRisuSprites } from './sprites.js';22import { importRisuSprites } from './sprites.js';
23import { getUserDirectories } from '../users.js';23import { getUserDirectories } from '../users.js';
24import { getChatInfo } from './chats.js';24import { getChatInfo } from './chats.js';
25const defaultAvatarPath = './public/img/ai4.png';
2625
27// With 100 MB limit it would take roughly 3000 characters to reach this limit26// With 100 MB limit it would take roughly 3000 characters to reach this limit
28const memoryCacheCapacity = getConfigValue('performance.memoryCacheCapacity', '100mb');27const memoryCacheCapacity = getConfigValue('performance.memoryCacheCapacity', '100mb');
@@ -243,7 +242,7 @@ async function writeCharacterData(inputFile, data, outputFile, request, crop = u
243 } catch (error) {242 } catch (error) {
244 const message = Buffer.isBuffer(inputFile) ? 'Failed to read image buffer.' : `Failed to read image: ${inputFile}.`;243 const message = Buffer.isBuffer(inputFile) ? 'Failed to read image buffer.' : `Failed to read image: ${inputFile}.`;
245 console.warn(message, 'Using a fallback image.', error);244 console.warn(message, 'Using a fallback image.', error);
246 return await fs.promises.readFile(defaultAvatarPath);245 return await fs.promises.readFile(DEFAULT_AVATAR_PATH);
247 }246 }
248 }247 }
249248
@@ -746,7 +745,7 @@ async function importFromYaml(uploadPath, context, preservedFileName) {
746 'creator': '',745 'creator': '',
747 'tags': '',746 'tags': '',
748 }, context.request.user.directories);747 }, context.request.user.directories);
749 const result = await writeCharacterData(defaultAvatarPath, JSON.stringify(char), fileName, context.request);748 const result = await writeCharacterData(DEFAULT_AVATAR_PATH, JSON.stringify(char), fileName, context.request);
750 return result ? fileName : '';749 return result ? fileName : '';
751}750}
752751
@@ -775,7 +774,7 @@ async function importFromCharX(uploadPath, { request }, preservedFileName) {
775 }774 }
776775
777 /** @type {string|Buffer} */776 /** @type {string|Buffer} */
778 let avatar = defaultAvatarPath;777 let avatar = DEFAULT_AVATAR_PATH;
779 const assets = _.get(card, 'data.assets');778 const assets = _.get(card, 'data.assets');
780 if (Array.isArray(assets) && assets.length) {779 if (Array.isArray(assets) && assets.length) {
781 for (const asset of assets.filter(x => x.type === 'icon' && typeof x.uri === 'string')) {780 for (const asset of assets.filter(x => x.type === 'icon' && typeof x.uri === 'string')) {
@@ -817,7 +816,7 @@ async function importFromJson(uploadPath, { request }, preservedFileName) {
817 jsonData['create_date'] = humanizedISO8601DateTime();816 jsonData['create_date'] = humanizedISO8601DateTime();
818 const pngName = preservedFileName || getPngName(jsonData.data?.name || jsonData.name, request.user.directories);817 const pngName = preservedFileName || getPngName(jsonData.data?.name || jsonData.name, request.user.directories);
819 const char = JSON.stringify(jsonData);818 const char = JSON.stringify(jsonData);
820 const result = await writeCharacterData(defaultAvatarPath, char, pngName, request);819 const result = await writeCharacterData(DEFAULT_AVATAR_PATH, char, pngName, request);
821 return result ? pngName : '';820 return result ? pngName : '';
822 } else if (jsonData.name !== undefined) {821 } else if (jsonData.name !== undefined) {
823 console.info('Importing from v1 json');822 console.info('Importing from v1 json');
@@ -843,7 +842,7 @@ async function importFromJson(uploadPath, { request }, preservedFileName) {
843 };842 };
844 char = convertToV2(char, request.user.directories);843 char = convertToV2(char, request.user.directories);
845 let charJSON = JSON.stringify(char);844 let charJSON = JSON.stringify(char);
846 const result = await writeCharacterData(defaultAvatarPath, charJSON, pngName, request);845 const result = await writeCharacterData(DEFAULT_AVATAR_PATH, charJSON, pngName, request);
847 return result ? pngName : '';846 return result ? pngName : '';
848 } else if (jsonData.char_name !== undefined) {//json Pygmalion notepad847 } else if (jsonData.char_name !== undefined) {//json Pygmalion notepad
849 console.info('Importing from gradio json');848 console.info('Importing from gradio json');
@@ -869,7 +868,7 @@ async function importFromJson(uploadPath, { request }, preservedFileName) {
869 };868 };
870 char = convertToV2(char, request.user.directories);869 char = convertToV2(char, request.user.directories);
871 const charJSON = JSON.stringify(char);870 const charJSON = JSON.stringify(char);
872 const result = await writeCharacterData(defaultAvatarPath, charJSON, pngName, request);871 const result = await writeCharacterData(DEFAULT_AVATAR_PATH, charJSON, pngName, request);
873 return result ? pngName : '';872 return result ? pngName : '';
874 }873 }
875874
@@ -950,7 +949,7 @@ router.post('/create', async function (request, response) {
950 if (!fs.existsSync(chatsPath)) fs.mkdirSync(chatsPath);949 if (!fs.existsSync(chatsPath)) fs.mkdirSync(chatsPath);
951950
952 if (!request.file) {951 if (!request.file) {
953 await writeCharacterData(defaultAvatarPath, char, internalName, request);952 await writeCharacterData(DEFAULT_AVATAR_PATH, char, internalName, request);
954 return response.send(avatarName);953 return response.send(avatarName);
955 } else {954 } else {
956 const crop = tryParse(request.query.crop);955 const crop = tryParse(request.query.crop);
src/endpoints/content-manager.js+2 -1
@@ -10,6 +10,7 @@ import { sync as writeFileAtomicSync } from 'write-file-atomic';
10import { getConfigValue, color, setPermissionsSync } from '../util.js';10import { getConfigValue, color, setPermissionsSync } from '../util.js';
11import { write } from '../character-card-parser.js';11import { write } from '../character-card-parser.js';
12import { serverDirectory } from '../server-directory.js';12import { serverDirectory } from '../server-directory.js';
13import { DEFAULT_AVATAR_PATH } from '../constants.js';
1314
14const contentDirectory = path.join(serverDirectory, 'default/content');15const contentDirectory = path.join(serverDirectory, 'default/content');
15const scaffoldDirectory = path.join(serverDirectory, 'default/scaffold');16const scaffoldDirectory = path.join(serverDirectory, 'default/scaffold');
@@ -711,7 +712,7 @@ async function downloadSoulkynCharacter(slug) {
711712
712 // Fallback to default avatar713 // Fallback to default avatar
713 if (!avatarBuffer) {714 if (!avatarBuffer) {
714 const defaultAvatarPath = path.join(serverDirectory, 'public', 'img', 'ai4.png');715 const defaultAvatarPath = path.join(serverDirectory, DEFAULT_AVATAR_PATH);
715 avatarBuffer = fs.readFileSync(defaultAvatarPath);716 avatarBuffer = fs.readFileSync(defaultAvatarPath);
716 }717 }
717718