Software /
code /
prosody-modules
Annotate
mod_minimix/mod_minimix.lua @ 4885:14ee1ec3bb93
mod_bookmarks: Use autolink to mod_bookmarks2
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sat, 05 Feb 2022 01:10:14 +0100 |
parent | 3398:1745021c0a73 |
rev | line source |
---|---|
2941
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1 -- mod_minimix |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
2 -- |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
3 -- Rewrite MUC stanzas suich that the account / bare JID joins rooms instead of clients / full JIDs |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
4 -- |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
5 local jid_split, jid_join, jid_node, jid_bare = import("util.jid", "split", "join", "node", "bare"); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
6 local st = require "util.stanza"; |
3118 | 7 local mt = require "util.multitable"; |
2941
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
8 |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
9 local users = prosody.hosts[module.host].sessions; |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
10 |
3118 | 11 local data = mt.new(); |
2941
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
12 |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
13 -- FIXME You can join but you can never leave. |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
14 |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
15 module:hook("pre-presence/full", function (event) |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
16 local origin, stanza = event.origin, event.stanza; |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
17 |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
18 local room_node, room_host, nickname = jid_split(stanza.attr.to); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
19 local room_jid = jid_join(room_node, room_host); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
20 local username = origin.username; |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
21 |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
22 if stanza.attr.type == nil and stanza:get_child("x", "http://jabber.org/protocol/muc") then |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
23 module:log("debug", "Joining %s as %s", room_jid, nickname); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
24 |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
25 -- TODO Should this be kept track of before the *initial* join has been confirmed or? |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
26 if origin.joined_rooms then |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
27 origin.joined_rooms[room_jid] = nickname; |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
28 else |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
29 origin.joined_rooms = { [room_jid] = nickname }; |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
30 end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
31 |
3122
c69f32c9c576
mod_minimix: Don't consider oneself fully joined until subject message
Kim Alvefur <zash@zash.se>
parents:
3120
diff
changeset
|
32 if data:get(username, room_jid, "subject") then |
2941
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
33 module:log("debug", "Already joined to %s as %s", room_jid, nickname); |
3118 | 34 local presences = data:get(username, room_jid, "presence"); |
3123
f4e86d2662ec
mod_minimix: Handle having received no presence (should not happen)
Kim Alvefur <zash@zash.se>
parents:
3122
diff
changeset
|
35 if presences then |
f4e86d2662ec
mod_minimix: Handle having received no presence (should not happen)
Kim Alvefur <zash@zash.se>
parents:
3122
diff
changeset
|
36 -- Joined but no presence? Weird |
f4e86d2662ec
mod_minimix: Handle having received no presence (should not happen)
Kim Alvefur <zash@zash.se>
parents:
3122
diff
changeset
|
37 for _, pres in pairs(presences) do |
3124
cabe58ae17c9
mod_minimix: Set full JID when dumping cached stanzas
Kim Alvefur <zash@zash.se>
parents:
3123
diff
changeset
|
38 pres = st.clone(pres); |
cabe58ae17c9
mod_minimix: Set full JID when dumping cached stanzas
Kim Alvefur <zash@zash.se>
parents:
3123
diff
changeset
|
39 pres.attr.to = origin.full_jid; |
cabe58ae17c9
mod_minimix: Set full JID when dumping cached stanzas
Kim Alvefur <zash@zash.se>
parents:
3123
diff
changeset
|
40 origin.send(pres); |
3123
f4e86d2662ec
mod_minimix: Handle having received no presence (should not happen)
Kim Alvefur <zash@zash.se>
parents:
3122
diff
changeset
|
41 end |
2941
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
42 end |
3118 | 43 -- FIXME should send ones own presence last |
3119
f84a6ad72548
mod_minimix: Handle missing subject
Kim Alvefur <zash@zash.se>
parents:
3118
diff
changeset
|
44 local subject = data:get(username, room_jid, "subject"); |
f84a6ad72548
mod_minimix: Handle missing subject
Kim Alvefur <zash@zash.se>
parents:
3118
diff
changeset
|
45 if subject then |
f84a6ad72548
mod_minimix: Handle missing subject
Kim Alvefur <zash@zash.se>
parents:
3118
diff
changeset
|
46 origin.send(st.clone(subject)); |
f84a6ad72548
mod_minimix: Handle missing subject
Kim Alvefur <zash@zash.se>
parents:
3118
diff
changeset
|
47 end |
2941
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
48 -- Send on-join stanzas from local state, somehow |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
49 -- Maybe tell them their nickname was changed if it doesn't match the account one |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
50 return true; |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
51 end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
52 |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
53 local account_join = st.clone(stanza); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
54 account_join.attr.from = jid_join(origin.username, origin.host); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
55 module:send(account_join); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
56 |
3118 | 57 data:set(username, room_jid, "joined", nickname); |
58 | |
2941
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
59 return true; |
3118 | 60 elseif stanza.attr.type == "unavailable" then |
61 if origin.joined_rooms and origin.joined_rooms[room_jid] then | |
62 origin.joined_rooms[room_jid] = nil; | |
63 end | |
2941
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
64 origin.send(st.reply(stanza)); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
65 return true; |
3120
b914ee44b49f
mod_minimix: Drop presence updates for now (may be treated as GC 1.0 joins)
Kim Alvefur <zash@zash.se>
parents:
3119
diff
changeset
|
66 elseif stanza.attr.type == nil and origin.joined_rooms and origin.joined_rooms[room_jid] then |
3398
1745021c0a73
mod_minimix: Fix typo in comment
Kim Alvefur <zash@zash.se>
parents:
3124
diff
changeset
|
67 return true; -- Suppress these |
2941
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
68 end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
69 end); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
70 |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
71 module:hook("pre-message/bare", function (event) |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
72 local origin, stanza = event.origin, event.stanza; |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
73 local username = origin.username; |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
74 local room_jid = jid_bare(stanza.attr.to); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
75 |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
76 module:log("info", "%s", stanza) |
3118 | 77 if origin.joined_rooms and origin.joined_rooms[room_jid] then |
2941
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
78 local from_account = st.clone(stanza); |
3118 | 79 from_account.attr.from = jid_join(username, origin.host); |
2941
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
80 module:log("debug", "Sending:\n%s\nInstead of:\n%s", from_account, stanza); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
81 module:send(from_account, origin); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
82 return true; |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
83 end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
84 end); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
85 |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
86 local function handle_to_bare_jid(event) |
3118 | 87 local stanza = event.stanza; |
2941
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
88 local username = jid_node(stanza.attr.to); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
89 local room_jid = jid_bare(stanza.attr.from); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
90 |
3118 | 91 if data:get(username, room_jid) then |
2941
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
92 module:log("debug", "handle_to_bare_jid %q, %s", room_jid, stanza); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
93 -- Broadcast to clients |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
94 |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
95 if stanza.name == "message" and stanza.attr.type == "groupchat" |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
96 and not stanza:get_child("body") and stanza:get_child("subject") then |
3118 | 97 data:set(username, room_jid, "subject", st.clone(stanza)); |
2941
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
98 elseif stanza.name == "presence" then |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
99 if stanza.attr.type == nil then |
3118 | 100 data:set(username, room_jid, "presence", stanza.attr.from, st.clone(stanza)); |
2941
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
101 elseif stanza.attr.type == "unavailable" then |
3118 | 102 data:set(username, room_jid, "presence", stanza.attr.from, nil); |
2941
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
103 end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
104 end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
105 |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
106 if users[username] then |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
107 module:log("debug", "%s has sessions", username); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
108 for _, session in pairs(users[username].sessions) do |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
109 module:log("debug", "Session: %s", jid_join(session.username, session.host, session.resource)); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
110 if session.joined_rooms and session.joined_rooms[room_jid] then |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
111 module:log("debug", "Is joined"); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
112 local s = st.clone(stanza); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
113 s.attr.to = session.full_jid; |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
114 session.send(s); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
115 else |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
116 module:log("debug", "session.joined_rooms = %s", session.joined_rooms); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
117 end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
118 end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
119 end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
120 |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
121 return true; |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
122 end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
123 end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
124 |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
125 module:hook("presence/bare", handle_to_bare_jid); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
126 module:hook("message/bare", handle_to_bare_jid); |