From ab9aa28fe461489e59dba1644f9e19dcd195c8ce Mon Sep 17 00:00:00 2001 From: Cohee <18619528+Cohee1207@users.noreply.github.com> Date: Sat, 16 Sep 2023 18:03:31 +0300 Subject: [PATCH] Move missed endpoints --- .../scripts/extensions/expressions/index.js | 2 +- public/scripts/openai.js | 6 +- server.js | 74 ------------------- src/presets.js | 17 +++++ src/sprites.js | 60 +++++++++++++++ 5 files changed, 82 insertions(+), 77 deletions(-) diff --git a/public/scripts/extensions/expressions/index.js b/public/scripts/extensions/expressions/index.js index e6301ba3b..dd1f9f170 100644 --- a/public/scripts/extensions/expressions/index.js +++ b/public/scripts/extensions/expressions/index.js @@ -917,7 +917,7 @@ async function getSpritesList(name) { console.debug('getting sprites list'); 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()) : []; return sprites; } diff --git a/public/scripts/openai.js b/public/scripts/openai.js index 31d8d1bb2..5a8d28591 100644 --- a/public/scripts/openai.js +++ b/public/scripts/openai.js @@ -2425,14 +2425,16 @@ async function onDeletePresetClick() { $('#settings_perset_openai').trigger('change'); } - const response = await fetch('/deletepreset_openai', { + const response = await fetch('/api/presets/delete-openai', { method: 'POST', headers: getRequestHeaders(), body: JSON.stringify({ name: nameToDelete }), }); 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(); diff --git a/server.js b/server.js index 2a2925083..9d376fb08 100644 --- a/server.js +++ b/server.js @@ -2701,64 +2701,6 @@ app.post('/deletegroup', jsonParser, async (request, response) => { 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() { try { if (fs.existsSync(UPLOADS_PATH)) { @@ -2880,22 +2822,6 @@ app.post("/openai_bias", jsonParser, async function (request, response) { 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) { const messageStrings = []; messages.forEach(m => { diff --git a/src/presets.js b/src/presets.js index 249d4b20b..931f13ec9 100644 --- a/src/presets.js +++ b/src/presets.js @@ -87,6 +87,23 @@ function registerEndpoints(app, jsonParser) { writeFileAtomicSync(fullpath, JSON.stringify(request.body, null, 4), 'utf-8'); 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 = { diff --git a/src/sprites.js b/src/sprites.js index 74d882e78..d51adfc8a 100644 --- a/src/sprites.js +++ b/src/sprites.js @@ -1,10 +1,40 @@ const fs = require('fs'); const path = require('path'); +const mime = require('mime-types'); +const sanitize = require('sanitize-filename'); const writeFileAtomicSync = require('write-file-atomic').sync; const { DIRECTORIES, UPLOADS_PATH } = require('./constants'); 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. * @param {object} data RisuAI character data @@ -78,6 +108,36 @@ function importRisuSprites(data) { * @param {any} urlencodedParser URL encoded parser middleware */ 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) => { const label = request.body.label; const name = request.body.name;