diff --git a/src/ts/parser.ts b/src/ts/parser.ts index 3ec76a60..f56aedde 100644 --- a/src/ts/parser.ts +++ b/src/ts/parser.ts @@ -283,6 +283,208 @@ function wppParser(data:string){ const rgx = /(?:{{|<)(.+?)(?:}}|>)/gm +const matcher = (p1:string,matcherArg:{chatID:number,db:Database,chara:character|string,rmVar:boolean}) => { + const lowerCased = p1.toLocaleLowerCase() + const chatID = matcherArg.chatID + const db = matcherArg.db + const chara = matcherArg.chara + switch(lowerCased){ + case 'previous_char_chat':{ + if(chatID !== -1){ + const selchar = db.characters[get(selectedCharID)] + const chat = selchar.chats[selchar.chatPage] + let pointer = chatID - 1 + while(pointer >= 0){ + if(chat.message[pointer].role === 'char'){ + return chat.message[pointer].data + } + pointer-- + } + return selchar.firstMsgIndex === -1 ? selchar.firstMessage : selchar.alternateGreetings[selchar.firstMsgIndex] + } + return '' + } + case 'previous_user_chat':{ + if(chatID !== -1){ + const selchar = db.characters[get(selectedCharID)] + const chat = selchar.chats[selchar.chatPage] + let pointer = chatID - 1 + while(pointer >= 0){ + if(chat.message[pointer].role === 'user'){ + return chat.message[pointer].data + } + pointer-- + } + return selchar.firstMsgIndex === -1 ? selchar.firstMessage : selchar.alternateGreetings[selchar.firstMsgIndex] + } + return '' + } + case 'char': + case 'bot':{ + let selectedChar = get(selectedCharID) + let currentChar = db.characters[selectedChar] + if(currentChar.type !== 'group'){ + return currentChar.name + } + if(chara){ + if(typeof(chara) === 'string'){ + return chara + } + else{ + return chara.name + } + } + return currentChar.name + } + case 'user':{ + return db.username + } + case 'personality': + case 'char_persona':{ + const argChara = chara + const achara = (argChara && typeof(argChara) !== 'string') ? argChara : (db.characters[get(selectedCharID)]) + if(achara.type === 'group'){ + return "" + } + return achara.personality + } + case 'description': + case 'char_desc':{ + const argChara = chara + const achara = (argChara && typeof(argChara) !== 'string') ? argChara : (db.characters[get(selectedCharID)]) + if(achara.type === 'group'){ + return "" + } + return achara.desc + } + case 'scenario':{ + const argChara = chara + const achara = (argChara && typeof(argChara) !== 'string') ? argChara : (db.characters[get(selectedCharID)]) + if(achara.type === 'group'){ + return "" + } + return achara.scenario + } + case 'example_dialogue': + case 'example_message':{ + const argChara = chara + const achara = (argChara && typeof(argChara) !== 'string') ? argChara : (db.characters[get(selectedCharID)]) + if(achara.type === 'group'){ + return "" + } + return achara.exampleMessage + } + case 'persona': + case 'user_persona':{ + return db.personaPrompt + } + case 'main_prompt': + case 'system_prompt':{ + return db.mainPrompt + } + case 'lorebook': + case 'world_info':{ + const argChara = chara + const achara = (argChara && typeof(argChara) !== 'string') ? argChara : (db.characters[get(selectedCharID)]) + const selchar = db.characters[get(selectedCharID)] + const chat = selchar.chats[selchar.chatPage] + const characterLore = (achara.type === 'group') ? [] : (achara.globalLore ?? []) + const chatLore = chat.localLore ?? [] + const globalLore = db.loreBook[db.loreBookPage]?.data ?? [] + const fullLore = characterLore.concat(chatLore.concat(globalLore)) + return fullLore.map((f) => { + return JSON.stringify(f) + }).join("§\n") + } + case 'history': + case 'messages':{ + const selchar = db.characters[get(selectedCharID)] + const chat = selchar.chats[selchar.chatPage] + return chat.message.map((f) => { + return JSON.stringify(f) + }).join("§\n") + } + case 'ujb': + case 'global_note': + case 'system_note':{ + return db.globalNote + } + case 'chat_index':{ + return chatID.toString() + } + case 'blank': + case 'none':{ + return '' + } + } + const arra = p1.split("::") + if(arra.length > 1){ + const v = arra[1] + switch(arra[0]){ + case 'getvar':{ + const d =getVarChat(chatID) + return d[v] ?? "[Null]" + } + case 'calc':{ + return calcString(v).toString() + } + case 'addvar': + case 'setvar':{ + if(matcherArg.rmVar){ + return '' + } + break + } + case 'button':{ + return `` + } + case 'risu':{ + return `` + } + } + } + if(p1.startsWith('random')){ + if(p1.startsWith('random::')){ + const randomIndex = Math.floor(Math.random() * (arra.length - 1)) + 1 + return arra[randomIndex] + } + else{ + const arr = p1.split(/\:|\,/g) + const randomIndex = Math.floor(Math.random() * (arr.length - 1)) + 1 + return arr[randomIndex] + } + } + return null +} + +const smMatcher = (p1:string,matcherArg:{db:Database,chara:character|string,rmVar:boolean}) => { + const lowerCased = p1.toLocaleLowerCase() + const db = matcherArg.db + const chara = matcherArg.chara + switch(lowerCased){ + case 'char': + case 'bot':{ + let selectedChar = get(selectedCharID) + let currentChar = db.characters[selectedChar] + if(currentChar.type !== 'group'){ + return currentChar.name + } + if(chara){ + if(typeof(chara) === 'string'){ + return chara + } + else{ + return chara.name + } + } + return currentChar.name + } + case 'user':{ + return db.username + } + } +} + export function risuChatParser(da:string, arg:{ chatID?:number db?:Database @@ -305,181 +507,18 @@ export function risuChatParser(da:string, arg:{ chara = aChara } } - const matcher = (p1:string) => { - const lowerCased = p1.toLocaleLowerCase() - switch(lowerCased){ - case 'previous_char_chat':{ - if(chatID !== -1){ - const selchar = db.characters[get(selectedCharID)] - const chat = selchar.chats[selchar.chatPage] - let pointer = chatID - 1 - while(pointer >= 0){ - if(chat.message[pointer].role === 'char'){ - return chat.message[pointer].data - } - pointer-- - } - return selchar.firstMsgIndex === -1 ? selchar.firstMessage : selchar.alternateGreetings[selchar.firstMsgIndex] - } - return '' - } - case 'previous_user_chat':{ - if(chatID !== -1){ - const selchar = db.characters[get(selectedCharID)] - const chat = selchar.chats[selchar.chatPage] - let pointer = chatID - 1 - while(pointer >= 0){ - if(chat.message[pointer].role === 'user'){ - return chat.message[pointer].data - } - pointer-- - } - return selchar.firstMsgIndex === -1 ? selchar.firstMessage : selchar.alternateGreetings[selchar.firstMsgIndex] - } - return '' - } - case 'char': - case 'bot':{ - let selectedChar = get(selectedCharID) - let currentChar = db.characters[selectedChar] - if(currentChar.type !== 'group'){ - return currentChar.name - } - if(chara){ - if(typeof(chara) === 'string'){ - return chara - } - else{ - return chara.name - } - } - return currentChar.name - } - case 'user':{ - return db.username - } - case 'personality': - case 'char_persona':{ - const argChara = chara - const achara = (argChara && typeof(argChara) !== 'string') ? argChara : (db.characters[get(selectedCharID)]) - if(achara.type === 'group'){ - return "" - } - return achara.personality - } - case 'description': - case 'char_desc':{ - const argChara = chara - const achara = (argChara && typeof(argChara) !== 'string') ? argChara : (db.characters[get(selectedCharID)]) - if(achara.type === 'group'){ - return "" - } - return achara.desc - } - case 'scenario':{ - const argChara = chara - const achara = (argChara && typeof(argChara) !== 'string') ? argChara : (db.characters[get(selectedCharID)]) - if(achara.type === 'group'){ - return "" - } - return achara.scenario - } - case 'example_dialogue': - case 'example_message':{ - const argChara = chara - const achara = (argChara && typeof(argChara) !== 'string') ? argChara : (db.characters[get(selectedCharID)]) - if(achara.type === 'group'){ - return "" - } - return achara.exampleMessage - } - case 'persona': - case 'user_persona':{ - return db.personaPrompt - } - case 'main_prompt': - case 'system_prompt':{ - return db.mainPrompt - } - case 'lorebook': - case 'world_info':{ - const argChara = chara - const achara = (argChara && typeof(argChara) !== 'string') ? argChara : (db.characters[get(selectedCharID)]) - const selchar = db.characters[get(selectedCharID)] - const chat = selchar.chats[selchar.chatPage] - const characterLore = (achara.type === 'group') ? [] : (achara.globalLore ?? []) - const chatLore = chat.localLore ?? [] - const globalLore = db.loreBook[db.loreBookPage]?.data ?? [] - const fullLore = characterLore.concat(chatLore.concat(globalLore)) - return fullLore.map((f) => { - return JSON.stringify(f) - }).join("§\n") - } - case 'history': - case 'messages':{ - const selchar = db.characters[get(selectedCharID)] - const chat = selchar.chats[selchar.chatPage] - return chat.message.map((f) => { - return JSON.stringify(f) - }).join("§\n") - } - case 'ujb': - case 'global_note': - case 'system_note':{ - return db.globalNote - } - case 'chat_index':{ - return chatID.toString() - } - case 'blank': - case 'none':{ - return '' - } - } - const arra = p1.split("::") - if(arra.length > 1){ - const v = arra[1] - switch(arra[0]){ - case 'getvar':{ - const d =getVarChat(chatID) - return d[v] ?? "[Null]" - } - case 'calc':{ - return calcString(v).toString() - } - case 'addvar': - case 'setvar':{ - if(arg.rmVar){ - return '' - } - break - } - case 'button':{ - return `` - } - case 'risu':{ - return `` - } - } - } - if(p1.startsWith('random')){ - if(p1.startsWith('random::')){ - const randomIndex = Math.floor(Math.random() * (arra.length - 1)) + 1 - return arra[randomIndex] - } - else{ - const arr = p1.split(/\:|\,/g) - const randomIndex = Math.floor(Math.random() * (arr.length - 1)) + 1 - return arr[randomIndex] - } - } - return null - } + let pointer = 0; let nested:string[] = [""] let pf = performance.now() let v = new Uint8Array(255) + const matcherObj = { + chatID: chatID, + chara: chara, + rmVar: arg.rmVar ?? false, + db: db + } while(pointer < da.length){ switch(da[pointer]){ case '{':{ @@ -504,7 +543,7 @@ export function risuChatParser(da:string, arg:{ } pointer++ const dat = nested.shift() - const mc = matcher(dat) + const mc = matcher(dat, matcherObj) nested[0] += mc ?? `{{${dat}}}` break } @@ -513,7 +552,7 @@ export function risuChatParser(da:string, arg:{ break } const dat = nested.shift() - const mc = matcher(dat) + const mc = smMatcher(dat, matcherObj) nested[0] += mc ?? `<${dat}>` break }