comparison src/chat.html.luan @ 4:2da10ece826f

add Chat
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 27 Oct 2024 20:39:18 -0600
parents src/login_sent.html.luan@2c63b10781e1
children a49866b52cc2
comparison
equal deleted inserted replaced
3:2c63b10781e1 4:2da10ece826f
1 local Luan = require "luan:Luan.luan"
2 local error = Luan.error
3 local ipairs = Luan.ipairs or error()
4 local pairs = Luan.pairs or error()
5 local Table = require "luan:Table.luan"
6 local concat = Table.concat or error()
7 local Io = require "luan:Io.luan"
8 local Http = require "luan:http/Http.luan"
9 local Shared = require "site:/lib/Shared.luan"
10 local head = Shared.head or error()
11 local header = Shared.header or error()
12 local User = require "site:/lib/User.luan"
13 local current_user = User.current_required or error()
14 local get_user_by_id = User.get_by_id or error()
15 local get_user_by_email = User.get_by_email or error()
16 local Utils = require "site:/lib/Utils.luan"
17 local to_set = Utils.to_set or error()
18 local Db = require "site:/lib/Db.luan"
19 local run_in_transaction = Db.run_in_transaction or error()
20 local Chat = require "site:/lib/Chat.luan"
21 local chat_search = Chat.search or error()
22
23
24 local function other_users(user,chat)
25 local my_id = user.id
26 local t = {}
27 for _, user_id in ipairs(chat.user_ids) do
28 if user_id ~= my_id then
29 local other_user = get_user_by_id(user_id) or error()
30 t[#t+1] = other_user.email
31 end
32 end
33 return concat( t, ", " )
34 end
35
36 local function get_chat(with)
37 local t = {}
38 local ids = {}
39 for email in pairs(with) do
40 local with_user = get_user_by_email(email) or error()
41 local id = with_user.id
42 t[#t+1] = "+chat_user_ids:"..id
43 ids[#ids+1] = id
44 end
45 local query = concat(t," ")
46 run_in_transaction( function()
47 local chats = chat_search(query)
48 local n = #chats
49 if n == 0 then
50 local chat = Chat.new{
51 user_ids = ids
52 }
53 chat.save()
54 return chat
55 elseif n == 1 then
56 return chats[1]
57 else
58 error("multiple chats for: "..query)
59 end
60 end )
61 end
62
63 return function()
64 local user = current_user()
65 if user == nil then
66 return
67 end
68 local with = Http.request.parameters.with
69 if with ~= nil then
70 with = to_set(with)
71 with[user.email] = true
72 get_chat(with)
73 end
74 local chats = user.get_chats()
75 Io.stdout = Http.response.text_writer()
76 %>
77 <!doctype html>
78 <html>
79 <head>
80 <% head() %>
81 </head>
82 <body>
83 <% header() %>
84 <div content>
85 <h1>Chat</h1>
86 <% for _, chat in ipairs(chats) do %>
87 <p><%= other_users(user,chat) %></p>
88 <% end %>
89 </div>
90 </body>
91 </html>
92 <%
93 end