mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-06-05 21:59:27 +02:00
123 lines
3.6 KiB
JavaScript
123 lines
3.6 KiB
JavaScript
import { getBase64Async } from "../../utils.js";
|
|
import { getContext, getApiUrl } from "../../extensions.js";
|
|
export { MODULE_NAME };
|
|
|
|
const MODULE_NAME = 'caption';
|
|
const UPDATE_INTERVAL = 1000;
|
|
|
|
async function moduleWorker() {
|
|
const context = getContext();
|
|
|
|
context.onlineStatus === 'no_connection'
|
|
? $('#send_picture').hide(200)
|
|
: $('#send_picture').show(200);
|
|
}
|
|
|
|
async function setImageIcon() {
|
|
try {
|
|
const sendButton = document.getElementById('send_picture');
|
|
sendButton.style.backgroundImage = `url('/img/image-solid.svg')`;
|
|
sendButton.classList.remove('spin');
|
|
}
|
|
catch (error) {
|
|
console.log(error);
|
|
}
|
|
}
|
|
|
|
async function setSpinnerIcon() {
|
|
try {
|
|
const sendButton = document.getElementById('send_picture');
|
|
sendButton.style.backgroundImage = `url('/img/spinner-solid.svg')`;
|
|
sendButton.classList.add('spin');
|
|
}
|
|
catch (error) {
|
|
console.log(error);
|
|
}
|
|
}
|
|
|
|
async function sendCaptionedMessage(caption, image) {
|
|
const context = getContext();
|
|
const messageText = `[${context.name1} sends ${context.name2 ?? ''} a picture that contains: ${caption}]`;
|
|
const message = {
|
|
name: context.name1,
|
|
is_user: true,
|
|
is_name: true,
|
|
send_date: Date.now(),
|
|
mes: messageText,
|
|
extra: { image: image },
|
|
title: caption
|
|
};
|
|
context.chat.push(message);
|
|
context.addOneMessage(message);
|
|
await context.generate();
|
|
}
|
|
|
|
async function onSelectImage(e) {
|
|
setSpinnerIcon();
|
|
const file = e.target.files[0];
|
|
|
|
if (!file) {
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const base64Img = await getBase64Async(file);
|
|
const url = new URL(getApiUrl());
|
|
url.pathname = '/api/caption';
|
|
|
|
const apiResult = await fetch(url, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'Bypass-Tunnel-Reminder': 'bypass',
|
|
},
|
|
body: JSON.stringify({ image: base64Img.split(',')[1] })
|
|
});
|
|
|
|
if (apiResult.ok) {
|
|
const data = await apiResult.json();
|
|
const caption = data.caption;
|
|
await sendCaptionedMessage(caption, base64Img);
|
|
}
|
|
}
|
|
catch (error) {
|
|
console.log(error);
|
|
}
|
|
finally {
|
|
e.target.form.reset();
|
|
setImageIcon();
|
|
}
|
|
}
|
|
|
|
$(document).ready(function () {
|
|
function patchSendForm() {
|
|
const columns = $('#send_form').css('grid-template-columns').split(' ');
|
|
columns[columns.length - 1] = `${parseInt(columns[columns.length - 1]) + 40}px`;
|
|
columns[1] = 'auto';
|
|
$('#send_form').css('grid-template-columns', columns.join(' '));
|
|
}
|
|
function addSendPictureButton() {
|
|
const sendButton = document.createElement('input');
|
|
sendButton.type = 'button';
|
|
sendButton.id = 'send_picture';
|
|
$(sendButton).hide();
|
|
$(sendButton).on('click', () => $('#img_file').click());
|
|
$('#send_but_sheld').prepend(sendButton);
|
|
}
|
|
function addPictureSendForm() {
|
|
const inputHtml = `<input id="img_file" type="file" accept="image/*">`;
|
|
const imgForm = document.createElement('form');
|
|
imgForm.id = 'img_form';
|
|
$(imgForm).append(inputHtml);
|
|
$(imgForm).hide();
|
|
$('#form_sheld').append(imgForm);
|
|
$('#img_file').on('change', onSelectImage);
|
|
}
|
|
|
|
addPictureSendForm();
|
|
addSendPictureButton();
|
|
setImageIcon();
|
|
patchSendForm();
|
|
moduleWorker();
|
|
setInterval(moduleWorker, UPDATE_INTERVAL);
|
|
}); |