diff --git a/src/lib/SideBars/RegexData.svelte b/src/lib/SideBars/RegexData.svelte
index de56752a..ab33ceff 100644
--- a/src/lib/SideBars/RegexData.svelte
+++ b/src/lib/SideBars/RegexData.svelte
@@ -34,6 +34,7 @@
{language.editInput}
{language.editOutput}
{language.editProcess}
+
{language.editDisplay}
IN:
diff --git a/src/lib/SideBars/Settings.svelte b/src/lib/SideBars/Settings.svelte
deleted file mode 100644
index a1a4dab2..00000000
--- a/src/lib/SideBars/Settings.svelte
+++ /dev/null
@@ -1,595 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-{#if subMenu === -1}
-
{language.userSetting}
-
{language.userIcon}
-
{selectUserImg()}}>
- {#if $DataBase.userIcon === ''}
-
- {:else}
- {#await getCharImage($DataBase.userIcon, 'css')}
-
- {:then im}
-
- {/await}
- {/if}
-
-
{language.username}
-
-
-{:else if subMenu === 0 && subSubMenu === 0}
-
{language.botSettings}
-
- {
- subSubMenu = 0
- }} class="flex-1 border-solid border-borderc border-1 p-2 flex justify-center cursor-pointer" class:bg-selected={subSubMenu === 0}>
- {language.Chat}
-
- {
- subSubMenu = 1
- }} class="flex-1 border-solid border-borderc border-1 border-l-transparent p-2 flex justify-center cursor-pointer">
- {language.others}
-
-
-
{language.model}
-
- OpenAI GPT-3.5
- OpenAI GPT-4
- Text Generation WebUI
- Google Palm2
- {#if $DataBase.plugins.length > 0}
- Plugin
- {/if}
-
-
-
{language.submodel}
-
- OpenAI GPT-3.5
- OpenAI GPT-4
- Google Palm2
- Text Generation WebUI
- {#if $customProviderStore.length > 0}
- Plugin
- {/if}
-
-
- {#if $DataBase.aiModel === 'palm2' || $DataBase.subModel === 'palm2'}
-
Palm2 {language.apiKey}
-
- {/if}
- {#if $DataBase.aiModel === 'gpt35' || $DataBase.aiModel === 'gpt4' || $DataBase.subModel === 'gpt4' || $DataBase.subModel === 'gpt35'}
-
OpenAI {language.apiKey}
-
-
-
- OpenAI {language.streaming}
-
- {/if}
- {#if $DataBase.aiModel === 'custom'}
-
{language.plugin}
-
- None
- {#each $customProviderStore as plugin}
- {plugin}
- {/each}
-
- {/if}
- {#if $DataBase.aiModel === 'textgen_webui' || $DataBase.subModel === 'textgen_webui'}
-
TextGen {language.providerURL}
-
-
You must use WebUI without agpl license or use unmodified version with agpl license to observe the contents of the agpl license.
-
You must use textgen webui with --no-stream and without --cai-chat or --chat
- {#if !isTauri}
-
You are using web version. you must use ngrok or other tunnels to use your local webui.
- {/if}
- {/if}
-
{language.mainPrompt}
-
-
{tokens.mainPrompt} {language.tokens}
-
{language.jailbreakPrompt}
-
-
{tokens.jailbreak} {language.tokens}
-
{language.globalNote}
-
-
{tokens.globalNote} {language.tokens}
-
{language.maxContextSize}
- {#if $DataBase.aiModel === 'gpt35'}
-
- {:else if $DataBase.aiModel === 'gpt4' || $DataBase.aiModel === 'textgen_webui'}
-
- {:else if $DataBase.aiModel === 'custom'}
-
- {/if}
-
{language.maxResponseSize}
-
-
{language.temperature}
-
-
{($DataBase.temperature / 100).toFixed(2)}
-
{language.frequencyPenalty}
-
-
{($DataBase.frequencyPenalty / 100).toFixed(2)}
-
{language.presensePenalty}
-
-
{($DataBase.PresensePenalty / 100).toFixed(2)}
-
-
{language.forceReplaceUrl}
-
-
{language.submodel} {language.forceReplaceUrl}
-
-
-
-
-
- {language.advancedSettings}
- {language.formatingOrder}
-
- Bias
-
-
-
-
- {language.promptPreprocess}
-
-
-
-
{openPresetList = true}} class="mt-4 drop-shadow-lg p-3 border-borderc border-solid flex justify-center items-center ml-2 mr-2 border-1 hover:bg-selected">{language.presets}
-
-
-{:else if subMenu === 0 && subSubMenu === 1}
-
{language.botSettings}
-
- {
- subSubMenu = 0
- }} class="flex-1 border-solid border-borderc border-1 p-2 flex justify-center cursor-pointer">
- {language.Chat}
-
- {
- subSubMenu = 1
- }} class="flex-1 border-solid border-borderc border-1 border-l-transparent p-2 flex justify-center cursor-pointer" class:bg-selected={subSubMenu === 1}>
- {language.others}
-
-
-
{language.imageGeneration}
-
-
{language.provider}
-
- None
- Stable Diffusion WebUI
-
-
-
-
- {#if $DataBase.sdProvider === 'webui'}
-
You must use WebUI with --api flag
-
You must use WebUI without agpl license or use unmodified version with agpl license to observe the contents of the agpl license.
- {#if !isTauri}
-
You are using web version. you must use ngrok or other tunnels to use your local webui.
- {/if}
-
WebUI {language.providerURL}
-
-
Steps
-
-
-
CFG Scale
-
-
-
Width
-
-
Height
-
-
Sampler
-
-
-
-
- Enable Hires
-
- {#if $DataBase.sdConfig.enable_hr === true}
-
denoising_strength
-
-
hr_scale
-
-
Upscaler
-
- {/if}
- {/if}
-
-
-
TTS
-
ElevenLabs API key
-
-
-
-{:else if subMenu == 3}
-
{language.display}
-
{language.UiLanguage}
-
{
- await sleep(10)
- changeLanguage($DataBase.language)
- subMenu = -1
- }}>
- English
- 한국어
-
-
-
{language.theme}
-
- Standard Risu
- Waifulike
- WaifuCut
-
-
-
-
-
- {#if $DataBase.theme === "waifu"}
-
{language.waifuWidth}
-
-
{($DataBase.waifuWidth)}%
-
-
{language.waifuWidth2}
-
-
{($DataBase.waifuWidth2)}%
- {/if}
-
-
{language.textColor}
-
- {language.classicRisu}
- {language.highcontrast}
- Custom
-
-
- {#if $DataBase.textTheme === "custom"}
-
-
- Normal Text
-
-
-
- Italic Text
-
-
-
- Bold Text
-
-
-
- Italic Bold Text
-
- {/if}
-
-
-
{language.translator}
-
- {language.disabled}
- 한국어
-
-
{language.UISize}
-
-
{($DataBase.zoomsize)}%
-
-
{language.iconSize}
-
-
{($DataBase.iconsize)}%
-
-
-
- {language.autoTranslation}
-
-
-
- {language.fullscreen}
-
-
-
-
- {language.showMemoryLimit}
-
-
-
- {
- if(check){
- $DataBase.customBackground = '-'
- const d = await selectSingleFile(['png', 'webp', 'gif'])
- if(!d){
- $DataBase.customBackground = ''
- return
- }
- const img = await saveImage(d.data)
- $DataBase.customBackground = img
- }
- else{
- $DataBase.customBackground = ''
- }
- }}>
- {language.useCustomBackground}
-
-
-
-
- {language.playMessage}
-
-
-
-
- {language.SwipeRegenerate}
-
-
-
-
- {language.roundIcons}
-
-
-
-
- {language.instantRemove}
-
-
-{:else if subMenu === 2}
-
{language.plugin}
-
{language.pluginWarn}
-
-
-
- {#if $DataBase.plugins.length === 0}
-
No Plugins
- {:else}
- {#each $DataBase.plugins as plugin, i}
- {#if i !== 0}
-
- {/if}
-
- {plugin.displayName ?? plugin.name}
- {
- const v = await alertConfirm(language.removeConfirm + (plugin.displayName ?? plugin.name))
- if(v){
- if($DataBase.currentPluginProvider === plugin.name){
- $DataBase.currentPluginProvider = ''
- }
- let plugins = $DataBase.plugins
- plugins.splice(i, 1)
- $DataBase.plugins = plugins
- }
- }}>
-
-
-
- {#if Object.keys(plugin.arguments).length > 0}
-
- {#each Object.keys(plugin.arguments) as arg}
- {arg}
- {#if Array.isArray(plugin.arguments[arg])}
-
- {#each plugin.arguments[arg] as a}
- a
- {/each}
-
- {:else if plugin.arguments[arg] === 'string'}
-
- {:else if plugin.arguments[arg] === 'int'}
-
- {/if}
- {/each}
-
- {/if}
- {/each}
- {/if}
-
-
-
{
- importPlugin()
- }} class="hover:text-neutral-200 cursor-pointer">
-
-
-
-{:else if subMenu === 1}
-
{language.advancedSettings}
-
{language.advancedSettingsWarn}
-
{language.loreBookDepth}
-
-
{language.loreBookToken}
-
-
-
{language.additionalPrompt}
-
-
-
{language.descriptionPrefix}
-
-
-
{language.emotionPrompt}
-
-
-
{language.SuperMemory} Prompt
-
-
-
{language.requestretrys}
-
-
-
Request Method
-
- Normal
- Proxy
- Plain Fetch
-
-
- {#if $DataBase.requestmet === 'proxy'}
-
Request Proxy URL
-
- {/if}
- {#if isTauri && $DataBase.requestmet === 'normal'}
-
Request Lib
-
- Reqwest
- Tauri
-
- {/if}
-
-
-
- {language.sayNothing}
-
-
-
- {language.showUnrecommended}
-
-
-
- {language.useExperimental}
-
-
{
- alertMd(getRequestLog())
- }}
- class="drop-shadow-lg p-3 border-borderc border-solid mt-6 flex justify-center items-center ml-2 mr-2 border-1 hover:bg-selected text-sm">
- {language.ShowLog}
-
-
-{:else if subMenu === 4}
-
{language.files}
-
-
{
- if(await alertConfirm(language.backupConfirm)){
- localStorage.setItem('backup', 'save')
- if(isTauri){
- checkDriver('savetauri')
- }
- else{
- checkDriver('save')
- }
- }
- }}
- class="drop-shadow-lg p-3 border-borderc border-solid mt-2 flex justify-center items-center ml-2 mr-2 border-1 hover:bg-selected text-sm">
- {language.savebackup}
-
-
-
{
- if((await alertConfirm(language.backupLoadConfirm)) && (await alertConfirm(language.backupLoadConfirm2))){
- localStorage.setItem('backup', 'load')
- if(isTauri){
- checkDriver('loadtauri')
- }
- else{
- checkDriver('load')
- }
- }
- }}
- class="drop-shadow-lg p-3 border-borderc border-solid mt-2 flex justify-center items-center ml-2 mr-2 border-1 hover:bg-selected text-sm">
- {language.loadbackup}
-
-
-{/if}
-
-
\ No newline at end of file
diff --git a/src/lib/SideBars/Sidebar.svelte b/src/lib/SideBars/Sidebar.svelte
index d5c85b1f..af5bed90 100644
--- a/src/lib/SideBars/Sidebar.svelte
+++ b/src/lib/SideBars/Sidebar.svelte
@@ -29,10 +29,9 @@
getCharImage,
} from "../../ts/characters";
import { importCharacter } from "src/ts/characterCards";
- import SettingsDom from "./Settings.svelte";
import CharConfig from "./CharConfig.svelte";
import { language } from "../../lang";
- import Botpreset from "../Others/botpreset.svelte";
+ import Botpreset from "../Setting/botpreset.svelte";
import { onDestroy } from "svelte";
import { isEqual } from "lodash";
import SidebarAvatar from "./SidebarAvatar.svelte";
@@ -226,7 +225,10 @@
{#if sideBarMode === 0}
{#if $selectedCharID < 0 || $settingsOpen}
-
+
+
Welcome to RisuAI!
+ Select a bot to start chating
+
{:else}
{/if}
diff --git a/src/main.ts b/src/main.ts
index 8d7eabe6..b75664dc 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -1,4 +1,5 @@
import "./styles.css";
+import "core-js/actual"
import App from "./App.svelte";
import { loadData } from "./ts/globalApi";
import { ReadableStream, WritableStream, TransformStream } from "web-streams-polyfill/ponyfill/es2018";
diff --git a/src/ts/characterCards.ts b/src/ts/characterCards.ts
index a2705e9e..522b13d9 100644
--- a/src/ts/characterCards.ts
+++ b/src/ts/characterCards.ts
@@ -1,6 +1,6 @@
import { get } from "svelte/store"
import { alertConfirm, alertError, alertNormal, alertSelect, alertStore } from "./alert"
-import { DataBase, defaultSdDataFunc, type character, saveImage, setDatabase, type customscript, type loreSettings, type loreBook } from "./database"
+import { DataBase, defaultSdDataFunc, type character, setDatabase, type customscript, type loreSettings, type loreBook } from "./database"
import { checkNullish, selectSingleFile, sleep } from "./util"
import { language } from "src/lang"
import { encode as encodeMsgpack, decode as decodeMsgpack } from "@msgpack/msgpack";
@@ -8,7 +8,7 @@ import { v4 as uuidv4 } from 'uuid';
import exifr from 'exifr'
import { PngMetadata } from "./exif"
import { characterFormatUpdate } from "./characters"
-import { downloadFile, readImage } from "./globalApi"
+import { downloadFile, readImage, saveAsset } from "./globalApi"
import { cloneDeep } from "lodash"
@@ -69,7 +69,7 @@ export async function importCharacter() {
msg: `Loading... (Getting Emotions ${i} / ${char.emotionImages.length})`
})
await sleep(10)
- const imgp = await saveImage(char.emotionImages[i][1] as any)
+ const imgp = await saveAsset(char.emotionImages[i][1] as any)
char.emotionImages[i][1] = imgp
}
}
@@ -85,7 +85,7 @@ export async function importCharacter() {
}
char.chatPage = 0
- char.image = await saveImage(PngMetadata.filter(img))
+ char.image = await saveAsset(PngMetadata.filter(img))
db.characters.push(characterFormatUpdate(char))
char.chaId = uuidv4()
setDatabase(db)
@@ -94,7 +94,7 @@ export async function importCharacter() {
}
else if(readed.chara){
const charaData:OldTavernChar = JSON.parse(Buffer.from(readed.chara, 'base64').toString('utf-8'))
- const imgp = await saveImage(PngMetadata.filter(img))
+ const imgp = await saveAsset(PngMetadata.filter(img))
let db = get(DataBase)
db.characters.push(convertOldTavernAndJSON(charaData, imgp))
DataBase.set(db)
@@ -140,7 +140,7 @@ export async function characterHubImport() {
}
}
{
- const imgp = await saveImage(PngMetadata.filter(img))
+ const imgp = await saveAsset(PngMetadata.filter(img))
let db = get(DataBase)
const charaData:OldTavernChar = JSON.parse(Buffer.from(readed.chara, 'base64').toString('utf-8'))
db.characters.push(convertOldTavernAndJSON(charaData, imgp))
@@ -300,7 +300,7 @@ async function importSpecv2(card:CharacterCardV2, img?:Uint8Array):Promise
0){
+ for(let i=0;i {
+ if (data.tagName === "iframe") {
+ const src = node.getAttribute("src") || "";
+ if (!src.startsWith("https://www.youtube.com/embed/")) {
+ return node.parentNode.removeChild(node);
+ }
+ }
+});
+
+export async function ParseMarkdown(data:string, char:(character | groupChat) = null) {
+ if(char && char.type !== 'group'){
+ if(char.customscript){
+ data = processScript(char, data, 'editdisplay')
+ }
+ if(char.additionalAssets){
+ for(const asset of char.additionalAssets){
+ const assetPath = await getFileSrc(asset[1])
+ data = data.replaceAll(`{{raw::${asset[0]}}}`, assetPath).replaceAll(`{{img::${asset[0]}}}`,` `)
+ }
+ }
+ }
return DOMPurify.sanitize(convertor.makeHtml(data), {
- FORBID_TAGS: []
+ ADD_TAGS: ["iframe"],
+ ADD_ATTR: ["allow", "allowfullscreen", "frameborder", "scrolling"],
})
}
diff --git a/src/ts/process/scripts.ts b/src/ts/process/scripts.ts
index 24f9c4b7..e9073206 100644
--- a/src/ts/process/scripts.ts
+++ b/src/ts/process/scripts.ts
@@ -4,7 +4,7 @@ import type { character } from "../database";
const dreg = /{{data}}/g
-type ScriptMode = 'editinput'|'editoutput'|'editprocess'
+type ScriptMode = 'editinput'|'editoutput'|'editprocess'|'editdisplay'
export function processScript(char:character, data:string, mode:ScriptMode){
return processScriptFull(char, data, mode).data
diff --git a/src/ts/translator/translator.ts b/src/ts/translator/translator.ts
index 43f1c84d..cb682cc0 100644
--- a/src/ts/translator/translator.ts
+++ b/src/ts/translator/translator.ts
@@ -1,7 +1,4 @@
-import { Body,fetch as TauriFetch,ResponseType } from "@tauri-apps/api/http"
-import { isTauri } from "../globalApi"
import { translatorPlugin } from "../process/plugins"
-import { sleep } from "../util"
let cache={
origin: [''],
diff --git a/version.json b/version.json
index 25e6454d..8dab4229 100644
--- a/version.json
+++ b/version.json
@@ -1 +1 @@
-{"version":"1.11.0"}
\ No newline at end of file
+{"version":"1.12.0"}
\ No newline at end of file