Merge branch 'staging' into woo-yeah

a5a8f6057bf3c3b31e01a91988f63c6d573c604c

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

22 files changed, +54 -28Ignore whitespace
public/index.html+4 -1
@@ -6373,7 +6373,10 @@
63736373 <img alt="Avatar" src="" />
63746374 </div>
63756375 <div class="group_member_name">
63766376 <div class="ch_namecharacter_name_block"></div>
6377+ <span class="ch_name"></span>
6378+ <small class="ch_additional_info character_version"></small>
6379+ </div>
63776380 <div class="tags tags_inline"></div>
63786381 </div>
63796382 <input class="ch_fav" value="" hidden />
public/locales/ar-sa.json+1 -1
@@ -1376,7 +1376,7 @@
13761376 "char_import_2": "Chub Lorebook (رابط مباشر أو معرف)",
13771377 "char_import_3": "حرف JanitorAI (رابط مباشر أو UUID)",
13781378 "char_import_4": "حرف Pygmalion.chat (رابط مباشر أو UUID)",
13791379 "char_import_5": "حرف AICharacterCardAICharacterCards.com (رابط مباشر أو معرف)",
13801380 "char_import_6": "رابط PNG المباشر (راجع",
13811381 "char_import_7": "للمضيفين المسموح بهم)",
13821382 "char_import_8": "شخصية RisuRealm (رابط مباشر)",
public/locales/de-de.json+1 -1
@@ -1376,7 +1376,7 @@
13761376 "char_import_2": "Chub Lorebook (Direktlink oder ID)",
13771377 "char_import_3": "JanitorAI-Charakter (Direktlink oder UUID)",
13781378 "char_import_4": "Pygmalion.chat-Charakter (Direktlink oder UUID)",
13791379 "char_import_5": "AICharacterCardAICharacterCards.com-Charakter (Direktlink oder ID)",
13801380 "char_import_6": "Direkter PNG-Link (siehe",
13811381 "char_import_7": "für erlaubte Hosts)",
13821382 "char_import_8": "RisuRealm-Charakter (Direktlink)",
public/locales/es-es.json+1 -1
@@ -1376,7 +1376,7 @@
13761376 "char_import_2": "Chub Lorebook (enlace directo o ID)",
13771377 "char_import_3": "Carácter de JanitorAI (enlace directo o UUID)",
13781378 "char_import_4": "Carácter Pygmalion.chat (enlace directo o UUID)",
13791379 "char_import_5": "Carácter AICharacterCardAICharacterCards.com (enlace directo o ID)",
13801380 "char_import_6": "Enlace PNG directo (consulte",
13811381 "char_import_7": "para hosts permitidos)",
13821382 "char_import_8": "Personaje RisuRealm (Enlace directo)",
public/locales/fr-fr.json+1 -1
@@ -1297,7 +1297,7 @@
12971297 "char_import_2": "Lorebook de Chub (lien direct ou ID)",
12981298 "char_import_3": "Personnage de JanitorAI (lien direct ou UUID)",
12991299 "char_import_4": "Personnage de Pygmalion.chat (lien direct ou UUID)",
13001300 "char_import_5": "Personnage de AICharacterCardAICharacterCards.com (lien direct ou identifiant)",
13011301 "char_import_6": "Lien PNG direct (voir",
13021302 "char_import_7": "pour les hôtes autorisés)",
13031303 "char_import_8": "Personnage de RisuRealm (lien direct)",
public/locales/is-is.json+1 -1
@@ -1376,7 +1376,7 @@
13761376 "char_import_2": "Chub Lorebook (beinn hlekkur eða auðkenni)",
13771377 "char_import_3": "JanitorAI karakter (beinn hlekkur eða UUID)",
13781378 "char_import_4": "Pygmalion.chat karakter (beinn hlekkur eða UUID)",
13791379 "char_import_5": "AICharacterCardAICharacterCards.com Karakter (beinn hlekkur eða auðkenni)",
13801380 "char_import_6": "Beinn PNG hlekkur (sjá",
13811381 "char_import_7": "fyrir leyfilega gestgjafa)",
13821382 "char_import_8": "RisuRealm karakter (beinn hlekkur)",
public/locales/it-it.json+1 -1
@@ -1376,7 +1376,7 @@
13761376 "char_import_2": "Lorebook di Chub (collegamento diretto o ID)",
13771377 "char_import_3": "Carattere JanitorAI (collegamento diretto o UUID)",
13781378 "char_import_4": "Carattere Pygmalion.chat (collegamento diretto o UUID)",
13791379 "char_import_5": "Carattere AICharacterCardAICharacterCards.com (Link diretto o ID)",
13801380 "char_import_6": "Collegamento PNG diretto (fare riferimento a",
13811381 "char_import_7": "per gli host consentiti)",
13821382 "char_import_8": "Personaggio RisuRealm (collegamento diretto)",
public/locales/ja-jp.json+1 -1
@@ -1378,7 +1378,7 @@
13781378 "char_import_2": "Chub ロアブック (直接リンクまたは ID)",
13791379 "char_import_3": "JanitorAI キャラクター (直接リンクまたは UUID)",
13801380 "char_import_4": "Pygmalion.chat キャラクター (直接リンクまたは UUID)",
13811381 "char_import_5": "AICharacterCardAICharacterCards.com キャラクター (直接リンクまたは ID)",
13821382 "char_import_6": "直接PNGリンク(参照",
13831383 "char_import_7": "許可されたホストの場合)",
13841384 "char_import_8": "RisuRealm キャラクター (直接リンク)",
public/locales/ko-kr.json+1 -1
@@ -1395,7 +1395,7 @@
13951395 "char_import_2": "Chub Lorebook(직접 링크 또는 ID)",
13961396 "char_import_3": "JanitorAI 캐릭터(직접 링크 또는 UUID)",
13971397 "char_import_4": "Pygmalion.chat 문자(직접 링크 또는 UUID)",
13981398 "char_import_5": "AICharacterCardAICharacterCards.com 캐릭터(직접 링크 또는 ID)",
13991399 "char_import_6": "직접 PNG 링크(참조",
14001400 "char_import_7": "허용된 호스트의 경우)",
14011401 "char_import_8": "RisuRealm 캐릭터 (직접링크)",
public/locales/nl-nl.json+1 -1
@@ -1376,7 +1376,7 @@
13761376 "char_import_2": "Chub Lorebook (directe link of ID)",
13771377 "char_import_3": "JanitorAI-personage (directe link of UUID)",
13781378 "char_import_4": "Pygmalion.chat-teken (directe link of UUID)",
13791379 "char_import_5": "AICharacterCardAICharacterCards.com-teken (directe link of ID)",
13801380 "char_import_6": "Directe PNG-link (zie",
13811381 "char_import_7": "voor toegestane hosts)",
13821382 "char_import_8": "RisuRealm-personage (directe link)",
public/locales/pt-pt.json+1 -1
@@ -1376,7 +1376,7 @@
13761376 "char_import_2": "Chub Lorebook (link direto ou ID)",
13771377 "char_import_3": "Personagem JanitorAI (Link Direto ou UUID)",
13781378 "char_import_4": "Caractere Pygmalion.chat (Link Direto ou UUID)",
13791379 "char_import_5": "Personagem AICharacterCardAICharacterCards.com (link direto ou ID)",
13801380 "char_import_6": "Link PNG direto (consulte",
13811381 "char_import_7": "para hosts permitidos)",
13821382 "char_import_8": "Personagem RisuRealm (link direto)",
public/locales/ru-ru.json+1 -1
@@ -966,7 +966,7 @@
966966 "char_import_2": "Лорбук с Chub (прямая ссылка или ID)",
967967 "char_import_3": "Персонаж с JanitorAI (прямая ссылка или UUID)",
968968 "char_import_4": "Персонаж с Pygmalion.chat (прямая ссылка или UUID)",
969969 "char_import_5": "Персонаж с AICharacterCardAICharacterCards.com (прямая ссылка или ID)",
970970 "char_import_6": "Прямая ссылка на PNG-файл (чтобы узнать список разрешённых хостов, загляните в",
971971 "char_import_7": ")",
972972 "Grammar String": "Грамматика",
public/locales/uk-ua.json+1 -1
@@ -1376,7 +1376,7 @@
13761376 "char_import_2": "Chub Lorebook (пряме посилання або ID)",
13771377 "char_import_3": "Символ JanitorAI (пряме посилання або UUID)",
13781378 "char_import_4": "Символ Pygmalion.chat (пряме посилання або UUID)",
13791379 "char_import_5": "Символ AICharacterCardAICharacterCards.com (пряме посилання або ідентифікатор)",
13801380 "char_import_6": "Пряме посилання на PNG (див",
13811381 "char_import_7": "для дозволених хостів)",
13821382 "char_import_8": "Персонаж RisuRealm (пряме посилання)",
public/locales/vi-vn.json+1 -1
@@ -1376,7 +1376,7 @@
13761376 "char_import_2": "Chub (Nhập URL trực tiếp hoặc ID)",
13771377 "char_import_3": "JanitorAI (Nhập URL trực tiếp hoặc UUID)",
13781378 "char_import_4": "Pygmalion.chat (Nhập URL trực tiếp hoặc UUID)",
13791379 "char_import_5": "AICharacterCardAICharacterCards.com (Nhập URL trực tiếp hoặc ID)",
13801380 "char_import_6": "Nhập PNG trực tiếp (tham khảo",
13811381 "char_import_7": "đối với các máy chủ được phép)",
13821382 "char_import_8": "RisuRealm (URL trực tiếp)",
public/locales/zh-cn.json+1 -1
@@ -1829,7 +1829,7 @@
18291829 "char_import_2": "Chub 知识书(直链或ID)",
18301830 "char_import_3": "JanitorAI 角色(直链或UUID)",
18311831 "char_import_4": "Pygmalion.chat 角色(直链或UUID)",
18321832 "char_import_5": "AICharacterCardAICharacterCards.com 角色(直链或ID)",
18331833 "char_import_6": "被允许的PNG直链(请参阅",
18341834 "char_import_7": ")",
18351835 "char_import_8": "RisuRealm 角色(直链)",
public/locales/zh-tw.json+1 -1
@@ -1381,7 +1381,7 @@
13811381 "char_import_2": "Chub Lorebook(直接連結或 ID)",
13821382 "char_import_3": "JanitorAI 角色(直接連結或 ID)",
13831383 "char_import_4": "Pygmalion.chat 角色(直接連結或 ID)",
13841384 "char_import_5": "AICharacterCardAICharacterCards.com 角色(直接連結或 ID)",
13851385 "char_import_6": "直接 PNG 連結(請參閱",
13861386 "char_import_7": "對於允許的主機)",
13871387 "char_import_8": "RisuRealm角色(直接連結)",
public/scripts/backgrounds.js+4 -4
@@ -482,10 +482,10 @@ function highlightNewBackground(bg) {
482482 */
483483function setFittingClass(fitting) {
484484 const backgrounds = $('#bg1, #bg_custom');
485- backgrounds.toggleClass('cover', fitting === 'cover');
485+ for (const option of ['cover', 'contain', 'stretch', 'center']) {
486486 backgrounds.toggleClass('contain'option, fittingoption === 'contain'fitting);
487- backgrounds.toggleClass('stretch', fitting === 'stretch');
487+ }
488- backgrounds.toggleClass('center', fitting === 'center');
488+ background_settings.fitting = fitting;
489489}
490490
491491function onBackgroundFilterInput() {
public/scripts/group-chats.js+9 -0
@@ -1368,6 +1368,15 @@ function getGroupCharacterBlock(character) {
13681368 template.find('.ch_fav').val(isFav);
13691369 template.toggleClass('is_fav', isFav);
13701370
1371+ const auxFieldName = power_user.aux_field || 'character_version';
1372+ const auxFieldValue = (character.data && character.data[auxFieldName]) || '';
1373+ if (auxFieldValue) {
1374+ template.find('.character_version').text(auxFieldValue);
1375+ }
1376+ else {
1377+ template.find('.character_version').hide();
1378+ }
1379+
13711380 let queuePosition = groupChatQueueOrder.get(character.avatar);
13721381 if (queuePosition) {
13731382 template.find('.queue_position').text(queuePosition);
public/scripts/templates/importCharacters.html+1 -1
@@ -7,7 +7,7 @@
77 <li><span data-i18n="char_import_2">Chub Lorebook (Direct Link or ID)</span><br><span data-i18n="char_import_example">Example:</span> <tt>lorebooks/bartleby/example-lorebook</tt></li>
88 <li><span data-i18n="char_import_3">JanitorAI Character (Direct Link or UUID)</span><br><span data-i18n="char_import_example">Example:</span> <tt>ddd1498a-a370-4136-b138-a8cd9461fdfe_character-aqua-the-useless-goddess</tt></li>
99 <li><span data-i18n="char_import_4">Pygmalion.chat Character (Direct Link or UUID)</span><br><span data-i18n="char_import_example">Example:</span> <tt>a7ca95a1-0c88-4e23-91b3-149db1e78ab9</tt></li>
1010 <li><span data-i18n="char_import_5">AICharacterCardAICharacterCards.com Character (Direct Link or ID)</span><br><span data-i18n="char_import_example">Example:</span> <tt>AICC/aicharcards/the-game-master</tt></li>
1111 <li><span data-i18n="char_import_6">Direct PNG Link (refer to</span> <code>config.yaml</code><span data-i18n="char_import_7"> for allowed hosts)</span><br><span data-i18n="char_import_example">Example:</span> <tt>https://files.catbox.moe/notarealfile.png</tt></li>
1212 <li><span data-i18n="char_import_8">RisuRealm Character (Direct Link)</span><br><span data-i18n="char_import_example">Example:</span> <tt>https://realm.risuai.net/character/3ca54c71-6efe-46a2-b9d0-4f62df23d712</tt></li>
1313 </ul>
public/style.css+8 -1
@@ -3003,7 +3003,7 @@ input[type=search]:focus::-webkit-search-cancel-button {
30033003 position: relative;
30043004}
30053005
30063006#rm_print_characters_block.character_name_block .ch_name,
30073007.avatar-container .ch_name {
30083008 flex: 1 1 auto;
30093009 white-space: nowrap;
@@ -3013,6 +3013,13 @@ input[type=search]:focus::-webkit-search-cancel-button {
30133013 display: block;
30143014}
30153015
3016+.character_name_block .character_version {
3017+ text-overflow: ellipsis;
3018+ overflow: hidden;
3019+ text-wrap: nowrap;
3020+ max-width: 50%;
3021+}
3022+
30163023#rm_print_characters_block .character_name_block> :last-child {
30173024 flex: 0 100000 auto;
30183025 /* Force shrinking first */
src/endpoints/characters.js+11 -5
@@ -74,12 +74,18 @@ async function writeCharacterData(inputFile, data, outputFile, request, crop = u
7474 * Read the image, resize, and save it as a PNG into the buffer.
7575 * @returns {Promise<Buffer>} Image buffer
7676 */
7777 async function getInputImage() {
78- if (Buffer.isBuffer(inputFile)) {
78+ try {
79- return parseImageBuffer(inputFile, crop);
79+ if (Buffer.isBuffer(inputFile)) {
80- }
80+ return await parseImageBuffer(inputFile, crop);
81+ }
8182
8283 return await tryReadImage(inputFile, crop);
84+ } catch (error) {
85+ const message = Buffer.isBuffer(inputFile) ? 'Failed to read image buffer.' : `Failed to read image: ${inputFile}.`;
86+ console.warn(message, 'Using a fallback image.', error);
87+ return await fs.promises.readFile(defaultAvatarPath);
88+ }
8389 }
8490
8591 const inputImage = await getInputImage();
src/users.js+2 -1
@@ -458,7 +458,8 @@ export function getPasswordSalt() {
458458 */
459459export function getCookieSessionName() {
460460 // Get server hostname and hash it to generate a session suffix
461- const suffix = crypto.createHash('sha256').update(os.hostname()).digest('hex').slice(0, 8);
461+ const hostname = os.hostname() || 'localhost';
462+ const suffix = crypto.createHash('sha256').update(hostname).digest('hex').slice(0, 8);
462463 return `session-${suffix}`;
463464}
464465