Mercurial Hosting > chat
comparison src/lib/Notify.luan @ 40:7ea33179592a
email notification
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 27 Feb 2025 16:44:20 -0700 |
parents | |
children | 818697418dbe |
comparison
equal
deleted
inserted
replaced
39:471b13e6ce2c | 40:7ea33179592a |
---|---|
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 stringify = Luan.stringify or error() | |
6 local Time = require "luan:Time.luan" | |
7 local time_now = Time.now or error() | |
8 local Thread = require "luan:Thread.luan" | |
9 local Http = require "luan:http/Http.luan" | |
10 local Chat = require "site:/lib/Chat.luan" | |
11 local User = require "site:/lib/User.luan" | |
12 local get_user_by_id = User.get_by_id or error() | |
13 local Db = require "site:/lib/Db.luan" | |
14 local run_in_transaction = Db.run_in_transaction or error() | |
15 local Shared = require "site:/lib/Shared.luan" | |
16 local send_mail = Shared.send_mail or error() | |
17 local Utils = require "site:/lib/Utils.luan" | |
18 local shallow_copy = Utils.shallow_copy or error() | |
19 local Logging = require "luan:logging/Logging.luan" | |
20 local logger = Logging.logger "Notify" | |
21 | |
22 | |
23 local Notify = {} | |
24 | |
25 local url = Http.domain and "https://"..Http.domain.."/" or "http://localhost:8080/" | |
26 | |
27 local wait = Time.period{seconds=10} | |
28 | |
29 local function set_notified(user,was_notified) | |
30 run_in_transaction( function() | |
31 user = user.reload() | |
32 user.was_notified = was_notified | |
33 user.save() | |
34 end ) | |
35 end | |
36 | |
37 local function init() | |
38 local users = {} | |
39 local fns = {} | |
40 | |
41 function fns.add(user_ids) | |
42 local now = time_now() | |
43 for _, user_id in ipairs(user_ids) do | |
44 local user = get_user_by_id(user_id) | |
45 if users[user_id] == nil and user.notify_email ~= nil and (user.multi_notify or not user.was_notified) then | |
46 users[user_id] = now | |
47 logger.info("add "..user_id) | |
48 end | |
49 end | |
50 end | |
51 | |
52 function fns.remove(user_id) | |
53 users[user_id] = nil | |
54 logger.info("remove "..user_id) | |
55 end | |
56 | |
57 function fns.notify() | |
58 logger.info("notify") | |
59 local now = time_now() | |
60 for user_id, when in pairs(shallow_copy(users)) do | |
61 if now - when > wait then | |
62 local user = get_user_by_id(user_id) | |
63 logger.info("notify "..user.notify_email.." "..user_id) | |
64 send_mail { | |
65 From = "Web Chat <chat@luan.software>" | |
66 To = user.notify_email | |
67 Subject = "New Messages" | |
68 body = `%> | |
69 You have received new messages. | |
70 | |
71 <%= url %> | |
72 <% ` | |
73 } | |
74 users[user_id] = nil | |
75 set_notified(user,true) | |
76 end | |
77 end | |
78 end | |
79 | |
80 return fns | |
81 end | |
82 | |
83 local glob = Thread.global_callable("notify",init) | |
84 | |
85 function Notify.add(chat) | |
86 Thread.run(function() | |
87 glob.add(chat.user_ids) | |
88 end) | |
89 end | |
90 | |
91 function Notify.remove(user) | |
92 Thread.run(function() | |
93 glob.remove(user.id) | |
94 if user.was_notified then | |
95 set_notified(user,false) | |
96 end | |
97 end) | |
98 end | |
99 | |
100 Thread.schedule( glob.notify, { repeating_delay=Time.period{seconds=10} } ) | |
101 | |
102 return Notify |