diff --git a/src/lang/cn.ts b/src/lang/cn.ts
index dd14b6a5..d45ddab8 100644
--- a/src/lang/cn.ts
+++ b/src/lang/cn.ts
@@ -304,6 +304,8 @@ export const languageChinese = {
tags: "标签",
copied: "已复制",
useChatCopy: "使用聊天复制",
+ useChatSticker: "使用聊天贴纸",
+ useAdditionalAssetsPreview: "使用附加资源预览",
autoTranslateInput: "使用自动翻译输入",
enterMessageForTranslateToEnglish: "输入要翻译为英语的消息",
recent: '最新',
diff --git a/src/lang/en.ts b/src/lang/en.ts
index 51317e85..a960c1c0 100644
--- a/src/lang/en.ts
+++ b/src/lang/en.ts
@@ -308,6 +308,8 @@ export const languageEnglish = {
backgroundHTML: "Background Embedding",
copied: "Copied",
useChatCopy: "Use Chat Message Copy",
+ useChatSticker: "Use Chat Sticker",
+ useAdditionalAssetsPreview: "Use Additional Assets Preview",
autoTranslateInput: "Auto Translate Input",
enterMessageForTranslateToEnglish: "Enter Message for Translate to English",
recent: 'Recent',
diff --git a/src/lang/ko.ts b/src/lang/ko.ts
index 266ff153..295ca49c 100644
--- a/src/lang/ko.ts
+++ b/src/lang/ko.ts
@@ -280,6 +280,8 @@ export const languageKorean = {
backgroundHTML: "백그라운드 임베딩",
copied: "복사됨",
useChatCopy: "채팅 메시지 복사 사용",
+ useChatSticker: "채팅 스티커 사용",
+ useAdditionalAssetsPreview: "추가 에셋 미리보기 사용",
autoTranslateInput: "입력 자동 번역",
enterMessageForTranslateToEnglish: "영어로 번역할 메시지를 입력해주세요",
imageCompression: "이미지 압축",
diff --git a/src/lib/ChatScreens/AssetInput.svelte b/src/lib/ChatScreens/AssetInput.svelte
new file mode 100644
index 00000000..0bf4d097
--- /dev/null
+++ b/src/lib/ChatScreens/AssetInput.svelte
@@ -0,0 +1,75 @@
+
+{#if currentCharacter.type ==='character'}
+
+ {#if currentCharacter.additionalAssets}
+ {#each currentCharacter.additionalAssets as additionalAsset, i}
+
+ {/each}
+ {/if}
+{/if}
\ No newline at end of file
diff --git a/src/lib/ChatScreens/Chat.svelte b/src/lib/ChatScreens/Chat.svelte
index fb6e37bc..be0bf967 100644
--- a/src/lib/ChatScreens/Chat.svelte
+++ b/src/lib/ChatScreens/Chat.svelte
@@ -8,6 +8,7 @@
import { selectedCharID } from "../../ts/stores";
import { translate } from "../../ts/translator/translator";
import { replacePlaceholders } from "../../ts/util";
+
export let message = ''
export let name = ''
export let isLastMemory:boolean
@@ -17,6 +18,7 @@
export let onReroll = () => {}
export let unReroll = () => {}
export let character:character|groupChat|null = null
+ let md:string
let translating = false
let editMode = false
let statusMessage:string = ''
@@ -24,7 +26,8 @@
let msgDisplay = ''
let msgTranslated = ''
- let translated = false;
+ let translated = false
+
async function rm(){
const rm = $DataBase.askRemoval ? await alertConfirm(language.removeChat) : true
if(rm){
@@ -53,7 +56,7 @@
$DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message = msg
}
- async function displaya(message:string){
+ async function displaya(message:string, isStreaming:boolean = false){
if($DataBase.autoTranslate && $DataBase.translator !== ''){
if(msgTranslated==='')
msgDisplay = replacePlaceholders(message, name)
@@ -64,6 +67,12 @@
else{
msgDisplay = replacePlaceholders(message, name)
}
+
+ if(!md || !isStreaming || isStreaming && idx === $DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].message.length - 1) {
+ ParseMarkdown(msgDisplay, character, 'normal').then(mdNew=>{
+ md = mdNew
+ })
+ }
}
const setStatusMessage = (message:string, timeout:number = 0)=>{
@@ -74,7 +83,7 @@
}, timeout)
}
- $: displaya(message)
+ $: displaya(message, $DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].isStreaming)
@@ -161,19 +170,17 @@
{#if editMode}
- {:else}
- {#await ParseMarkdown(msgDisplay, character) then md}
-
-
{
- if($DataBase.clickToEdit && idx > -1){
- editMode = true
- msgTranslated = ""
- }
- }}
- style:font-size="{0.875 * ($DataBase.zoomsize / 100)}rem"
- style:line-height="{1.25 * ($DataBase.zoomsize / 100)}rem"
- >{@html md}
- {/await}
+ {:else if md}
+
+
{
+ if($DataBase.clickToEdit && idx > -1){
+ editMode = true
+ msgTranslated = ""
+ }
+ }}
+ style:font-size="{0.875 * ($DataBase.zoomsize / 100)}rem"
+ style:line-height="{1.25 * ($DataBase.zoomsize / 100)}rem"
+ >{@html md}
{/if}
diff --git a/src/lib/ChatScreens/DefaultChatScreen.svelte b/src/lib/ChatScreens/DefaultChatScreen.svelte
index 30db6bee..8a63394e 100644
--- a/src/lib/ChatScreens/DefaultChatScreen.svelte
+++ b/src/lib/ChatScreens/DefaultChatScreen.svelte
@@ -1,9 +1,9 @@
{
@@ -234,6 +241,12 @@
}
}}>
+ {#if $DataBase.useChatSticker && currentCharacter.type !== 'group'}
+
{toggleStickers = !toggleStickers}}
+ class={"ml-4 bg-gray-500 flex justify-center items-center w-12 h-12 rounded-md hover:bg-green-500 transition-colors "+(toggleStickers ? 'text-green-500':'text-white')}>
+
+
+ {/if}
+
+
+
+
+
+{#if $DataBase.useExperimental}
+
+
+
+
+{/if}
diff --git a/src/lib/SideBars/CharConfig.svelte b/src/lib/SideBars/CharConfig.svelte
index 8045ffb1..85c75bde 100644
--- a/src/lib/SideBars/CharConfig.svelte
+++ b/src/lib/SideBars/CharConfig.svelte
@@ -16,7 +16,7 @@
import RegexData from "./RegexData.svelte";
import { exportChar, shareRisuHub } from "src/ts/characterCards";
import { getElevenTTSVoices, getWebSpeechTTSVoices, getVOICEVOXVoices } from "src/ts/process/tts";
- import { checkCharOrder } from "src/ts/storage/globalApi";
+ import { checkCharOrder, getFileSrc } from "src/ts/storage/globalApi";
import { addGroupChar, rmCharFromGroup } from "src/ts/process/group";
import HubUpload from "../UI/HubUpload.svelte";
@@ -95,7 +95,9 @@
currentChar = currentChar
})
-
+ let assetFileExtensions:string[] = []
+ let assetFilePath:string[] = []
+
$: {
if(database.characters[$selectedCharID].chaId === currentChar.data.chaId){
database.characters[$selectedCharID] = currentChar.data
@@ -106,6 +108,20 @@
emos = currentChar.data.emotionImages
DataBase.set(database)
loadTokenize(currentChar.data)
+
+ if(currentChar.type ==='character' && database.useAdditionalAssetsPreview){
+ if(currentChar.data.additionalAssets){
+ for(let i = 0; i < currentChar.data.additionalAssets.length; i++){
+ if(currentChar.data.additionalAssets[i].length > 2 && currentChar.data.additionalAssets[i][2]) {
+ assetFileExtensions[i] = currentChar.data.additionalAssets[i][2]
+ } else
+ assetFileExtensions[i] = currentChar.data.additionalAssets[i][1].split('.').pop()
+ getFileSrc(currentChar.data.additionalAssets[i][1]).then((filePath) => {
+ assetFilePath[i] = filePath
+ })
+ }
+ }
+ }
}
onDestroy(unsub);
@@ -615,9 +631,10 @@
for(const f of da){
console.log(f)
const img = f.data
- const imgp = await saveAsset(img)
const name = f.name
- currentChar.data.additionalAssets.push([name, imgp])
+ const extension = name.split('.').pop().toLowerCase()
+ const imgp = await saveAsset(img,'', extension)
+ currentChar.data.additionalAssets.push([name, imgp, extension])
currentChar.data.additionalAssets = currentChar.data.additionalAssets
}
}
@@ -634,8 +651,19 @@
{#each currentChar.data.additionalAssets as assets, i}
+ {#if assetFilePath[i] && database.useAdditionalAssetsPreview}
+ {#if assetFileExtensions[i] === 'mp4'}
+
+
+ {:else if assetFileExtensions[i] === 'mp3'}
+
+ {:else}
+
+ {/if}
+ {/if}
|
+
|