Merge branch 'staging' into woo-yeah
| @@ -6373,7 +6373,10 @@ | ||
| 6373 | 6373 | <img alt="Avatar" src="" /> |
| 6374 | 6374 | </div> |
| 6375 | 6375 | <div class="group_member_name"> |
| 6376 | 6376 | <div class="ch_namecharacter_name_block"></div> |
| 6377 | + <span class="ch_name"></span> | |
| 6378 | + <small class="ch_additional_info character_version"></small> | |
| 6379 | + </div> | |
| 6377 | 6380 | <div class="tags tags_inline"></div> |
| 6378 | 6381 | </div> |
| 6379 | 6382 | <input class="ch_fav" value="" hidden /> |
| @@ -1376,7 +1376,7 @@ | ||
| 1376 | 1376 | "char_import_2": "Chub Lorebook (رابط مباشر أو معرف)", |
| 1377 | 1377 | "char_import_3": "حرف JanitorAI (رابط مباشر أو UUID)", |
| 1378 | 1378 | "char_import_4": "حرف Pygmalion.chat (رابط مباشر أو UUID)", |
| 1379 | 1379 | "char_import_5": "حرف AICharacterCardAICharacterCards.com (رابط مباشر أو معرف)", |
| 1380 | 1380 | "char_import_6": "رابط PNG المباشر (راجع", |
| 1381 | 1381 | "char_import_7": "للمضيفين المسموح بهم)", |
| 1382 | 1382 | "char_import_8": "شخصية RisuRealm (رابط مباشر)", |
| @@ -1376,7 +1376,7 @@ | ||
| 1376 | 1376 | "char_import_2": "Chub Lorebook (Direktlink oder ID)", |
| 1377 | 1377 | "char_import_3": "JanitorAI-Charakter (Direktlink oder UUID)", |
| 1378 | 1378 | "char_import_4": "Pygmalion.chat-Charakter (Direktlink oder UUID)", |
| 1379 | 1379 | "char_import_5": "AICharacterCardAICharacterCards.com-Charakter (Direktlink oder ID)", |
| 1380 | 1380 | "char_import_6": "Direkter PNG-Link (siehe", |
| 1381 | 1381 | "char_import_7": "für erlaubte Hosts)", |
| 1382 | 1382 | "char_import_8": "RisuRealm-Charakter (Direktlink)", |
| @@ -1376,7 +1376,7 @@ | ||
| 1376 | 1376 | "char_import_2": "Chub Lorebook (enlace directo o ID)", |
| 1377 | 1377 | "char_import_3": "Carácter de JanitorAI (enlace directo o UUID)", |
| 1378 | 1378 | "char_import_4": "Carácter Pygmalion.chat (enlace directo o UUID)", |
| 1379 | 1379 | "char_import_5": "Carácter AICharacterCardAICharacterCards.com (enlace directo o ID)", |
| 1380 | 1380 | "char_import_6": "Enlace PNG directo (consulte", |
| 1381 | 1381 | "char_import_7": "para hosts permitidos)", |
| 1382 | 1382 | "char_import_8": "Personaje RisuRealm (Enlace directo)", |
| @@ -1297,7 +1297,7 @@ | ||
| 1297 | 1297 | "char_import_2": "Lorebook de Chub (lien direct ou ID)", |
| 1298 | 1298 | "char_import_3": "Personnage de JanitorAI (lien direct ou UUID)", |
| 1299 | 1299 | "char_import_4": "Personnage de Pygmalion.chat (lien direct ou UUID)", |
| 1300 | 1300 | "char_import_5": "Personnage de AICharacterCardAICharacterCards.com (lien direct ou identifiant)", |
| 1301 | 1301 | "char_import_6": "Lien PNG direct (voir", |
| 1302 | 1302 | "char_import_7": "pour les hôtes autorisés)", |
| 1303 | 1303 | "char_import_8": "Personnage de RisuRealm (lien direct)", |
| @@ -1376,7 +1376,7 @@ | ||
| 1376 | 1376 | "char_import_2": "Chub Lorebook (beinn hlekkur eða auðkenni)", |
| 1377 | 1377 | "char_import_3": "JanitorAI karakter (beinn hlekkur eða UUID)", |
| 1378 | 1378 | "char_import_4": "Pygmalion.chat karakter (beinn hlekkur eða UUID)", |
| 1379 | 1379 | "char_import_5": "AICharacterCardAICharacterCards.com Karakter (beinn hlekkur eða auðkenni)", |
| 1380 | 1380 | "char_import_6": "Beinn PNG hlekkur (sjá", |
| 1381 | 1381 | "char_import_7": "fyrir leyfilega gestgjafa)", |
| 1382 | 1382 | "char_import_8": "RisuRealm karakter (beinn hlekkur)", |
| @@ -1376,7 +1376,7 @@ | ||
| 1376 | 1376 | "char_import_2": "Lorebook di Chub (collegamento diretto o ID)", |
| 1377 | 1377 | "char_import_3": "Carattere JanitorAI (collegamento diretto o UUID)", |
| 1378 | 1378 | "char_import_4": "Carattere Pygmalion.chat (collegamento diretto o UUID)", |
| 1379 | 1379 | "char_import_5": "Carattere AICharacterCardAICharacterCards.com (Link diretto o ID)", |
| 1380 | 1380 | "char_import_6": "Collegamento PNG diretto (fare riferimento a", |
| 1381 | 1381 | "char_import_7": "per gli host consentiti)", |
| 1382 | 1382 | "char_import_8": "Personaggio RisuRealm (collegamento diretto)", |
| @@ -1378,7 +1378,7 @@ | ||
| 1378 | 1378 | "char_import_2": "Chub ロアブック (直接リンクまたは ID)", |
| 1379 | 1379 | "char_import_3": "JanitorAI キャラクター (直接リンクまたは UUID)", |
| 1380 | 1380 | "char_import_4": "Pygmalion.chat キャラクター (直接リンクまたは UUID)", |
| 1381 | 1381 | "char_import_5": "AICharacterCardAICharacterCards.com キャラクター (直接リンクまたは ID)", |
| 1382 | 1382 | "char_import_6": "直接PNGリンク(参照", |
| 1383 | 1383 | "char_import_7": "許可されたホストの場合)", |
| 1384 | 1384 | "char_import_8": "RisuRealm キャラクター (直接リンク)", |
| @@ -1395,7 +1395,7 @@ | ||
| 1395 | 1395 | "char_import_2": "Chub Lorebook(직접 링크 또는 ID)", |
| 1396 | 1396 | "char_import_3": "JanitorAI 캐릭터(직접 링크 또는 UUID)", |
| 1397 | 1397 | "char_import_4": "Pygmalion.chat 문자(직접 링크 또는 UUID)", |
| 1398 | 1398 | "char_import_5": "AICharacterCardAICharacterCards.com 캐릭터(직접 링크 또는 ID)", |
| 1399 | 1399 | "char_import_6": "직접 PNG 링크(참조", |
| 1400 | 1400 | "char_import_7": "허용된 호스트의 경우)", |
| 1401 | 1401 | "char_import_8": "RisuRealm 캐릭터 (직접링크)", |
| @@ -1376,7 +1376,7 @@ | ||
| 1376 | 1376 | "char_import_2": "Chub Lorebook (directe link of ID)", |
| 1377 | 1377 | "char_import_3": "JanitorAI-personage (directe link of UUID)", |
| 1378 | 1378 | "char_import_4": "Pygmalion.chat-teken (directe link of UUID)", |
| 1379 | 1379 | "char_import_5": "AICharacterCardAICharacterCards.com-teken (directe link of ID)", |
| 1380 | 1380 | "char_import_6": "Directe PNG-link (zie", |
| 1381 | 1381 | "char_import_7": "voor toegestane hosts)", |
| 1382 | 1382 | "char_import_8": "RisuRealm-personage (directe link)", |
| @@ -1376,7 +1376,7 @@ | ||
| 1376 | 1376 | "char_import_2": "Chub Lorebook (link direto ou ID)", |
| 1377 | 1377 | "char_import_3": "Personagem JanitorAI (Link Direto ou UUID)", |
| 1378 | 1378 | "char_import_4": "Caractere Pygmalion.chat (Link Direto ou UUID)", |
| 1379 | 1379 | "char_import_5": "Personagem AICharacterCardAICharacterCards.com (link direto ou ID)", |
| 1380 | 1380 | "char_import_6": "Link PNG direto (consulte", |
| 1381 | 1381 | "char_import_7": "para hosts permitidos)", |
| 1382 | 1382 | "char_import_8": "Personagem RisuRealm (link direto)", |
| @@ -966,7 +966,7 @@ | ||
| 966 | 966 | "char_import_2": "Лорбук с Chub (прямая ссылка или ID)", |
| 967 | 967 | "char_import_3": "Персонаж с JanitorAI (прямая ссылка или UUID)", |
| 968 | 968 | "char_import_4": "Персонаж с Pygmalion.chat (прямая ссылка или UUID)", |
| 969 | 969 | "char_import_5": "Персонаж с AICharacterCardAICharacterCards.com (прямая ссылка или ID)", |
| 970 | 970 | "char_import_6": "Прямая ссылка на PNG-файл (чтобы узнать список разрешённых хостов, загляните в", |
| 971 | 971 | "char_import_7": ")", |
| 972 | 972 | "Grammar String": "Грамматика", |
| @@ -1376,7 +1376,7 @@ | ||
| 1376 | 1376 | "char_import_2": "Chub Lorebook (пряме посилання або ID)", |
| 1377 | 1377 | "char_import_3": "Символ JanitorAI (пряме посилання або UUID)", |
| 1378 | 1378 | "char_import_4": "Символ Pygmalion.chat (пряме посилання або UUID)", |
| 1379 | 1379 | "char_import_5": "Символ AICharacterCardAICharacterCards.com (пряме посилання або ідентифікатор)", |
| 1380 | 1380 | "char_import_6": "Пряме посилання на PNG (див", |
| 1381 | 1381 | "char_import_7": "для дозволених хостів)", |
| 1382 | 1382 | "char_import_8": "Персонаж RisuRealm (пряме посилання)", |
| @@ -1376,7 +1376,7 @@ | ||
| 1376 | 1376 | "char_import_2": "Chub (Nhập URL trực tiếp hoặc ID)", |
| 1377 | 1377 | "char_import_3": "JanitorAI (Nhập URL trực tiếp hoặc UUID)", |
| 1378 | 1378 | "char_import_4": "Pygmalion.chat (Nhập URL trực tiếp hoặc UUID)", |
| 1379 | 1379 | "char_import_5": "AICharacterCardAICharacterCards.com (Nhập URL trực tiếp hoặc ID)", |
| 1380 | 1380 | "char_import_6": "Nhập PNG trực tiếp (tham khảo", |
| 1381 | 1381 | "char_import_7": "đối với các máy chủ được phép)", |
| 1382 | 1382 | "char_import_8": "RisuRealm (URL trực tiếp)", |
| @@ -1829,7 +1829,7 @@ | ||
| 1829 | 1829 | "char_import_2": "Chub 知识书(直链或ID)", |
| 1830 | 1830 | "char_import_3": "JanitorAI 角色(直链或UUID)", |
| 1831 | 1831 | "char_import_4": "Pygmalion.chat 角色(直链或UUID)", |
| 1832 | 1832 | "char_import_5": "AICharacterCardAICharacterCards.com 角色(直链或ID)", |
| 1833 | 1833 | "char_import_6": "被允许的PNG直链(请参阅", |
| 1834 | 1834 | "char_import_7": ")", |
| 1835 | 1835 | "char_import_8": "RisuRealm 角色(直链)", |
| @@ -1381,7 +1381,7 @@ | ||
| 1381 | 1381 | "char_import_2": "Chub Lorebook(直接連結或 ID)", |
| 1382 | 1382 | "char_import_3": "JanitorAI 角色(直接連結或 ID)", |
| 1383 | 1383 | "char_import_4": "Pygmalion.chat 角色(直接連結或 ID)", |
| 1384 | 1384 | "char_import_5": "AICharacterCardAICharacterCards.com 角色(直接連結或 ID)", |
| 1385 | 1385 | "char_import_6": "直接 PNG 連結(請參閱", |
| 1386 | 1386 | "char_import_7": "對於允許的主機)", |
| 1387 | 1387 | "char_import_8": "RisuRealm角色(直接連結)", |
| @@ -482,10 +482,10 @@ function highlightNewBackground(bg) { | ||
| 482 | 482 | */ |
| 483 | 483 | function setFittingClass(fitting) { |
| 484 | 484 | const backgrounds = $('#bg1, #bg_custom'); |
| 485 | - backgrounds.toggleClass('cover', fitting === 'cover'); | |
| 485 | + for (const option of ['cover', 'contain', 'stretch', 'center']) { | |
| 486 | 486 | 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; | |
| 489 | 489 | } |
| 490 | 490 | |
| 491 | 491 | function onBackgroundFilterInput() { |
| @@ -1368,6 +1368,15 @@ function getGroupCharacterBlock(character) { | ||
| 1368 | 1368 | template.find('.ch_fav').val(isFav); |
| 1369 | 1369 | template.toggleClass('is_fav', isFav); |
| 1370 | 1370 | |
| 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 | + | |
| 1371 | 1380 | let queuePosition = groupChatQueueOrder.get(character.avatar); |
| 1372 | 1381 | if (queuePosition) { |
| 1373 | 1382 | template.find('.queue_position').text(queuePosition); |
| @@ -7,7 +7,7 @@ | ||
| 7 | 7 | <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> |
| 8 | 8 | <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> |
| 9 | 9 | <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> |
| 10 | 10 | <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> |
| 11 | 11 | <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> |
| 12 | 12 | <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> |
| 13 | 13 | </ul> |
| @@ -3003,7 +3003,7 @@ input[type=search]:focus::-webkit-search-cancel-button { | ||
| 3003 | 3003 | position: relative; |
| 3004 | 3004 | } |
| 3005 | 3005 | |
| 3006 | 3006 | #rm_print_characters_block.character_name_block .ch_name, |
| 3007 | 3007 | .avatar-container .ch_name { |
| 3008 | 3008 | flex: 1 1 auto; |
| 3009 | 3009 | white-space: nowrap; |
| @@ -3013,6 +3013,13 @@ input[type=search]:focus::-webkit-search-cancel-button { | ||
| 3013 | 3013 | display: block; |
| 3014 | 3014 | } |
| 3015 | 3015 | |
| 3016 | +.character_name_block .character_version { | |
| 3017 | + text-overflow: ellipsis; | |
| 3018 | + overflow: hidden; | |
| 3019 | + text-wrap: nowrap; | |
| 3020 | + max-width: 50%; | |
| 3021 | +} | |
| 3022 | + | |
| 3016 | 3023 | #rm_print_characters_block .character_name_block> :last-child { |
| 3017 | 3024 | flex: 0 100000 auto; |
| 3018 | 3025 | /* Force shrinking first */ |
| @@ -74,12 +74,18 @@ async function writeCharacterData(inputFile, data, outputFile, request, crop = u | ||
| 74 | 74 | * Read the image, resize, and save it as a PNG into the buffer. |
| 75 | 75 | * @returns {Promise<Buffer>} Image buffer |
| 76 | 76 | */ |
| 77 | 77 | async function getInputImage() { |
| 78 | + try { | |
| 78 | 79 | if (Buffer.isBuffer(inputFile)) { |
| 79 | 80 | return await parseImageBuffer(inputFile, crop); |
| 80 | 81 | } |
| 81 | 82 | |
| 82 | 83 | 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 | + } | |
| 83 | 89 | } |
| 84 | 90 | |
| 85 | 91 | const inputImage = await getInputImage(); |
| @@ -458,7 +458,8 @@ export function getPasswordSalt() { | ||
| 458 | 458 | */ |
| 459 | 459 | export function getCookieSessionName() { |
| 460 | 460 | // 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); | |
| 462 | 463 | return `session-${suffix}`; |
| 463 | 464 | } |
| 464 | 465 | |