@@ -594,6 +594,13 @@ let getScenariosAndLegacyServerSaves = async () => {
594594
595595let maxLengthForSection = 500 , halfMaxLengthForSection = Math . floor ( maxLengthForSection / 2 ) ;
596596let showCharacterList = async ( ) => {
597+ // Still processing characters
598+ if ( ! ! window ?. debounce_pending_updateCharacterListFromAll || ! ! window ?. pending_encrypt )
599+ {
600+ handleError ( "Please wait - data is still being loaded" )
601+ return
602+ }
603+
597604 let containers = [ ]
598605
599606 let createIcon = ( name , image ) => {
@@ -662,40 +669,47 @@ let showCharacterList = async () => {
662669 saveKLiteSaveToIndexDB ( fileName , data )
663670 }
664671 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- }
672+ if ( ! data . scenarioVersion && ( data . name != null || data . description != null ||
673+ data . personality != null || ( data . spec == "chara_card_v2" || data . spec == "chara_card_v3" ) || has_tav_wi_check ) ) {
674+ saveCharacterDataToIndexDB ( undefined , data , fileName )
674675 }
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
676+ else
677+ {
678+ let wiToAdd = data , has_tav_wi_check = has_tavern_wi_check ( wiToAdd ) , wiName = fileName ;
679+ if ( has_tav_wi_check ) {
680+ if ( wiToAdd ?. name !== undefined && wiToAdd . name . trim ( ) . length > 0 ) {
681+ wiName = wiToAdd . name
682+ }
683+ wiToAdd = load_tavern_wi ( wiToAdd ) ;
684+ if ( wiToAdd && wiToAdd . length > 0 ) {
685+ wiToAdd . forEach ( wi => wi . wigroup = fileName . replace ( "'" , "" ) )
686+ }
687+ }
688+ else {
689+ try {
690+ let hasNoGeneralWI = wiToAdd . length === 0 || wiToAdd . find ( wi => wi ?. wigroup === undefined || wi . wigroup . trim ( ) === null || wi . wigroup === "" || wi . wigroup === "General" ) === undefined ;
691+ if ( hasNoGeneralWI ) {
692+ let wiAllHaveSameGroup = wiToAdd . find ( ( e , p , a ) => a . find ( c => c ?. wigroup !== e . wigroup ) ) === undefined
693+ if ( wiAllHaveSameGroup ) {
694+ wiName = wiToAdd [ 0 ] . wigroup
695+ }
682696 }
683697 }
698+ catch ( e ) {
699+ console . error ( e )
700+ }
684701 }
685- catch ( e ) {
686- console . error ( e )
702+ if ( Array . isArray ( wiToAdd ) ) {
703+ wiToAdd = wiToAdd . filter ( wi => wi ?. key !== undefined )
704+ if ( wiToAdd . length > 0 ) {
705+ saveLorebookToIndexDB ( wiName , wiToAdd , JSON . parse ( plaintext ) )
706+ }
687707 }
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 ) )
708+ else {
709+ waitingToast . hide ( )
710+ handleError ( `${ fileName } : JSON does not contain WI or lorebook` )
693711 }
694712 }
695- else {
696- waitingToast . hide ( )
697- handleError ( `${ fileName } : JSON does not contain WI or lorebook` )
698- }
699713 }
700714 }
701715 }
@@ -839,6 +853,13 @@ let showCharacterList = async () => {
839853 a . click ( ) ;
840854 a . remove ( ) ;
841855 }
856+ let jsObjToBytes = ( data ) => {
857+ let bytes = new TextEncoder ( ) . encode ( JSON . stringify ( data ) ) , text = "" ;
858+ for ( var i = 0 ; i < Math . ceil ( bytes . length / 32768.0 ) ; i ++ ) {
859+ text += String . fromCharCode . apply ( null , bytes . slice ( i * 32768 , Math . min ( ( i + 1 ) * 32768 , bytes . length ) ) )
860+ }
861+ return text
862+ }
842863 createSearchInput ( )
843864 for ( let i = 0 ; i < allCharacterNames . length ; i ++ ) {
844865 let { name, thumbnail } = allCharacterNames [ i ] , type = getTypeFromAllCharacterData ( allCharacterNames [ i ] ) ;
@@ -889,8 +910,19 @@ let showCharacterList = async () => {
889910 }
890911 } ) . button ( "Download character" , async ( ) => {
891912 popupUtils . reset ( )
892- let charData = await getCharacterData ( name ) , { image } = charData ;
893- downloadB64URL ( `${ name } .png` , image )
913+ let charData = await getCharacterData ( name ) ;
914+ if ( ! ! charData ?. image ) {
915+ downloadB64URL ( `${ name } .png` , charData . image )
916+ }
917+ else
918+ {
919+ try {
920+ downloadB64URL ( `${ name } .json` , `data:application/json;base64,${ btoa ( jsObjToBytes ( charData . data ) ) } ` )
921+ }
922+ catch ( e ) {
923+ handleError ( e )
924+ }
925+ }
894926 } ) . button ( "Delete character" , async ( ) => {
895927 popupUtils . reset ( )
896928 msgboxYesNo ( "Are you sure you wish to delete?" , "Character manager" , async ( ) => {
@@ -924,11 +956,7 @@ let showCharacterList = async () => {
924956 let charData = await getCharacterData ( name ) , { originalData } = charData ;
925957 if ( ! ! originalData ) {
926958 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 ) } ` )
959+ downloadB64URL ( `${ name } .json` , `data:application/json;base64,${ btoa ( jsObjToBytes ( originalData ) ) } ` )
932960 }
933961 catch ( e ) {
934962 handleError ( e )
@@ -1126,6 +1154,10 @@ let showCharacterList = async () => {
11261154 }
11271155 } , false ) ;
11281156 } )
1157+ . button ( "Download" , ( ) => {
1158+ popupUtils . reset ( )
1159+ save_file_button ( )
1160+ } )
11291161 . button ( "Share" , ( ) => {
11301162 popupUtils . reset ( )
11311163 share_story_button ( )
0 commit comments