mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-06-05 21:59:27 +02:00
Move missed endpoints
This commit is contained in:
@ -917,7 +917,7 @@ async function getSpritesList(name) {
|
|||||||
console.debug('getting sprites list');
|
console.debug('getting sprites list');
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const result = await fetch(`/get_sprites?name=${encodeURIComponent(name)}`);
|
const result = await fetch(`/api/sprites/get?name=${encodeURIComponent(name)}`);
|
||||||
let sprites = result.ok ? (await result.json()) : [];
|
let sprites = result.ok ? (await result.json()) : [];
|
||||||
return sprites;
|
return sprites;
|
||||||
}
|
}
|
||||||
|
@ -2425,14 +2425,16 @@ async function onDeletePresetClick() {
|
|||||||
$('#settings_perset_openai').trigger('change');
|
$('#settings_perset_openai').trigger('change');
|
||||||
}
|
}
|
||||||
|
|
||||||
const response = await fetch('/deletepreset_openai', {
|
const response = await fetch('/api/presets/delete-openai', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: getRequestHeaders(),
|
headers: getRequestHeaders(),
|
||||||
body: JSON.stringify({ name: nameToDelete }),
|
body: JSON.stringify({ name: nameToDelete }),
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
console.warn('Preset was not deleted from server');
|
toastr.warning('Preset was not deleted from server');
|
||||||
|
} else {
|
||||||
|
toastr.success('Preset deleted');
|
||||||
}
|
}
|
||||||
|
|
||||||
saveSettingsDebounced();
|
saveSettingsDebounced();
|
||||||
|
74
server.js
74
server.js
@ -2701,64 +2701,6 @@ app.post('/deletegroup', jsonParser, async (request, response) => {
|
|||||||
return response.send({ ok: true });
|
return response.send({ ok: true });
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the path to the sprites folder for the provided character name
|
|
||||||
* @param {string} name - The name of the character
|
|
||||||
* @param {boolean} isSubfolder - Whether the name contains a subfolder
|
|
||||||
* @returns {string | null} The path to the sprites folder. Null if the name is invalid.
|
|
||||||
*/
|
|
||||||
function getSpritesPath(name, isSubfolder) {
|
|
||||||
if (isSubfolder) {
|
|
||||||
const nameParts = name.split('/');
|
|
||||||
const characterName = sanitize(nameParts[0]);
|
|
||||||
const subfolderName = sanitize(nameParts[1]);
|
|
||||||
|
|
||||||
if (!characterName || !subfolderName) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return path.join(DIRECTORIES.characters, characterName, subfolderName);
|
|
||||||
}
|
|
||||||
|
|
||||||
name = sanitize(name);
|
|
||||||
|
|
||||||
if (!name) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return path.join(DIRECTORIES.characters, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
app.get('/get_sprites', jsonParser, function (request, response) {
|
|
||||||
const name = String(request.query.name);
|
|
||||||
const isSubfolder = name.includes('/');
|
|
||||||
const spritesPath = getSpritesPath(name, isSubfolder);
|
|
||||||
let sprites = [];
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (spritesPath && fs.existsSync(spritesPath) && fs.statSync(spritesPath).isDirectory()) {
|
|
||||||
sprites = fs.readdirSync(spritesPath)
|
|
||||||
.filter(file => {
|
|
||||||
const mimeType = mime.lookup(file);
|
|
||||||
return mimeType && mimeType.startsWith('image/');
|
|
||||||
})
|
|
||||||
.map((file) => {
|
|
||||||
const pathToSprite = path.join(spritesPath, file);
|
|
||||||
return {
|
|
||||||
label: path.parse(pathToSprite).name.toLowerCase(),
|
|
||||||
path: `/characters/${name}/${file}`,
|
|
||||||
};
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (err) {
|
|
||||||
console.log(err);
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
return response.send(sprites);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
function cleanUploads() {
|
function cleanUploads() {
|
||||||
try {
|
try {
|
||||||
if (fs.existsSync(UPLOADS_PATH)) {
|
if (fs.existsSync(UPLOADS_PATH)) {
|
||||||
@ -2880,22 +2822,6 @@ app.post("/openai_bias", jsonParser, async function (request, response) {
|
|||||||
return response.send(result);
|
return response.send(result);
|
||||||
});
|
});
|
||||||
|
|
||||||
app.post("/deletepreset_openai", jsonParser, function (request, response) {
|
|
||||||
if (!request.body || !request.body.name) {
|
|
||||||
return response.sendStatus(400);
|
|
||||||
}
|
|
||||||
|
|
||||||
const name = request.body.name;
|
|
||||||
const pathToFile = path.join(DIRECTORIES.openAI_Settings, `${name}.settings`);
|
|
||||||
|
|
||||||
if (fs.existsSync(pathToFile)) {
|
|
||||||
fs.rmSync(pathToFile);
|
|
||||||
return response.send({ ok: true });
|
|
||||||
}
|
|
||||||
|
|
||||||
return response.send({ error: true });
|
|
||||||
});
|
|
||||||
|
|
||||||
function convertChatMLPrompt(messages) {
|
function convertChatMLPrompt(messages) {
|
||||||
const messageStrings = [];
|
const messageStrings = [];
|
||||||
messages.forEach(m => {
|
messages.forEach(m => {
|
||||||
|
@ -87,6 +87,23 @@ function registerEndpoints(app, jsonParser) {
|
|||||||
writeFileAtomicSync(fullpath, JSON.stringify(request.body, null, 4), 'utf-8');
|
writeFileAtomicSync(fullpath, JSON.stringify(request.body, null, 4), 'utf-8');
|
||||||
return response.send({ name });
|
return response.send({ name });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// TODO: Merge with /api/presets/delete
|
||||||
|
app.post("/api/presets/delete-openai", jsonParser, function (request, response) {
|
||||||
|
if (!request.body || !request.body.name) {
|
||||||
|
return response.sendStatus(400);
|
||||||
|
}
|
||||||
|
|
||||||
|
const name = request.body.name;
|
||||||
|
const pathToFile = path.join(DIRECTORIES.openAI_Settings, `${name}.settings`);
|
||||||
|
|
||||||
|
if (fs.existsSync(pathToFile)) {
|
||||||
|
fs.rmSync(pathToFile);
|
||||||
|
return response.send({ ok: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
return response.send({ error: true });
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
@ -1,10 +1,40 @@
|
|||||||
|
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
const mime = require('mime-types');
|
||||||
|
const sanitize = require('sanitize-filename');
|
||||||
const writeFileAtomicSync = require('write-file-atomic').sync;
|
const writeFileAtomicSync = require('write-file-atomic').sync;
|
||||||
const { DIRECTORIES, UPLOADS_PATH } = require('./constants');
|
const { DIRECTORIES, UPLOADS_PATH } = require('./constants');
|
||||||
const { getImageBuffers } = require('./util');
|
const { getImageBuffers } = require('./util');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the path to the sprites folder for the provided character name
|
||||||
|
* @param {string} name - The name of the character
|
||||||
|
* @param {boolean} isSubfolder - Whether the name contains a subfolder
|
||||||
|
* @returns {string | null} The path to the sprites folder. Null if the name is invalid.
|
||||||
|
*/
|
||||||
|
function getSpritesPath(name, isSubfolder) {
|
||||||
|
if (isSubfolder) {
|
||||||
|
const nameParts = name.split('/');
|
||||||
|
const characterName = sanitize(nameParts[0]);
|
||||||
|
const subfolderName = sanitize(nameParts[1]);
|
||||||
|
|
||||||
|
if (!characterName || !subfolderName) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return path.join(DIRECTORIES.characters, characterName, subfolderName);
|
||||||
|
}
|
||||||
|
|
||||||
|
name = sanitize(name);
|
||||||
|
|
||||||
|
if (!name) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return path.join(DIRECTORIES.characters, name);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Imports base64 encoded sprites from RisuAI character data.
|
* Imports base64 encoded sprites from RisuAI character data.
|
||||||
* @param {object} data RisuAI character data
|
* @param {object} data RisuAI character data
|
||||||
@ -78,6 +108,36 @@ function importRisuSprites(data) {
|
|||||||
* @param {any} urlencodedParser URL encoded parser middleware
|
* @param {any} urlencodedParser URL encoded parser middleware
|
||||||
*/
|
*/
|
||||||
function registerEndpoints(app, jsonParser, urlencodedParser) {
|
function registerEndpoints(app, jsonParser, urlencodedParser) {
|
||||||
|
app.get('/api/sprites/get', jsonParser, function (request, response) {
|
||||||
|
const name = String(request.query.name);
|
||||||
|
const isSubfolder = name.includes('/');
|
||||||
|
const spritesPath = getSpritesPath(name, isSubfolder);
|
||||||
|
let sprites = [];
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (spritesPath && fs.existsSync(spritesPath) && fs.statSync(spritesPath).isDirectory()) {
|
||||||
|
sprites = fs.readdirSync(spritesPath)
|
||||||
|
.filter(file => {
|
||||||
|
const mimeType = mime.lookup(file);
|
||||||
|
return mimeType && mimeType.startsWith('image/');
|
||||||
|
})
|
||||||
|
.map((file) => {
|
||||||
|
const pathToSprite = path.join(spritesPath, file);
|
||||||
|
return {
|
||||||
|
label: path.parse(pathToSprite).name.toLowerCase(),
|
||||||
|
path: `/characters/${name}/${file}`,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
console.log(err);
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
return response.send(sprites);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
app.post('/api/sprites/delete', jsonParser, async (request, response) => {
|
app.post('/api/sprites/delete', jsonParser, async (request, response) => {
|
||||||
const label = request.body.label;
|
const label = request.body.label;
|
||||||
const name = request.body.name;
|
const name = request.body.name;
|
||||||
|
Reference in New Issue
Block a user