diff --git a/src/lib/ChatScreens/DefaultChatScreen.svelte b/src/lib/ChatScreens/DefaultChatScreen.svelte index 59e1ab26..42007f0a 100644 --- a/src/lib/ChatScreens/DefaultChatScreen.svelte +++ b/src/lib/ChatScreens/DefaultChatScreen.svelte @@ -69,13 +69,15 @@ cha.push({ role: 'user', - data: processScript(char,messageInput,'editinput') + data: processScript(char,messageInput,'editinput'), + time: Date.now() }) } else{ cha.push({ role: 'user', - data: messageInput + data: messageInput, + time: Date.now() }) } } diff --git a/src/ts/parser.ts b/src/ts/parser.ts index c44a3a1e..102212b3 100644 --- a/src/ts/parser.ts +++ b/src/ts/parser.ts @@ -2,7 +2,7 @@ import DOMPurify from 'isomorphic-dompurify'; import showdown from 'showdown'; import { Marked } from 'marked'; -import { DataBase, type Database, type character, type groupChat } from './storage/database'; +import { DataBase, type Database, type Message, type character, type groupChat } from './storage/database'; import { getFileSrc } from './storage/globalApi'; import { processScript, processScriptFull } from './process/scripts'; import { get } from 'svelte/store'; @@ -442,6 +442,88 @@ const matcher = (p1:string,matcherArg:matcherArg) => { case 'none':{ return '' } + case 'time':{ + if(chatID === -1){ + return "[Cannot get time]" + } + + const selchar = db.characters[get(selectedCharID)] + const chat = selchar.chats[selchar.chatPage] + const message = chat.message[chatID] + if(!message.time){ + return "[Cannot get time, message was sent in older version]" + } + const date = new Date(message.time) + //output time in format like 10:30 AM + return date.toLocaleTimeString() + } + case 'date':{ + if(chatID === -1){ + return "[Cannot get time]" + } + const selchar = db.characters[get(selectedCharID)] + const chat = selchar.chats[selchar.chatPage] + const message = chat.message[chatID] + if(!message.time){ + return "[Cannot get time, message was sent in older version]" + } + const date = new Date(message.time) + //output date in format like Aug 23, 2021 + return date.toLocaleDateString() + } + case 'idle_duration':{ + if(chatID === -1){ + return "[Cannot get time]" + } + const selchar = db.characters[get(selectedCharID)] + const chat = selchar.chats[selchar.chatPage] + + //get latest user message + let pointer = chatID + let pointerMode: 'findLast'|'findSecondLast' = 'findLast' + let message:Message + let previous_message:Message + while(pointer >= 0){ + if(chat.message[pointer].role === 'user'){ + if(pointerMode === 'findLast'){ + message = chat.message[pointer] + pointerMode = 'findSecondLast' + } + else{ + previous_message = chat.message[pointer] + break + } + } + pointer-- + } + + if(!message){ + return '[No user message found]' + } + + if(!previous_message){ + return '[No previous user message found]' + } + if(!message.time){ + return "[Cannot get time, message was sent in older version]" + } + if(!previous_message.time){ + return "[Cannot get time, previous message was sent in older version]" + } + + console.log(message.time) + console.log(previous_message.time) + let duration = message.time - previous_message.time + //output time in format like 10:30:00 + let seconds = Math.floor(duration / 1000) + let minutes = Math.floor(seconds / 60) + let hours = Math.floor(minutes / 60) + seconds = seconds % 60 + minutes = minutes % 60 + //output, like 1:30:00 + return hours.toString() + ':' + minutes.toString().padStart(2,'0') + ':' + seconds.toString().padStart(2,'0') + + } } const arra = p1.split("::") if(arra.length > 1){ diff --git a/src/ts/process/index.ts b/src/ts/process/index.ts index a2fec8dd..41f9b03c 100644 --- a/src/ts/process/index.ts +++ b/src/ts/process/index.ts @@ -614,7 +614,8 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n db.characters[selectedChar].chats[selectedChat].message.push({ role: 'char', data: "", - saying: currentChar.chaId + saying: currentChar.chaId, + time: Date.now() }) while(abortSignal.aborted === false){ const readed = (await reader.read()) @@ -655,7 +656,8 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n db.characters[selectedChar].chats[selectedChat].message.push({ role: msg[0], data: result, - saying: currentChar.chaId + saying: currentChar.chaId, + time: Date.now() }) db.characters[selectedChar].reloadKeys += 1 await sayTTS(currentChar, result) diff --git a/src/ts/storage/database.ts b/src/ts/storage/database.ts index a3d1dc02..116663ae 100644 --- a/src/ts/storage/database.ts +++ b/src/ts/storage/database.ts @@ -662,6 +662,7 @@ export interface Message{ data: string saying?: string chatId?:string + time?: number } interface AINsettings{