changeset 41:2a4c83ce3deb

public chat
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 11 Aug 2025 07:58:32 +0900
parents 6cdb2c761e08
children 1d9d9786d76f
files src/chat.css src/chat.html.luan src/chat.js src/lib/Chat.luan src/lib/ai/claude/Ai_chat.luan src/save_chat.js.luan
diffstat 6 files changed, 32 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
diff -r 6cdb2c761e08 -r 2a4c83ce3deb src/chat.css
--- a/src/chat.css	Sun Aug 10 11:29:02 2025 +0900
+++ b/src/chat.css	Mon Aug 11 07:58:32 2025 +0900
@@ -40,6 +40,9 @@
 	width: 100%;
 }
 
-div[role=assistant]:not(:has([name=show_text]:checked)) div[message] {
+div[role=assistant] div[message] {
 	filter: blur(5px);
 }
+div[role=assistant]:has([name=show_text]:checked) div[message] {
+	filter: none;
+}
diff -r 6cdb2c761e08 -r 2a4c83ce3deb src/chat.html.luan
--- a/src/chat.html.luan	Sun Aug 10 11:29:02 2025 +0900
+++ b/src/chat.html.luan	Mon Aug 11 07:58:32 2025 +0900
@@ -13,17 +13,18 @@
 local started = Shared.started or error()
 local voices = Shared.voices or error()
 local User = require "site:/lib/User.luan"
-local current_user = User.current_required or error()
+local current_user = User.current or error()
 local Chat = require "site:/lib/Chat.luan"
 local get_chat_by_id = Chat.get_by_id or error()
 local languages = require "site:/lib/languages.luan"
 
 
 return function()
-	local user = current_user()
-	if user == nil then return end
 	local chat_id = Http.request.parameters.chat or error()
 	local chat = get_chat_by_id(chat_id) or error()
+	local user = current_user()
+	local is_owner = user ~= nil and user.id == chat.user_id
+	is_owner or not chat.is_private or error "private"
 	local init_text = chat.init_text()
 	Io.stdout = Http.response.text_writer()
 %>
@@ -44,8 +45,10 @@
 				<span pulldown>
 					<img onclick="clickMenu(this)" src="/images/menu.svg">
 					<div>
+<%	if is_owner then %>
 						<span onclick="editChat()">Edit Chat</span>
 						<span onclick="deleteChat()">Delete Chat</span>
+<%	end %>
 						<span onclick="systemPrompt()">System Prompt</span>
 					</div>
 				</span>
@@ -53,6 +56,7 @@
 			<div messages>
 <%				chat.output_messages_html() %>
 			</div>
+<%	if is_owner then %>
 			<div ask>
 				<textarea autofocus oninput="fixTextarea(event.target)" onkeydown="textareaKey(event)"><%= html_encode(init_text) %></textarea>
 				<div buttons>
@@ -61,6 +65,7 @@
 					<button onclick="askAi()" title="Send"><img src="/images/send.svg"></button>
 				</div>
 			</div>
+<%	end %>
 		</div>
 		<img waiting-ai-icon src="/images/spinner_green.gif">
 		<dialog edit>
@@ -95,6 +100,9 @@
 				<p>
 					<label clickable><input type=checkbox name=show_text>Show text</label>
 				</p>
+				<p>
+					<label clickable><input type=checkbox name=is_private>Private chat</label>
+				</p>
 				<div buttons>
 					<button type=button onclick="closeModal(this)">Cancel</button>
 					<button type=submit>Save</button>
@@ -121,8 +129,14 @@
 		</dialog>
 		<input name=initialized style="display:none">
 		<script>
+			'use strict';
+//let test = 'a';
+//alert(test);
+//test = 'b';
 			setChat(<%= json_string(chat.info()) %>);
 			handleChatMarkdown();
+			scrollToEnd();
+/*
 			setTimeout(function(){
 				let initialized = document.querySelector('[name=initialized]');
 				if( !initialized.value ) {
@@ -131,6 +145,7 @@
 					scrollToEnd();
 				}
 			},10);
+*/
 		</script>
 	</body>
 </html>
diff -r 6cdb2c761e08 -r 2a4c83ce3deb src/chat.js
--- a/src/chat.js	Sun Aug 10 11:29:02 2025 +0900
+++ b/src/chat.js	Mon Aug 11 07:58:32 2025 +0900
@@ -26,6 +26,7 @@
 	dialog.querySelector('select[name=voice]').value = chat.voice;
 	dialog.querySelector('input[name=show_text]').checked = chat.show_text;
 	dialog.querySelector('input[name=autoplay]').checked = chat.autoplay;
+	dialog.querySelector('input[name=is_private]').checked = chat.is_private;
 	dialog.showModal();
 }
 
diff -r 6cdb2c761e08 -r 2a4c83ce3deb src/lib/Chat.luan
--- a/src/lib/Chat.luan	Sun Aug 10 11:29:02 2025 +0900
+++ b/src/lib/Chat.luan	Mon Aug 11 07:58:32 2025 +0900
@@ -33,6 +33,7 @@
 		voice = doc.voice
 		show_text = doc.show_text == "true"
 		autoplay = doc.autoplay == "true"
+		is_private = doc.is_private == "true"
 	}
 end
 
@@ -50,6 +51,7 @@
 		voice = chat.voice or error()
 		show_text = chat.show_text and "true" or "false"
 		autoplay = chat.autoplay and "true" or "false"
+		is_private = chat.is_private and "true" or nil
 	}
 end
 
@@ -86,6 +88,7 @@
 			name = chat.name
 			show_text = chat.show_text
 			autoplay = chat.autoplay
+			is_private = chat.is_private
 		}
 	end
 
diff -r 6cdb2c761e08 -r 2a4c83ce3deb src/lib/ai/claude/Ai_chat.luan
--- a/src/lib/ai/claude/Ai_chat.luan	Sun Aug 10 11:29:02 2025 +0900
+++ b/src/lib/ai/claude/Ai_chat.luan	Mon Aug 11 07:58:32 2025 +0900
@@ -93,8 +93,12 @@
 		}
 		fn = function(input)
 			local Chat = require "site:/lib/Chat.luan"
+			local User = require "site:/lib/User.luan"
 			local thread_id = input.thread_id or error()
 			local chat = Chat.get_by_id(thread_id) or error
+			local user = User.current_user()
+			local is_owner = user ~= nil and user.id == chat.user_id
+			is_owner or not chat.is_private or error "private"
 			return chat.ai_thread or error()
 		end
 	}
diff -r 6cdb2c761e08 -r 2a4c83ce3deb src/save_chat.js.luan
--- a/src/save_chat.js.luan	Sun Aug 10 11:29:02 2025 +0900
+++ b/src/save_chat.js.luan	Mon Aug 11 07:58:32 2025 +0900
@@ -21,6 +21,7 @@
 	local voice = Http.request.parameters.voice or error()
 	local show_text = Http.request.parameters.show_text
 	local autoplay = Http.request.parameters.autoplay
+	local is_private = Http.request.parameters.is_private
 	run_in_transaction( function()
 		chat = get_chat_by_id(chat) or error()
 		chat.user_id == current_user().id or error()
@@ -29,6 +30,7 @@
 		chat.voice = voice
 		chat.show_text = show_text ~= nil
 		chat.autoplay = autoplay ~= nil
+		chat.is_private = is_private ~= nil
 		chat.save()
 	end )
 	Io.stdout = Http.response.text_writer()