[feat] risupreset file
This commit is contained in:
@@ -1,12 +1,12 @@
|
|||||||
import { get, writable } from 'svelte/store';
|
import { get, writable } from 'svelte/store';
|
||||||
import { checkNullish, selectSingleFile } from '../util';
|
import { checkNullish, decryptBuffer, encryptBuffer, selectSingleFile } from '../util';
|
||||||
import { changeLanguage, language } from '../../lang';
|
import { changeLanguage, language } from '../../lang';
|
||||||
import type { RisuPlugin } from '../plugins/plugins';
|
import type { RisuPlugin } from '../plugins/plugins';
|
||||||
import type {triggerscript as triggerscriptMain} from '../process/triggers';
|
import type {triggerscript as triggerscriptMain} from '../process/triggers';
|
||||||
import { downloadFile, saveAsset as saveImageGlobal } from './globalApi';
|
import { downloadFile, saveAsset as saveImageGlobal } from './globalApi';
|
||||||
import { clone, cloneDeep } from 'lodash';
|
import { clone, cloneDeep } from 'lodash';
|
||||||
import { defaultAutoSuggestPrompt, defaultJailbreak, defaultMainPrompt } from './defaultPrompts';
|
import { defaultAutoSuggestPrompt, defaultJailbreak, defaultMainPrompt } from './defaultPrompts';
|
||||||
import { alertNormal } from '../alert';
|
import { alertNormal, alertSelect } from '../alert';
|
||||||
import type { NAISettings } from '../process/models/nai';
|
import type { NAISettings } from '../process/models/nai';
|
||||||
import { prebuiltNAIpresets, prebuiltPresets } from '../process/templates/templates';
|
import { prebuiltNAIpresets, prebuiltPresets } from '../process/templates/templates';
|
||||||
import { defaultColorScheme, type ColorScheme } from '../gui/colorscheme';
|
import { defaultColorScheme, type ColorScheme } from '../gui/colorscheme';
|
||||||
@@ -995,7 +995,10 @@ export function setPreset(db:Database, newPres: botPreset){
|
|||||||
return db
|
return db
|
||||||
}
|
}
|
||||||
|
|
||||||
export function downloadPreset(id:number){
|
import { encode as encodeMsgpack, decode as decodeMsgpack } from "msgpackr";
|
||||||
|
import * as fflate from "fflate";
|
||||||
|
|
||||||
|
export async function downloadPreset(id:number){
|
||||||
saveCurrentPreset()
|
saveCurrentPreset()
|
||||||
let db = get(DataBase)
|
let db = get(DataBase)
|
||||||
let pres = cloneDeep(db.botPresets[id])
|
let pres = cloneDeep(db.botPresets[id])
|
||||||
@@ -1006,17 +1009,41 @@ export function downloadPreset(id:number){
|
|||||||
pres.proxyKey = ''
|
pres.proxyKey = ''
|
||||||
pres.textgenWebUIStreamURL= ''
|
pres.textgenWebUIStreamURL= ''
|
||||||
pres.textgenWebUIBlockingURL= ''
|
pres.textgenWebUIBlockingURL= ''
|
||||||
downloadFile(pres.name + "_preset.json", Buffer.from(JSON.stringify(pres, null, 2)))
|
const sel = parseInt(await alertSelect(['RISUPRESET (recommended)','JSON']))
|
||||||
|
if(sel === 1){
|
||||||
|
downloadFile(pres.name + "_preset.json", Buffer.from(JSON.stringify(pres, null, 2)))
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
downloadFile(pres.name + "_preset.risupreset", fflate.compressSync(encodeMsgpack({
|
||||||
|
presetVersion: 0,
|
||||||
|
type: 'preset',
|
||||||
|
pres: await encryptBuffer(
|
||||||
|
encodeMsgpack(pres),
|
||||||
|
'risupreset'
|
||||||
|
)
|
||||||
|
})))
|
||||||
|
}
|
||||||
alertNormal(language.successExport)
|
alertNormal(language.successExport)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export async function importPreset(){
|
export async function importPreset(){
|
||||||
const f = await selectSingleFile(["json", "preset"])
|
const f = await selectSingleFile(["json", "preset", "risupreset"])
|
||||||
if(!f){
|
if(!f){
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
let pre:any
|
||||||
|
if(f.name.endsWith('.risupreset')){
|
||||||
|
const decoded = await decodeMsgpack(fflate.decompressSync(f.data))
|
||||||
|
console.log(decoded)
|
||||||
|
if(decoded.presetVersion === 0 && decoded.type === 'preset'){
|
||||||
|
pre = decodeMsgpack(Buffer.from(await decryptBuffer(decoded.pres, 'risupreset')))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
pre = (JSON.parse(Buffer.from(f.data).toString('utf-8')))
|
||||||
|
}
|
||||||
let db = get(DataBase)
|
let db = get(DataBase)
|
||||||
const pre = (JSON.parse(Buffer.from(f.data).toString('utf-8')))
|
|
||||||
if(pre.presetVersion && pre.presetVersion >= 3){
|
if(pre.presetVersion && pre.presetVersion >= 3){
|
||||||
//NAI preset
|
//NAI preset
|
||||||
const pr = cloneDeep(prebuiltPresets.NAI2)
|
const pr = cloneDeep(prebuiltPresets.NAI2)
|
||||||
|
|||||||
@@ -309,4 +309,54 @@ export function getAuthorNoteDefaultText(){
|
|||||||
}
|
}
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function encryptBuffer(data:Uint8Array, keys:string){
|
||||||
|
// hash the key to get a fixed length key value
|
||||||
|
const keyArray = await window.crypto.subtle.digest("SHA-256", new TextEncoder().encode(keys))
|
||||||
|
|
||||||
|
const key = await window.crypto.subtle.importKey(
|
||||||
|
"raw",
|
||||||
|
keyArray,
|
||||||
|
"AES-GCM",
|
||||||
|
false,
|
||||||
|
["encrypt", "decrypt"]
|
||||||
|
)
|
||||||
|
|
||||||
|
// use web crypto api to encrypt the data
|
||||||
|
const result = await window.crypto.subtle.encrypt(
|
||||||
|
{
|
||||||
|
name: "AES-GCM",
|
||||||
|
iv: new Uint8Array(12),
|
||||||
|
},
|
||||||
|
key,
|
||||||
|
data
|
||||||
|
)
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function decryptBuffer(data:Uint8Array, keys:string){
|
||||||
|
// hash the key to get a fixed length key value
|
||||||
|
const keyArray = await window.crypto.subtle.digest("SHA-256", new TextEncoder().encode(keys))
|
||||||
|
|
||||||
|
const key = await window.crypto.subtle.importKey(
|
||||||
|
"raw",
|
||||||
|
keyArray,
|
||||||
|
"AES-GCM",
|
||||||
|
false,
|
||||||
|
["encrypt", "decrypt"]
|
||||||
|
)
|
||||||
|
|
||||||
|
// use web crypto api to encrypt the data
|
||||||
|
const result = await window.crypto.subtle.decrypt(
|
||||||
|
{
|
||||||
|
name: "AES-GCM",
|
||||||
|
iv: new Uint8Array(12),
|
||||||
|
},
|
||||||
|
key,
|
||||||
|
data
|
||||||
|
)
|
||||||
|
|
||||||
|
return result
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user