diff --git a/public/characters/Aqua.png b/public/characters/Aqua.png
index 62552dd74..6da8e87e1 100644
Binary files a/public/characters/Aqua.png and b/public/characters/Aqua.png differ
diff --git a/public/index.html b/public/index.html
index e87dd88b3..57bd0aee8 100644
--- a/public/index.html
+++ b/public/index.html
@@ -53,6 +53,25 @@
}];
var chat_create_date = 0;
+
+ //RossAscends: Added function to format dates used in files and chat timestamps to a humanized format.
+ //Mostly I wanted this to be for file names, but couldn't figure out exactly where the filename save code was as everything seemed to be connected.
+ //During testing, this performs the same as previous date.now() structure.
+ //It also does not break old characters/chats, as the code just uses whatever timestamp exists in the chat.
+ //New chats made with characters will use this new formatting.
+ //Useable variable is (( humanizedISO8601Datetime ))
+
+ var baseDate = new Date(Date.now());
+ var humanYear = baseDate.getFullYear();
+ var humanMonth = (baseDate.getMonth()+1);
+ var humanDate = baseDate.getDate();
+ var humanHour = (baseDate.getHours() < 10? '0' : '') + baseDate.getHours();
+ var humanMinute = (baseDate.getMinutes() < 10? '0' : '') + baseDate.getMinutes();
+ var humanSecond = (baseDate.getSeconds() < 10? '0' : '') + baseDate.getSeconds();
+ var humanMillisecond = (baseDate.getMilliseconds() < 10? '0' : '') + baseDate.getMilliseconds();
+ var humanizedISO8601DateTime = (humanYear+"-"+humanMonth+"-"+humanDate+" @"+humanHour+"h "+humanMinute+"m "+humanSecond+"s "+humanMillisecond+"ms");
+
+
var default_ch_mes = "Hello";
var count_view_mes = 0;
var mesStr = '';
@@ -316,7 +335,7 @@
characters.forEach(function(item, i, arr) {
var this_avatar = default_avatar;
if(item.avatar != 'none'){
- this_avatar = "characters/"+item.avatar+"#"+Date.now();
+ this_avatar = "characters/"+item.avatar+"#"+humanizedISO8601DateTime; //Date.now();
}
$("#rm_print_characters_block").prepend('
');
@@ -654,7 +673,7 @@
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'] = Date.now();
+ chat[chat.length-1]['send_date'] = humanizedISO8601DateTime; //Date.now();
chat[chat.length-1]['mes'] = textareaText;
addOneMessage(chat[chat.length-1]);
}
@@ -1071,7 +1090,7 @@
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'] = Date.now();
+ chat[chat.length-1]['send_date'] = humanizedISO8601DateTime; //Date.now();
getMessage = $.trim(getMessage);
chat[chat.length-1]['mes'] = getMessage;
addOneMessage(chat[chat.length-1]);
@@ -1117,7 +1136,6 @@
}
});
var save_chat = [{user_name:default_user_name, character_name:name2,create_date: chat_create_date}, ...chat];
-
jQuery.ajax({
type: 'POST',
url: '/savechat',
@@ -1162,7 +1180,7 @@
chat.shift();
}else{
- chat_create_date = Date.now();
+ chat_create_date = humanizedISO8601DateTime; //Date.now();
}
//console.log(chat);
getChatResult();
@@ -1195,7 +1213,7 @@
chat[0]['name'] = name2;
chat[0]['is_user'] = false;
chat[0]['is_name'] = true;
- chat[0]['send_date'] = Date.now();
+ chat[0]['send_date'] = humanizedISO8601DateTime; //Date.now();
if(characters[this_chid].first_mes != ""){
chat[0]['mes'] = characters[this_chid].first_mes;
}else{
@@ -1402,7 +1420,7 @@
if(characters[chid].avatar != 'none'){
this_avatar = "characters/"+characters[chid].avatar;
}
- $("#avatar_load_preview").attr('src',this_avatar+"#"+Date.now());
+ $("#avatar_load_preview").attr('src',this_avatar+"#"+humanizedISO8601DateTime); //Date.now());
$("#name_div").css("display", "none");
$("#form_create").attr("actiontype", "editcharacter");
@@ -1567,7 +1585,7 @@
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 = Date.now();
+ characters[this_chid].chat = (name2 +' - '+ humanizedISO8601DateTime); //RossAscends: added character name to new chat filenames and replaced Date.now() with humanizedISO8601DateTime;
$("#selected_chat_pole").val(characters[this_chid].chat);
timerSaveEdit = setTimeout(() => {$("#create_button").click();},durationSaveEdit);
getChat();
@@ -1688,7 +1706,7 @@
}
}
$("#add_avatar_button").change(function(){
- is_mes_reload_avatar = Date.now();
+ is_mes_reload_avatar = humanizedISO8601DateTime; //Date.now();
read_avatar_load(this);
});
$( "#form_create" ).submit(function(e) {
@@ -2552,7 +2570,7 @@
//console.log(characters[this_chid].chat);
jQuery.ajax({
type: 'POST',
- url: '/getallchatsofchatacter',
+ url: '/getallchatsofcharacter',
data: JSON.stringify({avatar_url: characters[this_chid].avatar}),
beforeSend: function(){
//$('#create_button').attr('value','Creating...');
@@ -2571,7 +2589,7 @@
if(mes.length > strlen){
mes = '...'+mes.substring(mes.length - strlen);
}
- $('#select_chat_div').append(''+data[key]['file_name']+'
'+mes+'
');
+ $('#select_chat_div').append(''+data[key]['file_name']+'
'+mes+'
');
if(characters[this_chid]['chat'] == data[key]['file_name'].replace('.jsonl', '')){
//children().last()
$('#select_chat_div').children(':nth-last-child(1)').attr('highlight', true);
diff --git a/public/style.css b/public/style.css
index f306500bc..67220f24b 100644
--- a/public/style.css
+++ b/public/style.css
@@ -1585,7 +1585,7 @@ label.checkbox :checked + span:after {
#select_chat_popup{
display: block;
grid-template-rows: 50px 100px 100px auto 45px;
- max-width:450px;
+ max-width:800px;
height: 440px;
position: absolute;
z-index: 2066;
@@ -1628,7 +1628,7 @@ label.checkbox :checked + span:after {
margin-top: 30px;
overflow-x: hidden;
overflow-y: scroll;
- max-width:430px;
+
height: 350px;
}
#select_chat_div hr{
@@ -1641,18 +1641,21 @@ label.checkbox :checked + span:after {
}
.select_chat_block{
- border-radius: 5px;
+border-radius: 5px;
margin-right: 10px;
- cursor:pointer;
+ margin-bottom: 10px;
+ border: 1px solid rgba(255,255,255,0.2);
+ padding: 5px;
display: grid;
- grid-template-columns: 60px auto;
- grid-template-rows: 26px auto;
+ grid-template-columns: min-content auto;
+ grid-template-rows: auto auto;
+ grid-gap: 10px;
}
.select_chat_block:hover {
- background-color: #ffffff07;
+ background-color: rgba(255,255,255,0.2);
}
.select_chat_block[highlight]{
- background-color: #ffffff09;/* #c2b07a12; */
+ background-color: rgba(100,100,255,0.3);
}
.select_chat_block .avatar{
@@ -1669,8 +1672,8 @@ label.checkbox :checked + span:after {
}
.select_chat_block .avatar {
- height:30px;
- width:30px;
+ /*height:30px;
+ width:30px;*/
}
#advanced_div{
diff --git a/server.js b/server.js
index 545b484e9..67fca5d2b 100644
--- a/server.js
+++ b/server.js
@@ -51,6 +51,24 @@ var response_getstatus_novel;
var response_getlastversion;
var api_key_novel;
+ //RossAscends: Added function to format dates used in files and chat timestamps to a humanized format.
+ //Mostly I wanted this to be for file names, but couldn't figure out exactly where the filename save code was as everything seemed to be connected.
+ //During testing, this performs the same as previous date.now() structure.
+ //It also does not break old characters/chats, as the code just uses whatever timestamp exists in the chat.
+ //New chats made with characters will use this new formatting.
+ //Useable variable is (( humanizedISO8601Datetime ))
+
+ var baseDate = new Date(Date.now());
+ var humanYear = baseDate.getFullYear();
+ var humanMonth = (baseDate.getMonth()+1);
+ var humanDate = baseDate.getDate();
+ var humanHour = (baseDate.getHours() < 10? '0' : '') + baseDate.getHours();
+ var humanMinute = (baseDate.getMinutes() < 10? '0' : '') + baseDate.getMinutes();
+ var humanSecond = (baseDate.getSeconds() < 10? '0' : '') + baseDate.getSeconds();
+ var humanMillisecond = (baseDate.getMilliseconds() < 10? '0' : '') + baseDate.getMilliseconds();
+
+ var humanizedISO8601DateTime = (humanYear+"-"+humanMonth+"-"+humanDate+" @"+humanHour+"h "+humanMinute+"m "+humanSecond+"s "+humanMillisecond+"ms");
+
var is_colab = false;
var charactersPath = 'public/characters/';
var chatsPath = 'public/chats/';
@@ -263,6 +281,7 @@ app.post("/generate", jsonParser, function(request, response_generate = response
});
});
app.post("/savechat", jsonParser, function(request, response){
+ //console.log('/savechat/ entered');
//console.log(request.data);
//console.log(request.body.bg);
//const data = request.body;
@@ -291,22 +310,23 @@ app.post("/getchat", jsonParser, function(request, response){
//console.log(request);
//console.log(request.body.chat);
//var bg = "body {background-image: linear-gradient(rgba(19,21,44,0.75), rgba(19,21,44,0.75)), url(../backgrounds/"+request.body.bg+");}";
+ //console.log('/getchat entered');
var dir_name = String(request.body.avatar_url).replace('.png','');
fs.stat(chatsPath+dir_name, function(err, stat) {
- if(stat === undefined){
+ if(stat === undefined){ //if no chat dir for the character is found, make one with the character name
fs.mkdirSync(chatsPath+dir_name);
response.send({});
return;
}else{
- if(err === null){
+ if(err === null){ //if there is a dir, then read the requested file from the JSON call
fs.stat(chatsPath+dir_name+"/"+request.body.file_name+".jsonl", function(err, stat) {
- if (err === null) {
+ if (err === null) { //if no error (the file exists), read the file
if(stat !== undefined){
fs.readFile(chatsPath+dir_name+"/"+request.body.file_name+".jsonl", 'utf8', (err, data) => {
@@ -321,7 +341,7 @@ app.post("/getchat", jsonParser, function(request, response){
// Iterate through the array of strings and parse each line as JSON
const jsonData = lines.map(JSON.parse);
response.send(jsonData);
-
+ //console.log('read the requested file')
});
}
@@ -335,6 +355,7 @@ app.post("/getchat", jsonParser, function(request, response){
console.error(err);
response.send({});
return;
+
}
}
@@ -394,7 +415,7 @@ function checkServer(){
//***************** Main functions
function charaFormatData(data){
- var char = {"name": data.ch_name, "description": data.description, "personality": data.personality, "first_mes": data.first_mes, "avatar": 'none', "chat": Date.now(), "mes_example": data.mes_example, "scenario": data.scenario, "create_date": Date.now()};
+ var char = {"name": data.ch_name, "description": data.description, "personality": data.personality, "first_mes": data.first_mes, "avatar": 'none', "chat": humanizedISO8601DateTime, "mes_example": data.mes_example, "scenario": data.scenario, "create_date": humanizedISO8601DateTime};
return char;
}
app.post("/createcharacter", urlencodedParser, function(request, response){
@@ -884,7 +905,7 @@ app.post("/generate_novelai", jsonParser, function(request, response_generate_no
});
});
-app.post("/getallchatsofchatacter", jsonParser, function(request, response){
+app.post("/getallchatsofcharacter", jsonParser, function(request, response){
if(!request.body) return response.sendStatus(400);
var char_dir = (request.body.avatar_url).replace('.png','')
@@ -900,10 +921,10 @@ app.post("/getallchatsofchatacter", jsonParser, function(request, response){
// sort the files by name
//jsonFiles.sort().reverse();
-
// print the sorted file names
var chatData = {};
- let ii = jsonFiles.length;
+ let ii = jsonFiles.length; //this is the number of files belonging to the character
+
for(let i = jsonFiles.length-1; i >= 0; i--){
const file = jsonFiles[i];
@@ -914,11 +935,9 @@ app.post("/getallchatsofchatacter", jsonParser, function(request, response){
});
let lastLine;
-
rl.on('line', (line) => {
- lastLine = line;
+ lastLine = line;
});
-
rl.on('close', () => {
if(lastLine){
let jsonData = JSON.parse(lastLine);
@@ -968,12 +987,12 @@ app.post("/importcharacter", urlencodedParser, function(request, response){
if(jsonData.name !== undefined){
png_name = getPngName(jsonData.name);
- let char = {"name": jsonData.name, "description": jsonData.description ?? '', "personality": jsonData.personality ?? '', "first_mes": jsonData.first_mes ?? '', "avatar": 'none', "chat": Date.now(), "mes_example": jsonData.mes_example ?? '', "scenario": jsonData.scenario ?? '', "create_date": Date.now()};
+ let char = {"name": jsonData.name, "description": jsonData.description ?? '', "personality": jsonData.personality ?? '', "first_mes": jsonData.first_mes ?? '', "avatar": 'none', "chat": humanizedISO8601DateTime, "mes_example": jsonData.mes_example ?? '', "scenario": jsonData.scenario ?? '', "create_date": humanizedISO8601DateTime};
char = JSON.stringify(char);
charaWrite('./public/img/fluffy.png', char, png_name, response, {file_name: png_name});
}else if(jsonData.char_name !== undefined){//json Pygmalion notepad
png_name = getPngName(jsonData.char_name);
- let char = {"name": jsonData.char_name, "description": jsonData.char_persona ?? '', "personality": '', "first_mes": jsonData.char_greeting ?? '', "avatar": 'none', "chat": Date.now(), "mes_example": jsonData.example_dialogue ?? '', "scenario": jsonData.world_scenario ?? '', "create_date": Date.now()};
+ let char = {"name": jsonData.char_name, "description": jsonData.char_persona ?? '', "personality": '', "first_mes": jsonData.char_greeting ?? '', "avatar": 'none', "chat": humanizedISO8601DateTime, "mes_example": jsonData.example_dialogue ?? '', "scenario": jsonData.world_scenario ?? '', "create_date": humanizedISO8601DateTime};
char = JSON.stringify(char);
charaWrite('./public/img/fluffy.png', char, png_name, response, {file_name: png_name});
}else{
@@ -989,7 +1008,7 @@ app.post("/importcharacter", urlencodedParser, function(request, response){
png_name = getPngName(jsonData.name);
if(jsonData.name !== undefined){
- let char = {"name": jsonData.name, "description": jsonData.description ?? '', "personality": jsonData.personality ?? '', "first_mes": jsonData.first_mes ?? '', "avatar": 'none', "chat": Date.now(), "mes_example": jsonData.mes_example ?? '', "scenario": jsonData.scenario ?? '', "create_date": Date.now()};
+ let char = {"name": jsonData.name, "description": jsonData.description ?? '', "personality": jsonData.personality ?? '', "first_mes": jsonData.first_mes ?? '', "avatar": 'none', "chat": humanizedISO8601DateTime, "mes_example": jsonData.mes_example ?? '', "scenario": jsonData.scenario ?? '', "create_date": humanizedISO8601DateTime};
char = JSON.stringify(char);
charaWrite('./uploads/'+filedata.filename, char, png_name, response, {file_name: png_name});
/*
@@ -1048,7 +1067,7 @@ app.post("/importchat", urlencodedParser, function(request, response){
new_chat[i] = {};
new_chat[0]['user_name'] = 'You';
new_chat[0]['character_name'] = ch_name;
- new_chat[0]['create_date'] = Date.now();
+ new_chat[0]['create_date'] = humanizedISO8601DateTime //Date.now();
i++;
jsonData.histories.histories[0].msgs.forEach(function(item) {
new_chat[i] = {};
@@ -1059,12 +1078,13 @@ app.post("/importchat", urlencodedParser, function(request, response){
}
new_chat[i]['is_user'] = item.src.is_human;
new_chat[i]['is_name'] = true;
- new_chat[i]['send_date'] = Date.now();
+ new_chat[i]['send_date'] = humanizedISO8601DateTime //Date.now();
new_chat[i]['mes'] = item.text;
i++;
});
const chatJsonlData = new_chat.map(JSON.stringify).join('\n');
- fs.writeFile(chatsPath+avatar_url+'/'+Date.now()+'.jsonl', chatJsonlData, 'utf8', function(err) {
+ fs.writeFile(chatsPath+avatar_url+'/'+ch_name+' - '+humanizedISO8601DateTime+' imported.jsonl', chatJsonlData, 'utf8', function(err) { //added ch_name and replaced Date.now() with humanizedISO8601DateTime
+
if(err) {
response.send(err);
return console.log(err);
@@ -1093,7 +1113,7 @@ app.post("/importchat", urlencodedParser, function(request, response){
let jsonData = JSON.parse(line);
if(jsonData.user_name !== undefined){
- fs.copyFile('./uploads/'+filedata.filename, chatsPath+avatar_url+'/'+Date.now()+'.jsonl', (err) => {
+ fs.copyFile('./uploads/'+filedata.filename, chatsPath+avatar_url+'/'+ch_name+' - '+humanizedISO8601DateTime+'.jsonl', (err) => { //Date.now() replaced for humanizedISO8601DateTime
if(err) {
response.send({error:true});
return console.log(err);
@@ -1172,7 +1192,7 @@ function convertStage2(){
//console.log(directoriesB[key]);
var char = JSON.parse(charactersB[key]);
- char.create_date = Date.now();
+ char.create_date = humanizedISO8601DateTime;
charactersB[key] = JSON.stringify(char);
var avatar = 'public/img/fluffy.png';
if(char.avatar !== 'none'){
@@ -1202,7 +1222,7 @@ function convertStage2(){
}
let i = 0;
let ii = 0;
- new_chat_data[i] = {user_name:'You', character_name:char.name, create_date: Date.now()};
+ new_chat_data[i] = {user_name:'You', character_name:char.name, create_date: humanizedISO8601DateTime};
i++;
ii++;
chat_data.forEach(function(mes) {
@@ -1218,14 +1238,14 @@ function convertStage2(){
new_chat_data[ii]['name'] = char.name;
new_chat_data[ii]['is_user'] = false;
new_chat_data[ii]['is_name'] = is_name;
- new_chat_data[ii]['send_date'] = Date.now();
+ new_chat_data[ii]['send_date'] = humanizedISO8601DateTime; //Date.now();
}else{
mes = mes.replace(this_chat_user_name+':','');
new_chat_data[ii]['name'] = 'You';
new_chat_data[ii]['is_user'] = true;
new_chat_data[ii]['is_name'] = true;
- new_chat_data[ii]['send_date'] = Date.now();
+ new_chat_data[ii]['send_date'] = humanizedISO8601DateTime //Date.now();
}
new_chat_data[ii]['mes'] = mes.trim();