From d8a5ee5b4e87d276fe73f172f67ee138078eaa0d Mon Sep 17 00:00:00 2001 From: LL Date: Thu, 22 Jun 2023 07:10:18 +0900 Subject: [PATCH] [feat] Add support for chat stickers This commit adds support for chat stickers by allowing users to use stickers in chat message window. The users can toggle show additional asset list using a button. Added Additional assets file extension data. Additional assets list shows preview. Optimized render when use streaming api. (prevent markdown again when message not changed) Added controls to Video/Audio Assets --- src/lang/cn.ts | 1 + src/lang/en.ts | 1 + src/lang/ko.ts | 1 + src/lib/ChatScreens/AssetInput.svelte | 75 ++++++++++++++++++++ src/lib/ChatScreens/Chat.svelte | 39 +++++----- src/lib/ChatScreens/DefaultChatScreen.svelte | 35 ++++++++- src/lib/Setting/Pages/DisplaySettings.svelte | 10 ++- src/lib/SideBars/CharConfig.svelte | 35 +++++++-- src/ts/characterCards.ts | 11 +-- src/ts/parser.ts | 6 +- src/ts/process/index.ts | 3 + src/ts/storage/database.ts | 6 +- src/ts/storage/globalApi.ts | 14 ++-- 13 files changed, 200 insertions(+), 37 deletions(-) create mode 100644 src/lib/ChatScreens/AssetInput.svelte diff --git a/src/lang/cn.ts b/src/lang/cn.ts index dd14b6a5..658b44b8 100644 --- a/src/lang/cn.ts +++ b/src/lang/cn.ts @@ -304,6 +304,7 @@ export const languageChinese = { tags: "标签", copied: "已复制", useChatCopy: "使用聊天复制", + useChatSticker: "使用聊天贴纸", autoTranslateInput: "使用自动翻译输入", enterMessageForTranslateToEnglish: "输入要翻译为英语的消息", recent: '最新', diff --git a/src/lang/en.ts b/src/lang/en.ts index 51317e85..276d15eb 100644 --- a/src/lang/en.ts +++ b/src/lang/en.ts @@ -308,6 +308,7 @@ export const languageEnglish = { backgroundHTML: "Background Embedding", copied: "Copied", useChatCopy: "Use Chat Message Copy", + useChatSticker: "Use Chat Sticker", 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..ae7e32da 100644 --- a/src/lang/ko.ts +++ b/src/lang/ko.ts @@ -280,6 +280,7 @@ export const languageKorean = { backgroundHTML: "백그라운드 임베딩", copied: "복사됨", useChatCopy: "채팅 메시지 복사 사용", + useChatSticker: "채팅 스티커 사용", 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}