@@ -662,40 +662,47 @@ let showCharacterList = async () => {
662662 saveKLiteSaveToIndexDB ( fileName , data )
663663 }
664664 else {
665- let wiToAdd = data , has_tav_wi_check = has_tavern_wi_check ( wiToAdd ) , wiName = fileName ;
666- if ( has_tav_wi_check ) {
667- if ( wiToAdd ?. name !== undefined && wiToAdd . name . trim ( ) . length > 0 ) {
668- wiName = wiToAdd . name
669- }
670- wiToAdd = load_tavern_wi ( wiToAdd ) ;
671- if ( wiToAdd && wiToAdd . length > 0 ) {
672- wiToAdd . forEach ( wi => wi . wigroup = fileName . replace ( "'" , "" ) )
673- }
665+ if ( ! data . scenarioVersion && ( data . name != null || data . description != null ||
666+ data . personality != null || ( data . spec == "chara_card_v2" || data . spec == "chara_card_v3" ) || has_tav_wi_check ) ) {
667+ saveCharacterDataToIndexDB ( undefined , data , fileName )
674668 }
675- else {
676- try {
677- let hasNoGeneralWI = wiToAdd . length === 0 || wiToAdd . find ( wi => wi ?. wigroup === undefined || wi . wigroup . trim ( ) === null || wi . wigroup === "" || wi . wigroup === "General" ) === undefined ;
678- if ( hasNoGeneralWI ) {
679- let wiAllHaveSameGroup = wiToAdd . find ( ( e , p , a ) => a . find ( c => c ?. wigroup !== e . wigroup ) ) === undefined
680- if ( wiAllHaveSameGroup ) {
681- wiName = wiToAdd [ 0 ] . wigroup
669+ else
670+ {
671+ let wiToAdd = data , has_tav_wi_check = has_tavern_wi_check ( wiToAdd ) , wiName = fileName ;
672+ if ( has_tav_wi_check ) {
673+ if ( wiToAdd ?. name !== undefined && wiToAdd . name . trim ( ) . length > 0 ) {
674+ wiName = wiToAdd . name
675+ }
676+ wiToAdd = load_tavern_wi ( wiToAdd ) ;
677+ if ( wiToAdd && wiToAdd . length > 0 ) {
678+ wiToAdd . forEach ( wi => wi . wigroup = fileName . replace ( "'" , "" ) )
679+ }
680+ }
681+ else {
682+ try {
683+ let hasNoGeneralWI = wiToAdd . length === 0 || wiToAdd . find ( wi => wi ?. wigroup === undefined || wi . wigroup . trim ( ) === null || wi . wigroup === "" || wi . wigroup === "General" ) === undefined ;
684+ if ( hasNoGeneralWI ) {
685+ let wiAllHaveSameGroup = wiToAdd . find ( ( e , p , a ) => a . find ( c => c ?. wigroup !== e . wigroup ) ) === undefined
686+ if ( wiAllHaveSameGroup ) {
687+ wiName = wiToAdd [ 0 ] . wigroup
688+ }
682689 }
683690 }
691+ catch ( e ) {
692+ console . error ( e )
693+ }
684694 }
685- catch ( e ) {
686- console . error ( e )
695+ if ( Array . isArray ( wiToAdd ) ) {
696+ wiToAdd = wiToAdd . filter ( wi => wi ?. key !== undefined )
697+ if ( wiToAdd . length > 0 ) {
698+ saveLorebookToIndexDB ( wiName , wiToAdd , JSON . parse ( plaintext ) )
699+ }
687700 }
688- }
689- if ( Array . isArray ( wiToAdd ) ) {
690- wiToAdd = wiToAdd . filter ( wi => wi ?. key !== undefined )
691- if ( wiToAdd . length > 0 ) {
692- saveLorebookToIndexDB ( wiName , wiToAdd , JSON . parse ( plaintext ) )
701+ else {
702+ waitingToast . hide ( )
703+ handleError ( `${ fileName } : JSON does not contain WI or lorebook` )
693704 }
694705 }
695- else {
696- waitingToast . hide ( )
697- handleError ( `${ fileName } : JSON does not contain WI or lorebook` )
698- }
699706 }
700707 }
701708 }
@@ -839,6 +846,13 @@ let showCharacterList = async () => {
839846 a . click ( ) ;
840847 a . remove ( ) ;
841848 }
849+ let jsObjToBytes = ( data ) => {
850+ let bytes = new TextEncoder ( ) . encode ( JSON . stringify ( data ) ) , text = "" ;
851+ for ( var i = 0 ; i < Math . ceil ( bytes . length / 32768.0 ) ; i ++ ) {
852+ text += String . fromCharCode . apply ( null , bytes . slice ( i * 32768 , Math . min ( ( i + 1 ) * 32768 , bytes . length ) ) )
853+ }
854+ return text
855+ }
842856 createSearchInput ( )
843857 for ( let i = 0 ; i < allCharacterNames . length ; i ++ ) {
844858 let { name, thumbnail } = allCharacterNames [ i ] , type = getTypeFromAllCharacterData ( allCharacterNames [ i ] ) ;
@@ -889,8 +903,19 @@ let showCharacterList = async () => {
889903 }
890904 } ) . button ( "Download character" , async ( ) => {
891905 popupUtils . reset ( )
892- let charData = await getCharacterData ( name ) , { image } = charData ;
893- downloadB64URL ( `${ name } .png` , image )
906+ let charData = await getCharacterData ( name ) ;
907+ if ( ! ! charData ?. image ) {
908+ downloadB64URL ( `${ name } .png` , charData . image )
909+ }
910+ else
911+ {
912+ try {
913+ downloadB64URL ( `${ name } .json` , `data:application/json;base64,${ btoa ( jsObjToBytes ( charData . data ) ) } ` )
914+ }
915+ catch ( e ) {
916+ handleError ( e )
917+ }
918+ }
894919 } ) . button ( "Delete character" , async ( ) => {
895920 popupUtils . reset ( )
896921 msgboxYesNo ( "Are you sure you wish to delete?" , "Character manager" , async ( ) => {
@@ -924,11 +949,7 @@ let showCharacterList = async () => {
924949 let charData = await getCharacterData ( name ) , { originalData } = charData ;
925950 if ( ! ! originalData ) {
926951 try {
927- let bytes = new TextEncoder ( ) . encode ( JSON . stringify ( originalData ) ) , text = "" ;
928- for ( var i = 0 ; i < Math . ceil ( bytes . length / 32768.0 ) ; i ++ ) {
929- text += String . fromCharCode . apply ( null , bytes . slice ( i * 32768 , Math . min ( ( i + 1 ) * 32768 , bytes . length ) ) )
930- }
931- downloadB64URL ( `${ name } .json` , `data:application/json;base64,${ btoa ( text ) } ` )
952+ downloadB64URL ( `${ name } .json` , `data:application/json;base64,${ btoa ( jsObjToBytes ( originalData ) ) } ` )
932953 }
933954 catch ( e ) {
934955 handleError ( e )
0 commit comments