Unify default user avatars Closes #2862
Binary file
| @@ -510,6 +510,7 @@ let saveCharactersPage = 0; | |||
| 510 | export const default_avatar = 'img/ai4.png'; | 510 | export const default_avatar = 'img/ai4.png'; |
| 511 | export const system_avatar = 'img/five.png'; | 511 | export const system_avatar = 'img/five.png'; |
| 512 | export const comment_avatar = 'img/quill.png'; | 512 | export const comment_avatar = 'img/quill.png'; |
| 513 | export const default_user_avatar = 'img/user-default.png'; | ||
| 513 | export let CLIENT_VERSION = 'SillyTavern:UNKNOWN:Cohee#1207'; // For Horde header | 514 | export let CLIENT_VERSION = 'SillyTavern:UNKNOWN:Cohee#1207'; // For Horde header |
| 514 | let optionsPopper = Popper.createPopper(document.getElementById('options_button'), document.getElementById('options'), { | 515 | let optionsPopper = Popper.createPopper(document.getElementById('options_button'), document.getElementById('options'), { |
| 515 | placement: 'top-start', | 516 | placement: 'top-start', |
| @@ -2,7 +2,7 @@ import { | |||
| 2 | characters, | 2 | characters, |
| 3 | chat, | 3 | chat, |
| 4 | chat_metadata, | 4 | chat_metadata, |
| 5 | default_avatar, | 5 | default_user_avatar, |
| 6 | eventSource, | 6 | eventSource, |
| 7 | event_types, | 7 | event_types, |
| 8 | getRequestHeaders, | 8 | getRequestHeaders, |
| @@ -357,7 +357,7 @@ async function createDummyPersona() { | |||
| 357 | // Date + name (only ASCII) to make it unique | 357 | // Date + name (only ASCII) to make it unique |
| 358 | const avatarId = `${Date.now()}-${personaName.replace(/[^a-zA-Z0-9]/g, '')}.png`; | 358 | const avatarId = `${Date.now()}-${personaName.replace(/[^a-zA-Z0-9]/g, '')}.png`; |
| 359 | initPersona(avatarId, personaName, ''); | 359 | initPersona(avatarId, personaName, ''); |
| 360 | await uploadUserAvatar(default_avatar, avatarId); | 360 | await uploadUserAvatar(default_user_avatar, avatarId); |
| 361 | } | 361 | } |
| 362 | 362 | ||
| 363 | /** | 363 | /** |
| @@ -944,7 +944,7 @@ async function onPersonasRestoreInput(e) { | |||
| 944 | // If the avatar is missing, upload it | 944 | // If the avatar is missing, upload it |
| 945 | if (!avatarsList.includes(key)) { | 945 | if (!avatarsList.includes(key)) { |
| 946 | warnings.push(`Persona image "${key}" (${value}) is missing, uploading default avatar`); | 946 | warnings.push(`Persona image "${key}" (${value}) is missing, uploading default avatar`); |
| 947 | await uploadUserAvatar(default_avatar, key); | 947 | await uploadUserAvatar(default_user_avatar, key); |
| 948 | } | 948 | } |
| 949 | } | 949 | } |
| 950 | 950 | ||
| @@ -5,7 +5,6 @@ const PUBLIC_DIRECTORIES = { | |||
| 5 | extensions: 'public/scripts/extensions', | 5 | extensions: 'public/scripts/extensions', |
| 6 | }; | 6 | }; |
| 7 | 7 | ||
| 8 | const DEFAULT_AVATAR = '/img/ai4.png'; | ||
| 9 | const SETTINGS_FILE = 'settings.json'; | 8 | const SETTINGS_FILE = 'settings.json'; |
| 10 | 9 | ||
| 11 | /** | 10 | /** |
| @@ -422,7 +421,6 @@ const VLLM_KEYS = [ | |||
| 422 | 421 | ||
| 423 | module.exports = { | 422 | module.exports = { |
| 424 | DEFAULT_USER, | 423 | DEFAULT_USER, |
| 425 | DEFAULT_AVATAR, | ||
| 426 | SETTINGS_FILE, | 424 | SETTINGS_FILE, |
| 427 | PUBLIC_DIRECTORIES, | 425 | PUBLIC_DIRECTORIES, |
| 428 | USER_DIRECTORY_TEMPLATE, | 426 | USER_DIRECTORY_TEMPLATE, |
| @@ -726,13 +726,12 @@ router.post('/create', urlencodedParser, async function (request, response) { | |||
| 726 | const char = JSON.stringify(charaFormatData(request.body, request.user.directories)); | 726 | const char = JSON.stringify(charaFormatData(request.body, request.user.directories)); |
| 727 | const internalName = getPngName(request.body.ch_name, request.user.directories); | 727 | const internalName = getPngName(request.body.ch_name, request.user.directories); |
| 728 | const avatarName = `${internalName}.png`; | 728 | const avatarName = `${internalName}.png`; |
| 729 | const defaultAvatar = './public/img/ai4.png'; | ||
| 730 | const chatsPath = path.join(request.user.directories.chats, internalName); | 729 | const chatsPath = path.join(request.user.directories.chats, internalName); |
| 731 | 730 | ||
| 732 | if (!fs.existsSync(chatsPath)) fs.mkdirSync(chatsPath); | 731 | if (!fs.existsSync(chatsPath)) fs.mkdirSync(chatsPath); |
| 733 | 732 | ||
| 734 | if (!request.file) { | 733 | if (!request.file) { |
| 735 | await writeCharacterData(defaultAvatar, char, internalName, request); | 734 | await writeCharacterData(defaultAvatarPath, char, internalName, request); |
| 736 | return response.send(avatarName); | 735 | return response.send(avatarName); |
| 737 | } else { | 736 | } else { |
| 738 | const crop = tryParse(request.query.crop); | 737 | const crop = tryParse(request.query.crop); |
| @@ -10,7 +10,7 @@ const express = require('express'); | |||
| 10 | const mime = require('mime-types'); | 10 | const mime = require('mime-types'); |
| 11 | const archiver = require('archiver'); | 11 | const archiver = require('archiver'); |
| 12 | 12 | ||
| 13 | const { USER_DIRECTORY_TEMPLATE, DEFAULT_USER, PUBLIC_DIRECTORIES, DEFAULT_AVATAR, SETTINGS_FILE } = require('./constants'); | 13 | const { USER_DIRECTORY_TEMPLATE, DEFAULT_USER, PUBLIC_DIRECTORIES, SETTINGS_FILE } = require('./constants'); |
| 14 | const { getConfigValue, color, delay, setConfigValue, generateTimestamp } = require('./util'); | 14 | const { getConfigValue, color, delay, setConfigValue, generateTimestamp } = require('./util'); |
| 15 | const { readSecret, writeSecret } = require('./endpoints/secrets'); | 15 | const { readSecret, writeSecret } = require('./endpoints/secrets'); |
| 16 | 16 | ||
| @@ -24,6 +24,7 @@ const ANON_CSRF_SECRET = crypto.randomBytes(64).toString('base64'); | |||
| 24 | * @type {Map<string, UserDirectoryList>} | 24 | * @type {Map<string, UserDirectoryList>} |
| 25 | */ | 25 | */ |
| 26 | const DIRECTORIES_CACHE = new Map(); | 26 | const DIRECTORIES_CACHE = new Map(); |
| 27 | const PUBLIC_USER_AVATAR = '/img/default-user.png'; | ||
| 27 | 28 | ||
| 28 | const STORAGE_KEYS = { | 29 | const STORAGE_KEYS = { |
| 29 | csrfSecret: 'csrfSecret', | 30 | csrfSecret: 'csrfSecret', |
| @@ -478,11 +479,11 @@ async function getUserAvatar(handle) { | |||
| 478 | const settings = fs.existsSync(pathToSettings) ? JSON.parse(fs.readFileSync(pathToSettings, 'utf8')) : {}; | 479 | const settings = fs.existsSync(pathToSettings) ? JSON.parse(fs.readFileSync(pathToSettings, 'utf8')) : {}; |
| 479 | const avatarFile = settings?.power_user?.default_persona || settings?.user_avatar; | 480 | const avatarFile = settings?.power_user?.default_persona || settings?.user_avatar; |
| 480 | if (!avatarFile) { | 481 | if (!avatarFile) { |
| 481 | return DEFAULT_AVATAR; | 482 | return PUBLIC_USER_AVATAR; |
| 482 | } | 483 | } |
| 483 | const avatarPath = path.join(directory.avatars, avatarFile); | 484 | const avatarPath = path.join(directory.avatars, avatarFile); |
| 484 | if (!fs.existsSync(avatarPath)) { | 485 | if (!fs.existsSync(avatarPath)) { |
| 485 | return DEFAULT_AVATAR; | 486 | return PUBLIC_USER_AVATAR; |
| 486 | } | 487 | } |
| 487 | const mimeType = mime.lookup(avatarPath); | 488 | const mimeType = mime.lookup(avatarPath); |
| 488 | const base64Content = fs.readFileSync(avatarPath, 'base64'); | 489 | const base64Content = fs.readFileSync(avatarPath, 'base64'); |
| @@ -490,7 +491,7 @@ async function getUserAvatar(handle) { | |||
| 490 | } | 491 | } |
| 491 | catch { | 492 | catch { |
| 492 | // Ignore errors | 493 | // Ignore errors |
| 493 | return DEFAULT_AVATAR; | 494 | return PUBLIC_USER_AVATAR; |
| 494 | } | 495 | } |
| 495 | } | 496 | } |
| 496 | 497 | ||