mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-06-05 21:59:27 +02:00
4962 lines
202 KiB
JavaScript
4962 lines
202 KiB
JavaScript
import { humanizedDateTime } from "./scripts/RossAscends-mods.js";
|
||
|
||
//RossAscends: exporting functions and vars for RA mods.
|
||
export {
|
||
Generate,
|
||
getSettings,
|
||
saveSettings,
|
||
printMessages,
|
||
clearChat,
|
||
getChat,
|
||
this_chid,
|
||
settings,
|
||
characters,
|
||
online_status,
|
||
main_api,
|
||
api_server,
|
||
api_key_novel,
|
||
getCharacters,
|
||
is_send_press,
|
||
chat
|
||
}
|
||
|
||
// API OBJECT FOR EXTERNAL WIRING
|
||
window['TavernAI'] = {};
|
||
|
||
const VERSION = '1.2.8';
|
||
var converter = new showdown.Converter({ emoji: 'true' });
|
||
var bg_menu_toggle = false;
|
||
const systemUserName = 'TavernAI';
|
||
const systemCharName = 'Chloe';
|
||
var default_user_name = "You";
|
||
var name1 = default_user_name;
|
||
var name2 = "Chloe";
|
||
// might want to migrate this to 'system message' code
|
||
var chat = [{ name: 'Chloe', is_user: false, is_name: true, create_date: 0, mes: '\n*You went inside. The air smelled of fried meat, tobacco and a hint of wine. A dim light was cast by candles, and a fire crackled in the fireplace. It seems to be a very pleasant place. Behind the wooden bar is an elf waitress, she is smiling. Her ears are very pointy, and there is a twinkle in her eye. She wears glasses and a white apron. As soon as she noticed you, she immediately came right up close to you.*\n\n' + ' "Hello there! How is your evening going?"<br><br>\n' + '<img src="img/star_dust_city.png" width=80%; display:block;">\n' }];
|
||
var safetychat = [{ name: 'Chloe', is_user: false, is_name: true, create_date: 0, mes: '\n*You deleted a character/chat and arrived back here for safety reasons! Pick another character!*\n\n' }];
|
||
var chat_create_date = 0;
|
||
|
||
let prev_selected_char = null;
|
||
var default_ch_mes = "Hello";
|
||
var count_view_mes = 0;
|
||
var mesStr = '';
|
||
var generatedPromtCache = '';
|
||
var characters = [];
|
||
let groups = [];
|
||
let selected_group = null;
|
||
let is_group_automode_enabled = false;
|
||
var this_chid;
|
||
var active_character;
|
||
var backgrounds = [];
|
||
var default_avatar = 'img/fluffy.png';
|
||
var is_colab = false;
|
||
var is_checked_colab = false;
|
||
var is_mes_reload_avatar = false;
|
||
let collapse_newlines = false;
|
||
|
||
const system_message_types = {
|
||
HELP: 'help',
|
||
WELCOME: 'welcome',
|
||
GROUP: 'group',
|
||
EMPTY: 'empty',
|
||
GENERIC: 'generic',
|
||
};
|
||
|
||
const system_messages = {
|
||
'help': {
|
||
"name": systemUserName,
|
||
"force_avatar": "img/five.png",
|
||
"is_user": false,
|
||
"is_system": true,
|
||
"is_name": true,
|
||
"mes": "Hi there! The following chat formatting commands are supported:<br><ul><li><tt>*text*</tt> – format the actions that your character does</li><li><tt>{*text*}</tt> – set the behavioral bias for your character</li></ul><p>Need more help? Visit our wiki – <a href=\"https://github.com/TavernAI/TavernAI/wiki\">TavernAI Wiki</a>!</p>"
|
||
},
|
||
'group': {
|
||
"name": systemUserName,
|
||
"force_avatar": "img/five.png",
|
||
"is_user": false,
|
||
"is_system": true,
|
||
"is_name": true,
|
||
"mes": "Group chat created. Say 'Hi' to lovely people!"
|
||
},
|
||
'empty': {
|
||
"name": systemUserName,
|
||
"force_avatar": "img/five.png",
|
||
"is_user": false,
|
||
"is_system": true,
|
||
"is_name": true,
|
||
"mes": 'No one hears you. **Hint:** add more members to the group!'
|
||
},
|
||
'generic': {
|
||
"name": systemUserName,
|
||
"force_avatar": "img/five.png",
|
||
"is_user": false,
|
||
"is_system": true,
|
||
"is_name": true,
|
||
"mes": "Generic system message. User `text` parameter to override the contents",
|
||
},
|
||
};
|
||
|
||
const world_info_position = {
|
||
'before': 0,
|
||
'after': 1,
|
||
}
|
||
const talkativeness_default = 0.5;
|
||
const storage_keys = {
|
||
'collapse_newlines': 'TavernAI_collapse_newlines',
|
||
};
|
||
|
||
var is_advanced_char_open = false;
|
||
var is_world_edit_open = false;
|
||
|
||
var menu_type = '';//what is selected in the menu
|
||
var selected_button = '';//which button pressed
|
||
//create pole save
|
||
var create_save_name = '';
|
||
var create_save_description = '';
|
||
var create_save_personality = '';
|
||
var create_save_first_message = '';
|
||
var create_save_avatar = '';
|
||
var create_save_scenario = '';
|
||
var create_save_mes_example = '';
|
||
var create_save_talkativeness = talkativeness_default;
|
||
|
||
var timerSaveEdit;
|
||
var timerWorldSave;
|
||
var timerGroupSave;
|
||
var durationSaveEdit = 200;
|
||
//animation right menu
|
||
var animation_rm_duration = 200;
|
||
var animation_rm_easing = "";
|
||
|
||
var popup_type = "";
|
||
var bg_file_for_del = '';
|
||
var online_status = 'no_connection';
|
||
|
||
var api_server = "";
|
||
var api_server_textgenerationwebui = "";
|
||
//var interval_timer = setInterval(getStatus, 2000);
|
||
var interval_timer_novel = setInterval(getStatusNovel, 3000);
|
||
const groupAutoModeInterval = setInterval(groupChatAutoModeWorker, 5000);
|
||
var is_get_status = false;
|
||
var is_get_status_novel = false;
|
||
var is_api_button_press = false;
|
||
var is_api_button_press_novel = false;
|
||
|
||
var is_send_press = false;//Send generation
|
||
let is_group_generating = false; // Group generation flag
|
||
|
||
var this_del_mes = 0;
|
||
|
||
var this_edit_mes_text = '';
|
||
var this_edit_mes_chname = '';
|
||
var this_edit_mes_id;
|
||
|
||
const delay = ms => new Promise(res => setTimeout(res, ms));
|
||
//settings
|
||
var settings;
|
||
var koboldai_settings;
|
||
var koboldai_setting_names;
|
||
var preset_settings = 'gui';
|
||
var user_avatar = 'you.png';
|
||
var temp = 0.5;
|
||
var world_info = null;
|
||
var world_names;
|
||
var world_info_data = null;
|
||
var world_info_depth = 2;
|
||
var world_info_budget = 128;
|
||
var imported_world_name = '';
|
||
var amount_gen = 80; //default max length of AI generated responses
|
||
var max_context = 2048;
|
||
var rep_pen = 1;
|
||
var rep_pen_size = 100;
|
||
|
||
var textgenerationwebui_settings = {
|
||
temp: 0.5,
|
||
top_p: 0.9,
|
||
top_k: 0,
|
||
typical_p: 1,
|
||
rep_pen: 1.1,
|
||
rep_pen_size: 0,
|
||
penalty_alpha: 0,
|
||
}
|
||
|
||
var is_pygmalion = false;
|
||
var tokens_already_generated = 0;
|
||
var message_already_generated = '';
|
||
var if_typing_text = false;
|
||
const tokens_cycle_count = 30;
|
||
var cycle_count_generation = 0;
|
||
|
||
var swipes = false;
|
||
|
||
var anchor_order = 0;
|
||
var style_anchor = true;
|
||
var character_anchor = true;
|
||
let extension_prompts = {};
|
||
var auto_connect = false;
|
||
var auto_load_chat = false;
|
||
|
||
var main_api = 'kobold';
|
||
//novel settings
|
||
var temp_novel = 0.5;
|
||
var rep_pen_novel = 1;
|
||
var rep_pen_size_novel = 100;
|
||
|
||
var api_key_novel = "";
|
||
var novel_tier;
|
||
var model_novel = "euterpe-v2";
|
||
var novelai_settings;
|
||
var novelai_setting_names;
|
||
var preset_settings_novel = 'Classic-Krake';
|
||
|
||
//css
|
||
var bg1_toggle = true; // inits the BG as BG1
|
||
var css_mes_bg = $('<div class="mes"></div>').css('background');
|
||
var css_send_form_display = $('<div id=send_form></div>').css('display');
|
||
|
||
var colab_ini_step = 1;
|
||
|
||
|
||
|
||
var token;
|
||
|
||
|
||
setInterval(function () {
|
||
switch (colab_ini_step) {
|
||
case 0:
|
||
$('#colab_popup_text').html('<h3>Initialization</h3>');
|
||
colab_ini_step = 1;
|
||
break
|
||
case 1:
|
||
$('#colab_popup_text').html('<h3>Initialization.</h3>');
|
||
colab_ini_step = 2;
|
||
break
|
||
case 2:
|
||
$('#colab_popup_text').html('<h3>Initialization..</h3>');
|
||
colab_ini_step = 3;
|
||
break
|
||
case 3:
|
||
$('#colab_popup_text').html('<h3>Initialization...</h3>');
|
||
colab_ini_step = 0;
|
||
break
|
||
}
|
||
}, 500);
|
||
/////////////
|
||
|
||
$.ajaxPrefilter((options, originalOptions, xhr) => {
|
||
xhr.setRequestHeader("X-CSRF-Token", token);
|
||
});
|
||
|
||
|
||
$.get("/csrf-token")
|
||
.then(data => {
|
||
token = data.token;
|
||
getCharacters();
|
||
getSettings("def");
|
||
getLastVersion();
|
||
//getCharacters();
|
||
printMessages();
|
||
getBackgrounds();
|
||
getUserAvatars();
|
||
});
|
||
function flushSettings() {
|
||
$('#settings_perset').empty();
|
||
$('#settings_perset_novel').empty();
|
||
$('#world_info').empty();
|
||
$('#settings_perset').append('<option value="gui">GUI KoboldAI Settings</option>');
|
||
$('#world_info').append('<option value="None">None</option>');
|
||
}
|
||
function checkOnlineStatus() {
|
||
//console.log(online_status);
|
||
if (online_status == 'no_connection') {
|
||
$("#send_textarea").attr('placeholder', "Not connected to API!"); //Input bar placeholder tells users they are not connected
|
||
$("#send_form").css("background-color", "rgba(100,0,0,0.7)"); //entire input form area is red when not connected
|
||
$("#send_but").css("display", "none"); //send button is hidden when not connected
|
||
|
||
$("#online_status_indicator2").css("background-color", "red");
|
||
$("#online_status_text2").html("No connection...");
|
||
$("#online_status_indicator3").css("background-color", "red");
|
||
$("#online_status_text3").html("No connection...");
|
||
is_get_status = false;
|
||
is_get_status_novel = false;
|
||
} else {
|
||
$("#send_textarea").attr('placeholder', 'Type a message...'); //on connect, placeholder tells user to type message
|
||
$("#send_form").css("background-color", "rgba(0,0,0,0.7)"); //on connect, form BG changes to transprent black
|
||
$("#send_but").css("display", "inline"); //on connect, send button shows up
|
||
|
||
$("#online_status_indicator2").css("background-color", "green");
|
||
$("#online_status_text2").html(online_status);
|
||
$("#online_status_indicator3").css("background-color", "green");
|
||
$("#online_status_text3").html(online_status);
|
||
$("#online_status_indicator4").css("background-color", "green");
|
||
$("#online_status_text4").html(online_status);
|
||
}
|
||
}
|
||
async function getLastVersion() {
|
||
|
||
jQuery.ajax({
|
||
type: 'POST', //
|
||
url: '/getlastversion', //
|
||
data: JSON.stringify({
|
||
'': ''
|
||
}),
|
||
beforeSend: function () {
|
||
|
||
|
||
},
|
||
cache: false,
|
||
dataType: "json",
|
||
contentType: "application/json",
|
||
//processData: false,
|
||
success: function (data) {
|
||
var getVersion = data.version;
|
||
if (getVersion !== 'error' && getVersion != undefined) {
|
||
if (compareVersions(getVersion, VERSION) === 1) {
|
||
$('#verson').append(' <span>(v.' + getVersion + ')</span>');
|
||
}
|
||
}
|
||
|
||
},
|
||
error: function (jqXHR, exception) {
|
||
console.log(exception);
|
||
console.log(jqXHR);
|
||
|
||
}
|
||
});
|
||
|
||
}
|
||
async function getStatus() {
|
||
if (is_get_status) {
|
||
jQuery.ajax({
|
||
type: 'POST', //
|
||
url: '/getstatus', //
|
||
data: JSON.stringify({
|
||
api_server: (main_api == "kobold" ? api_server : api_server_textgenerationwebui),
|
||
main_api: main_api,
|
||
}),
|
||
beforeSend: function () {
|
||
if (is_api_button_press) {
|
||
//$("#api_loading").css("display", 'inline-block');
|
||
//$("#api_button").css("display", 'none');
|
||
}
|
||
//$('#create_button').attr('value','Creating...'); //
|
||
|
||
},
|
||
cache: false,
|
||
dataType: "json",
|
||
crossDomain: true,
|
||
contentType: "application/json",
|
||
//processData: false,
|
||
success: function (data) {
|
||
online_status = data.result;
|
||
if (online_status == undefined) {
|
||
online_status = 'no_connection';
|
||
}
|
||
if (online_status.toLowerCase().indexOf('pygmalion') != -1) {
|
||
is_pygmalion = true;
|
||
online_status += " (Pyg. formatting on)";
|
||
} else {
|
||
is_pygmalion = false;
|
||
}
|
||
|
||
//console.log(online_status);
|
||
resultCheckStatus();
|
||
if (online_status !== 'no_connection') {
|
||
var checkStatusNow = setTimeout(getStatus, 3000);//getStatus();
|
||
}
|
||
},
|
||
error: function (jqXHR, exception) {
|
||
console.log(exception);
|
||
console.log(jqXHR);
|
||
online_status = 'no_connection';
|
||
|
||
resultCheckStatus();
|
||
}
|
||
});
|
||
} else {
|
||
if (is_get_status_novel != true) {
|
||
online_status = 'no_connection';
|
||
}
|
||
}
|
||
}
|
||
function resultCheckStatus() {
|
||
is_api_button_press = false;
|
||
checkOnlineStatus();
|
||
$("#api_loading").css("display", 'none');
|
||
$("#api_button").css("display", 'inline-block');
|
||
$("#api_loading_textgenerationwebui").css("display", 'none');
|
||
$("#api_button_textgenerationwebui").css("display", 'inline-block');
|
||
}
|
||
async function getSoftPromptsList() {
|
||
if (!api_server) {
|
||
return;
|
||
}
|
||
|
||
const response = await fetch('/getsoftprompts', {
|
||
method: 'POST',
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
"X-CSRF-Token": token,
|
||
},
|
||
body: JSON.stringify({ api_server: api_server }),
|
||
});
|
||
|
||
if (response.ok) {
|
||
const data = await response.json();
|
||
updateSoftPromptsList(data.soft_prompts);
|
||
}
|
||
}
|
||
function clearSoftPromptsList() {
|
||
$('#softprompt option[value!=""]').each(function () {
|
||
$(this).remove();
|
||
});
|
||
}
|
||
function updateSoftPromptsList(soft_prompts) {
|
||
// Delete SPs removed from Kobold
|
||
$('#softprompt option').each(function () {
|
||
const value = $(this).attr('value');
|
||
|
||
if (value == '') {
|
||
return;
|
||
}
|
||
|
||
const prompt = soft_prompts.find(x => x.name === value);
|
||
if (!prompt) {
|
||
$(this).remove();
|
||
}
|
||
});
|
||
|
||
// Add SPs added to Kobold
|
||
soft_prompts.forEach((prompt) => {
|
||
if ($(`#softprompt option[value="${prompt.name}"]`).length === 0) {
|
||
$('#softprompt').append(`<option value="${prompt.name}">${prompt.name}</option>`);
|
||
|
||
if (prompt.selected) {
|
||
$('#softprompt').val(prompt.name);
|
||
}
|
||
}
|
||
});
|
||
|
||
// No SP selected or no SPs
|
||
if (soft_prompts.length === 0 || !(soft_prompts.some(x => x.selected))) {
|
||
$('#softprompt').val('');
|
||
}
|
||
}
|
||
function printCharacters() {
|
||
//console.log('printCharacters() entered');
|
||
|
||
$("#rm_print_characters_block").empty();
|
||
//console.log('printCharacters() -- sees '+characters.length+' characters.');
|
||
characters.forEach(function (item, i, arr) {
|
||
|
||
var this_avatar = default_avatar;
|
||
if (item.avatar != 'none') {
|
||
this_avatar = "characters/" + item.avatar + "?" + Date.now();
|
||
|
||
} //RossAscends: changed 'prepend' to 'append' to make alphabetical sorting display correctly.
|
||
$("#rm_print_characters_block").append('<div class=character_select chid=' + i + ' id="CharID' + i + '"><div class=avatar><img src="' + this_avatar + '"></div><div class=ch_name>' + item.name + '</div></div>');
|
||
//console.log('printcharacters() -- printing -- ChID '+i+' ('+item.name+')');
|
||
});
|
||
printGroups();
|
||
|
||
}
|
||
function printGroups() {
|
||
for (let group of groups) {
|
||
const template = $('#group_list_template .group_select').clone();
|
||
template.data('id', group.id);
|
||
template.find('.ch_name').html(group.name);
|
||
$('#rm_print_characters_block').prepend(template);
|
||
updateGroupAvatar(group);
|
||
}
|
||
}
|
||
function updateGroupAvatar(group) {
|
||
$('#rm_print_characters_block .group_select').each(function () {
|
||
if ($(this).data('id') == group.id) {
|
||
const avatar = getGroupAvatar(group);
|
||
if (avatar) {
|
||
$(this).find('.avatar').replaceWith(avatar);
|
||
}
|
||
}
|
||
})
|
||
}
|
||
function getGroupAvatar(group) {
|
||
const memberAvatars = [];
|
||
if (group && Array.isArray(group.members) && group.members.length) {
|
||
for (const member of group.members) {
|
||
const charIndex = characters.findIndex(x => x.name === member);
|
||
if (charIndex !== -1 && characters[charIndex].avatar !== 'none') {
|
||
const this_avatar = `characters/${characters[charIndex].avatar}#${Date.now()}`;
|
||
memberAvatars.push(this_avatar);
|
||
}
|
||
if (memberAvatars.length === 4) {
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
// Cohee: there's probably a smarter way to do this..
|
||
if (memberAvatars.length === 1) {
|
||
const groupAvatar = $('#group_avatars_template .collage_1').clone();
|
||
groupAvatar.find('.img_1').attr('src', memberAvatars[0]);
|
||
return groupAvatar;
|
||
}
|
||
|
||
if (memberAvatars.length === 2) {
|
||
const groupAvatar = $('#group_avatars_template .collage_2').clone();
|
||
groupAvatar.find('.img_1').attr('src', memberAvatars[0]);
|
||
groupAvatar.find('.img_2').attr('src', memberAvatars[1]);
|
||
return groupAvatar;
|
||
}
|
||
|
||
if (memberAvatars.length === 3) {
|
||
const groupAvatar = $('#group_avatars_template .collage_3').clone();
|
||
groupAvatar.find('.img_1').attr('src', memberAvatars[0]);
|
||
groupAvatar.find('.img_2').attr('src', memberAvatars[1]);
|
||
groupAvatar.find('.img_3').attr('src', memberAvatars[2]);
|
||
return groupAvatar;
|
||
}
|
||
|
||
if (memberAvatars.length === 4) {
|
||
const groupAvatar = $('#group_avatars_template .collage_4').clone();
|
||
groupAvatar.find('.img_1').attr('src', memberAvatars[0]);
|
||
groupAvatar.find('.img_2').attr('src', memberAvatars[1]);
|
||
groupAvatar.find('.img_3').attr('src', memberAvatars[2]);
|
||
groupAvatar.find('.img_4').attr('src', memberAvatars[3]);
|
||
return groupAvatar;
|
||
}
|
||
|
||
// default avatar
|
||
const groupAvatar = $('#group_avatars_template .collage_1').clone();
|
||
groupAvatar.find('.img_1').attr('src', group.avatar_url);
|
||
return groupAvatar;
|
||
}
|
||
async function getCharacters() {
|
||
await getGroups();
|
||
|
||
//console.log('getCharacters() -- entered');
|
||
//console.log(characters);
|
||
var response = await fetch("/getcharacters", { //RossAscends: changed from const
|
||
method: "POST",
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
"X-CSRF-Token": token
|
||
},
|
||
body: JSON.stringify({
|
||
"": ""
|
||
})
|
||
});
|
||
if (response.ok === true) {
|
||
|
||
var getData = ''; //RossAscends: reset to force array to update to account for deleted character.
|
||
var getData = await response.json(); //RossAscends: changed from const
|
||
//console.log(getData);
|
||
|
||
//var aa = JSON.parse(getData[0]);
|
||
|
||
var load_ch_count = Object.getOwnPropertyNames(getData); //RossAscends: change from const to create dynamic character load amounts.
|
||
var charCount = load_ch_count.length;
|
||
//console.log('/getcharacters -- expecting to load '+charCount+' characters.')
|
||
for (var i = 0; i < load_ch_count.length; i++) {
|
||
characters[i] = [];
|
||
characters[i] = getData[i];
|
||
//console.log('/getcharacters -- loaded character #'+(i+1)+' ('+characters[i].name+')');
|
||
}
|
||
//RossAscends: updated character sorting to be alphabetical
|
||
characters.sort(function (a, b) {
|
||
//console.log('sorting characters: '+a.name+' vs '+b.name);
|
||
if (a.name < b.name) {
|
||
return -1
|
||
}
|
||
if (a.name > b.name) {
|
||
return 1;
|
||
}
|
||
return 0;
|
||
|
||
});
|
||
//console.log(characters);
|
||
|
||
//characters.reverse();
|
||
//console.log('/getcharacters -- this_chid -- '+this_chid);
|
||
if (this_chid != undefined && this_chid != 'invalid-safety-id') {
|
||
$("#avatar_url_pole").val(characters[this_chid].avatar);
|
||
}
|
||
|
||
|
||
//console.log('/getcharacters -- sending '+i+' characters to /printcharacters');
|
||
printCharacters();
|
||
//console.log(propOwn.length);
|
||
//return JSON.parse(getData[0]);
|
||
//const getData = await response.json();
|
||
//var getMessage = getData.results[0].text;
|
||
}
|
||
}
|
||
async function getBackgrounds() {
|
||
|
||
const response = await fetch("/getbackgrounds", {
|
||
method: "POST",
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
"X-CSRF-Token": token
|
||
},
|
||
body: JSON.stringify({
|
||
"": ""
|
||
})
|
||
|
||
});
|
||
if (response.ok === true) {
|
||
const getData = await response.json();
|
||
//background = getData;
|
||
//console.log(getData.length);
|
||
for (var i = 0; i < getData.length; i++) {
|
||
//console.log(1);
|
||
$("#bg_menu_content").append("<div class=bg_example><img bgfile='" + getData[i] + "' class=bg_example_img src='backgrounds/" + getData[i] + "'><img bgfile='" + getData[i] + "' class=bg_example_cross src=img/cross.png></div>");
|
||
}
|
||
//var aa = JSON.parse(getData[0]);
|
||
//const load_ch_coint = Object.getOwnPropertyNames(getData);
|
||
|
||
|
||
}
|
||
}
|
||
async function isColab() {
|
||
is_checked_colab = true;
|
||
const response = await fetch("/iscolab", {
|
||
method: "POST",
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
"X-CSRF-Token": token
|
||
},
|
||
body: JSON.stringify({
|
||
"": ""
|
||
})
|
||
|
||
});
|
||
if (response.ok === true) {
|
||
const getData = await response.json();
|
||
if (getData.colaburl != false) {
|
||
$('#colab_shadow_popup').css('display', 'none');
|
||
is_colab = true;
|
||
let url = String(getData.colaburl).split("flare.com")[0] + "flare.com";
|
||
url = String(url).split("loca.lt")[0] + "loca.lt";
|
||
$('#api_url_text').val(url);
|
||
setTimeout(function () {
|
||
$('#api_button').click();
|
||
}, 2000);
|
||
}
|
||
|
||
|
||
}
|
||
}
|
||
async function setBackground(bg) {
|
||
|
||
jQuery.ajax({
|
||
type: 'POST', //
|
||
url: '/setbackground', //
|
||
data: JSON.stringify({
|
||
bg: bg
|
||
}),
|
||
beforeSend: function () {
|
||
//$('#create_button').attr('value','Creating...'); //
|
||
},
|
||
cache: false,
|
||
dataType: "json",
|
||
contentType: "application/json",
|
||
//processData: false,
|
||
success: function (html) {
|
||
},
|
||
error: function (jqXHR, exception) {
|
||
console.log(exception);
|
||
console.log(jqXHR);
|
||
}
|
||
});
|
||
}
|
||
async function delBackground(bg) {
|
||
const response = await fetch("/delbackground", {
|
||
method: "POST",
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
"X-CSRF-Token": token
|
||
},
|
||
body: JSON.stringify({
|
||
"bg": bg
|
||
})
|
||
|
||
});
|
||
if (response.ok === true) {
|
||
}
|
||
}
|
||
function printMessages() {
|
||
chat.forEach(function (item, i, arr) {
|
||
addOneMessage(item);
|
||
});
|
||
}
|
||
function clearChat() {
|
||
count_view_mes = 0;
|
||
extension_prompts = {};
|
||
$('#chat').html('');
|
||
}
|
||
function messageFormating(mes, ch_name, isSystem, forceAvatar) {
|
||
if (this_chid != undefined && !isSystem) mes = mes.replaceAll("<", "<").replaceAll(">", ">");//for Chloe
|
||
if (this_chid === undefined) {
|
||
mes = mes.replace(/\*\*(.+?)\*\*/g, '<b>$1</b>').replace(/\*(.+?)\*/g, '<i>$1</i>').replace(/\n/g, '<br/>');
|
||
|
||
} else if (!isSystem) {
|
||
mes = converter.makeHtml(mes);
|
||
mes = mes.replace(/{([^}]+)}/g, '');
|
||
mes = mes.replace(/\n/g, '<br/>');
|
||
mes = mes.trim();
|
||
}
|
||
|
||
if (forceAvatar) {
|
||
mes = mes.replaceAll(ch_name + ":", "");
|
||
}
|
||
|
||
if (ch_name !== name1) {
|
||
mes = mes.replaceAll(name2 + ":", "");
|
||
}
|
||
return mes;
|
||
}
|
||
function appendImageToMessage(mes, messageElement) {
|
||
if (mes.extra?.image) {
|
||
const image = document.createElement('img');
|
||
image.src = mes.extra?.image;
|
||
image.classList.add('img_extra');
|
||
messageElement.find('.mes_text').prepend(image);
|
||
}
|
||
}
|
||
function addOneMessage(mes,type='normal') {
|
||
//var message = mes['mes'];
|
||
//message = mes['mes'].replace(/^\s+/g, '');
|
||
//console.log(message.indexOf(name1+":"));
|
||
var messageText = mes['mes'];
|
||
var characterName = name1;
|
||
var avatarImg = "User Avatars/" + user_avatar;
|
||
const isSystem = mes.is_system;
|
||
generatedPromtCache = '';
|
||
//thisText = thisText.split("\n").join("<br>");
|
||
if (!mes['is_user']) {
|
||
if (mes.force_avatar) {
|
||
avatarImg = mes.force_avatar;
|
||
}
|
||
else if (this_chid == undefined || this_chid == "invalid-safety-id") {
|
||
avatarImg = "img/chloe.png";
|
||
}
|
||
else {
|
||
if (characters[this_chid].avatar != 'none') {
|
||
avatarImg = "characters/" + characters[this_chid].avatar;
|
||
if (is_mes_reload_avatar !== false) {
|
||
avatarImg += "?" + is_mes_reload_avatar;
|
||
//console.log(avatarImg);
|
||
}
|
||
} else {
|
||
avatarImg = "img/fluffy.png";
|
||
}
|
||
}
|
||
characterName = mes.is_system || mes.force_avatar ? mes.name : name2;
|
||
}
|
||
if (count_view_mes == 0) {
|
||
messageText = messageText.replace(/{{user}}/gi, name1);
|
||
messageText = messageText.replace(/{{char}}/gi, name2);
|
||
messageText = messageText.replace(/<USER>/gi, name1);
|
||
messageText = messageText.replace(/<BOT>/gi, name2);
|
||
}
|
||
messageText = messageFormating(messageText, characterName, isSystem, mes.force_avatar);
|
||
const bias = messageFormating(mes.extra?.bias ?? '');
|
||
var HTMLForEachMes =
|
||
'<div class="mes" mesid="' + count_view_mes +'" ch_name="' +characterName + '" is_user="' +mes["is_user"]+'">'+
|
||
'<div class="for_checkbox"></div>'+
|
||
'<input type="checkbox" class="del_checkbox">'+
|
||
'<div class="avatar">'+
|
||
'<img src="' + avatarImg + '">'+
|
||
'</div>'+
|
||
'<div class="swipe_left">'+
|
||
'<img src="img/swipe_left.png">'+
|
||
'</div>'+
|
||
'<div class="mes_block">'+
|
||
'<div class="ch_name">' +
|
||
characterName +
|
||
'<div title=Edit class=mes_edit></div>'+
|
||
'<div class=mes_edit_cancel><img src=img/cancel.png></div>'+
|
||
'<div class=mes_edit_done><img src=img/done.png></div>'+
|
||
'</div>'+
|
||
'<div class=mes_text></div>'+
|
||
'</div>'+
|
||
'<div class="mes_bias">'+bias+'</div>'+
|
||
'<div class="swipe_right">'+
|
||
' <img src="img/swipe_right.png">'+
|
||
'</div>'+
|
||
'</div>';
|
||
if(type !== 'swipe'){
|
||
$("#chat").append(HTMLForEachMes);
|
||
}
|
||
|
||
const newMessage = $(`#chat [mesid="${count_view_mes}"]`);
|
||
newMessage.data('isSystem', isSystem);
|
||
|
||
appendImageToMessage(mes, newMessage);
|
||
if (isSystem) {
|
||
newMessage.find('.mes_edit').hide();
|
||
}
|
||
|
||
if (type === "swipe") {
|
||
$("#chat")
|
||
.children()
|
||
.filter('[mesid="' + (count_view_mes - 1) + '"]')
|
||
.children(".mes_block")
|
||
.children(".mes_text")
|
||
.html("");
|
||
$("#chat")
|
||
.children()
|
||
.filter('[mesid="' + (count_view_mes - 1) + '"]')
|
||
.children(".mes_block")
|
||
.children(".mes_text")
|
||
.append(messageText);
|
||
|
||
count_view_mes++;
|
||
}
|
||
|
||
var $textchat = $("#chat");
|
||
$("#chat .mes").last().addClass("last_mes");
|
||
$("#chat .mes").eq(-2).removeClass("last_mes");
|
||
$textchat.scrollTop($textchat[0].scrollHeight);
|
||
|
||
hideSwipeButtons();
|
||
showSwipeButtons();
|
||
|
||
}
|
||
function substituteParams(content) {
|
||
content = content.replace(/{{user}}/gi, name1);
|
||
content = content.replace(/{{char}}/gi, name2);
|
||
content = content.replace(/<USER>/gi, name1);
|
||
content = content.replace(/<BOT>/gi, name2);
|
||
return content;
|
||
}
|
||
function checkWorldInfo(chat) {
|
||
if (world_info_data.entries.length == 0) {
|
||
return '';
|
||
}
|
||
|
||
const messagesToLookBack = world_info_depth * 2;
|
||
let textToScan = chat.slice(0, messagesToLookBack).join('').toLowerCase();
|
||
let worldInfoBefore = '';
|
||
let worldInfoAfter = '';
|
||
let needsToScan = true;
|
||
let allActivatedEntries = new Set();
|
||
|
||
const sortedEntries = Object.keys(world_info_data.entries).map(x => world_info_data.entries[x]).sort((a, b) => b.order - a.order);
|
||
while (needsToScan) {
|
||
let activatedNow = new Set();
|
||
|
||
for (let entry of sortedEntries) {
|
||
if (allActivatedEntries.has(entry.uid)) {
|
||
continue;
|
||
}
|
||
|
||
if (entry.constant) {
|
||
activatedNow.add(entry.uid);
|
||
}
|
||
|
||
if (Array.isArray(entry.key) && entry.key.length) {
|
||
primary: for (let key of entry.key) {
|
||
if (key && textToScan.includes(key.trim().toLowerCase())) {
|
||
if (entry.selective && Array.isArray(entry.keysecondary) && entry.keysecondary.length) {
|
||
secondary: for (let keysecondary of entry.keysecondary) {
|
||
if (keysecondary && textToScan.includes(keysecondary.trim().toLowerCase())) {
|
||
activatedNow.add(entry.uid);
|
||
break secondary;
|
||
}
|
||
}
|
||
} else {
|
||
activatedNow.add(entry.uid);
|
||
break primary;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
needsToScan = activatedNow.size > 0;
|
||
const newEntries = [...activatedNow]
|
||
.map(x => world_info_data.entries[x])
|
||
.sort((a, b) => sortedEntries.indexOf(a) - sortedEntries.indexOf(b));
|
||
|
||
for (const entry of newEntries) {
|
||
if (entry.position === world_info_position.after) {
|
||
worldInfoAfter = `${substituteParams(entry.content)}\n${worldInfoAfter}`;
|
||
}
|
||
else {
|
||
worldInfoBefore = `${substituteParams(entry.content)}\n${worldInfoBefore}`;
|
||
}
|
||
|
||
if (encode(worldInfoBefore + worldInfoAfter).length >= world_info_budget) {
|
||
needsToScan = false;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (needsToScan) {
|
||
textToScan = newEntries.map(x => x.content).join('\n').toLowerCase() + textToScan;
|
||
}
|
||
|
||
allActivatedEntries = new Set([...allActivatedEntries, ...activatedNow]);
|
||
}
|
||
|
||
return { worldInfoBefore, worldInfoAfter };
|
||
}
|
||
function isHelpRequest(message) {
|
||
const helpTokens = ['/?', '/help'];
|
||
return helpTokens.includes(message.trim().toLowerCase());
|
||
}
|
||
function sendSystemMessage(type, text) {
|
||
const systemMessage = system_messages[type];
|
||
|
||
if (!systemMessage) {
|
||
return;
|
||
}
|
||
|
||
const newMessage = { ...systemMessage, 'send_date': humanizedDateTime() };
|
||
|
||
if (text) {
|
||
newMessage.mes = text;
|
||
}
|
||
|
||
chat.push(newMessage);
|
||
console.log('sendSystemMessage calls addOneMessage');
|
||
addOneMessage(newMessage);
|
||
is_send_press = false;
|
||
}
|
||
function extractMessageBias(message) {
|
||
if (!message) {
|
||
return null;
|
||
}
|
||
|
||
const found = [];
|
||
const rxp = /{([^}]+)}/g;
|
||
let curMatch;
|
||
|
||
while (curMatch = rxp.exec(message)) {
|
||
found.push(curMatch[1].trim());
|
||
}
|
||
|
||
if (!found.length) {
|
||
return '';
|
||
}
|
||
|
||
return ` ${found.join(' ')} `;
|
||
}
|
||
|
||
async function Generate(type, automatic_trigger) {//encode("dsfs").length
|
||
console.log('Generate entered');
|
||
tokens_already_generated = 0;
|
||
message_already_generated = name2 + ': ';
|
||
|
||
if (isHelpRequest($("#send_textarea").val())) {
|
||
sendSystemMessage(system_message_types.HELP);
|
||
$("#send_textarea").val('').trigger('input');
|
||
return;
|
||
}
|
||
|
||
if (selected_group && !is_group_generating) {
|
||
generateGroupWrapper(false);
|
||
return;
|
||
}
|
||
|
||
if (online_status != 'no_connection' && this_chid != undefined && this_chid !== 'invalid-safety-id') {
|
||
if (type !== 'regenerate') {
|
||
is_send_press = true;
|
||
var textareaText = $("#send_textarea").val();
|
||
//console.log('Not a Regenerate call, so posting normall with input of: ' +textareaText);
|
||
$("#send_textarea").val('').trigger('input');
|
||
|
||
} else {
|
||
//console.log('Regenerate call detected')
|
||
var textareaText = "";
|
||
if (chat[chat.length - 1]['is_user']) {//If last message from You
|
||
|
||
} else {
|
||
chat.length = chat.length - 1;
|
||
count_view_mes -= 1;
|
||
//$('#chat').children().last().css({'transition':'all 0.5s ease-in-out'});
|
||
//$('#chat').children().last().css({'transform':'translateX(100vh) scale(0.1,0.1)'});
|
||
//$('#chat').children().last().css({'opacity':'0'});
|
||
setTimeout(function(){
|
||
$('#chat').children().last().remove();
|
||
},1000);
|
||
}
|
||
}
|
||
|
||
$("#send_but").css("display", "none");
|
||
$("#loading_mes").css("display", "inline-block");
|
||
|
||
let promptBias = null;
|
||
let messageBias = extractMessageBias(textareaText);
|
||
|
||
// gets bias of the latest message where it was applied
|
||
for (let mes of chat) {
|
||
if (mes && mes.is_user && mes.extra && mes.extra.bias) {
|
||
promptBias = mes.extra.bias;
|
||
}
|
||
}
|
||
|
||
// bias from the latest message is top priority//
|
||
|
||
promptBias = messageBias ?? promptBias ?? '';
|
||
|
||
var storyString = "";
|
||
var userSendString = "";
|
||
var finalPromt = "";
|
||
var postAnchorChar = "talks a lot with descriptions";//'Talk a lot with description what is going on around';// in asterisks
|
||
var postAnchorStyle = "Writing style: very long messages";//"[Genre: roleplay chat][Tone: very long messages with descriptions]";
|
||
var anchorTop = '';
|
||
var anchorBottom = '';
|
||
var topAnchorDepth = 8;
|
||
|
||
if (character_anchor && !is_pygmalion) {
|
||
console.log('saw not pyg');
|
||
if (anchor_order === 0) {
|
||
anchorTop = name2 + " " + postAnchorChar;
|
||
} else {
|
||
console.log('saw pyg, adding anchors')
|
||
anchorBottom = "[" + name2 + " " + postAnchorChar + "]";
|
||
}
|
||
}
|
||
if (style_anchor && !is_pygmalion) {
|
||
if (anchor_order === 1) {
|
||
anchorTop = postAnchorStyle;
|
||
} else {
|
||
anchorBottom = "[" + postAnchorStyle + "]";
|
||
}
|
||
}
|
||
|
||
//*********************************
|
||
//PRE FORMATING STRING
|
||
//*********************************
|
||
if (textareaText != "" && !automatic_trigger) {
|
||
chat[chat.length] = {};
|
||
chat[chat.length - 1]['name'] = name1;
|
||
chat[chat.length - 1]['is_user'] = true;
|
||
chat[chat.length - 1]['is_name'] = true;
|
||
chat[chat.length - 1]['send_date'] = humanizedDateTime();
|
||
chat[chat.length - 1]['mes'] = textareaText;
|
||
chat[chat.length - 1]['extra'] = {};
|
||
|
||
if (messageBias) {
|
||
console.log('checking bias');
|
||
chat[chat.length - 1]['extra']['bias'] = messageBias;
|
||
}
|
||
console.log('Generate calls addOneMessage');
|
||
addOneMessage(chat[chat.length - 1]);
|
||
}
|
||
////////////////////////////////////
|
||
var chatString = '';
|
||
var arrMes = [];
|
||
var mesSend = [];
|
||
var mesExamplesArray = [];
|
||
var charDescription = baseChatReplaceAndSplit($.trim(characters[this_chid].description), name1, name2);
|
||
var charPersonality = baseChatReplaceAndSplit($.trim(characters[this_chid].personality), name1, name2);
|
||
var Scenario = baseChatReplaceAndSplit($.trim(characters[this_chid].scenario), name1, name2);
|
||
var mesExamples = baseChatReplaceAndSplit($.trim(characters[this_chid].mes_example.replace(/<START>/gi, '')), name1, name2);
|
||
|
||
function baseChatReplaceAndSplit(value, name1, name2) {
|
||
if (value !== undefined && value.length > 0) {
|
||
if (is_pygmalion) {
|
||
value = value.replace(/{{user}}:/gi, "You:");
|
||
value = value.replace(/<USER>:/gi, "You:");
|
||
}
|
||
value = value.replace(/{{user}}/gi, name1);
|
||
value = value.replace(/{{char}}/gi, name2);
|
||
value = value.replace(/<USER>/gi, name1);
|
||
value = value.replace(/<BOT>/gi, name2);
|
||
let blocks = value.split(/<START>/gi);
|
||
return blocks.slice(1).map(block => `<START>\n${block.trim()}\n`).join('');
|
||
}
|
||
return value;
|
||
}
|
||
|
||
function appendToStoryString(value, prefix) {
|
||
if (value !== undefined && value.length > 0) {
|
||
return prefix + value + '\n';
|
||
}
|
||
return '';
|
||
}
|
||
|
||
if (is_pygmalion) {
|
||
storyString += appendToStoryString(charDescription, name2 + "'s Persona: ");
|
||
storyString += appendToStoryString(charPersonality, 'Personality: ');
|
||
storyString += appendToStoryString(Scenario, 'Scenario: ');
|
||
} else {
|
||
if (charDescription !== undefined) {
|
||
if (charPersonality.length > 0) {
|
||
charPersonality = name2 + "'s personality: " + charPersonality;
|
||
}
|
||
}
|
||
|
||
storyString += appendToStoryString(charDescription, '');
|
||
|
||
if (storyString.endsWith('\n')) {
|
||
storyString = storyString.slice(0, -1);
|
||
}
|
||
|
||
if (count_view_mes < topAnchorDepth) {
|
||
storyString += '\n' + appendToStoryString(charPersonality, '');
|
||
}
|
||
}
|
||
//////////////////////////////////
|
||
|
||
var count_exm_add = 0;
|
||
console.log('emptying chat2');
|
||
var chat2 = [];
|
||
var j = 0;
|
||
console.log('pre-replace chat.length = '+chat.length);
|
||
for (var i = chat.length - 1; i >= 0; i--) {
|
||
|
||
if (j == 0) {
|
||
chat[j]['mes'] = chat[j]['mes'].replace(/{{user}}/gi, name1);
|
||
chat[j]['mes'] = chat[j]['mes'].replace(/{{char}}/gi, name2);
|
||
chat[j]['mes'] = chat[j]['mes'].replace(/<USER>/gi, name1);
|
||
chat[j]['mes'] = chat[j]['mes'].replace(/<BOT>/gi, name2);
|
||
}
|
||
let this_mes_ch_name = '';
|
||
if (chat[j]['is_user']) {
|
||
this_mes_ch_name = name1;
|
||
} else {
|
||
this_mes_ch_name = name2;
|
||
}
|
||
if (chat[j]['is_name']) {
|
||
chat2[i] = this_mes_ch_name + ': ' + chat[j]['mes'] + '\n';
|
||
} else {
|
||
chat2[i] = chat[j]['mes'] + '\n';
|
||
}
|
||
// system messages produce no text
|
||
if (chat[j]['is_system']) {
|
||
chat2[i] = '';
|
||
}
|
||
|
||
// replace bias markup
|
||
chat2[i] = (chat2[i] ?? '').replace(/{([^}]+)}/g, '');
|
||
//console.log('replacing chat2 {}s');
|
||
j++;
|
||
}
|
||
console.log('post replace chat.length = '+chat.length);
|
||
//chat2 = chat2.reverse();
|
||
var this_max_context = 1487;
|
||
if (main_api == 'kobold') this_max_context = max_context;
|
||
if (main_api == 'novel') {
|
||
if (novel_tier === 1) {
|
||
this_max_context = 1024;
|
||
} else {
|
||
this_max_context = 2048 - 60;//fix for fat tokens
|
||
if (model_novel == 'krake-v2') {
|
||
this_max_context -= 160;
|
||
}
|
||
}
|
||
}
|
||
|
||
let worldInfoString = '', worldInfoBefore = '', worldInfoAfter = '';
|
||
|
||
if (world_info && world_info_data) {
|
||
const activatedWorldInfo = checkWorldInfo(chat2);
|
||
worldInfoBefore = activatedWorldInfo.worldInfoBefore;
|
||
worldInfoAfter = activatedWorldInfo.worldInfoAfter;
|
||
worldInfoString = worldInfoBefore + worldInfoAfter;
|
||
}
|
||
|
||
let extension_prompt = Object.keys(extension_prompts).sort().map(x => extension_prompts[x]).filter(x => x).join('\n');
|
||
if (extension_prompt.length && !extension_prompt.endsWith('\n')) {
|
||
extension_prompt += '\n';
|
||
}
|
||
/////////////////////// swipecode
|
||
if(type == 'swipe'){
|
||
|
||
console.log('pre swipe shift: ' + chat2.length);
|
||
console.log('shifting swipe chat2');
|
||
chat2.shift();
|
||
|
||
}
|
||
console.log('post swipe shift:'+chat2.length);
|
||
var i = 0;
|
||
|
||
for (var item of chat2) {//console.log(encode("dsfs").length);
|
||
chatString = item + chatString;
|
||
if (encode(JSON.stringify(
|
||
worldInfoString + storyString + chatString +
|
||
anchorTop + anchorBottom +
|
||
charPersonality + promptBias + extension_prompt
|
||
)).length + 120 < this_max_context) { //(The number of tokens in the entire promt) need fix, it must count correctly (added +120, so that the description of the character does not hide)
|
||
//if (is_pygmalion && i == chat2.length-1) item='<START>\n'+item;
|
||
arrMes[arrMes.length] = item;
|
||
} else {
|
||
console.log('reducing chat.length by 1');
|
||
i = chat.length - 1;
|
||
}
|
||
|
||
await delay(1); //For disable slow down (encode gpt-2 need fix)
|
||
// console.log(i+' '+chat.length);
|
||
|
||
count_exm_add = 0;
|
||
|
||
if (i === chat.length - 1) {
|
||
let mesExmString = '';
|
||
for (let iii = mesExamplesArray.length - 1; iii >= 0; iii--) {
|
||
mesExmString += mesExamplesArray[iii];
|
||
const prompt = worldInfoString + storyString + mesExmString + chatString + anchorTop + anchorBottom + charPersonality + promptBias + extension_prompt;
|
||
if (encode(JSON.stringify(prompt)).length + 120 < this_max_context) {
|
||
if (!is_pygmalion) {
|
||
mesExamplesArray[iii] = mesExamplesArray[iii].replace(/<START>/i, `This is how ${name2} should talk`);
|
||
}
|
||
count_exm_add++;
|
||
await delay(1);
|
||
} else {
|
||
break;
|
||
}
|
||
}
|
||
if (!is_pygmalion && Scenario && Scenario.length > 0) {
|
||
storyString += `Circumstances and context of the dialogue: ${Scenario}\n`;
|
||
}
|
||
}
|
||
i++;
|
||
}
|
||
console.log('calling runGenerate');
|
||
runGenerate();
|
||
return;
|
||
|
||
function runGenerate(cycleGenerationPromt = '') {
|
||
console.log('rungenerate entered');
|
||
|
||
generatedPromtCache += cycleGenerationPromt;
|
||
if (generatedPromtCache.length == 0) {
|
||
console.log('generating prompt');
|
||
chatString = "";
|
||
arrMes = arrMes.reverse();
|
||
var is_add_personality = false;
|
||
arrMes.forEach(function (item, i, arr) {//For added anchors and others
|
||
|
||
if (i >= arrMes.length - 1 && $.trim(item).substr(0, (name1 + ":").length) != name1 + ":") {
|
||
if (textareaText == "") {
|
||
item = item.substr(0, item.length - 1);
|
||
}
|
||
}
|
||
if (i === arrMes.length - topAnchorDepth && count_view_mes >= topAnchorDepth && !is_add_personality) {
|
||
|
||
is_add_personality = true;
|
||
//chatString = chatString.substr(0,chatString.length-1);
|
||
//anchorAndPersonality = "[Genre: roleplay chat][Tone: very long messages with descriptions]";
|
||
if ((anchorTop != "" || charPersonality != "") && !is_pygmalion) {
|
||
if (anchorTop != "") charPersonality += ' ';
|
||
item += "[" + charPersonality + anchorTop + ']\n';
|
||
}
|
||
}
|
||
if (i >= arrMes.length - 1 && count_view_mes > 8 && $.trim(item).substr(0, (name1 + ":").length) == name1 + ":" && !is_pygmalion) {//For add anchor in end
|
||
item = item.substr(0, item.length - 1);
|
||
//chatString+=postAnchor+"\n";//"[Writing style: very long messages]\n";
|
||
item = item + anchorBottom + "\n";
|
||
}
|
||
if (is_pygmalion) {
|
||
if (i >= arrMes.length - 1 && $.trim(item).substr(0, (name1 + ":").length) == name1 + ":") {//for add name2 when user sent
|
||
item = item + name2 + ":";
|
||
}
|
||
if (i >= arrMes.length - 1 && $.trim(item).substr(0, (name1 + ":").length) != name1 + ":") {//for add name2 when continue
|
||
if (textareaText == "") {
|
||
item = item + '\n' + name2 + ":";
|
||
}
|
||
}
|
||
if ($.trim(item).indexOf(name1) === 0) {
|
||
item = item.replace(name1 + ':', 'You:');
|
||
}
|
||
}
|
||
mesSend[mesSend.length] = item;
|
||
//chatString = chatString+item;
|
||
});
|
||
}
|
||
//finalPromt +=chatString;
|
||
//console.log(storyString);
|
||
|
||
//console.log(encode(characters[this_chid].description+chatString).length);
|
||
//console.log(encode(JSON.stringify(characters[this_chid].description+chatString)).length);
|
||
if (type == 'force_name2') {
|
||
finalPromt += name2 + ':';
|
||
}
|
||
//console.log(JSON.stringify(storyString));
|
||
//Send story string
|
||
var mesSendString = '';
|
||
var mesExmString = '';
|
||
|
||
function setPromtString() {
|
||
mesSendString = '';
|
||
mesExmString = '';
|
||
for (let j = 0; j < count_exm_add; j++) {
|
||
mesExmString += mesExamplesArray[j];
|
||
}
|
||
for (let j = 0; j < mesSend.length; j++) {
|
||
//console.log('compiling messages for prompt');
|
||
mesSendString += mesSend[j];
|
||
}
|
||
}
|
||
|
||
function checkPromtSize() {
|
||
//console.log('checking prompt size');
|
||
setPromtString();
|
||
let thisPromtContextSize = encode(JSON.stringify(worldInfoString + storyString + mesExmString + mesSendString + anchorTop + anchorBottom + charPersonality + generatedPromtCache + promptBias + extension_prompt)).length + 120;
|
||
|
||
if (thisPromtContextSize > this_max_context) { //if the prepared prompt is larger than the max context size...
|
||
|
||
if (count_exm_add > 0) { // ..and we have example mesages..
|
||
//console.log('Context size: '+thisPromtContextSize+' -- too big, removing example message');
|
||
//mesExamplesArray.length = mesExamplesArray.length-1;
|
||
count_exm_add--; // remove the example messages...
|
||
checkPromtSize(); // and try agin...
|
||
} else if (mesSend.length > 0) { // if the chat history is longer than 0
|
||
//console.log('Context size: '+thisPromtContextSize+' -- too big, removing oldest chat message');
|
||
mesSend.shift(); // remove the first (oldest) chat entry..
|
||
checkPromtSize(); // and check size again..
|
||
} else {
|
||
//end
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
if (generatedPromtCache.length > 0) {
|
||
//console.log('Generated Prompt Cache length: '+generatedPromtCache.length);
|
||
checkPromtSize();
|
||
} else {
|
||
console.log('calling setPromtString')
|
||
setPromtString();
|
||
}
|
||
|
||
if (!is_pygmalion) {
|
||
mesSendString = '\nThen the roleplay chat between ' + name1 + ' and ' + name2 + ' begins.\n' + mesSendString;
|
||
} else {
|
||
mesSendString = '<START>\n' + mesSendString;
|
||
//mesSendString = mesSendString; //This edit simply removes the first "<START>" that is prepended to all context prompts
|
||
}
|
||
finalPromt = worldInfoBefore + storyString + worldInfoAfter + extension_prompt + mesExmString + mesSendString + generatedPromtCache + promptBias;
|
||
finalPromt = finalPromt.replace(/\r/gm, '');
|
||
console.log('final prompt decided');
|
||
|
||
//if we aren't using the kobold GUI settings...
|
||
if (main_api == 'textgenerationwebui' || main_api == 'kobold' && preset_settings != 'gui') {
|
||
var this_settings = koboldai_settings[koboldai_setting_names[preset_settings]];
|
||
|
||
var this_amount_gen = parseInt(amount_gen); // how many tokens the AI will be requested to generate
|
||
if (is_pygmalion) { // if we are using a pygmalion model...
|
||
if (tokens_already_generated === 0) { // if nothing has been generated yet..
|
||
if (parseInt(amount_gen) >= 50) { // if the max gen setting is > 50...(
|
||
this_amount_gen = 50; // then only try to make 50 this cycle..
|
||
}
|
||
else {
|
||
this_amount_gen = parseInt(amount_gen); // otherwise, make as much as the max amount request.
|
||
}
|
||
}
|
||
else { // if we already recieved some generated text...
|
||
if (parseInt(amount_gen) - tokens_already_generated < tokens_cycle_count) { // if the remaining tokens to be made is less than next potential cycle count
|
||
this_amount_gen = parseInt(amount_gen) - tokens_already_generated; // subtract already generated amount from the desired max gen amount
|
||
}
|
||
else {
|
||
this_amount_gen = tokens_cycle_count; // otherwise make the standard cycle amont (frist 50, and 30 after that)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
var generate_data;
|
||
if (main_api == 'kobold') {
|
||
var generate_data = { prompt: finalPromt, gui_settings: true, max_length: amount_gen, temperature: temp, max_context_length: max_context };
|
||
if (preset_settings != 'gui') {
|
||
|
||
generate_data = {
|
||
prompt: finalPromt,
|
||
gui_settings: false,
|
||
sampler_order: this_settings.sampler_order,
|
||
max_context_length: parseInt(max_context),//this_settings.max_length,
|
||
max_length: this_amount_gen,//parseInt(amount_gen),
|
||
rep_pen: parseFloat(rep_pen),
|
||
rep_pen_range: parseInt(rep_pen_size),
|
||
rep_pen_slope: this_settings.rep_pen_slope,
|
||
temperature: parseFloat(temp),
|
||
tfs: this_settings.tfs,
|
||
top_a: this_settings.top_a,
|
||
top_k: this_settings.top_k,
|
||
top_p: this_settings.top_p,
|
||
typical: this_settings.typical,
|
||
s1: this_settings.sampler_order[0],
|
||
s2: this_settings.sampler_order[1],
|
||
s3: this_settings.sampler_order[2],
|
||
s4: this_settings.sampler_order[3],
|
||
s5: this_settings.sampler_order[4],
|
||
s6: this_settings.sampler_order[5],
|
||
s7: this_settings.sampler_order[6],
|
||
use_world_info: false,
|
||
};
|
||
}
|
||
}
|
||
|
||
if (main_api == 'textgenerationwebui') {
|
||
const doSample = textgenerationwebui_settings.penalty_alpha == 0;
|
||
var generate_data = {
|
||
data: [
|
||
finalPromt,
|
||
this_amount_gen, // min_length
|
||
doSample, // do_sample
|
||
textgenerationwebui_settings.temp, // temperature
|
||
textgenerationwebui_settings.top_p, // top_p
|
||
textgenerationwebui_settings.typical_p, // typical_p
|
||
textgenerationwebui_settings.rep_pen, // repetition_penalty
|
||
textgenerationwebui_settings.top_k, // top_k
|
||
0, // min_length
|
||
textgenerationwebui_settings.rep_pen_size, // no_repeat_ngram_size
|
||
1, // num_beams
|
||
textgenerationwebui_settings.penalty_alpha, // penalty_alpha
|
||
1, // length_penalty
|
||
false, // early_stopping
|
||
name1, // name1
|
||
name2, // name2
|
||
"", // Context
|
||
true, // stop at newline
|
||
max_context, // Maximum prompt size in tokens
|
||
1, // num attempts
|
||
]
|
||
};
|
||
}
|
||
|
||
if (main_api == 'novel') {
|
||
var this_settings = novelai_settings[novelai_setting_names[preset_settings_novel]];
|
||
generate_data = {
|
||
"input": finalPromt,
|
||
"model": model_novel,
|
||
"use_string": true,
|
||
"temperature": parseFloat(temp_novel),
|
||
"max_length": this_settings.max_length,
|
||
"min_length": this_settings.min_length,
|
||
"tail_free_sampling": this_settings.tail_free_sampling,
|
||
"repetition_penalty": parseFloat(rep_pen_novel),
|
||
"repetition_penalty_range": parseInt(rep_pen_size_novel),
|
||
"repetition_penalty_frequency": this_settings.repetition_penalty_frequency,
|
||
"repetition_penalty_presence": this_settings.repetition_penalty_presence,
|
||
//"stop_sequences": {{187}},
|
||
//bad_words_ids = {{50256}, {0}, {1}};
|
||
//generate_until_sentence = true;
|
||
"use_cache": false,
|
||
//use_string = true;
|
||
"return_full_text": false,
|
||
"prefix": "vanilla",
|
||
"order": this_settings.order
|
||
};
|
||
}
|
||
var generate_url = '';
|
||
if (main_api == 'kobold') {
|
||
generate_url = '/generate';
|
||
} else if (main_api == 'textgenerationwebui') {
|
||
generate_url = '/generate_textgenerationwebui';
|
||
} else if (main_api == 'novel') {
|
||
generate_url = '/generate_novelai';
|
||
}
|
||
console.log('rungenerate calling API');
|
||
jQuery.ajax({
|
||
type: 'POST', //
|
||
url: generate_url, //
|
||
data: JSON.stringify(generate_data),
|
||
beforeSend: function () {
|
||
//$('#create_button').attr('value','Creating...');
|
||
},
|
||
cache: false,
|
||
dataType: "json",
|
||
contentType: "application/json",
|
||
success: function (data) {
|
||
console.log('generation success');
|
||
tokens_already_generated += this_amount_gen; // add new gen amt to any prev gen counter..
|
||
|
||
|
||
//console.log('Tokens requested in total: '+tokens_already_generated);
|
||
//$("#send_textarea").focus();
|
||
//$("#send_textarea").removeAttr('disabled');
|
||
is_send_press = false;
|
||
if (!data.error) {
|
||
//const getData = await response.json();
|
||
var getMessage = "";
|
||
if (main_api == 'kobold') {
|
||
getMessage = data.results[0].text;
|
||
} else if (main_api == 'textgenerationwebui') {
|
||
getMessage = data.data[0];
|
||
if (getMessage == null || data.error) {
|
||
popup_type = 'default';
|
||
callPopup('<h3>Got empty response from Text generation web UI. Try restarting the API with recommended options.</h3>');
|
||
return;
|
||
}
|
||
getMessage = getMessage.substring(finalPromt.length);
|
||
} else if (main_api == 'novel') {
|
||
getMessage = data.output;
|
||
}
|
||
|
||
if (collapse_newlines) {
|
||
getMessage = getMessage.replaceAll(/\n+/g, "\n");
|
||
}
|
||
|
||
//Pygmalion run again // to make it continue generating so long as it's under max_amount and hasn't signaled
|
||
// an end to the character's response via typing "You:" or adding "<endoftext>"
|
||
if (is_pygmalion) {
|
||
if_typing_text = false;
|
||
message_already_generated += getMessage;
|
||
promptBias = '';
|
||
//console.log('AI Response so far: '+message_already_generated);
|
||
if (message_already_generated.indexOf('You:') === -1 && //if there is no 'You:' in the response msg
|
||
message_already_generated.indexOf('<|endoftext|>') === -1 && //if there is no <endoftext> stamp in the response msg
|
||
tokens_already_generated < parseInt(amount_gen) && //if the gen'd msg is less than the max response length..
|
||
getMessage.length > 0) { //if we actually have gen'd text at all...
|
||
runGenerate(getMessage); //generate again with the 'GetMessage' argument..
|
||
return;
|
||
}
|
||
|
||
getMessage = message_already_generated;
|
||
|
||
}
|
||
//Formating
|
||
getMessage = $.trim(getMessage);
|
||
if (is_pygmalion) {
|
||
getMessage = getMessage.replace(new RegExp('<USER>', "g"), name1);
|
||
getMessage = getMessage.replace(new RegExp('<BOT>', "g"), name2);
|
||
getMessage = getMessage.replace(new RegExp('You:', "g"), name1 + ':');
|
||
}
|
||
if (getMessage.indexOf(name1 + ":") != -1) {
|
||
getMessage = getMessage.substr(0, getMessage.indexOf(name1 + ":"));
|
||
|
||
}
|
||
if (getMessage.indexOf('<|endoftext|>') != -1) {
|
||
getMessage = getMessage.substr(0, getMessage.indexOf('<|endoftext|>'));
|
||
|
||
}
|
||
// clean-up group message from excessive generations
|
||
if (type == 'group_chat' && selected_group) {
|
||
const group = groups.find(x => x.id == selected_group);
|
||
|
||
if (group && Array.isArray(group.members) && group.members) {
|
||
for (let member of group.members) {
|
||
// Skip current speaker.
|
||
if (member === name2) {
|
||
continue;
|
||
}
|
||
|
||
const indexOfMember = getMessage.indexOf(member + ":");
|
||
if (indexOfMember != -1) {
|
||
getMessage = getMessage.substr(0, indexOfMember);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
let this_mes_is_name = true;
|
||
if (getMessage.indexOf(name2 + ":") === 0) {
|
||
getMessage = getMessage.replace(name2 + ':', '');
|
||
getMessage = getMessage.trimStart();
|
||
} else {
|
||
this_mes_is_name = false;
|
||
}
|
||
if (type === 'force_name2') this_mes_is_name = true;
|
||
//getMessage = getMessage.replace(/^\s+/g, '');
|
||
if (getMessage.length > 0) {
|
||
if(chat[chat.length-1]['swipe_id'] === undefined ||
|
||
chat[chat.length-1]['is_user']){type = 'normal';}
|
||
if(type === 'swipe'){
|
||
|
||
chat[chat.length-1]['swipes'][chat[chat.length-1]['swipes'].length] = getMessage;
|
||
if(chat[chat.length-1]['swipe_id'] === chat[chat.length-1]['swipes'].length-1){
|
||
//console.log(getMessage);
|
||
chat[chat.length-1]['mes'] = getMessage;
|
||
console.log('runGenerate calls addOneMessage for swipe');
|
||
addOneMessage(chat[chat.length-1], 'swipe');
|
||
}else{
|
||
chat[chat.length-1]['mes'] = getMessage;
|
||
}
|
||
is_send_press = false;
|
||
}else{
|
||
console.log('entering chat update routine for non-swipe post');
|
||
is_send_press = false;
|
||
chat[chat.length] = {};
|
||
chat[chat.length - 1]['name'] = name2;
|
||
chat[chat.length - 1]['is_user'] = false;
|
||
chat[chat.length - 1]['is_name'] = this_mes_is_name;
|
||
chat[chat.length - 1]['send_date'] = humanizedDateTime();
|
||
getMessage = $.trim(getMessage);
|
||
chat[chat.length - 1]['mes'] = getMessage;
|
||
|
||
if (type === 'group_chat') {
|
||
console.log('entering chat update for groups');
|
||
let avatarImg = 'img/fluffy.png';
|
||
if (characters[this_chid].avatar != 'none') {
|
||
avatarImg = `characters/${characters[this_chid].avatar}?${Date.now()}`;
|
||
}
|
||
chat[chat.length - 1]['is_name'] = true;
|
||
chat[chat.length - 1]['force_avatar'] = avatarImg;
|
||
}
|
||
console.log('runGenerate calls addOneMessage');
|
||
addOneMessage(chat[chat.length - 1]);
|
||
console.log('should hide loading mes and return with send button now');
|
||
$("#send_but").css("display", "inline");
|
||
$("#loading_mes").css("display", "none");
|
||
|
||
if (type == 'group_chat' && selected_group) {
|
||
saveGroupChat(selected_group);
|
||
} /* else {
|
||
console.log('saving message for non group chat');
|
||
saveChat();
|
||
} */
|
||
}
|
||
|
||
|
||
} else {
|
||
Generate('force_name2');
|
||
}
|
||
} else {
|
||
console.log('final re-setting of send button due to error');
|
||
$("#send_but").css("display", "inline");
|
||
$("#loading_mes").css("display", "none");
|
||
showSwipeButtons();
|
||
}
|
||
console.log('/savechat called by /Generate');
|
||
saveChat();
|
||
//let final_message_length = encode(JSON.stringify(getMessage)).length;
|
||
//console.log('AI Response: +'+getMessage+ '('+final_message_length+' tokens)');
|
||
|
||
$("#send_but").css("display", "inline");
|
||
console.log('attempting to show swipes');
|
||
showSwipeButtons();
|
||
|
||
$("#loading_mes").css("display", "none");
|
||
|
||
},
|
||
error: function (jqXHR, exception) {
|
||
|
||
$("#send_textarea").removeAttr('disabled');
|
||
is_send_press = false;
|
||
$("#send_but").css("display", "inline");
|
||
$("#loading_mes").css("display", "none");
|
||
console.log(exception);
|
||
console.log(jqXHR);
|
||
}
|
||
}); //end of "if not data error"
|
||
} //rungenerate ends
|
||
|
||
} else { //generate's primary loop ends, after this is error handling for no-connection or safety-id
|
||
|
||
if (this_chid == undefined || this_chid == 'invalid-safety-id') {
|
||
//send ch sel
|
||
popup_type = 'char_not_selected';
|
||
callPopup('<h3>Сharacter is not selected</h3>');
|
||
}
|
||
is_send_press = false;
|
||
}
|
||
console.log('generate ending');
|
||
} //generate ends
|
||
async function saveChat() {
|
||
console.log('savechat entered');
|
||
chat.forEach(function (item, i) {
|
||
if (item.is_user) {
|
||
var str = item.mes.replace(`${name1}:`, `${default_user_name}:`);
|
||
chat[i].mes = str;
|
||
chat[i].name = default_user_name;
|
||
} else if (i !== chat.length - 1 && chat[i].swipe_id !== undefined) {
|
||
delete chat[i].swipes;
|
||
delete chat[i].swipe_id;
|
||
}
|
||
});
|
||
var save_chat = [
|
||
{ user_name: default_user_name, character_name: name2, create_date: chat_create_date },
|
||
...chat,
|
||
];
|
||
try {
|
||
const response = await $.ajax({
|
||
url: '/savechat',
|
||
method: 'POST',
|
||
dataType: 'json',
|
||
contentType: 'application/json',
|
||
data: JSON.stringify({
|
||
ch_name: characters[this_chid].name,
|
||
file_name: characters[this_chid].chat,
|
||
chat: save_chat,
|
||
avatar_url: characters[this_chid].avatar,
|
||
}),
|
||
});
|
||
console.log(response);
|
||
} catch (error) {
|
||
console.log(error);
|
||
}
|
||
}
|
||
async function getChat() {
|
||
console.log('/getchat -- entered for -- ' + characters[this_chid].name);
|
||
try {
|
||
const response = await $.ajax({
|
||
type: 'POST',
|
||
url: '/getchat',
|
||
data: JSON.stringify({ ch_name: characters[this_chid].name, file_name: characters[this_chid].chat, avatar_url: characters[this_chid].avatar }),
|
||
dataType: 'json',
|
||
contentType: 'application/json',
|
||
});
|
||
if (response[0] !== undefined) {
|
||
chat.push(...response);
|
||
chat_create_date = chat[0]['create_date'];
|
||
chat.shift();
|
||
} else {
|
||
chat_create_date = humanizedDateTime();
|
||
}
|
||
getChatResult();
|
||
saveChat();
|
||
} catch (error) {
|
||
getChatResult();
|
||
console.log(error);
|
||
}
|
||
}
|
||
function getChatResult() {
|
||
console.log('getchatresults entered');
|
||
name2 = characters[this_chid].name;
|
||
|
||
if (chat.length > 1) {
|
||
for (let i = 0; i < chat.length; i++) {
|
||
const item = chat[i];
|
||
if (item['is_user']) {
|
||
item['mes'] = item['mes'].replace(default_user_name + ':', name1 + ':');
|
||
item['name'] = name1;
|
||
}
|
||
}
|
||
} else {
|
||
const firstMes = characters[this_chid].first_mes || default_ch_mes;
|
||
chat[0] = {
|
||
name: name2,
|
||
is_user: false,
|
||
is_name: true,
|
||
send_date: humanizedDateTime(),
|
||
mes: firstMes
|
||
};
|
||
}
|
||
|
||
printMessages();
|
||
select_selected_character(this_chid);
|
||
}
|
||
|
||
///////// GROUP CHAT FUNCTIONS /////////////////////
|
||
async function generateGroupWrapper(by_auto_mode) {
|
||
console.log('generateGroupWrapper entered');
|
||
if (online_status === 'no_connection') {
|
||
is_group_generating = false;
|
||
is_send_press = false;
|
||
return;
|
||
}
|
||
|
||
const group = groups.find(x => x.id === selected_group);
|
||
|
||
if (!group || !Array.isArray(group.members) || !group.members.length) {
|
||
sendSystemMessage(system_message_types.EMPTY);
|
||
return;
|
||
}
|
||
|
||
try {
|
||
is_group_generating = true;
|
||
this_chid = undefined;
|
||
name2 = '';
|
||
const userInput = $("#send_textarea").val();
|
||
|
||
let typingIndicator = $('#chat .typing_indicator');
|
||
|
||
if (typingIndicator.length === 0) {
|
||
typingIndicator = $('#typing_indicator_template .typing_indicator').clone();
|
||
typingIndicator.hide();
|
||
$('#chat').append(typingIndicator);
|
||
}
|
||
|
||
let messagesBefore = chat.length;
|
||
let activationText = '';
|
||
if (userInput && userInput.length && !by_auto_mode) {
|
||
activationText = userInput;
|
||
messagesBefore++;
|
||
} else {
|
||
const lastMessage = chat[chat.length - 1];
|
||
if (lastMessage && !lastMessage.is_system) {
|
||
activationText = lastMessage.mes;
|
||
}
|
||
}
|
||
|
||
const activatedMembers = activateMembers(group.members, activationText);
|
||
// now the real generation begins: cycle through every character
|
||
for (const chId of activatedMembers) {
|
||
this_chid = chId;
|
||
name2 = characters[chId].name;
|
||
|
||
await Generate('group_chat', by_auto_mode);
|
||
|
||
// update indicator and scroll down
|
||
typingIndicator.find('.typing_indicator_name').text(characters[chId].name);
|
||
$('#chat').append(typingIndicator);
|
||
typingIndicator.show(250, function () {
|
||
typingIndicator.get(0).scrollIntoView({ behavior: 'smooth' });
|
||
});
|
||
|
||
while (true) {
|
||
// check if message generated already
|
||
if (chat.length == messagesBefore) {
|
||
await delay(10);
|
||
} else {
|
||
messagesBefore++;
|
||
break;
|
||
}
|
||
}
|
||
|
||
// hide and reapply the indicator to the bottom of the list
|
||
typingIndicator.hide(250);
|
||
$('#chat').append(typingIndicator);
|
||
}
|
||
|
||
} finally {
|
||
is_group_generating = false;
|
||
is_send_press = false;
|
||
this_chid = undefined;
|
||
}
|
||
}
|
||
function activateMembers(members, input) {
|
||
let activatedNames = [];
|
||
|
||
// find mentions
|
||
if (input && input.length) {
|
||
for (let inputWord of extractAllWords(input)) {
|
||
for (let member of members) {
|
||
if (extractAllWords(member).includes(inputWord)) {
|
||
activatedNames.push(member);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// activation by talkativeness (in shuffled order)
|
||
const shuffledMembers = shuffle([...members]);
|
||
for (let member of shuffledMembers) {
|
||
const character = characters.find(x => x.name === member);
|
||
|
||
if (!character) {
|
||
continue;
|
||
}
|
||
|
||
const rollValue = Math.random();
|
||
let talkativeness = Number(character.talkativeness);
|
||
talkativeness = Number.isNaN(talkativeness) ? talkativeness_default : talkativeness;
|
||
if (talkativeness >= rollValue) {
|
||
activatedNames.push(member);
|
||
}
|
||
}
|
||
|
||
// pick 1 at random if no one was activated
|
||
if (activatedNames.length === 0) {
|
||
const randomIndex = Math.floor(Math.random() * members.length);
|
||
activatedNames.push(members[randomIndex]);
|
||
}
|
||
|
||
// de-duplicate array of names
|
||
activatedNames = activatedNames.filter(onlyUnique);
|
||
|
||
// map to character ids
|
||
const memberIds = activatedNames.map(x => characters.findIndex(y => y.name === x)).filter(x => x !== -1);
|
||
return memberIds;
|
||
}
|
||
function extractAllWords(value) {
|
||
const words = [];
|
||
|
||
if (!value) {
|
||
return words;
|
||
}
|
||
|
||
const matches = value.matchAll(/\b\w+\b/gmi);
|
||
for (let match of matches) {
|
||
words.push(match[0].toLowerCase());
|
||
}
|
||
return words;
|
||
}
|
||
async function getGroupChat(id) {
|
||
const response = await fetch('/getgroupchat', {
|
||
method: 'POST',
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
"X-CSRF-Token": token,
|
||
},
|
||
body: JSON.stringify({ id: id }),
|
||
});
|
||
|
||
if (response.ok) {
|
||
const data = await response.json();
|
||
if (Array.isArray(data) && data.length) {
|
||
for (let key of data) {
|
||
chat.push(key);
|
||
}
|
||
printMessages();
|
||
}
|
||
else {
|
||
sendSystemMessage(system_message_types.GROUP);
|
||
const group = groups.find(x => x.id === id);
|
||
if (group && Array.isArray(group.members)) {
|
||
for (let name of group.members) {
|
||
const character = characters.find(x => x.name === name);
|
||
|
||
if (!character) {
|
||
continue;
|
||
}
|
||
|
||
const mes = {};
|
||
mes['is_user'] = false;
|
||
mes['is_system'] = false;
|
||
mes['name'] = character.name;
|
||
mes['is_name'] = true;
|
||
mes['send_date'] = humanizedDateTime();
|
||
mes['mes'] = character.first_mes ? substituteParams(character.first_mes.trim()) : mes['mes'] = default_ch_mes;
|
||
mes['force_avatar'] = character.avatar != 'none' ? `characters/${character.avatar}?${Date.now()}` : 'img/fluffy.png';
|
||
chat.push(mes);
|
||
console.log('getGroupChat calls addOneMessage');
|
||
addOneMessage(mes);
|
||
}
|
||
}
|
||
}
|
||
|
||
await saveGroupChat(id);
|
||
}
|
||
}
|
||
async function saveGroupChat(id) {
|
||
const response = await fetch('/savegroupchat', {
|
||
method: 'POST',
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
"X-CSRF-Token": token,
|
||
},
|
||
body: JSON.stringify({ id: id, chat: [...chat] })
|
||
});
|
||
}
|
||
async function getGroups() {
|
||
const response = await fetch('/getgroups', {
|
||
method: 'POST',
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
"X-CSRF-Token": token,
|
||
},
|
||
});
|
||
|
||
if (response.ok) {
|
||
const data = await response.json();
|
||
groups = data.sort((a, b) => a.id - b.id);
|
||
}
|
||
}
|
||
async function deleteGroup(id) {
|
||
const response = await fetch('/deletegroup', {
|
||
method: 'POST',
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
"X-CSRF-Token": token,
|
||
},
|
||
body: JSON.stringify({ id: id }),
|
||
});
|
||
|
||
if (response.ok) {
|
||
active_character = 'invalid-safety-id'; //unsets the chid in settings (this prevents AutoLoadChat from trying to load the wrong ChID
|
||
this_chid = 'invalid-safety-id'; //unsets expected chid before reloading (related to getCharacters/printCharacters from using old arrays)
|
||
selected_group = null;
|
||
characters.length = 0; // resets the characters array, forcing getcharacters to reset
|
||
name2 = "Chloe"; // replaces deleted charcter name with Chloe, since she wil be displayed next.
|
||
chat = [...safetychat]; // sets up chloe to tell user about having deleted a character
|
||
|
||
/* QuickRefresh(); */
|
||
$('#rm_info_avatar').html('');
|
||
$('#rm_info_block').transition({ opacity: 0, duration: 0 });
|
||
select_rm_info("Group deleted!");
|
||
$('#rm_info_block').transition({ opacity: 1.0, duration: 2000 });
|
||
}
|
||
|
||
}
|
||
async function editGroup(id, immediately) {
|
||
const group = groups.find(x => x.id == id);
|
||
|
||
if (!group) {
|
||
return;
|
||
}
|
||
|
||
async function _save() {
|
||
const response = await fetch('/editgroup', {
|
||
method: 'POST',
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
"X-CSRF-Token": token,
|
||
},
|
||
body: JSON.stringify(group),
|
||
});
|
||
}
|
||
|
||
if (immediately) {
|
||
return await _save();
|
||
}
|
||
|
||
clearTimeout(timerGroupSave);
|
||
timerGroupSave = setTimeout(async () => await _save(), durationSaveEdit);
|
||
}
|
||
async function groupChatAutoModeWorker() {
|
||
if (!is_group_automode_enabled || online_status === 'no_connection') {
|
||
return;
|
||
}
|
||
|
||
if (!selected_group || is_send_press || is_group_generating) {
|
||
return;
|
||
}
|
||
|
||
const group = groups.find(x => x.id === selected_group);
|
||
|
||
if (!group || !Array.isArray(group.members) || !group.members.length) {
|
||
return;
|
||
}
|
||
|
||
await generateGroupWrapper(true);
|
||
}
|
||
function select_group_chats(chat_id) {
|
||
menu_type = 'group_chats';
|
||
const group = chat_id && groups.find(x => x.id == chat_id);
|
||
const groupName = group?.name ?? '';
|
||
|
||
$('#rm_group_chat_name').val(groupName);
|
||
$('#rm_group_chat_name').off();
|
||
$('#rm_group_chat_name').on('input', async function () {
|
||
if (chat_id) {
|
||
group.name = $(this).val();
|
||
await editGroup(chat_id);
|
||
}
|
||
});
|
||
$('#rm_group_filter').val('').trigger('input');
|
||
$("#rm_group_chats_block").css("display", "flex");
|
||
$('#rm_group_chats_block').css('opacity', 0.0);
|
||
$('#rm_group_chats_block').transition({
|
||
opacity: 1.0,
|
||
duration: animation_rm_duration,
|
||
easing: animation_rm_easing,
|
||
complete: function () { }
|
||
});
|
||
|
||
$("#rm_ch_create_block").css("display", "none");
|
||
$("#rm_characters_block").css("display", "none");
|
||
|
||
async function memberClickHandler(event) {
|
||
event.stopPropagation();
|
||
const id = $(this).data('id');
|
||
const isDelete = !!($(this).closest('#rm_group_members').length);
|
||
const template = $(this).clone();
|
||
template.data('id', id);
|
||
template.click(memberClickHandler);
|
||
|
||
if (isDelete) {
|
||
template.find('.plus').show();
|
||
template.find('.minus').hide();
|
||
$('#rm_group_add_members').prepend(template);
|
||
} else {
|
||
template.find('.plus').hide();
|
||
template.find('.minus').show();
|
||
$('#rm_group_members').prepend(template);
|
||
}
|
||
|
||
if (group) {
|
||
if (isDelete) {
|
||
const index = group.members.findIndex(x => x === id);
|
||
if (index !== -1) {
|
||
group.members.splice(index, 1);
|
||
}
|
||
} else {
|
||
group.members.push(id);
|
||
}
|
||
await editGroup(chat_id);
|
||
updateGroupAvatar(group);
|
||
}
|
||
|
||
$(this).remove();
|
||
const groupHasMembers = !!$('#rm_group_members').children().length;
|
||
$("#rm_group_submit").prop('disabled', !groupHasMembers);
|
||
}
|
||
|
||
// render characters list
|
||
$('#rm_group_add_members').empty();
|
||
$('#rm_group_members').empty();
|
||
for (let character of characters) {
|
||
const avatar = character.avatar != 'none' ? `characters/${character.avatar}#${Date.now()}` : default_avatar;
|
||
const template = $('#group_member_template .group_member').clone();
|
||
template.data('id', character.name);
|
||
template.find('.avatar img').attr('src', avatar);
|
||
template.find('.ch_name').html(character.name);
|
||
template.click(memberClickHandler);
|
||
|
||
if (group && Array.isArray(group.members) && group.members.includes(character.name)) {
|
||
template.find('.plus').hide();
|
||
template.find('.minus').show();
|
||
$('#rm_group_members').append(template);
|
||
} else {
|
||
template.find('.plus').show();
|
||
template.find('.minus').hide();
|
||
$('#rm_group_add_members').append(template);
|
||
}
|
||
}
|
||
|
||
const groupHasMembers = !!$('#rm_group_members').children().length;
|
||
$("#rm_group_submit").prop('disabled', !groupHasMembers);
|
||
|
||
// bottom buttons
|
||
if (chat_id) {
|
||
$('#rm_group_submit').hide();
|
||
$('#rm_group_delete').show();
|
||
} else {
|
||
$('#rm_group_submit').show();
|
||
$('#rm_group_delete').hide();
|
||
}
|
||
|
||
$('#rm_group_delete').off();
|
||
$('#rm_group_delete').on('click', function () {
|
||
popup_type = 'del_group';
|
||
$('#dialogue_popup').data('group_id', chat_id);
|
||
callPopup('<h3>Delete the group?</h3>');
|
||
});
|
||
|
||
// top bar
|
||
if (group) {
|
||
var display_name = groupName;
|
||
//$("#rm_button_selected_ch").children("h2").css(deselected_button_style);
|
||
$("#rm_button_selected_ch").children("h2").text('');
|
||
}
|
||
}
|
||
////////////////////////////////////////////////////
|
||
|
||
function openNavToggle() {
|
||
if (!$('#nav-toggle').prop('checked')) {
|
||
$('#nav-toggle').trigger('click');
|
||
}
|
||
}
|
||
function changeMainAPI() {
|
||
if ($('#main_api').find(":selected").val() == 'kobold') {
|
||
$('#kobold_api').css("display", "block");
|
||
$('#novel_api').css("display", "none");
|
||
$('#textgenerationwebui_api').css("display", "none");
|
||
main_api = 'kobold';
|
||
$('#max_context_block').css('display', 'block');
|
||
$('#amount_gen_block').css('display', 'block');
|
||
$('#softprompt_block').css('display', 'block');
|
||
$('#settings_perset').trigger('change');
|
||
}
|
||
if ($('#main_api').find(":selected").val() == 'textgenerationwebui') {
|
||
$('#kobold_api').css("display", "none");
|
||
$('#novel_api').css("display", "none");
|
||
$('#textgenerationwebui_api').css("display", "block");
|
||
main_api = 'textgenerationwebui';
|
||
$('#max_context_block').css('display', 'block');
|
||
$('#amount_gen_block').css('display', 'block');
|
||
$('#softprompt_block').css('display', 'block');
|
||
$("#amount_gen_block").children().prop("disabled", false);
|
||
$("#amount_gen_block").css('opacity', 1.0);
|
||
}
|
||
|
||
if ($('#main_api').find(":selected").val() == 'novel') {
|
||
$('#kobold_api').css("display", "none");
|
||
$('#novel_api').css("display", "block");
|
||
$('#textgenerationwebui_api').css("display", "none");
|
||
main_api = 'novel';
|
||
$('#max_context_block').css('display', 'none');
|
||
$('#amount_gen_block').css('display', 'none');
|
||
$('#softprompt_block').css('display', 'none');
|
||
}
|
||
}
|
||
async function getUserAvatars() {
|
||
$("#user_avatar_block").html(""); //RossAscends: necessary to avoid doubling avatars each QuickRefresh.
|
||
$('#user_avatar_block').append('<div class="avatar_upload">+</div>');
|
||
const response = await fetch("/getuseravatars", {
|
||
method: "POST",
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
"X-CSRF-Token": token
|
||
},
|
||
body: JSON.stringify({
|
||
"": ""
|
||
})
|
||
|
||
});
|
||
if (response.ok === true) {
|
||
const getData = await response.json();
|
||
//background = getData;
|
||
//console.log(getData.length);
|
||
|
||
for (var i = 0; i < getData.length; i++) {
|
||
//console.log(1);
|
||
appendUserAvatar(getData[i]);
|
||
}
|
||
//var aa = JSON.parse(getData[0]);
|
||
//const load_ch_coint = Object.getOwnPropertyNames(getData);
|
||
|
||
|
||
}
|
||
}
|
||
function highlightSelectedAvatar() {
|
||
$("#user_avatar_block").find('.avatar').removeClass('selected');
|
||
$("#user_avatar_block").find(`.avatar[imgfile='${user_avatar}']`).addClass('selected');
|
||
}
|
||
function appendUserAvatar(name) {
|
||
const block = $("#user_avatar_block").append('<div imgfile="' + name + '" class="avatar"><img src="User Avatars/' + name + '"></div>');
|
||
highlightSelectedAvatar();
|
||
}
|
||
|
||
//***************SETTINGS****************//
|
||
///////////////////////////////////////////
|
||
async function getSettings(type) {//timer
|
||
|
||
console.log('getSettings() -- Entered');
|
||
jQuery.ajax({
|
||
type: 'POST',
|
||
url: '/getsettings',
|
||
data: JSON.stringify({}),
|
||
beforeSend: function () {
|
||
console.log('getSettings -- before pull -- amount_gen = '+amount_gen)
|
||
|
||
},
|
||
cache: false,
|
||
dataType: "json",
|
||
contentType: "application/json",
|
||
//processData: false,
|
||
success: function (data) {
|
||
if (data.result != 'file not find' && data.settings) {
|
||
settings = JSON.parse(data.settings);
|
||
if (settings.username !== undefined) {
|
||
if (settings.username !== '') {
|
||
name1 = settings.username;
|
||
$('#your_name').val(name1);
|
||
}
|
||
}
|
||
|
||
//Load which API we are using
|
||
if (settings.main_api != undefined) {
|
||
main_api = settings.main_api;
|
||
$("#main_api option[value=" + main_api + "]").attr('selected', 'true');
|
||
changeMainAPI();
|
||
}
|
||
//load Novel API KEY is exists
|
||
if (settings.api_key_novel != undefined) {
|
||
api_key_novel = settings.api_key_novel;
|
||
$("#api_key_novel").val(api_key_novel);
|
||
}
|
||
//load the rest of the Novel settings without any checks
|
||
model_novel = settings.model_novel;
|
||
$("#model_novel_select option[value=" + model_novel + "]").attr('selected', 'true');
|
||
|
||
novelai_setting_names = data.novelai_setting_names;
|
||
novelai_settings = data.novelai_settings;
|
||
novelai_settings.forEach(function (item, i, arr) {
|
||
novelai_settings[i] = JSON.parse(item);
|
||
});
|
||
var arr_holder = {};
|
||
|
||
$("#settings_perset_novel").empty();
|
||
|
||
novelai_setting_names.forEach(function (item, i, arr) {
|
||
arr_holder[item] = i;
|
||
$('#settings_perset_novel').append('<option value=' + i + '>' + item + '</option>');
|
||
|
||
});
|
||
novelai_setting_names = {};
|
||
novelai_setting_names = arr_holder;
|
||
|
||
preset_settings_novel = settings.preset_settings_novel;
|
||
$("#settings_perset_novel option[value=" + novelai_setting_names[preset_settings_novel] + "]").attr('selected', 'true');
|
||
|
||
//Load KoboldAI settings
|
||
koboldai_setting_names = data.koboldai_setting_names;
|
||
koboldai_settings = data.koboldai_settings;
|
||
koboldai_settings.forEach(function (item, i, arr) {
|
||
koboldai_settings[i] = JSON.parse(item);
|
||
});
|
||
var arr_holder = {};
|
||
|
||
$("#settings_perset").empty(); //RossAscends: uncommented this to prevent settings selector from doubling preset list on QuickRefresh
|
||
$("#settings_perset").append('<option value="gui">GUI KoboldAI Settings</option>'); //adding in the GUI settings, since it is not loaded dynamically
|
||
|
||
koboldai_setting_names.forEach(function (item, i, arr) {
|
||
arr_holder[item] = i;
|
||
$('#settings_perset').append('<option value=' + i + '>' + item + '</option>');
|
||
//console.log('loading preset #'+i+' -- '+item);
|
||
|
||
});
|
||
koboldai_setting_names = {};
|
||
koboldai_setting_names = arr_holder;
|
||
preset_settings = settings.preset_settings;
|
||
|
||
//Load AI model config settings (temp, context length, anchors, and anchor order)
|
||
|
||
textgenerationwebui_settings = settings.textgenerationwebui_settings || textgenerationwebui_settings;
|
||
|
||
temp = settings.temp;
|
||
var addZeros = "";
|
||
if (isInt(temp)) addZeros = ".00";
|
||
$('#temp').val(temp);
|
||
$('#temp_counter').html(temp + addZeros);
|
||
|
||
amount_gen = settings.amount_gen;
|
||
$('#amount_gen').val(amount_gen);
|
||
$('#amount_gen_counter').html(amount_gen + ' Tokens');
|
||
console.log('getSettings -- just pulled -- amount_gen ='+amount_gen);
|
||
|
||
if (settings.max_context !== undefined) max_context = parseInt(settings.max_context);
|
||
$('#max_context').val(max_context);
|
||
$('#max_context_counter').html(max_context + ' Tokens');
|
||
|
||
if (settings.anchor_order !== undefined) anchor_order = parseInt(settings.anchor_order);
|
||
if (settings.style_anchor !== undefined) style_anchor = !!settings.style_anchor;
|
||
if (settings.character_anchor !== undefined) character_anchor = !!settings.character_anchor;
|
||
$('#style_anchor').prop('checked', style_anchor);
|
||
$('#character_anchor').prop('checked', character_anchor);
|
||
$("#anchor_order option[value=" + anchor_order + "]").attr('selected', 'true');
|
||
|
||
if (settings.world_info_depth !== undefined) world_info_depth = Number(settings.world_info_depth);
|
||
if (settings.world_info_budget !== undefined) world_info_budget = Number(settings.world_info_budget);
|
||
|
||
rep_pen = settings.rep_pen;
|
||
rep_pen_size = settings.rep_pen_size;
|
||
|
||
swipes = !!settings.swipes; //// swipecode
|
||
$('#swipes-checkbox').prop('checked', swipes); /// swipecode
|
||
console.log('getSettings -- swipes = '+swipes+'. toggling box');
|
||
hideSwipeButtons();
|
||
showSwipeButtons();
|
||
|
||
/* $('#swipes-checkbox').change(function() {
|
||
swipes = !!$('#swipes-checkbox').prop('checked');
|
||
|
||
//if(swipes){ showSwipeButtons(); }else{ hideSwipeButtons(); }
|
||
saveSettings();
|
||
}); */
|
||
|
||
$('#world_info_depth_counter').html(`${world_info_depth} Messages`);
|
||
$('#world_info_depth').val(world_info_depth);
|
||
|
||
$('#world_info_budget_counter').html(`${world_info_budget} Tokens`);
|
||
$('#world_info_budget').val(world_info_budget);
|
||
|
||
addZeros = "";
|
||
if (isInt(rep_pen)) addZeros = ".00";
|
||
$('#rep_pen').val(rep_pen);
|
||
$('#rep_pen_counter').html(rep_pen + addZeros);
|
||
|
||
$('#rep_pen_size').val(rep_pen_size);
|
||
$('#rep_pen_size_counter').html(rep_pen_size + " Tokens");
|
||
|
||
//Novel
|
||
temp_novel = settings.temp_novel;
|
||
rep_pen_novel = settings.rep_pen_novel;
|
||
rep_pen_size_novel = settings.rep_pen_size_novel;
|
||
|
||
addZeros = "";
|
||
if (isInt(temp_novel)) addZeros = ".00";
|
||
$('#temp_novel').val(temp_novel);
|
||
$('#temp_counter_novel').html(temp_novel + addZeros);
|
||
|
||
addZeros = "";
|
||
if (isInt(rep_pen_novel)) addZeros = ".00";
|
||
$('#rep_pen_novel').val(rep_pen_novel);
|
||
$('#rep_pen_counter_novel').html(rep_pen_novel + addZeros);
|
||
|
||
$('#rep_pen_size_novel').val(rep_pen_size_novel);
|
||
$('#rep_pen_size_counter_novel').html(rep_pen_size_novel + " Tokens");
|
||
|
||
//Enable GUI deference settings if GUI is selected for Kobold
|
||
if (preset_settings == 'gui') {
|
||
$("#settings_perset option[value=gui]").attr('selected', 'true').trigger('change');
|
||
$("#range_block").children().prop("disabled", true);
|
||
$("#range_block").css('opacity', 0.5);
|
||
|
||
$("#amount_gen_block").children().prop("disabled", true);
|
||
$("#amount_gen_block").css('opacity', 0.45);
|
||
} else {
|
||
if (typeof koboldai_setting_names[preset_settings] !== 'undefined') {
|
||
|
||
$("#settings_perset option[value=" + koboldai_setting_names[preset_settings] + "]").attr('selected', 'true').trigger('change');
|
||
} else {
|
||
$("#range_block").children().prop("disabled", true);
|
||
$("#range_block").css('opacity', 0.5);
|
||
$("#amount_gen_block").children().prop("disabled", true);
|
||
$("#amount_gen_block").css('opacity', 0.45);
|
||
|
||
preset_settings = 'gui';
|
||
$("#settings_perset option[value=gui]").attr('selected', 'true').trigger('change');
|
||
}
|
||
}
|
||
|
||
//Load User's Name and Avatar
|
||
|
||
user_avatar = settings.user_avatar;
|
||
$('.mes').each(function () {
|
||
if ($(this).attr('ch_name') == name1) {
|
||
$(this).children('.avatar').children('img').attr('src', 'User Avatars/' + user_avatar);
|
||
}
|
||
});
|
||
|
||
//Load the API server URL from settings
|
||
api_server = settings.api_server;
|
||
$('#api_url_text').val(api_server);
|
||
|
||
// world info settings
|
||
world_names = data.world_names?.length ? data.world_names : [];
|
||
|
||
if (settings.world_info != undefined) {
|
||
if (world_names.includes(settings.world_info)) {
|
||
world_info = settings.world_info;
|
||
}
|
||
}
|
||
|
||
world_names.forEach((item, i) => {
|
||
$('#world_info').append(`<option value='${i}'>${item}</option>`);
|
||
// preselect world if saved
|
||
if (item == world_info) {
|
||
$('#world_info').val(i).change();
|
||
}
|
||
});
|
||
// end world info settings
|
||
|
||
if (data.enable_extensions) {
|
||
const src = 'scripts/extensions.js';
|
||
if ($(`script[src="${src}"]`).length === 0) {
|
||
const script = document.createElement('script');
|
||
script.type = 'text/javascript';
|
||
script.src = src;
|
||
$('body').append(script);
|
||
}
|
||
}
|
||
|
||
//get the character to auto-load
|
||
if (settings.active_character !== undefined) {
|
||
if (settings.active_character !== '') {
|
||
active_character = settings.active_character;
|
||
}
|
||
}
|
||
|
||
api_server_textgenerationwebui = settings.api_server_textgenerationwebui;
|
||
$("#textgenerationwebui_api_url_text").val(api_server_textgenerationwebui);
|
||
|
||
|
||
for (var i of ["temp", "rep_pen", "rep_pen_size", "top_k", "top_p", "typical_p", "penalty_alpha"]) {
|
||
$("#" + i + "_textgenerationwebui")
|
||
.val(textgenerationwebui_settings[i]);
|
||
$("#" + i + "_counter_textgenerationwebui")
|
||
.html(textgenerationwebui_settings[i]);
|
||
}
|
||
|
||
selected_button = settings.selected_button;
|
||
|
||
|
||
}
|
||
|
||
if (!is_checked_colab) isColab();
|
||
console.log('getSettings() -- success -- amount_gen='+amount_gen );
|
||
},
|
||
error: function (jqXHR, exception) {
|
||
console.log(exception);
|
||
console.log(jqXHR);
|
||
|
||
}
|
||
});
|
||
collapse_newlines = localStorage.getItem(storage_keys.collapse_newlines) == 'true';
|
||
$('#collapse-newlines-checkbox').prop('checked', collapse_newlines);
|
||
}
|
||
async function saveSettings(type) {
|
||
console.log('saveSettings() -- Entered');
|
||
jQuery.ajax({
|
||
type: 'POST',
|
||
url: '/savesettings',
|
||
data: JSON.stringify({
|
||
username: name1,
|
||
api_server: api_server,
|
||
api_server_textgenerationwebui: api_server_textgenerationwebui,
|
||
preset_settings: preset_settings,
|
||
preset_settings_novel: preset_settings_novel,
|
||
user_avatar: user_avatar,
|
||
temp: temp,
|
||
amount_gen: amount_gen,
|
||
max_context: max_context,
|
||
anchor_order: anchor_order,
|
||
style_anchor: style_anchor,
|
||
character_anchor: character_anchor,
|
||
main_api: main_api,
|
||
api_key_novel: api_key_novel,
|
||
rep_pen: rep_pen,
|
||
rep_pen_size: rep_pen_size,
|
||
model_novel: model_novel,
|
||
temp_novel: temp_novel,
|
||
rep_pen_novel: rep_pen_novel,
|
||
rep_pen_size_novel: rep_pen_size_novel,
|
||
world_info: world_info,
|
||
world_info_depth: world_info_depth,
|
||
world_info_budget: world_info_budget,
|
||
active_character: active_character,
|
||
textgenerationwebui_settings: textgenerationwebui_settings,
|
||
swipes: swipes
|
||
}),
|
||
beforeSend: function () {
|
||
if (type == 'change_name') {
|
||
name1 = $('#your_name').val()
|
||
}
|
||
},
|
||
cache: false,
|
||
dataType: "json",
|
||
contentType: "application/json",
|
||
success: function (data) {
|
||
if (type == 'change_name') {
|
||
clearChat();
|
||
printMessages();
|
||
}
|
||
},
|
||
error: function (jqXHR, exception) {
|
||
console.log(exception);
|
||
console.log(jqXHR);
|
||
|
||
}
|
||
});
|
||
localStorage.setItem(storage_keys.collapse_newlines, collapse_newlines);
|
||
}
|
||
function isInt(value) {
|
||
return !isNaN(value) &&
|
||
parseInt(Number(value)) == value &&
|
||
!isNaN(parseInt(value, 10));
|
||
}
|
||
function messageEditDone(div) {
|
||
|
||
var text = div.parent().parent().children('.mes_text').children('.edit_textarea').val();
|
||
//var text = chat[this_edit_mes_id];
|
||
text = text.trim();
|
||
const bias = extractMessageBias(text);
|
||
chat[this_edit_mes_id]['mes'] = text;
|
||
|
||
// editing old messages
|
||
if (!chat[this_edit_mes_id]['extra']) {
|
||
chat[this_edit_mes_id]['extra'] = {};
|
||
}
|
||
|
||
chat[this_edit_mes_id]['extra']['bias'] = bias ?? null;
|
||
|
||
div.parent().parent().children('.mes_text').empty();
|
||
div.css('display', 'none');
|
||
div.parent().children('.mes_edit_cancel').css('display', 'none');
|
||
div.parent().children('.mes_edit').css('display', 'inline-block');
|
||
div.parent().parent().children('.mes_text').append(messageFormating(text, this_edit_mes_chname));
|
||
div.parent().parent().children('.mes_bias').empty();
|
||
div.parent().parent().children('.mes_bias').append(messageFormating(bias));
|
||
appendImageToMessage(chat[this_edit_mes_id], div.closest('.mes'));
|
||
this_edit_mes_id = undefined;
|
||
if (selected_group) {
|
||
saveGroupChat(selected_group);
|
||
}
|
||
else {
|
||
saveChat();
|
||
}
|
||
}
|
||
async function getAllCharaChats() {
|
||
//console.log('getAllCharaChats() pinging server for character chat history.');
|
||
$('#select_chat_div').html('');
|
||
//console.log(characters[this_chid].chat);
|
||
jQuery.ajax({
|
||
type: 'POST',
|
||
url: '/getallchatsofcharacter',
|
||
data: JSON.stringify({ avatar_url: characters[this_chid].avatar }),
|
||
beforeSend: function () {
|
||
//$('#create_button').attr('value','Creating...');
|
||
},
|
||
cache: false,
|
||
dataType: "json",
|
||
contentType: "application/json",
|
||
success: function (data) {
|
||
$('#load_select_chat_div').css('display', 'none');
|
||
let dataArr = Object.values(data);
|
||
data = dataArr.sort((a, b) => a['file_name'].localeCompare(b['file_name']));
|
||
data = data.reverse();
|
||
|
||
for (const key in data) {
|
||
let strlen = 300;
|
||
let mes = data[key]['mes'];
|
||
if (mes !== undefined) {
|
||
if (mes.length > strlen) {
|
||
mes = '...' + mes.substring(mes.length - strlen);
|
||
}
|
||
$('#select_chat_div').append('<div class="select_chat_block" file_name="' + data[key]['file_name'] + '"><div class=avatar><img src="characters/' + characters[this_chid]['avatar'] + '""></div><div class="select_chat_block_filename">' + data[key]['file_name'] + '</div><div class="select_chat_block_mes">' + mes + '</div></div>');
|
||
if (characters[this_chid]['chat'] == data[key]['file_name'].replace('.jsonl', '')) {
|
||
//children().last()
|
||
$('#select_chat_div').children(':nth-last-child(1)').attr('highlight', true);
|
||
}
|
||
}
|
||
}
|
||
|
||
},
|
||
error: function (jqXHR, exception) {
|
||
//getChatResult();
|
||
//console.log('getAllCharaChats() -- Failed');
|
||
console.log(exception);
|
||
console.log(jqXHR);
|
||
|
||
}
|
||
});
|
||
}
|
||
//************************************************************
|
||
//************************Novel.AI****************************
|
||
//************************************************************
|
||
async function getStatusNovel() {
|
||
if (is_get_status_novel) {
|
||
|
||
var data = { key: api_key_novel };
|
||
|
||
|
||
jQuery.ajax({
|
||
type: 'POST', //
|
||
url: '/getstatus_novelai', //
|
||
data: JSON.stringify(data),
|
||
beforeSend: function () {
|
||
//$('#create_button').attr('value','Creating...');
|
||
},
|
||
cache: false,
|
||
dataType: "json",
|
||
contentType: "application/json",
|
||
success: function (data) {
|
||
|
||
|
||
if (data.error != true) {
|
||
//var settings2 = JSON.parse(data);
|
||
//const getData = await response.json();
|
||
novel_tier = data.tier;
|
||
if (novel_tier == undefined) {
|
||
online_status = 'no_connection';
|
||
}
|
||
if (novel_tier === 0) {
|
||
online_status = "Paper";
|
||
}
|
||
if (novel_tier === 1) {
|
||
online_status = "Tablet";
|
||
}
|
||
if (novel_tier === 2) {
|
||
online_status = "Scroll";
|
||
}
|
||
if (novel_tier === 3) {
|
||
online_status = "Opus";
|
||
}
|
||
}
|
||
resultCheckStatusNovel();
|
||
},
|
||
error: function (jqXHR, exception) {
|
||
online_status = 'no_connection';
|
||
console.log(exception);
|
||
console.log(jqXHR);
|
||
resultCheckStatusNovel();
|
||
}
|
||
});
|
||
} else {
|
||
if (is_get_status != true) {
|
||
online_status = 'no_connection';
|
||
}
|
||
}
|
||
}
|
||
function compareVersions(v1, v2) {
|
||
const v1parts = v1.split('.');
|
||
const v2parts = v2.split('.');
|
||
|
||
for (let i = 0; i < v1parts.length; ++i) {
|
||
if (v2parts.length === i) {
|
||
return 1;
|
||
}
|
||
|
||
if (v1parts[i] === v2parts[i]) {
|
||
continue;
|
||
}
|
||
if (v1parts[i] > v2parts[i]) {
|
||
return 1;
|
||
}
|
||
else {
|
||
return -1;
|
||
}
|
||
}
|
||
|
||
if (v1parts.length != v2parts.length) {
|
||
return -1;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
function select_rm_info(text, charId = null) {
|
||
$("#rm_characters_block").css("display", "none");
|
||
$("#rm_api_block").css("display", "none");
|
||
$("#rm_ch_create_block").css("display", "none");
|
||
$("#rm_group_chats_block").css("display", "none");
|
||
$("#rm_info_block").css("display", "flex");
|
||
|
||
$("#rm_info_text").html('<h3>' + text + '</h3>');
|
||
|
||
$("#rm_button_characters").css("class", "deselected-right-tab");
|
||
$("#rm_button_settings").css("class", "deselected-right-tab");
|
||
$("#rm_button_selected_ch").css("class", "deselected-right-tab");
|
||
|
||
prev_selected_char = charId;
|
||
}
|
||
function select_selected_character(chid) { //character select
|
||
//console.log('select_selected_character() -- starting with input of -- '+chid+' (name:'+characters[chid].name+')');
|
||
select_rm_create();
|
||
menu_type = 'character_edit';
|
||
$("#delete_button").css("display", "block");
|
||
$("#export_button").css("display", "block");
|
||
$("#rm_button_selected_ch").css("class", "selected-right-tab");
|
||
var display_name = characters[chid].name;
|
||
|
||
|
||
$("#rm_button_selected_ch").children("h2").text(display_name);
|
||
|
||
//create text poles
|
||
$("#rm_button_back").css("display", "none");
|
||
//$("#character_import_button").css("display", "none");
|
||
$("#create_button").attr("value", "Save");
|
||
$("#create_button").css("display", "none");
|
||
var i = 0;
|
||
while ($("#rm_button_selected_ch").width() > 170 && i < 100) {
|
||
display_name = display_name.slice(0, display_name.length - 2);
|
||
//console.log(display_name);
|
||
$("#rm_button_selected_ch").children("h2").text($.trim(display_name) + '...');
|
||
i++;
|
||
}
|
||
$("#add_avatar_button").val('');
|
||
|
||
$('#character_popup_text_h3').text(characters[chid].name);
|
||
$("#character_name_pole").val(characters[chid].name);
|
||
$("#description_textarea").val(characters[chid].description);
|
||
$("#personality_textarea").val(characters[chid].personality);
|
||
$("#firstmessage_textarea").val(characters[chid].first_mes);
|
||
$("#scenario_pole").val(characters[chid].scenario);
|
||
$("#talkativeness_slider").val(characters[chid].talkativeness ?? talkativeness_default);
|
||
$("#mes_example_textarea").val(characters[chid].mes_example);
|
||
$("#selected_chat_pole").val(characters[chid].chat);
|
||
$("#create_date_pole").val(characters[chid].create_date);
|
||
$("#avatar_url_pole").val(characters[chid].avatar);
|
||
$("#chat_import_avatar_url").val(characters[chid].avatar);
|
||
$("#chat_import_character_name").val(characters[chid].name);
|
||
//$("#avatar_div").css("display", "none");
|
||
var this_avatar = default_avatar;
|
||
if (characters[chid].avatar != 'none') {
|
||
this_avatar = "characters/" + characters[chid].avatar;
|
||
}
|
||
$("#avatar_load_preview").attr('src', this_avatar + "?" + Date.now());
|
||
$("#name_div").css("display", "none");
|
||
|
||
$("#form_create").attr("actiontype", "editcharacter");
|
||
active_character = chid;
|
||
//console.log('select_selected_character() -- active_character -- '+chid+'(ChID of '+display_name+')');
|
||
saveSettings();
|
||
//console.log('select_selected_character() -- called saveSettings() to save -- active_character -- '+active_character+'(ChID of '+display_name+')');
|
||
|
||
}
|
||
function select_rm_create() {
|
||
menu_type = 'create';
|
||
|
||
//console.log('select_rm_Create() -- selected button: '+selected_button);
|
||
if (selected_button == 'create') {
|
||
if (create_save_avatar != '') {
|
||
$("#add_avatar_button").get(0).files = create_save_avatar;
|
||
read_avatar_load($("#add_avatar_button").get(0));
|
||
}
|
||
}
|
||
|
||
$("#rm_characters_block").css("display", "none");
|
||
$("#rm_api_block").css("display", "none");
|
||
$("#rm_ch_create_block").css("display", "block");
|
||
$("#rm_group_chats_block").css("display", "none");
|
||
|
||
$('#rm_ch_create_block').css('opacity', 0.0);
|
||
$('#rm_ch_create_block').transition({
|
||
opacity: 1.0,
|
||
duration: animation_rm_duration,
|
||
easing: animation_rm_easing,
|
||
complete: function () { }
|
||
});
|
||
$("#rm_info_block").css("display", "none");
|
||
|
||
$("#delete_button_div").css("display", "none");
|
||
$("#delete_button").css("display", "none");
|
||
$("#export_button").css("display", "none");
|
||
$("#create_button").css("display", "block");
|
||
$("#create_button").attr("value", "Create");
|
||
//RossAscends: commented this out as part of the auto-loading token counter
|
||
//$('#result_info').html(' ');
|
||
$("#rm_button_characters").css("class", "deselected-right-tab");
|
||
$("#rm_button_settings").css("class", "deselected-right-tab");
|
||
$("#rm_button_selected_ch").css("class", "deselected-right-tab");
|
||
|
||
//create text poles
|
||
$("#rm_button_back").css("display", "inline-block");
|
||
$("#character_import_button").css("display", "inline-block");
|
||
$("#character_popup_text_h3").text('Create character');
|
||
$("#character_name_pole").val(create_save_name);
|
||
$("#description_textarea").val(create_save_description);
|
||
$("#personality_textarea").val(create_save_personality);
|
||
$("#firstmessage_textarea").val(create_save_first_message);
|
||
$("#talkativeness_slider").val(create_save_talkativeness);
|
||
$("#scenario_pole").val(create_save_scenario);
|
||
if ($.trim(create_save_mes_example).length == 0) {
|
||
$("#mes_example_textarea").val('<START>');
|
||
} else {
|
||
$("#mes_example_textarea").val(create_save_mes_example);
|
||
}
|
||
$("#avatar_div").css("display", "grid");
|
||
$("#avatar_load_preview").attr('src', default_avatar);
|
||
$("#name_div").css("display", "block");
|
||
|
||
$("#form_create").attr("actiontype", "createcharacter");
|
||
}
|
||
function select_rm_characters() {
|
||
/* QuickRefresh(true); */
|
||
|
||
if (prev_selected_char) {
|
||
let newChId = characters.findIndex(x => x.name == prev_selected_char);
|
||
$(`.character_select[chid="${newChId}"]`).trigger('click');
|
||
prev_selected_char = null;
|
||
}
|
||
|
||
menu_type = 'characters';
|
||
$("#rm_characters_block").css("display", "block");
|
||
$('#rm_characters_block').css('opacity', 0.0);
|
||
$('#rm_characters_block').transition({
|
||
opacity: 1.0,
|
||
duration: animation_rm_duration,
|
||
easing: animation_rm_easing,
|
||
complete: function () { }
|
||
});
|
||
|
||
$("#rm_api_block").css("display", "none");
|
||
$("#rm_ch_create_block").css("display", "none");
|
||
$("#rm_info_block").css("display", "none");
|
||
$("#rm_group_chats_block").css("display", "none");
|
||
|
||
$("#rm_button_characters").css("class", "selected-right-tab");
|
||
$("#rm_button_settings").css("class", "deselected-right-tab");
|
||
$("#rm_button_selected_ch").css("class", "deselected-right-tab");
|
||
}
|
||
function showSwipeButtons() {
|
||
if (
|
||
chat[chat.length - 1].name === 'TavernAI' ||
|
||
!swipes ||
|
||
$('.mes:last').attr('mesid') <= 0 ||
|
||
chat[chat.length - 1].is_user ||
|
||
count_view_mes <= 1
|
||
) {return;}
|
||
const currentMessage = $("#chat").children().filter(`[mesid="${count_view_mes-1}"]`);
|
||
const swipeId = chat[chat.length - 1].swipe_id;
|
||
|
||
if (swipeId !== undefined && swipeId != 0) {
|
||
currentMessage.children('.swipe_left').css('display', 'flex');
|
||
}
|
||
currentMessage.children('.swipe_right').css('display', 'flex');
|
||
}
|
||
function hideSwipeButtons(){
|
||
//console.log('hideswipebuttons entered');
|
||
$("#chat").children().filter('[mesid="'+(count_view_mes-1)+'"]').children('.swipe_right').css('display', 'none');
|
||
$("#chat").children().filter('[mesid="'+(count_view_mes-1)+'"]').children('.swipe_left').css('display', 'none');
|
||
}
|
||
function onlyUnique(value, index, array) {
|
||
return array.indexOf(value) === index;
|
||
}
|
||
|
||
function shuffle(array) {
|
||
let currentIndex = array.length, randomIndex;
|
||
|
||
while (currentIndex != 0) {
|
||
randomIndex = Math.floor(Math.random() * currentIndex);
|
||
currentIndex--;
|
||
[array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]];
|
||
}
|
||
return array;
|
||
}
|
||
|
||
function setExtensionPrompt(key, value) {
|
||
extension_prompts[key] = value;
|
||
}
|
||
|
||
window['TavernAI'].getContext = function () {
|
||
return {
|
||
chat: chat,
|
||
characters: characters,
|
||
groups: groups,
|
||
worldInfo: world_info_data,
|
||
name1: name1,
|
||
name2: name2,
|
||
characterId: this_chid,
|
||
groupId: selected_group,
|
||
chatId: (this_chid && characters[this_chid] && characters[this_chid].chat),
|
||
onlineStatus: online_status,
|
||
addOneMessage: addOneMessage,
|
||
generate: Generate,
|
||
encode: encode,
|
||
extensionPrompts: extension_prompts,
|
||
setExtensionPrompt: setExtensionPrompt,
|
||
saveChat: saveChat,
|
||
sendSystemMessage: sendSystemMessage,
|
||
};
|
||
};
|
||
function callPopup(text) {
|
||
$("#dialogue_popup_cancel").css("display", "inline-block");
|
||
switch (popup_type) {
|
||
case 'text':
|
||
case 'char_not_selected':
|
||
|
||
$("#dialogue_popup_ok").text("Ok");
|
||
$("#dialogue_popup_cancel").css("display", "none");
|
||
break;
|
||
|
||
case 'world_imported':
|
||
case 'new_chat':
|
||
|
||
|
||
$("#dialogue_popup_ok").text("Yes");
|
||
break;
|
||
case 'del_world':
|
||
case 'del_group':
|
||
default:
|
||
|
||
$("#dialogue_popup_ok").text("Delete");
|
||
|
||
}
|
||
$("#dialogue_popup_text").html(text);
|
||
$("#shadow_popup").css('display', 'block');
|
||
$('#shadow_popup').transition({ opacity: 1.0, duration: animation_rm_duration, easing: animation_rm_easing });
|
||
}
|
||
function read_bg_load(input) {
|
||
if (input.files && input.files[0]) {
|
||
var reader = new FileReader();
|
||
|
||
reader.onload = function (e) {
|
||
$('#bg_load_preview')
|
||
.attr('src', e.target.result)
|
||
.width(103)
|
||
.height(83);
|
||
|
||
var formData = new FormData($("#form_bg_download").get(0));
|
||
|
||
//console.log(formData);
|
||
jQuery.ajax({
|
||
type: 'POST',
|
||
url: '/downloadbackground',
|
||
data: formData,
|
||
beforeSend: function () {
|
||
//$('#create_button').attr('value','Creating...');
|
||
},
|
||
cache: false,
|
||
contentType: false,
|
||
processData: false,
|
||
success: function (html) {
|
||
setBackground(html);
|
||
if (bg1_toggle == true) { // this is a repeat of the background setting function for when user uploads a new BG image
|
||
bg1_toggle = false; // should make the Bg setting a modular function to be called in both cases
|
||
var number_bg = 2;
|
||
var target_opacity = 1.0;
|
||
} else {
|
||
bg1_toggle = true;
|
||
var number_bg = 1;
|
||
var target_opacity = 0.0;
|
||
}
|
||
$('#bg2').transition({
|
||
opacity: target_opacity,
|
||
duration: 1300,//animation_rm_duration,
|
||
easing: "linear",
|
||
complete: function () {
|
||
$("#options").css('display', 'none');
|
||
}
|
||
});
|
||
$('#bg' + number_bg).css('background-image', 'url(' + e.target.result + ')');
|
||
$("#form_bg_download").after("<div class=bg_example><img bgfile='" + html + "' class=bg_example_img src='backgrounds/" + html + "'><img bgfile='" + html + "' class=bg_example_cross src=img/cross.png></div>");
|
||
},
|
||
error: function (jqXHR, exception) {
|
||
console.log(exception);
|
||
console.log(jqXHR);
|
||
}
|
||
});
|
||
|
||
};
|
||
|
||
reader.readAsDataURL(input.files[0]);
|
||
}
|
||
}
|
||
function read_avatar_load(input) {
|
||
|
||
if (input.files && input.files[0]) {
|
||
var reader = new FileReader();
|
||
if (selected_button == 'create') {
|
||
|
||
create_save_avatar = input.files;
|
||
}
|
||
reader.onload = function (e) {
|
||
|
||
if (selected_button == 'character_edit') {
|
||
|
||
timerSaveEdit = setTimeout(() => { $("#create_button").click(); }, durationSaveEdit);
|
||
}
|
||
$('#avatar_load_preview')
|
||
.attr('src', e.target.result);
|
||
//.width(103)
|
||
//.height(83);
|
||
//console.log(e.target.result.name);
|
||
|
||
};
|
||
|
||
reader.readAsDataURL(input.files[0]);
|
||
}
|
||
}
|
||
function resultCheckStatusNovel() {
|
||
is_api_button_press_novel = false;
|
||
checkOnlineStatus();
|
||
$("#api_loading_novel").css("display", 'none');
|
||
$("#api_button_novel").css("display", 'inline-block');
|
||
}
|
||
|
||
async function updateWorldInfoList(importedWorldName) {
|
||
var result = await fetch('/getsettings', {
|
||
method: 'POST',
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
"X-CSRF-Token": token,
|
||
},
|
||
body: JSON.stringify({})
|
||
});
|
||
|
||
if (result.ok) {
|
||
var data = await result.json();
|
||
world_names = data.world_names?.length ? data.world_names : [];
|
||
$('#world_info').find('option[value!="None"]').remove();
|
||
|
||
world_names.forEach((item, i) => {
|
||
$('#world_info').append(`<option value='${i}'>${item}</option>`);
|
||
});
|
||
|
||
if (importedWorldName) {
|
||
const indexOf = world_names.indexOf(world_info);
|
||
$('#world_info').val(indexOf);
|
||
|
||
popup_type = 'world_imported';
|
||
callPopup('<h3>World imported successfully! Select it now?</h3>');
|
||
}
|
||
}
|
||
}
|
||
|
||
function download(content, fileName, contentType) {
|
||
var a = document.createElement("a");
|
||
var file = new Blob([content], { type: contentType });
|
||
a.href = URL.createObjectURL(file);
|
||
a.download = fileName;
|
||
a.click();
|
||
}
|
||
// World Info Editor
|
||
async function showWorldEditor() {
|
||
if (!world_info) {
|
||
popup_type = 'default';
|
||
callPopup('<h3>Select a world info first!</h3>');
|
||
return;
|
||
}
|
||
|
||
is_world_edit_open = true;
|
||
$('#world_popup_name').val(world_info);
|
||
$('#world_popup').css('display', 'flex');
|
||
await loadWorldInfoData();
|
||
displayWorldEntries(world_info_data);
|
||
}
|
||
|
||
async function loadWorldInfoData() {
|
||
if (!world_info) {
|
||
return;
|
||
}
|
||
|
||
const response = await fetch("/getworldinfo", {
|
||
method: "POST",
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
"X-CSRF-Token": token,
|
||
},
|
||
body: JSON.stringify({ name: world_info })
|
||
});
|
||
|
||
if (response.ok) {
|
||
world_info_data = await response.json();
|
||
}
|
||
}
|
||
|
||
function hideWorldEditor() {
|
||
is_world_edit_open = false;
|
||
$('#world_popup').css('display', 'none');
|
||
}
|
||
|
||
function displayWorldEntries(data) {
|
||
$('#world_popup_entries_list').empty();
|
||
|
||
if (!data || !('entries' in data)) {
|
||
return;
|
||
}
|
||
|
||
for (const entryUid in data.entries) {
|
||
const entry = data.entries[entryUid];
|
||
appendWorldEntry(entry);
|
||
}
|
||
}
|
||
|
||
function appendWorldEntry(entry) {
|
||
const template = $('#entry_edit_template .world_entry').clone();
|
||
template.data('uid', entry.uid);
|
||
|
||
// key
|
||
const keyInput = template.find('textarea[name="key"]');
|
||
keyInput.data('uid', entry.uid);
|
||
keyInput.on('input', function () {
|
||
const uid = $(this).data('uid');
|
||
const value = $(this).val();
|
||
$(this).css("height", ""); //reset the height
|
||
$(this).css("height", $(this).prop('scrollHeight') + "px");
|
||
world_info_data.entries[uid].key = value.split(',').map(x => x.trim()).filter(x => x);
|
||
saveWorldInfo();
|
||
});
|
||
keyInput.val(entry.key.join(',')).trigger('input');
|
||
keyInput.css("height", ""); //reset the height
|
||
keyInput.css("height", $(this).prop('scrollHeight') + "px");
|
||
|
||
// keysecondary
|
||
const keySecondaryInput = template.find('textarea[name="keysecondary"]');
|
||
keySecondaryInput.data('uid', entry.uid);
|
||
keySecondaryInput.on('input', function () {
|
||
const uid = $(this).data('uid');
|
||
const value = $(this).val();
|
||
$(this).css("height", ""); //reset the height
|
||
$(this).css("height", $(this).prop('scrollHeight') + "px");
|
||
world_info_data.entries[uid].keysecondary = value.split(',').map(x => x.trim()).filter(x => x);
|
||
saveWorldInfo();
|
||
});
|
||
keySecondaryInput.val(entry.keysecondary.join(',')).trigger('input');
|
||
keySecondaryInput.css("height", ""); //reset the height
|
||
keySecondaryInput.css("height", $(this).prop('scrollHeight') + "px");
|
||
|
||
// comment
|
||
const commentInput = template.find('textarea[name="comment"]');
|
||
commentInput.data('uid', entry.uid);
|
||
commentInput.on('input', function () {
|
||
const uid = $(this).data('uid');
|
||
const value = $(this).val();
|
||
$(this).css("height", ""); //reset the height
|
||
$(this).css("height", $(this).prop('scrollHeight') + "px");
|
||
world_info_data.entries[uid].comment = value;
|
||
saveWorldInfo();
|
||
});
|
||
commentInput.val(entry.comment).trigger('input');
|
||
commentInput.css("height", ""); //reset the height
|
||
commentInput.css("height", $(this).prop('scrollHeight') + "px");
|
||
|
||
// content
|
||
const contentInput = template.find('textarea[name="content"]');
|
||
contentInput.data('uid', entry.uid);
|
||
contentInput.on('input', function () {
|
||
const uid = $(this).data('uid');
|
||
const value = $(this).val();
|
||
world_info_data.entries[uid].content = value;
|
||
$(this).css("height", ""); //reset the height
|
||
$(this).css("height", $(this).prop('scrollHeight') + "px");
|
||
saveWorldInfo();
|
||
|
||
// count tokens
|
||
const numberOfTokens = encode(value).length;
|
||
$(this).closest('.world_entry').find('.world_entry_form_token_counter').html(numberOfTokens);
|
||
});
|
||
contentInput.val(entry.content).trigger('input');
|
||
contentInput.css("height", ""); //reset the height
|
||
contentInput.css("height", $(this).prop('scrollHeight') + "px");
|
||
|
||
// selective
|
||
const selectiveInput = template.find('input[name="selective"]');
|
||
selectiveInput.data('uid', entry.uid);
|
||
selectiveInput.on('input', function () {
|
||
const uid = $(this).data('uid');
|
||
const value = $(this).prop('checked');
|
||
world_info_data.entries[uid].selective = value;
|
||
saveWorldInfo();
|
||
|
||
const keysecondary = $(this).closest('.world_entry').find('.keysecondary');
|
||
value ? keysecondary.show() : keysecondary.hide();
|
||
});
|
||
selectiveInput.prop('checked', entry.selective).trigger('input');
|
||
selectiveInput.siblings('.checkbox_fancy').click(function () {
|
||
$(this).siblings('input').click();
|
||
});
|
||
|
||
|
||
// constant
|
||
const constantInput = template.find('input[name="constant"]');
|
||
constantInput.data('uid', entry.uid);
|
||
constantInput.on('input', function () {
|
||
const uid = $(this).data('uid');
|
||
const value = $(this).prop('checked');
|
||
world_info_data.entries[uid].constant = value;
|
||
saveWorldInfo();
|
||
});
|
||
constantInput.prop('checked', entry.constant).trigger('input');
|
||
constantInput.siblings('.checkbox_fancy').click(function () {
|
||
$(this).siblings('input').click();
|
||
});
|
||
|
||
// order
|
||
const orderInput = template.find('input[name="order"]');
|
||
orderInput.data('uid', entry.uid);
|
||
orderInput.on('input', function () {
|
||
const uid = $(this).data('uid');
|
||
const value = Number($(this).val());
|
||
|
||
world_info_data.entries[uid].order = !isNaN(value) ? value : 0;
|
||
saveWorldInfo();
|
||
});
|
||
orderInput.val(entry.order).trigger('input');
|
||
|
||
// position
|
||
if (entry.position === undefined) {
|
||
entry.position = 0;
|
||
}
|
||
|
||
const positionInput = template.find('input[name="position"]');
|
||
positionInput.data('uid', entry.uid);
|
||
positionInput.on('input', function () {
|
||
const uid = $(this).data('uid');
|
||
const value = Number($(this).val());
|
||
world_info_data.entries[uid].position = !isNaN(value) ? value : 0;
|
||
saveWorldInfo();
|
||
})
|
||
template.find(`input[name="position"][value=${entry.position}]`).prop('checked', true).trigger('input');
|
||
|
||
// display uid
|
||
template.find('.world_entry_form_uid_value').html(entry.uid);
|
||
|
||
// delete button
|
||
const deleteButton = template.find('input.delete_entry_button');
|
||
deleteButton.data('uid', entry.uid);
|
||
deleteButton.on('click', function () {
|
||
const uid = $(this).data('uid');
|
||
deleteWorldInfoEntry(uid);
|
||
$(this).closest('.world_entry').remove();
|
||
saveWorldInfo();
|
||
});
|
||
|
||
template.appendTo('#world_popup_entries_list');
|
||
return template;
|
||
}
|
||
|
||
async function deleteWorldInfoEntry(uid) {
|
||
if (!world_info_data || !('entries' in world_info_data)) {
|
||
return;
|
||
}
|
||
|
||
delete world_info_data.entries[uid];
|
||
}
|
||
|
||
function createWorldInfoEntry() {
|
||
const newEntryTemplate = {
|
||
key: [],
|
||
keysecondary: [],
|
||
comment: '',
|
||
content: '',
|
||
constant: false,
|
||
selective: false,
|
||
order: 100,
|
||
position: 0,
|
||
};
|
||
const newUid = getFreeWorldEntryUid();
|
||
|
||
if (!Number.isInteger(newUid)) {
|
||
console.error("Couldn't assign UID to a new entry");
|
||
return;
|
||
}
|
||
|
||
const newEntry = { uid: newUid, ...newEntryTemplate };
|
||
world_info_data.entries[newUid] = newEntry;
|
||
|
||
const entryTemplate = appendWorldEntry(newEntry);
|
||
entryTemplate.get(0).scrollIntoView({ behavior: 'smooth' });
|
||
}
|
||
|
||
async function saveWorldInfo(immediately) {
|
||
if (!world_info || !world_info_data) {
|
||
return;
|
||
}
|
||
|
||
async function _save() {
|
||
const response = await fetch("/editworldinfo", {
|
||
method: "POST",
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
"X-CSRF-Token": token,
|
||
},
|
||
body: JSON.stringify({ name: world_info, data: world_info_data })
|
||
});
|
||
}
|
||
|
||
if (immediately) {
|
||
return await _save();
|
||
}
|
||
|
||
clearTimeout(timerWorldSave);
|
||
timerWorldSave = setTimeout(async () => await _save(), durationSaveEdit);
|
||
}
|
||
|
||
async function renameWorldInfo() {
|
||
const oldName = world_info;
|
||
const newName = $('#world_popup_name').val();
|
||
|
||
if (oldName === newName) {
|
||
return;
|
||
}
|
||
|
||
world_info = newName;
|
||
await saveWorldInfo(true);
|
||
await deleteWorldInfo(oldName, newName);
|
||
}
|
||
|
||
async function deleteWorldInfo(worldInfoName, selectWorldName) {
|
||
if (!world_names.includes(worldInfoName)) {
|
||
return;
|
||
}
|
||
|
||
const response = await fetch("/deleteworldinfo", {
|
||
method: "POST",
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
"X-CSRF-Token": token,
|
||
},
|
||
body: JSON.stringify({ name: worldInfoName })
|
||
});
|
||
|
||
if (response.ok) {
|
||
await updateWorldInfoList();
|
||
|
||
const selectedIndex = world_names.indexOf(selectWorldName);
|
||
if (selectedIndex !== -1) {
|
||
$('#world_info').val(selectedIndex).change();
|
||
}
|
||
else {
|
||
$('#world_info').val('None').change();
|
||
}
|
||
|
||
hideWorldEditor();
|
||
}
|
||
}
|
||
|
||
function getFreeWorldEntryUid() {
|
||
if (!world_info_data || !('entries' in world_info_data)) {
|
||
return null;
|
||
}
|
||
|
||
const MAX_UID = 1_000_000; // <- should be safe enough :)
|
||
for (let uid = 0; uid < MAX_UID; uid++) {
|
||
if (uid in world_info_data.entries) {
|
||
continue;
|
||
}
|
||
return uid;
|
||
}
|
||
|
||
return null;
|
||
}
|
||
|
||
function getFreeWorldName() {
|
||
const MAX_FREE_NAME = 100_000;
|
||
for (let index = 1; index < MAX_FREE_NAME; index++) {
|
||
const newName = `New World (${index})`;
|
||
if (world_names.includes(newName)) {
|
||
continue;
|
||
}
|
||
return newName;
|
||
}
|
||
|
||
return undefined;
|
||
}
|
||
|
||
async function createNewWorldInfo() {
|
||
const worldInfoTemplate = { entries: {} };
|
||
const worldInfoName = getFreeWorldName();
|
||
|
||
if (!worldInfoName) {
|
||
return;
|
||
}
|
||
|
||
world_info = worldInfoName;
|
||
world_info_data = { ...worldInfoTemplate };
|
||
await saveWorldInfo(true);
|
||
await updateWorldInfoList();
|
||
|
||
const selectedIndex = world_names.indexOf(worldInfoName);
|
||
if (selectedIndex !== -1) {
|
||
$('#world_info').val(selectedIndex).change();
|
||
}
|
||
else {
|
||
$('#world_info').val('None').change();
|
||
}
|
||
}
|
||
|
||
/////////////////////////////////////////////////////////
|
||
///////// INTERACTIVE FUNCTIONS AND LISTENERS ///////////
|
||
/////////////////////////////////////////////////////////
|
||
|
||
|
||
import { encode, decode } from "../scripts/gpt-2-3-tokenizer/mod.js";
|
||
$(document).ready(function () {
|
||
|
||
$('#swipes-checkbox').change(function() {
|
||
console.log('detected swipes-checkbox changed values')
|
||
swipes = !!$('#swipes-checkbox').prop('checked');
|
||
if(swipes){
|
||
showSwipeButtons();
|
||
}else{
|
||
hideSwipeButtons();
|
||
}
|
||
saveSettings();
|
||
});
|
||
///// SWIPE BUTTON CLICKS ///////
|
||
|
||
$(document).on('click', '.swipe_right', function(){ //when we click swipe right button
|
||
const swipe_duration = 120;
|
||
const swipe_range = 700;
|
||
//console.log(swipe_range);
|
||
let run_generate = false;
|
||
let run_swipe_right = false;
|
||
if(chat[chat.length-1]['swipe_id'] === undefined){ // if there is no swipe-message in the last spot of the chat array
|
||
chat[chat.length-1]['swipe_id'] = 0; // set it to id 0
|
||
chat[chat.length-1]['swipes'] = []; // empty the array
|
||
chat[chat.length-1]['swipes'][0] = chat[chat.length-1]['mes']; //assign swipe array with last message from chat
|
||
}
|
||
chat[chat.length-1]['swipe_id']++; //make new slot in array
|
||
//console.log(chat[chat.length-1]['swipes']);
|
||
if(parseInt(chat[chat.length-1]['swipe_id']) === chat[chat.length-1]['swipes'].length){ //if swipe id of last message is the same as the length of the 'swipes' array
|
||
run_generate = true;
|
||
}else if(parseInt(chat[chat.length-1]['swipe_id']) < chat[chat.length-1]['swipes'].length){ //otherwise, if the id is less than the number of swipes
|
||
chat[chat.length-1]['mes'] = chat[chat.length-1]['swipes'][chat[chat.length-1]['swipe_id']]; //load the last mes box with the latest generation
|
||
run_swipe_right = true; //then swipe
|
||
}
|
||
|
||
if(chat[chat.length-1]['swipe_id'] > chat[chat.length-1]['swipes'].length){ //if we swipe right while generating (the swipe ID is greater than what we are viewing now)
|
||
chat[chat.length-1]['swipe_id'] = chat[chat.length-1]['swipes'].length; //show that message slot (will be '...' while generating)
|
||
}
|
||
if(run_generate){ //hide swipe arrows while generating
|
||
$(this).css('display', 'none');
|
||
|
||
}
|
||
if(run_generate || run_swipe_right){ // handles animated transitions when swipe right, specifically height transitions between messages
|
||
|
||
let this_mes_div = $(this).parent();
|
||
let this_mes_block = $(this).parent().children('.mes_block').children('.mes_text');
|
||
const this_mes_div_height = this_mes_div[0].scrollHeight;
|
||
const this_mes_block_height = this_mes_block[0].scrollHeight;
|
||
|
||
this_mes_div.children('.swipe_left').css('display', 'flex');
|
||
this_mes_div.children('.mes_block').transition({ // this moves the div back and forth
|
||
x: '-'+swipe_range,
|
||
duration: swipe_duration,
|
||
easing: animation_rm_easing,
|
||
queue:false,
|
||
complete: function() {
|
||
|
||
const is_animation_scroll = ($('#chat').scrollTop() >= ($('#chat').prop("scrollHeight") - $('#chat').outerHeight()) - 10);
|
||
//console.log(parseInt(chat[chat.length-1]['swipe_id']));
|
||
//console.log(chat[chat.length-1]['swipes'].length);
|
||
if(run_generate && parseInt(chat[chat.length-1]['swipe_id']) === chat[chat.length-1]['swipes'].length){
|
||
//console.log('showing ...');
|
||
$("#chat").children().filter('[mesid="'+(count_view_mes-1)+'"]').children('.mes_block').children('.mes_text').html('...'); //shows ... while generating
|
||
}else{
|
||
//console.log('showing previously generated swipe candidate, or "..."');
|
||
addOneMessage(chat[chat.length-1], 'swipe');
|
||
}
|
||
let new_height = this_mes_div_height-(this_mes_block_height - this_mes_block[0].scrollHeight);
|
||
if(new_height < 103) new_height = 103;
|
||
|
||
|
||
this_mes_div.animate({height: new_height+'px'}, {
|
||
duration: 100,
|
||
queue:false,
|
||
progress: function() {
|
||
// Scroll the chat down as the message expands
|
||
if(is_animation_scroll) $("#chat").scrollTop($("#chat")[0].scrollHeight);
|
||
},
|
||
complete: function() {
|
||
this_mes_div.css('height', 'auto');
|
||
// Scroll the chat down to the bottom once the animation is complete
|
||
if(is_animation_scroll) $("#chat").scrollTop($("#chat")[0].scrollHeight);
|
||
}
|
||
});
|
||
this_mes_div.children('.mes_block').transition({
|
||
x: swipe_range,
|
||
duration: 0,
|
||
easing: animation_rm_easing,
|
||
queue:false,
|
||
complete: function() {
|
||
this_mes_div.children('.mes_block').transition({
|
||
x: '0px',
|
||
duration: swipe_duration,
|
||
easing: animation_rm_easing,
|
||
queue:false,
|
||
complete: function() {
|
||
if(run_generate && !is_send_press && parseInt(chat[chat.length-1]['swipe_id']) === chat[chat.length-1]['swipes'].length){
|
||
console.log('caught here 2');
|
||
is_send_press = true;
|
||
Generate('swipe');
|
||
}else{
|
||
if(parseInt(chat[chat.length-1]['swipe_id']) !== chat[chat.length-1]['swipes'].length){
|
||
console.log('caught here 3');
|
||
saveChat();
|
||
}
|
||
}
|
||
}
|
||
});
|
||
}
|
||
});
|
||
}
|
||
});
|
||
|
||
$(this).parent().children('.avatar').transition({ // moves avatar aong with swipe
|
||
x: '-'+swipe_range,
|
||
duration: swipe_duration,
|
||
easing: animation_rm_easing,
|
||
queue:false,
|
||
complete: function() {
|
||
$(this).parent().children('.avatar').transition({
|
||
x: swipe_range,
|
||
duration: 0,
|
||
easing: animation_rm_easing,
|
||
queue:false,
|
||
complete: function() {
|
||
$(this).parent().children('.avatar').transition({
|
||
x: '0px',
|
||
duration: swipe_duration,
|
||
easing: animation_rm_easing,
|
||
queue:false,
|
||
complete: function() {
|
||
|
||
}
|
||
});
|
||
}
|
||
});
|
||
}
|
||
});
|
||
}
|
||
|
||
});
|
||
$(document).on('click', '.swipe_left', function(){ // when we swipe left..but no generation.
|
||
const swipe_duration = 120;
|
||
const swipe_range = '700px';
|
||
chat[chat.length-1]['swipe_id']--;
|
||
if(chat[chat.length-1]['swipe_id'] >= 0){ // hide the left arrow if we are viewing the first candidate of the last message block
|
||
$(this).parent().children('swipe_right_button').css('display', 'flex');
|
||
if(chat[chat.length-1]['swipe_id'] === 0){
|
||
$(this).css('display', 'none');
|
||
}
|
||
|
||
let this_mes_div = $(this).parent();
|
||
let this_mes_block = $(this).parent().children('.mes_block').children('.mes_text');
|
||
const this_mes_div_height = this_mes_div[0].scrollHeight;
|
||
this_mes_div.css('height', this_mes_div_height);
|
||
const this_mes_block_height = this_mes_block[0].scrollHeight;
|
||
|
||
chat[chat.length-1]['mes'] = chat[chat.length-1]['swipes'][chat[chat.length-1]['swipe_id']];
|
||
$(this).parent().children('.mes_block').transition({
|
||
x: swipe_range,
|
||
duration: swipe_duration,
|
||
easing: animation_rm_easing,
|
||
queue:false,
|
||
complete: function() {
|
||
const is_animation_scroll = ($('#chat').scrollTop() >= ($('#chat').prop("scrollHeight") - $('#chat').outerHeight()) - 10);
|
||
console.log('sipwing left after tr5ansition calls addOneMessage');
|
||
addOneMessage(chat[chat.length-1], 'swipe');
|
||
let new_height = this_mes_div_height-(this_mes_block_height - this_mes_block[0].scrollHeight);
|
||
if(new_height < 103) new_height = 103;
|
||
this_mes_div.animate({height: new_height+'px'}, {
|
||
duration: 100,
|
||
queue:false,
|
||
progress: function() {
|
||
// Scroll the chat down as the message expands
|
||
|
||
if(is_animation_scroll) $("#chat").scrollTop($("#chat")[0].scrollHeight);
|
||
},
|
||
complete: function() {
|
||
this_mes_div.css('height', 'auto');
|
||
// Scroll the chat down to the bottom once the animation is complete
|
||
if(is_animation_scroll) $("#chat").scrollTop($("#chat")[0].scrollHeight);
|
||
}
|
||
});
|
||
$(this).parent().children('.mes_block').transition({
|
||
x: '-'+swipe_range,
|
||
duration: 0,
|
||
easing: animation_rm_easing,
|
||
queue:false,
|
||
complete: function() {
|
||
$(this).parent().children('.mes_block').transition({
|
||
x: '0px',
|
||
duration: swipe_duration,
|
||
easing: animation_rm_easing,
|
||
queue:false,
|
||
complete: function() {
|
||
saveChat();
|
||
}
|
||
});
|
||
}
|
||
});
|
||
}
|
||
});
|
||
|
||
$(this).parent().children('.avatar').transition({
|
||
x: swipe_range,
|
||
duration: swipe_duration,
|
||
easing: animation_rm_easing,
|
||
queue:false,
|
||
complete: function() {
|
||
$(this).parent().children('.avatar').transition({
|
||
x: '-'+swipe_range,
|
||
duration: 0,
|
||
easing: animation_rm_easing,
|
||
queue:false,
|
||
complete: function() {
|
||
$(this).parent().children('.avatar').transition({
|
||
x: '0px',
|
||
duration: swipe_duration,
|
||
easing: animation_rm_easing,
|
||
queue:false,
|
||
complete: function() {
|
||
|
||
}
|
||
});
|
||
}
|
||
});
|
||
}
|
||
});
|
||
}
|
||
if(chat[chat.length-1]['swipe_id'] < 0){
|
||
chat[chat.length-1]['swipe_id'] = 0;
|
||
}
|
||
});
|
||
|
||
//// CHAR SEARCH BAR /////
|
||
|
||
$('#character_search_bar').on('input', function () {
|
||
const searchValue = $(this).val().trim().toLowerCase();
|
||
|
||
if (!searchValue) {
|
||
$("#rm_print_characters_block .character_select").show();
|
||
} else {
|
||
$("#rm_print_characters_block .character_select").each(function () {
|
||
$(this).children('.ch_name').text().toLowerCase().includes(searchValue)
|
||
? $(this).show()
|
||
: $(this).hide();
|
||
});
|
||
}
|
||
});
|
||
|
||
$('#characloud_url').click(function () {
|
||
window.open('https://boosty.to/tavernai', '_blank');
|
||
});
|
||
$("#send_but").click(function () {
|
||
if (is_send_press == false) {
|
||
hideSwipeButtons();
|
||
is_send_press = true;
|
||
|
||
Generate();
|
||
}
|
||
});
|
||
|
||
$("#send_textarea").keydown(function (e) {
|
||
if (!e.shiftKey && !e.ctrlKey && e.key == "Enter" && is_send_press == false) {
|
||
hideSwipeButtons();
|
||
is_send_press = true;
|
||
e.preventDefault();
|
||
Generate();
|
||
}
|
||
});
|
||
|
||
//menu buttons setup
|
||
var selected_button_style = {};
|
||
var deselected_button_style = {};
|
||
|
||
$("#rm_button_create").css("class", "deselected-right-tab");
|
||
$("#rm_button_characters").css("class", "deselected-right-tab");
|
||
|
||
$("#rm_button_settings").click(function () {
|
||
selected_button = 'settings';
|
||
menu_type = 'settings';
|
||
$("#rm_characters_block").css("display", "none");
|
||
$("#rm_api_block").css("display", "grid");
|
||
$('#rm_api_block').css('opacity', 0.0);
|
||
$('#rm_api_block').transition({
|
||
opacity: 1.0,
|
||
duration: animation_rm_duration,
|
||
easing: animation_rm_easing,
|
||
complete: function () { }
|
||
});
|
||
|
||
$("#rm_ch_create_block").css("display", "none");
|
||
$("#rm_info_block").css("display", "none");
|
||
$("#rm_group_chats_block").css("display", "none");
|
||
$("#rm_button_characters").css("class", "deselected-right-tab");
|
||
$("#rm_button_settings").css("class", "selected-right-tab");
|
||
$("#rm_button_selected_ch").css("class", "deselected-right-tab");
|
||
});
|
||
$("#rm_button_characters").click(function () {
|
||
selected_button = 'characters';
|
||
select_rm_characters();
|
||
});
|
||
$("#rm_button_back").click(function () {
|
||
selected_button = 'characters';
|
||
select_rm_characters();
|
||
});
|
||
$("#rm_button_create").click(function () {
|
||
selected_button = 'create';
|
||
select_rm_create();
|
||
});
|
||
$("#rm_button_selected_ch").click(function () {
|
||
selected_button = 'character_edit';
|
||
select_selected_character(this_chid);
|
||
});
|
||
$(document).on('click', '.group_select', async function () {
|
||
const id = $(this).data('id');
|
||
selected_button = 'group_chats';
|
||
|
||
if (!is_send_press && !is_group_generating) {
|
||
if (selected_group !== id) {
|
||
selected_group = id;
|
||
this_chid = undefined;
|
||
this_edit_mes_id = undefined;
|
||
clearChat();
|
||
chat.length = 0;
|
||
await getGroupChat(id);
|
||
}
|
||
|
||
select_group_chats(id);
|
||
}
|
||
});
|
||
$("#rm_button_group_chats").click(function () {
|
||
selected_button = 'group_chats';
|
||
select_group_chats();
|
||
});
|
||
$("#rm_button_back_from_group").click(function () {
|
||
selected_button = 'characters';
|
||
select_rm_characters();
|
||
});
|
||
$('#rm_group_filter').on('input', function () {
|
||
const searchValue = $(this).val().trim().toLowerCase();
|
||
|
||
if (!searchValue) {
|
||
$("#rm_group_add_members .group_member").show();
|
||
} else {
|
||
$("#rm_group_add_members .group_member").each(function () {
|
||
$(this).children('.ch_name').text().toLowerCase().includes(searchValue)
|
||
? $(this).show()
|
||
: $(this).hide();
|
||
});
|
||
}
|
||
});
|
||
$('#rm_group_submit').click(async function () {
|
||
let name = $('#rm_group_chat_name').val();
|
||
const members = $('#rm_group_members .group_member').map((_, x) => $(x).data('id')).toArray();
|
||
|
||
if (!name) {
|
||
name = `Chat with ${members.join(', ')}`;
|
||
}
|
||
|
||
// placeholder
|
||
const avatar_url = '/img/five.png';
|
||
|
||
const createGroupResponse = await fetch('/creategroup', {
|
||
method: 'POST',
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
"X-CSRF-Token": token,
|
||
},
|
||
body: JSON.stringify({ name: name, members: members, avatar_url: avatar_url }),
|
||
});
|
||
|
||
if (createGroupResponse.ok) {
|
||
const createGroupData = await createGroupResponse.json();
|
||
const id = createGroupData.id;
|
||
|
||
await getCharacters();
|
||
$('#rm_info_avatar').html('');
|
||
var avatar = $('#avatar_div_div').clone();
|
||
avatar.find('img').attr('src', avatar_url);
|
||
$('#rm_info_avatar').append(avatar);
|
||
$('#rm_info_block').transition({ opacity: 0, duration: 0 });
|
||
select_rm_info("Group chat created");
|
||
$('#rm_info_block').transition({ opacity: 1.0, duration: 2000 });
|
||
}
|
||
});
|
||
|
||
$('#rm_group_automode').on('input', function () {
|
||
const value = $(this).prop('checked');
|
||
is_group_automode_enabled = value;
|
||
});
|
||
|
||
$(document).on('click', '.character_select', function () {
|
||
if (this_chid !== $(this).attr("chid")) { //if clicked on a different character from what was currently selected
|
||
if (!is_send_press) {
|
||
selected_group = null;
|
||
is_group_generating = false;
|
||
this_edit_mes_id = undefined;
|
||
selected_button = 'character_edit';
|
||
this_chid = $(this).attr("chid");
|
||
active_character = this_chid;
|
||
clearChat();
|
||
chat.length = 0;
|
||
getChat();
|
||
|
||
//console.log('Clicked on '+characters[this_chid].name+' Active_Character set to: '+active_character+' (ChID:'+this_chid+')');
|
||
}
|
||
} else { //if clicked on character that was already selected
|
||
selected_button = 'character_edit';
|
||
select_selected_character(this_chid);
|
||
}
|
||
$('#character_search_bar').val('').trigger('input');
|
||
});
|
||
var scroll_holder = 0;
|
||
var is_use_scroll_holder = false;
|
||
$(document).on('input', '.edit_textarea', function () {
|
||
scroll_holder = $("#chat").scrollTop();
|
||
$(this).height(0).height(this.scrollHeight);
|
||
is_use_scroll_holder = true;
|
||
});
|
||
$("#chat").on("scroll", function () {
|
||
if (is_use_scroll_holder) {
|
||
$("#chat").scrollTop(scroll_holder);
|
||
is_use_scroll_holder = false;
|
||
}
|
||
|
||
});
|
||
$(document).on('click', '.del_checkbox', function () { //when a 'delete message' checkbox is clicked
|
||
$('.del_checkbox').each(function () {
|
||
$(this).prop("checked", false);
|
||
$(this).parent().css('background', css_mes_bg);
|
||
});
|
||
$(this).parent().css('background', "#600"); //sets the bg of the mes selected for deletion
|
||
var i = $(this).parent().attr('mesid'); //checks the message ID in the chat
|
||
this_del_mes = i;
|
||
while (i < chat.length) { //as long as the current message ID is less than the total chat length
|
||
$(".mes[mesid='" + i + "']").css('background', "#600"); //sets the bg of the all msgs BELOW the selected .mes
|
||
$(".mes[mesid='" + i + "']").children('.del_checkbox').prop("checked", true);
|
||
i++;
|
||
//console.log(i);
|
||
}
|
||
|
||
});
|
||
$(document).on('click', '#user_avatar_block .avatar', function () {
|
||
user_avatar = $(this).attr("imgfile");
|
||
$('.mes').each(function () {
|
||
if ($(this).attr('ch_name') == name1) {
|
||
$(this).children('.avatar').children('img').attr('src', 'User Avatars/' + user_avatar);
|
||
}
|
||
});
|
||
saveSettings();
|
||
highlightSelectedAvatar();
|
||
});
|
||
$(document).on('click', '#user_avatar_block .avatar_upload', function () {
|
||
$('#avatar_upload_file').click();
|
||
});
|
||
$('#avatar_upload_file').on('change', function (e) {
|
||
const file = e.target.files[0];
|
||
|
||
if (!file) {
|
||
return;
|
||
}
|
||
|
||
const formData = new FormData($("#form_upload_avatar").get(0));
|
||
|
||
jQuery.ajax({
|
||
type: 'POST',
|
||
url: '/uploaduseravatar',
|
||
data: formData,
|
||
beforeSend: () => { },
|
||
cache: false,
|
||
contentType: false,
|
||
processData: false,
|
||
success: function (data) {
|
||
if (data.path) {
|
||
appendUserAvatar(data.path);
|
||
}
|
||
},
|
||
error: (jqXHR, exception) => { },
|
||
});
|
||
|
||
// Will allow to select the same file twice in a row
|
||
$('#form_upload_avatar').trigger("reset");
|
||
});
|
||
$('#logo_block').click(function (event) {
|
||
if (!bg_menu_toggle) {
|
||
$('#bg_menu_button').transition({ perspective: '100px', rotate3d: '1,1,0,180deg' });
|
||
$('#bg_menu_content').transition({
|
||
opacity: 1.0, height: '90vh',
|
||
duration: 340,
|
||
easing: 'in',
|
||
complete: function () { bg_menu_toggle = true; $('#bg_menu_content').css("overflow-y", "auto"); }
|
||
});
|
||
} else {
|
||
$('#bg_menu_button').transition({ perspective: '100px', rotate3d: '1,1,0,360deg' });
|
||
$('#bg_menu_content').css("overflow-y", "hidden");
|
||
$('#bg_menu_content').transition({
|
||
|
||
opacity: 0.0, height: '0px',
|
||
duration: 340,
|
||
easing: 'in',
|
||
complete: function () { bg_menu_toggle = false; }
|
||
});
|
||
}
|
||
});
|
||
$(document).on('click', '.bg_example_img', function () { //when user clicks on a BG thumbnail...
|
||
var this_bgfile = $(this).attr("bgfile"); // this_bgfile = whatever they clicked
|
||
|
||
if (bg1_toggle == true) { //if bg1 is toggled true (initially set as true in first JS vars)
|
||
bg1_toggle = false; // then toggle it false
|
||
var number_bg = 2; // sets a variable for bg2
|
||
var target_opacity = 1.0; // target opacity is 100%
|
||
} else { //if bg1 is FALSE
|
||
bg1_toggle = true; // make it true
|
||
var number_bg = 1; // set variable to bg1..
|
||
var target_opacity = 0.0; // set target opacity to 0
|
||
}
|
||
$('#bg2').stop(); // first, stop whatever BG transition was happening before
|
||
$('#bg2').transition({ // start a new BG transition routine
|
||
opacity: target_opacity, // set opacity to previously set variable
|
||
duration: 1300, //animation_rm_duration,
|
||
easing: "linear",
|
||
complete: function () { // why does the BG transition completion make the #options (right nav) invisible?
|
||
$("#options").css('display', 'none');
|
||
}
|
||
});
|
||
$('#bg' + number_bg).css('background-image', 'url("backgrounds/' + this_bgfile + '")');
|
||
setBackground(this_bgfile);
|
||
|
||
});
|
||
$(document).on('click', '.bg_example_cross', function () {
|
||
bg_file_for_del = $(this);
|
||
//$(this).parent().remove();
|
||
//delBackground(this_bgfile);
|
||
popup_type = 'del_bg';
|
||
callPopup('<h3>Delete the background?</h3>');
|
||
|
||
});
|
||
$("#advanced_div").click(function () {
|
||
if (!is_advanced_char_open) {
|
||
is_advanced_char_open = true;
|
||
$('#character_popup').css('display', 'grid');
|
||
$('#character_popup').css('opacity', 0.0);
|
||
$('#character_popup').transition({ opacity: 1.0, duration: animation_rm_duration, easing: animation_rm_easing });
|
||
} else {
|
||
is_advanced_char_open = false;
|
||
$('#character_popup').css('display', 'none');
|
||
}
|
||
});
|
||
$("#character_cross").click(function () {
|
||
is_advanced_char_open = false;
|
||
$('#character_popup').css('display', 'none');
|
||
});
|
||
$("#character_popup_ok").click(function () {
|
||
is_advanced_char_open = false;
|
||
$('#character_popup').css('display', 'none');
|
||
});
|
||
$("#dialogue_popup_ok").click(function () {
|
||
$("#shadow_popup").css('display', 'none');
|
||
$("#shadow_popup").css('opacity:', 0.0);
|
||
if (popup_type == 'del_bg') {
|
||
delBackground(bg_file_for_del.attr("bgfile"));
|
||
bg_file_for_del.parent().remove();
|
||
}
|
||
if (popup_type == 'del_ch') {
|
||
console.log('Deleting character -- ChID: ' + this_chid + ' -- Name: ' + characters[this_chid].name);
|
||
var msg = jQuery('#form_create').serialize(); // ID form
|
||
jQuery.ajax({
|
||
method: 'POST',
|
||
url: '/deletecharacter',
|
||
beforeSend: function () {
|
||
select_rm_info("Character deleted");
|
||
//$('#create_button').attr('value','Deleting...');
|
||
},
|
||
data: msg,
|
||
cache: false,
|
||
success: function (html){
|
||
//RossAscends: New handling of character deletion that avoids page refreshes and should have fixed char corruption due to cache problems.
|
||
//due to how it is handled with 'popup_type', i couldn't find a way to make my method completely modular, so keeping it in TAI-main.js as a new default.
|
||
//this allows for dynamic refresh of character list after deleting a character.
|
||
$("#character_cross").click(); // closes advanced editing popup
|
||
this_chid = "invalid-safety-id"; // unsets expected chid before reloading (related to getCharacters/printCharacters from using old arrays)
|
||
//avatar = "..img/Chloe.jpg";
|
||
characters.length = 0; // resets the characters array, forcing getcharacters to reset
|
||
name2 = "Chloe"; // replaces deleted charcter name with Chloe, since she will be displayed next.
|
||
chat = [...safetychat]; // sets up chloe to tell user about having deleted a character
|
||
$(document.getElementById("rm_button_selected_ch")).css("class","deselected-right-tab"); // 'deselects' character's tab panel
|
||
$(document.getElementById("rm_button_selected_ch")).children("h2").text(""); // removes character name from nav tabs
|
||
clearChat(); // removes deleted char's chat
|
||
this_chid = undefined; // prevents getCharacters from trying to load an invalid char.
|
||
getCharacters(); // gets the new list of characters (that doesn't include the deleted one)
|
||
printMessages(); // prints out Chloe's 'deleted character' message
|
||
//console.log("#dialogue_popup_ok(del-char) >>>> saving");
|
||
saveSettings(); // saving settings to keep changes to variables
|
||
//getCharacters();
|
||
//$('#create_button_div').html(html);
|
||
}
|
||
});
|
||
}
|
||
if (popup_type === 'world_imported' && imported_world_name) {
|
||
world_names.forEach((item, i) => {
|
||
if (item === imported_world_name) {
|
||
$('#world_info').val(i).change();
|
||
}
|
||
})
|
||
imported_world_name = '';
|
||
}
|
||
if (popup_type === 'del_world' && world_info) {
|
||
deleteWorldInfo(world_info);
|
||
}
|
||
if (popup_type === 'del_group') {
|
||
const groupId = $('#dialogue_popup').data('group_id');
|
||
|
||
if (groupId) {
|
||
deleteGroup(groupId);
|
||
}
|
||
}
|
||
//Make a new chat for selected character
|
||
if (popup_type == 'new_chat' && this_chid != undefined && menu_type != "create") {//Fix it; New chat doesn't create while open create character menu
|
||
clearChat();
|
||
chat.length = 0;
|
||
characters[this_chid].chat = (name2 + ' - ' + humanizedDateTime()); //RossAscends: added character name to new chat filenames and replaced Date.now() with humanizedDateTime;
|
||
$("#selected_chat_pole").val(characters[this_chid].chat);
|
||
timerSaveEdit = setTimeout(() => { $("#create_button").click(); }, durationSaveEdit);
|
||
getChat();
|
||
|
||
}
|
||
});
|
||
$("#dialogue_popup_cancel").click(function () {
|
||
$("#shadow_popup").css('display', 'none');
|
||
$("#shadow_popup").css('opacity:', 0.0);
|
||
popup_type = '';
|
||
});
|
||
|
||
$("#add_bg_button").change(function () {
|
||
read_bg_load(this);
|
||
|
||
});
|
||
|
||
$("#add_avatar_button").change(function () {
|
||
|
||
is_mes_reload_avatar = Date.now();
|
||
read_avatar_load(this);
|
||
});
|
||
$("#form_create").submit(function (e) {
|
||
|
||
$('#rm_info_avatar').html('');
|
||
var formData = new FormData($("#form_create").get(0));
|
||
if ($("#form_create").attr("actiontype") == "createcharacter") {
|
||
|
||
if ($("#character_name_pole").val().length > 0) { //if the character name text area isn't empty (only posible when creating a new character)
|
||
//console.log('/createcharacter entered');
|
||
jQuery.ajax({
|
||
type: 'POST',
|
||
url: '/createcharacter',
|
||
data: formData,
|
||
beforeSend: function () {
|
||
$('#create_button').attr('disabled', true);
|
||
$('#create_button').attr('value', 'Creating...');
|
||
},
|
||
cache: false,
|
||
contentType: false,
|
||
processData: false,
|
||
success: async function (html) {
|
||
$('#character_cross').click(); //closes the advanced character editing popup
|
||
$("#character_name_pole").val('');
|
||
create_save_name = '';
|
||
$("#description_textarea").val('');
|
||
create_save_description = '';
|
||
$("#personality_textarea").val('');
|
||
create_save_personality = '';
|
||
$("#firstmessage_textarea").val('');
|
||
create_save_first_message = '';
|
||
$("#talkativeness_slider").val(talkativeness_default);
|
||
create_save_talkativeness = talkativeness_default;
|
||
|
||
$("#character_popup_text_h3").text('Create character');
|
||
|
||
$("#scenario_pole").val('');
|
||
create_save_scenario = '';
|
||
$("#mes_example_textarea").val('');
|
||
create_save_mes_example = '';
|
||
|
||
create_save_avatar = '';
|
||
|
||
$('#create_button').removeAttr("disabled");
|
||
$("#add_avatar_button").replaceWith($("#add_avatar_button").val('').clone(true));
|
||
|
||
$('#create_button').attr('value', 'Create');
|
||
if (true) {
|
||
let oldSelectedChar = null;
|
||
if (this_chid != undefined && this_chid != 'invalid-safety-id') {
|
||
oldSelectedChar = characters[this_chid].name;
|
||
}
|
||
|
||
await getCharacters();
|
||
|
||
$('#rm_info_block').transition({ opacity: 0, duration: 0 });
|
||
var $prev_img = $('#avatar_div_div').clone();
|
||
$('#rm_info_avatar').append($prev_img);
|
||
select_rm_info("Character created", oldSelectedChar);
|
||
|
||
$('#rm_info_block').transition({ opacity: 1.0, duration: 2000 });
|
||
} else {
|
||
$('#result_info').html(html);
|
||
}
|
||
},
|
||
error: function (jqXHR, exception) {
|
||
//alert('ERROR: '+xhr.status+ ' Status Text: '+xhr.statusText+' '+xhr.responseText);
|
||
$('#create_button').removeAttr("disabled");
|
||
}
|
||
});
|
||
} else {
|
||
$('#result_info').html("Name not entered");
|
||
}
|
||
} else {
|
||
//console.log('/editcharacter -- entered.');
|
||
//console.log('Avatar Button Value:'+$("#add_avatar_button").val());
|
||
jQuery.ajax({
|
||
type: 'POST',
|
||
url: '/editcharacter',
|
||
data: formData,
|
||
beforeSend: function () {
|
||
$('#create_button').attr('disabled', true);
|
||
$('#create_button').attr('value', 'Save');
|
||
},
|
||
cache: false,
|
||
contentType: false,
|
||
processData: false,
|
||
success: function (html) {
|
||
$('.mes').each(function () {
|
||
if ($(this).attr('ch_name') != name1) {
|
||
$(this).children('.avatar').children('img').attr('src', $('#avatar_load_preview').attr('src'));
|
||
}
|
||
});
|
||
if (chat.length === 1) {
|
||
var this_ch_mes = default_ch_mes;
|
||
if ($('#firstmessage_textarea').val() != "") {
|
||
this_ch_mes = $('#firstmessage_textarea').val();
|
||
}
|
||
if (this_ch_mes != $.trim($("#chat").children('.mes').children('.mes_block').children('.mes_text').text())) {
|
||
clearChat();
|
||
chat.length = 0;
|
||
chat[0] = {};
|
||
chat[0]['name'] = name2;
|
||
chat[0]['is_user'] = false;
|
||
chat[0]['is_name'] = true;
|
||
chat[0]['mes'] = this_ch_mes;
|
||
//add_mes_without_animation = true;
|
||
addOneMessage(chat[0]);
|
||
}
|
||
}
|
||
$('#create_button').removeAttr("disabled");
|
||
getCharacters();
|
||
|
||
$("#add_avatar_button").replaceWith($("#add_avatar_button").val('').clone(true));
|
||
$('#create_button').attr('value', 'Save');
|
||
//console.log('/editcharacters -- this_chid -- '+this_chid);
|
||
/* if (this_chid != undefined && this_chid != 'invalid-safety-id') { //added check to avoid trying to load tokens in case of character deletion
|
||
CountCharTokens();
|
||
} */
|
||
},
|
||
error: function (jqXHR, exception) {
|
||
$('#create_button').removeAttr("disabled");
|
||
$('#result_info').html("<font color=red>Error: no connection</font>");
|
||
}
|
||
});
|
||
}
|
||
|
||
});
|
||
$("#delete_button").click(function () {
|
||
popup_type = 'del_ch';
|
||
callPopup('<h3>Delete the character?</h3>Page will reload and you will be returned to Chloe.');
|
||
});
|
||
$("#rm_info_button").click(function () {
|
||
$('#rm_info_avatar').html('');
|
||
select_rm_characters();
|
||
});
|
||
//@@@@@@@@@@@@@@@@@@@@@@@@
|
||
//character text poles creating and editing save
|
||
$('#character_name_pole').on('change keyup paste', function () {
|
||
if (menu_type == 'create') {
|
||
create_save_name = $('#character_name_pole').val();
|
||
}
|
||
|
||
});
|
||
$('#description_textarea').on('keyup paste cut', function () {//change keyup paste cut
|
||
|
||
if (menu_type == 'create') {
|
||
create_save_description = $('#description_textarea').val();
|
||
CountCharTokens();
|
||
} else {
|
||
timerSaveEdit = setTimeout(() => { $("#create_button").click(); }, durationSaveEdit);
|
||
}
|
||
|
||
});
|
||
$('#personality_textarea').on('keyup paste cut', function () {
|
||
if (menu_type == 'create') {
|
||
|
||
create_save_personality = $('#personality_textarea').val();
|
||
CountCharTokens();
|
||
} else {
|
||
timerSaveEdit = setTimeout(() => { $("#create_button").click(); }, durationSaveEdit);
|
||
}
|
||
});
|
||
$('#scenario_pole').on('keyup paste cut', function () {
|
||
if (menu_type == 'create') {
|
||
create_save_scenario = $('#scenario_pole').val();
|
||
CountCharTokens();
|
||
} else {
|
||
timerSaveEdit = setTimeout(() => { $("#create_button").click(); }, durationSaveEdit);
|
||
}
|
||
});
|
||
$('#mes_example_textarea').on('keyup paste cut', function () {
|
||
if (menu_type == 'create') {
|
||
|
||
create_save_mes_example = $('#mes_example_textarea').val();
|
||
CountCharTokens();
|
||
} else {
|
||
timerSaveEdit = setTimeout(() => { $("#create_button").click(); }, durationSaveEdit);
|
||
}
|
||
});
|
||
$('#firstmessage_textarea').on('keyup paste cut', function () {
|
||
|
||
if (menu_type == 'create') {
|
||
create_save_first_message = $('#firstmessage_textarea').val();
|
||
CountCharTokens();
|
||
} else {
|
||
timerSaveEdit = setTimeout(() => { $("#create_button").click(); }, durationSaveEdit);
|
||
}
|
||
});
|
||
$('#talkativeness_slider').on('input', function () {
|
||
if (menu_type == 'create') {
|
||
create_save_talkativeness = $('#talkativeness_slider').val();
|
||
} else {
|
||
timerSaveEdit = setTimeout(() => {
|
||
$('#create_button').click();
|
||
}, durationSaveEdit);
|
||
}
|
||
});
|
||
$("#api_button").click(function () {
|
||
if ($('#api_url_text').val() != '') {
|
||
$("#api_loading").css("display", 'inline-block');
|
||
$("#api_button").css("display", 'none');
|
||
api_server = $('#api_url_text').val();
|
||
api_server = $.trim(api_server);
|
||
//console.log("1: "+api_server);
|
||
if (api_server.substr(api_server.length - 1, 1) == "/") {
|
||
api_server = api_server.substr(0, api_server.length - 1);
|
||
}
|
||
if (!(api_server.substr(api_server.length - 3, 3) == "api" || api_server.substr(api_server.length - 4, 4) == "api/")) {
|
||
api_server = api_server + "/api";
|
||
}
|
||
//console.log("2: "+api_server);
|
||
main_api = "kobold";
|
||
saveSettings();
|
||
is_get_status = true;
|
||
is_api_button_press = true;
|
||
getStatus();
|
||
clearSoftPromptsList();
|
||
getSoftPromptsList();
|
||
}
|
||
});
|
||
|
||
$("#api_button_textgenerationwebui").click(function () {
|
||
if ($('#textgenerationwebui_api_url_text').val() != '') {
|
||
$("#api_loading_textgenerationwebui").css("display", 'inline-block');
|
||
$("#api_button_textgenerationwebui").css("display", 'none');
|
||
api_server_textgenerationwebui = $('#textgenerationwebui_api_url_text').val();
|
||
api_server_textgenerationwebui = $.trim(api_server_textgenerationwebui);
|
||
if (api_server_textgenerationwebui.substr(api_server_textgenerationwebui.length - 1, 1) == "/") {
|
||
api_server_textgenerationwebui = api_server_textgenerationwebui.substr(0, api_server_textgenerationwebui.length - 1);
|
||
}
|
||
//console.log("2: "+api_server_textgenerationwebui);
|
||
main_api = "textgenerationwebui";
|
||
saveSettings();
|
||
is_get_status = true;
|
||
is_api_button_press = true;
|
||
getStatus();
|
||
}
|
||
});
|
||
|
||
$("body").click(function () {
|
||
if ($("#options").css('opacity') == 1.0) {
|
||
$('#options').transition({
|
||
opacity: 0.0,
|
||
duration: 100,//animation_rm_duration,
|
||
easing: animation_rm_easing,
|
||
complete: function () {
|
||
$("#options").css('display', 'none');
|
||
}
|
||
})
|
||
|
||
}
|
||
});
|
||
|
||
$("#options_button").click(function () { // this is the options button click function, shows the options menu if closed
|
||
if ($("#options").css('display') === 'none' && $("#options").css('opacity') == 0.0) {
|
||
$("#options").css('display', 'block');
|
||
$('#options').transition({
|
||
opacity: 1.0, // the manual setting of CSS via JS is what allows the click-away feature to work
|
||
duration: 100,
|
||
easing: animation_rm_easing,
|
||
complete: function () {
|
||
|
||
}
|
||
});
|
||
}
|
||
});
|
||
|
||
$("#option_select_chat").click(function () {
|
||
if (selected_group) {
|
||
// will open a chat selection screen
|
||
openNavToggle();
|
||
$("#rm_button_characters").trigger('click');
|
||
return;
|
||
}
|
||
if (this_chid != undefined && !is_send_press) {
|
||
getAllCharaChats();
|
||
$('#shadow_select_chat_popup').css('display', 'block');
|
||
$('#shadow_select_chat_popup').css('opacity', 0.0);
|
||
$('#shadow_select_chat_popup').transition({ opacity: 1.0, duration: animation_rm_duration, easing: animation_rm_easing });
|
||
}
|
||
});
|
||
$("#option_start_new_chat").click(function () {
|
||
if (selected_group) {
|
||
// will open a group creation screen
|
||
openNavToggle();
|
||
$("#rm_button_group_chats").trigger('click');
|
||
return;
|
||
}
|
||
if (this_chid != undefined && !is_send_press) {
|
||
popup_type = 'new_chat';
|
||
callPopup('<h3>Start new chat?</h3>');
|
||
}
|
||
});
|
||
$("#option_regenerate").click(function () {
|
||
if (is_send_press == false) {
|
||
hideSwipeButtons();
|
||
is_send_press = true;
|
||
Generate('regenerate');
|
||
}
|
||
});
|
||
// this function hides the input form, and shows the delete/cancel buttons for deleting messages from chat
|
||
$("#option_delete_mes").click(function () {
|
||
hideSwipeButtons();
|
||
if (this_chid != undefined && !is_send_press || (selected_group && !is_group_generating)) {
|
||
$('#dialogue_del_mes').css('display', 'block');
|
||
$('#send_form').css('display', 'none');
|
||
$('.del_checkbox').each(function () {
|
||
if ($(this).parent().attr('mesid') != 0) {
|
||
$(this).css("display", "block");
|
||
$(this).parent().children('.for_checkbox').css('display', 'none');
|
||
}
|
||
});
|
||
}
|
||
});
|
||
//functionality for the cancel delete messages button, reverts to normal display of input form
|
||
$("#dialogue_del_mes_cancel").click(function () {
|
||
$('#dialogue_del_mes').css('display', 'none');
|
||
$('#send_form').css('display', css_send_form_display);
|
||
$('.del_checkbox').each(function () {
|
||
$(this).css("display", "none");
|
||
$(this).parent().children('.for_checkbox').css('display', 'block');
|
||
$(this).parent().css('background', css_mes_bg);
|
||
$(this).prop("checked", false);
|
||
|
||
});
|
||
this_del_mes = 0;
|
||
showSwipeButtons();
|
||
|
||
});
|
||
//confirms message delation with the "ok" button
|
||
$("#dialogue_del_mes_ok").click(function () {
|
||
$('#dialogue_del_mes').css('display', 'none');
|
||
$('#send_form').css('display', css_send_form_display);
|
||
$('.del_checkbox').each(function () {
|
||
$(this).css("display", "none");
|
||
$(this).parent().children('.for_checkbox').css('display', 'block');
|
||
$(this).parent().css('background', css_mes_bg);
|
||
$(this).prop("checked", false);
|
||
|
||
|
||
});
|
||
if (this_del_mes != 0) {
|
||
$(".mes[mesid='" + this_del_mes + "']").nextAll('div').remove();
|
||
$(".mes[mesid='" + this_del_mes + "']").remove();
|
||
chat.length = this_del_mes;
|
||
count_view_mes = this_del_mes;
|
||
if (selected_group) {
|
||
saveGroupChat(selected_group);
|
||
} else {
|
||
saveChat();
|
||
}
|
||
var $textchat = $('#chat');
|
||
$textchat.scrollTop($textchat[0].scrollHeight);
|
||
}
|
||
this_del_mes = 0;
|
||
$('#chat .mes').last().addClass('last_mes');
|
||
$('#chat .mes').eq(-2).removeClass('last_mes');
|
||
showSwipeButtons();
|
||
|
||
|
||
});
|
||
|
||
$("#world_info").change(async function () {
|
||
const selectedWorld = $('#world_info').find(":selected").val();
|
||
world_info = null;
|
||
world_info_data = null;
|
||
|
||
if (selectedWorld !== 'None') {
|
||
const worldIndex = Number(selectedWorld);
|
||
world_info = !isNaN(worldIndex) ? world_names[worldIndex] : null;
|
||
await loadWorldInfoData();
|
||
}
|
||
|
||
hideWorldEditor();
|
||
saveSettings();
|
||
});
|
||
|
||
$("#settings_perset").change(function () {
|
||
console.log('#settings_preset sensor -- starting');
|
||
if ($('#settings_perset').find(":selected").val() != 'gui') {
|
||
preset_settings = $('#settings_perset').find(":selected").text();
|
||
temp = koboldai_settings[koboldai_setting_names[preset_settings]].temp;
|
||
amount_gen = koboldai_settings[koboldai_setting_names[preset_settings]].genamt;
|
||
console.log('settings_perset -- changed -- amount_gen ='+ amount_gen);
|
||
rep_pen = koboldai_settings[koboldai_setting_names[preset_settings]].rep_pen;
|
||
rep_pen_size = koboldai_settings[koboldai_setting_names[preset_settings]].rep_pen_range;
|
||
max_context = koboldai_settings[koboldai_setting_names[preset_settings]].max_length;
|
||
$('#temp').val(temp);
|
||
$('#temp_counter').html(temp);
|
||
|
||
$('#amount_gen').val(amount_gen);
|
||
$('#amount_gen_counter').html(amount_gen);
|
||
|
||
$('#max_context').val(max_context);
|
||
$('#max_context_counter').html(max_context + " Tokens");
|
||
|
||
$('#rep_pen').val(rep_pen);
|
||
$('#rep_pen_counter').html(rep_pen);
|
||
|
||
$('#rep_pen_size').val(rep_pen_size);
|
||
$('#rep_pen_size_counter').html(rep_pen_size + " Tokens");
|
||
|
||
$("#range_block").children().prop("disabled", false);
|
||
$("#range_block").css('opacity', 1.0);
|
||
$("#amount_gen_block").children().prop("disabled", false);
|
||
$("#amount_gen_block").css('opacity', 1.0);
|
||
|
||
} else {
|
||
//$('.button').disableSelection();
|
||
preset_settings = 'gui';
|
||
$("#range_block").children().prop("disabled", true);
|
||
$("#range_block").css('opacity', 0.5);
|
||
$("#amount_gen_block").children().prop("disabled", true);
|
||
$("#amount_gen_block").css('opacity', 0.45);
|
||
}
|
||
console.log('setting_preset -- finished');
|
||
saveSettings();
|
||
});
|
||
$("#settings_perset_novel").change(function () {
|
||
|
||
preset_settings_novel = $('#settings_perset_novel').find(":selected").text();
|
||
temp_novel = novelai_settings[novelai_setting_names[preset_settings_novel]].temperature;
|
||
//amount_gen = koboldai_settings[koboldai_setting_names[preset_settings]].genamt;
|
||
rep_pen_novel = novelai_settings[novelai_setting_names[preset_settings_novel]].repetition_penalty;
|
||
rep_pen_size_novel = novelai_settings[novelai_setting_names[preset_settings_novel]].repetition_penalty_range;
|
||
$('#temp_novel').val(temp_novel);
|
||
$('#temp_counter_novel').html(temp_novel);
|
||
|
||
//$('#amount_gen').val(amount_gen);
|
||
//$('#amount_gen_counter').html(amount_gen);
|
||
|
||
$('#rep_pen_novel').val(rep_pen_novel);
|
||
$('#rep_pen_counter_novel').html(rep_pen_novel);
|
||
|
||
$('#rep_pen_size_novel').val(rep_pen_size_novel);
|
||
$('#rep_pen_size_counter_novel').html(rep_pen_size_novel + " Tokens");
|
||
|
||
//$("#range_block").children().prop("disabled", false);
|
||
//$("#range_block").css('opacity',1.0);
|
||
saveSettings();
|
||
});
|
||
$("#main_api").change(function () {
|
||
is_pygmalion = false;
|
||
is_get_status = false;
|
||
is_get_status_novel = false;
|
||
online_status = 'no_connection';
|
||
clearSoftPromptsList();
|
||
checkOnlineStatus();
|
||
changeMainAPI();
|
||
saveSettings();
|
||
});
|
||
$('#softprompt').change(async function () {
|
||
if (!api_server) {
|
||
return;
|
||
}
|
||
|
||
const selected = $('#softprompt').find(':selected').val();
|
||
const response = await fetch('/setsoftprompt', {
|
||
method: 'POST',
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
"X-CSRF-Token": token,
|
||
},
|
||
body: JSON.stringify({ name: selected, api_server: api_server }),
|
||
});
|
||
|
||
if (!response.ok) {
|
||
console.error("Couldn't change soft prompt");
|
||
}
|
||
});
|
||
|
||
for (var i of ["temp", "rep_pen", "rep_pen_size", "top_k", "top_p", "typical_p", "penalty_alpha"]) {
|
||
$('#' + i + '_textgenerationwebui').attr('x-setting-id', i);
|
||
$(document).on('input', '#' + i + '_textgenerationwebui', function () {
|
||
var i = $(this).attr('x-setting-id');
|
||
var val = $(this).val();
|
||
if (isInt(val)) {
|
||
$('#' + i + '_counter_textgenerationwebui').html($(this).val() + ".00");
|
||
} else {
|
||
$('#' + i + '_counter_textgenerationwebui').html($(this).val());
|
||
}
|
||
textgenerationwebui_settings[i] = parseFloat(val);
|
||
setTimeout(saveSettings, 500);
|
||
});
|
||
}
|
||
|
||
$(document).on('input', '#temp', function () {
|
||
temp = $(this).val();
|
||
if (isInt(temp)) {
|
||
$('#temp_counter').html($(this).val() + ".00");
|
||
} else {
|
||
$('#temp_counter').html($(this).val());
|
||
}
|
||
var tempTimer = setTimeout(saveSettings, 500);
|
||
});
|
||
$(document).on('input', '#amount_gen', function () {
|
||
amount_gen = $(this).val();
|
||
$('#amount_gen_counter').html($(this).val());
|
||
var amountTimer = setTimeout(saveSettings, 500);
|
||
});
|
||
$(document).on('input', '#max_context', function () {
|
||
max_context = parseInt($(this).val());
|
||
$('#max_context_counter').html($(this).val() + ' Tokens');
|
||
var max_contextTimer = setTimeout(saveSettings, 500);
|
||
});
|
||
$(document).on('input', '#world_info_depth', function () {
|
||
world_info_depth = Number($(this).val());
|
||
$('#world_info_depth_counter').html(`${$(this).val()} Messages`);
|
||
setTimeout(saveSettings, 500);
|
||
});
|
||
$(document).on('input', '#world_info_budget', function () {
|
||
world_info_budget = Number($(this).val());
|
||
$('#world_info_budget_counter').html(`${$(this).val()} Tokens`);
|
||
setTimeout(saveSettings, 500);
|
||
})
|
||
$('#style_anchor').change(function () {
|
||
style_anchor = !!$('#style_anchor').prop('checked');
|
||
saveSettings();
|
||
});
|
||
$('#character_anchor').change(function () {
|
||
character_anchor = !!$('#character_anchor').prop('checked');
|
||
saveSettings();
|
||
});
|
||
$('#auto-connect-checkbox').change(function () {
|
||
auto_connect = !!$('#auto-connect-checkbox').prop('checked');
|
||
saveSettings();
|
||
});
|
||
$('#auto-load-chat-checkbox').change(function () {
|
||
auto_load_chat = !!$('#auto-load-chat-checkbox').prop('checked');
|
||
saveSettings();
|
||
});
|
||
$('#collapse-newlines-checkbox').change(function () {
|
||
collapse_newlines = !!$('#collapse-newlines-checkbox').prop('checked');
|
||
saveSettings();
|
||
});
|
||
$(document).on('input', '#rep_pen', function () {
|
||
rep_pen = $(this).val();
|
||
if (isInt(rep_pen)) {
|
||
$('#rep_pen_counter').html($(this).val() + ".00");
|
||
} else {
|
||
$('#rep_pen_counter').html($(this).val());
|
||
}
|
||
var repPenTimer = setTimeout(saveSettings, 500);
|
||
});
|
||
$(document).on('input', '#rep_pen_size', function () {
|
||
rep_pen_size = $(this).val();
|
||
$('#rep_pen_size_counter').html($(this).val() + " Tokens");
|
||
var repPenSizeTimer = setTimeout(saveSettings, 500);
|
||
});
|
||
//Novel
|
||
$(document).on('input', '#temp_novel', function () {
|
||
temp_novel = $(this).val();
|
||
|
||
if (isInt(temp_novel)) {
|
||
$('#temp_counter_novel').html($(this).val() + ".00");
|
||
} else {
|
||
$('#temp_counter_novel').html($(this).val());
|
||
}
|
||
var tempTimer_novel = setTimeout(saveSettings, 500);
|
||
});
|
||
$(document).on('input', '#rep_pen_novel', function () {
|
||
rep_pen_novel = $(this).val();
|
||
if (isInt(rep_pen_novel)) {
|
||
$('#rep_pen_counter_novel').html($(this).val() + ".00");
|
||
} else {
|
||
$('#rep_pen_counter_novel').html($(this).val());
|
||
}
|
||
var repPenTimer_novel = setTimeout(saveSettings, 500);
|
||
});
|
||
$(document).on('input', '#rep_pen_size_novel', function () {
|
||
rep_pen_size_novel = $(this).val();
|
||
$('#rep_pen_size_counter_novel').html($(this).val() + " Tokens");
|
||
var repPenSizeTimer_novel = setTimeout(saveSettings, 500);
|
||
});
|
||
|
||
$('#donation').click(function () {
|
||
$('#shadow_tips_popup').css('display', 'block');
|
||
$('#shadow_tips_popup').transition({
|
||
opacity: 1.0,
|
||
duration: 100,
|
||
easing: animation_rm_easing,
|
||
complete: function () {
|
||
|
||
}
|
||
});
|
||
});
|
||
$('#tips_cross').click(function () {
|
||
|
||
$('#shadow_tips_popup').transition({
|
||
opacity: 0.0,
|
||
duration: 100,
|
||
easing: animation_rm_easing,
|
||
complete: function () {
|
||
$('#shadow_tips_popup').css('display', 'none');
|
||
}
|
||
});
|
||
});
|
||
$('#select_chat_cross').click(function () {
|
||
|
||
|
||
$('#shadow_select_chat_popup').css('display', 'none');
|
||
$('#load_select_chat_div').css('display', 'block');
|
||
});
|
||
|
||
//********************
|
||
//***Message Editor***
|
||
$(document).on('click', '.mes_edit', function () {
|
||
if (this_chid !== undefined || selected_group) {
|
||
const message = $(this).closest('.mes');
|
||
|
||
if (message.data('isSystem')) {
|
||
return;
|
||
}
|
||
|
||
let chatScrollPosition = $("#chat").scrollTop();
|
||
if (this_edit_mes_id !== undefined) {
|
||
|
||
let run_edit = true;
|
||
var edit_mes_id = $(this).parent().parent().parent().attr('mesid');
|
||
let mes_edited = $('#chat').children().filter('[mesid="' + this_edit_mes_id + '"]').children('.mes_block').children('.ch_name').children('.mes_edit_done');
|
||
if(edit_mes_id == count_view_mes-1){ //if the generating swipe (...)
|
||
if(chat[edit_mes_id]['swipe_id'] !== undefined){
|
||
if(chat[edit_mes_id]['swipes'].length === chat[edit_mes_id]['swipe_id']){
|
||
run_edit = false;
|
||
}
|
||
}
|
||
if(run_edit){
|
||
hideSwipeButtons();
|
||
}
|
||
}
|
||
|
||
messageEditDone(mes_edited);
|
||
}
|
||
$(this).parent().parent().children('.mes_text').empty();
|
||
$(this).css('display', 'none');
|
||
$(this).parent().children('.mes_edit_done').css('display', 'inline-block');
|
||
$(this).parent().children('.mes_edit_done').css('opacity', 0.0);
|
||
$(this).parent().children('.mes_edit_cancel').css('display', 'inline-block');
|
||
$(this).parent().children('.mes_edit_cancel').css('opacity', 0.0);
|
||
$(this).parent().children('.mes_edit_done').transition({
|
||
opacity: 1.0,
|
||
duration: 600,
|
||
easing: "",
|
||
complete: function () { }
|
||
});
|
||
$(this).parent().children('.mes_edit_cancel').transition({
|
||
opacity: 1.0,
|
||
duration: 600,
|
||
easing: "",
|
||
complete: function () { }
|
||
});
|
||
var edit_mes_id = $(this).parent().parent().parent().attr('mesid');
|
||
this_edit_mes_id = edit_mes_id;
|
||
|
||
var text = chat[edit_mes_id]['mes'];
|
||
if (chat[edit_mes_id]['is_user']) {
|
||
this_edit_mes_chname = name1;
|
||
}
|
||
else if (chat[edit_mes_id]['forced_avatar']) {
|
||
this_edit_mes_chname = chat[edit_mes_id]['name'];
|
||
}
|
||
else {
|
||
this_edit_mes_chname = name2;
|
||
}
|
||
text = text.trim();
|
||
$(this).parent().parent().children('.mes_text').append('<textarea class=edit_textarea style="max-width:auto; ">' + text + '</textarea>');
|
||
let edit_textarea = $(this).parent().parent().children('.mes_text').children('.edit_textarea');
|
||
edit_textarea.css('opacity', 0.0);
|
||
edit_textarea.transition({
|
||
opacity: 1.0,
|
||
duration: 0,
|
||
easing: "",
|
||
complete: function () { }
|
||
});
|
||
edit_textarea.height(0);
|
||
edit_textarea.height(edit_textarea[0].scrollHeight);
|
||
edit_textarea.focus();
|
||
edit_textarea[0].setSelectionRange(edit_textarea.val().length, edit_textarea.val().length);
|
||
if (this_edit_mes_id == count_view_mes - 1) {
|
||
$("#chat").scrollTop(chatScrollPosition);
|
||
}
|
||
}
|
||
});
|
||
$(document).on('click', '.mes_edit_cancel', function () {
|
||
//var text = $(this).parent().parent().children('.mes_text').children('.edit_textarea').val();
|
||
var text = chat[this_edit_mes_id]['mes'];
|
||
|
||
$(this).parent().parent().children('.mes_text').empty();
|
||
$(this).css('display', 'none');
|
||
$(this).parent().children('.mes_edit_done').css('display', 'none');
|
||
$(this).parent().children('.mes_edit').css('display', 'inline-block');
|
||
$(this).parent().parent().children('.mes_text').append(messageFormating(text, this_edit_mes_chname));
|
||
appendImageToMessage(chat[this_edit_mes_id], $(this).closest('.mes'));
|
||
this_edit_mes_id = undefined;
|
||
});
|
||
$(document).on('click', '.mes_edit_done', function () {
|
||
messageEditDone($(this));
|
||
});
|
||
|
||
$("#your_name_button").click(function () {
|
||
if (!is_send_press) {
|
||
name1 = $("#your_name").val();
|
||
if (name1 === undefined || name1 == '') name1 = default_user_name;
|
||
console.log(name1);
|
||
saveSettings('change_name');
|
||
|
||
}
|
||
});
|
||
//Select chat
|
||
|
||
$("#api_button_novel").click(function () {
|
||
if ($('#api_key_novel').val() != '') {
|
||
$("#api_loading_novel").css("display", 'inline-block');
|
||
$("#api_button_novel").css("display", 'none');
|
||
api_key_novel = $('#api_key_novel').val();
|
||
api_key_novel = $.trim(api_key_novel);
|
||
//console.log("1: "+api_server);
|
||
saveSettings();
|
||
is_get_status_novel = true;
|
||
is_api_button_press_novel = true;
|
||
}
|
||
});
|
||
|
||
$("#model_novel_select").change(function () {
|
||
model_novel = $('#model_novel_select').find(":selected").val();
|
||
saveSettings();
|
||
});
|
||
$("#anchor_order").change(function () {
|
||
anchor_order = parseInt($('#anchor_order').find(":selected").val());
|
||
saveSettings();
|
||
});
|
||
|
||
//**************************CHARACTER IMPORT EXPORT*************************//
|
||
$("#character_import_button").click(function () {
|
||
$("#character_import_file").click();
|
||
});
|
||
$("#character_import_file").on("change", function (e) {
|
||
$('#rm_info_avatar').html('');
|
||
var file = e.target.files[0];
|
||
//console.log(1);
|
||
if (!file) {
|
||
return;
|
||
}
|
||
var ext = file.name.match(/\.(\w+)$/);
|
||
if (!ext || (ext[1].toLowerCase() != "json" && ext[1].toLowerCase() != "png")) {
|
||
return;
|
||
}
|
||
|
||
var format = ext[1].toLowerCase();
|
||
$("#character_import_file_type").val(format);
|
||
//console.log(format);
|
||
var formData = new FormData($("#form_import").get(0));
|
||
|
||
jQuery.ajax({
|
||
type: 'POST',
|
||
url: '/importcharacter',
|
||
data: formData,
|
||
beforeSend: function () {
|
||
//$('#create_button').attr('disabled',true);
|
||
//$('#create_button').attr('value','Creating...');
|
||
},
|
||
cache: false,
|
||
contentType: false,
|
||
processData: false,
|
||
success: async function (data) {
|
||
if (data.file_name !== undefined) {
|
||
|
||
$('#rm_info_block').transition({ opacity: 0, duration: 0 });
|
||
var $prev_img = $('#avatar_div_div').clone();
|
||
$prev_img.children('img').attr('src', 'characters/' + data.file_name + '.png');
|
||
$('#rm_info_avatar').append($prev_img);
|
||
|
||
let oldSelectedChar = null;
|
||
if (this_chid != undefined && this_chid != 'invalid-safety-id') {
|
||
oldSelectedChar = characters[this_chid].name;
|
||
}
|
||
|
||
await getCharacters();
|
||
select_rm_info("Character created", oldSelectedChar);
|
||
$('#rm_info_block').transition({ opacity: 1, duration: 1000 });
|
||
}
|
||
},
|
||
error: function (jqXHR, exception) {
|
||
$('#create_button').removeAttr("disabled");
|
||
}
|
||
});
|
||
});
|
||
$('#export_button').click(function () {
|
||
var link = document.createElement('a');
|
||
link.href = 'characters/' + characters[this_chid].avatar;
|
||
link.download = characters[this_chid].avatar;
|
||
document.body.appendChild(link);
|
||
link.click();
|
||
});
|
||
//**************************CHAT IMPORT EXPORT*************************//
|
||
$("#chat_import_button").click(function () {
|
||
$("#chat_import_file").click();
|
||
});
|
||
$("#chat_import_file").on("change", function (e) {
|
||
var file = e.target.files[0];
|
||
//console.log(1);
|
||
if (!file) {
|
||
return;
|
||
}
|
||
var ext = file.name.match(/\.(\w+)$/);
|
||
if (!ext || (ext[1].toLowerCase() != "json" && ext[1].toLowerCase() != "jsonl")) {
|
||
return;
|
||
}
|
||
|
||
var format = ext[1].toLowerCase();
|
||
$("#chat_import_file_type").val(format);
|
||
//console.log(format);
|
||
var formData = new FormData($("#form_import_chat").get(0));
|
||
//console.log('/importchat entered with: '+formData);
|
||
jQuery.ajax({
|
||
type: 'POST',
|
||
url: '/importchat',
|
||
data: formData,
|
||
beforeSend: function () {
|
||
$('#select_chat_div').html('');
|
||
$('#load_select_chat_div').css('display', 'block');
|
||
//$('#create_button').attr('value','Creating...');
|
||
},
|
||
cache: false,
|
||
contentType: false,
|
||
processData: false,
|
||
success: function (data) {
|
||
//console.log(data);
|
||
if (data.res) {
|
||
getAllCharaChats();
|
||
|
||
|
||
}
|
||
},
|
||
error: function (jqXHR, exception) {
|
||
$('#create_button').removeAttr("disabled");
|
||
}
|
||
});
|
||
});
|
||
$(document).on('click', '.select_chat_block', function () {
|
||
let file_name = $(this).attr("file_name").replace('.jsonl', '');
|
||
//console.log(characters[this_chid]['chat']);
|
||
characters[this_chid]['chat'] = file_name;
|
||
clearChat();
|
||
chat.length = 0;
|
||
getChat();
|
||
$('#selected_chat_pole').val(file_name);
|
||
$("#create_button").click();
|
||
$('#shadow_select_chat_popup').css('display', 'none');
|
||
$('#load_select_chat_div').css('display', 'block');
|
||
|
||
});
|
||
|
||
//**************************WORLD INFO IMPORT EXPORT*************************//
|
||
$("#world_import_button").click(function () {
|
||
$("#world_import_file").click();
|
||
});
|
||
|
||
$("#world_import_file").on("change", function (e) {
|
||
var file = e.target.files[0];
|
||
|
||
if (!file) {
|
||
return;
|
||
}
|
||
|
||
const ext = file.name.match(/\.(\w+)$/);
|
||
if (!ext || (ext[1].toLowerCase() !== "json")) {
|
||
return;
|
||
}
|
||
|
||
var formData = new FormData($("#form_world_import").get(0));
|
||
|
||
jQuery.ajax({
|
||
type: 'POST',
|
||
url: '/importworldinfo',
|
||
data: formData,
|
||
beforeSend: () => { },
|
||
cache: false,
|
||
contentType: false,
|
||
processData: false,
|
||
success: function (data) {
|
||
if (data.name) {
|
||
imported_world_name = data.name;
|
||
updateWorldInfoList(imported_world_name);
|
||
}
|
||
},
|
||
error: (jqXHR, exception) => { },
|
||
});
|
||
|
||
// Will allow to select the same file twice in a row
|
||
$('#form_world_import').trigger("reset");
|
||
});
|
||
|
||
$('#world_info_edit_button').click(() => {
|
||
is_world_edit_open ? hideWorldEditor() : showWorldEditor();
|
||
});
|
||
|
||
$('#world_popup_export').click(() => {
|
||
if (world_info && world_info_data) {
|
||
const jsonValue = JSON.stringify(world_info_data);
|
||
const fileName = `${world_info}.json`;
|
||
download(jsonValue, fileName, 'application/json');
|
||
}
|
||
});
|
||
|
||
$('#world_popup_delete').click(() => {
|
||
popup_type = 'del_world';
|
||
callPopup('<h3>Delete the World Info?</h3>');
|
||
});
|
||
|
||
$('#world_popup_new').click(() => {
|
||
createWorldInfoEntry();
|
||
});
|
||
|
||
$('#world_cross').click(() => {
|
||
hideWorldEditor();
|
||
});
|
||
|
||
$('#world_popup_name_button').click(() => {
|
||
renameWorldInfo();
|
||
});
|
||
|
||
$('#world_create_button').click(() => {
|
||
createNewWorldInfo();
|
||
});
|
||
});
|