58 lines
1.7 KiB
TypeScript
58 lines
1.7 KiB
TypeScript
import { get } from "svelte/store";
|
|
import { runTrigger } from "./process/triggers";
|
|
import { CurrentCharacter, CurrentChat } from "./stores";
|
|
import { runCharacterJS } from "./plugins/embedscript";
|
|
import { sleep } from "./util";
|
|
|
|
|
|
function nodeObserve(node:HTMLElement){
|
|
const triggerName = node.getAttribute('risu-trigger');
|
|
const btnEvent = node.getAttribute('risu-btn');
|
|
const observerAdded = node.getAttribute('risu-observer');
|
|
|
|
if(observerAdded){
|
|
return
|
|
}
|
|
if(triggerName){
|
|
node.addEventListener('click', async () => {
|
|
const currentChar = get(CurrentCharacter)
|
|
if(currentChar.type === 'group'){
|
|
return;
|
|
}
|
|
const triggerResult = await runTrigger(currentChar, 'manual', {
|
|
chat: get(CurrentChat),
|
|
manualName: triggerName,
|
|
});
|
|
|
|
if(triggerResult){
|
|
CurrentChat.set(triggerResult.chat);
|
|
}
|
|
|
|
}, {
|
|
passive: true,
|
|
});
|
|
node.setAttribute('risu-observer', 'true');
|
|
return
|
|
}
|
|
|
|
if(btnEvent){
|
|
node.addEventListener('click',async ()=>{
|
|
await runCharacterJS({
|
|
code: null,
|
|
mode: 'onButtonClick',
|
|
data: btnEvent
|
|
})
|
|
}, {passive: true})
|
|
node.setAttribute('risu-observer', 'true');
|
|
return
|
|
}
|
|
}
|
|
|
|
export async function startObserveDom(){
|
|
//We are using a while loop intead of MutationObserver because MutationObserver is expensive for just a few elements
|
|
while(true){
|
|
document.querySelectorAll('[risu-trigger]').forEach(nodeObserve);
|
|
document.querySelectorAll('[risu-btn]').forEach(nodeObserve);
|
|
await sleep(100);
|
|
}
|
|
} |