2023-08-22 04:51:00 +02:00
|
|
|
/*
|
|
|
|
TODO:
|
|
|
|
- Check failed install file (0kb size ?)
|
|
|
|
*/
|
|
|
|
//const DEBUG_TONY_SAMA_FORK_MODE = false
|
|
|
|
|
|
|
|
import { saveSettingsDebounced } from "../../../script.js";
|
|
|
|
import { getContext, getApiUrl, extension_settings, doExtrasFetch, ModuleWorkerWrapper, modules } from "../../extensions.js";
|
|
|
|
export { MODULE_NAME };
|
|
|
|
|
|
|
|
const MODULE_NAME = 'Assets';
|
|
|
|
const DEBUG_PREFIX = "<Assets module> ";
|
|
|
|
const UPDATE_INTERVAL = 1000;
|
|
|
|
let ASSETS_JSON_URL = "https://raw.githubusercontent.com/SillyTavern/SillyTavern-Content/main/index.json"
|
|
|
|
|
|
|
|
// DBG
|
|
|
|
//if (DEBUG_TONY_SAMA_FORK_MODE)
|
|
|
|
// ASSETS_JSON_URL = "https://raw.githubusercontent.com/Tony-sama/SillyTavern-Content/main/index.json"
|
2023-08-23 05:10:55 +02:00
|
|
|
let availableAssets = {};
|
|
|
|
let currentAssets = {};
|
2023-08-22 04:51:00 +02:00
|
|
|
|
|
|
|
//#############################//
|
|
|
|
// Extension UI and Settings //
|
|
|
|
//#############################//
|
|
|
|
|
|
|
|
const defaultSettings = {
|
|
|
|
}
|
|
|
|
|
|
|
|
function loadSettings() {
|
|
|
|
updateCurrentAssets().then(function(){
|
|
|
|
fetch(ASSETS_JSON_URL)
|
|
|
|
.then(response => response.json())
|
|
|
|
.then(json => {
|
|
|
|
console.debug(DEBUG_PREFIX,"Received assets dictionary", json);
|
|
|
|
|
|
|
|
for(const i of json){
|
2023-08-23 05:10:55 +02:00
|
|
|
//console.log(DEBUG_PREFIX,i)
|
|
|
|
if (availableAssets[i["type"]] === undefined)
|
|
|
|
availableAssets[i["type"]] = [];
|
|
|
|
|
|
|
|
availableAssets[i["type"]].push(i);
|
2023-08-22 04:51:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
console.debug(DEBUG_PREFIX,"Updated available assets to",availableAssets);
|
|
|
|
|
2023-08-23 05:10:55 +02:00
|
|
|
for (const assetType in availableAssets) {
|
|
|
|
let assetTypeMenu = $('<div />', {id:"assets_audio_ambient_div", class:"assets-list-div"});
|
|
|
|
assetTypeMenu.append(`<h3>${assetType}</h3>`)
|
|
|
|
for (const i in availableAssets[assetType]) {
|
|
|
|
const asset = availableAssets[assetType][i];
|
|
|
|
const elemId = `assets_install_${assetType}_${i}`;
|
|
|
|
let element = $('<input />', { type: 'checkbox', id: elemId})
|
|
|
|
|
|
|
|
//if (DEBUG_TONY_SAMA_FORK_MODE)
|
|
|
|
// assetUrl = assetUrl.replace("https://github.com/SillyTavern/","https://github.com/Tony-sama/"); // DBG
|
|
|
|
|
|
|
|
console.debug(DEBUG_PREFIX,"Checking asset",asset["id"], asset["url"]);
|
|
|
|
|
|
|
|
if (isAssetInstalled(assetType, asset["id"])) {
|
|
|
|
console.debug(DEBUG_PREFIX,"installed, checked")
|
2023-08-22 04:51:00 +02:00
|
|
|
element.prop("disabled",true);
|
2023-08-23 05:10:55 +02:00
|
|
|
element.prop("checked",true);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
console.debug(DEBUG_PREFIX,"not installed, unchecked")
|
|
|
|
element.prop("checked",false);
|
|
|
|
element.on("click", function(){
|
|
|
|
installAsset(asset["url"], assetType, asset["id"]);
|
|
|
|
element.prop("disabled",true);
|
|
|
|
element.off("click");
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
console.debug(DEBUG_PREFIX,"Created element for BGM",asset["id"])
|
|
|
|
|
|
|
|
$(`<i></i>`)
|
|
|
|
.append(element)
|
|
|
|
.append(`<p>${asset["id"]}</p>`)
|
|
|
|
.appendTo(assetTypeMenu);
|
2023-08-22 04:51:00 +02:00
|
|
|
}
|
2023-08-23 05:10:55 +02:00
|
|
|
assetTypeMenu.appendTo("#assets_menu");
|
2023-08-22 04:51:00 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
$(document).ready(function () {
|
|
|
|
function addExtensionControls() {
|
|
|
|
const settingsHtml = `
|
|
|
|
<div id="audio_settings">
|
|
|
|
<div class="inline-drawer">
|
|
|
|
<div class="inline-drawer-toggle inline-drawer-header">
|
|
|
|
<b>Assets</b>
|
|
|
|
<div class="inline-drawer-icon fa-solid fa-circle-chevron-down down"></div>
|
|
|
|
</div>
|
|
|
|
<div class="inline-drawer-content" id="assets_menu">
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
`;
|
|
|
|
$('#extensions_settings').append(settingsHtml);
|
|
|
|
}
|
|
|
|
|
|
|
|
addExtensionControls(); // No init dependencies
|
|
|
|
loadSettings(); // Depends on Extension Controls
|
|
|
|
|
|
|
|
|
|
|
|
//const wrapper = new ModuleWorkerWrapper(moduleWorker);
|
|
|
|
//setInterval(wrapper.update.bind(wrapper), UPDATE_INTERVAL);
|
|
|
|
//moduleWorker();
|
|
|
|
})
|
|
|
|
|
2023-08-23 05:10:55 +02:00
|
|
|
function isAssetInstalled(assetType,filename) {
|
|
|
|
for(const i of currentAssets[assetType]){
|
|
|
|
//console.debug(DEBUG_PREFIX,i,filename)
|
2023-08-22 04:51:00 +02:00
|
|
|
if(i.includes(filename))
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2023-08-23 05:10:55 +02:00
|
|
|
async function installAsset(url, assetType, filename) {
|
2023-08-22 04:51:00 +02:00
|
|
|
console.debug(DEBUG_PREFIX,"Downloading ",url);
|
2023-08-23 05:10:55 +02:00
|
|
|
const save_path = "public/assets/"+assetType+"/"+filename;
|
2023-08-22 04:51:00 +02:00
|
|
|
try {
|
|
|
|
const result = await fetch(`/asset_download?url=${url}&save_path=${save_path}`);
|
2023-08-23 05:10:55 +02:00
|
|
|
let assets = result.ok ? (await result.json()) : [];
|
|
|
|
return assets;
|
2023-08-22 04:51:00 +02:00
|
|
|
}
|
|
|
|
catch (err) {
|
|
|
|
console.log(err);
|
|
|
|
return [];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//#############################//
|
|
|
|
// API Calls //
|
|
|
|
//#############################//
|
|
|
|
|
|
|
|
async function updateCurrentAssets() {
|
|
|
|
console.debug(DEBUG_PREFIX,"Checking installed assets...")
|
|
|
|
try {
|
2023-08-23 05:10:55 +02:00
|
|
|
const result = await fetch(`/get_assets`);
|
|
|
|
currentAssets = result.ok ? (await result.json()) : {};
|
2023-08-22 04:51:00 +02:00
|
|
|
}
|
|
|
|
catch (err) {
|
|
|
|
console.log(err);
|
|
|
|
}
|
2023-08-23 05:10:55 +02:00
|
|
|
console.debug(DEBUG_PREFIX,"Current assets found:",currentAssets)
|
2023-08-22 04:51:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//#############################//
|
|
|
|
// Module Worker //
|
|
|
|
//#############################//
|