author | Kim Alvefur <zash@zash.se> |
Tue, 19 Jun 2018 18:56:57 +0200 | |
changeset 3123 | f84a6ad72548 |
parent 3122 | 24e49391d4e8 |
child 3124 | b914ee44b49f |
permissions | -rw-r--r-- |
2945
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"; |
3122 | 7 |
local mt = require "util.multitable"; |
2945
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 |
|
3122 | 11 |
local data = mt.new(); |
2945
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 | 32 |
if data:get(username, room_jid) then |
2945
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); |
3122 | 34 |
local presences = data:get(username, room_jid, "presence"); |
35 |
for _, pres in pairs(presences) do |
|
36 |
origin.send(st.clone(pres)); |
|
2945
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
37 |
end |
3122 | 38 |
-- FIXME should send ones own presence last |
3123
f84a6ad72548
mod_minimix: Handle missing subject
Kim Alvefur <zash@zash.se>
parents:
3122
diff
changeset
|
39 |
local subject = data:get(username, room_jid, "subject"); |
f84a6ad72548
mod_minimix: Handle missing subject
Kim Alvefur <zash@zash.se>
parents:
3122
diff
changeset
|
40 |
if subject then |
f84a6ad72548
mod_minimix: Handle missing subject
Kim Alvefur <zash@zash.se>
parents:
3122
diff
changeset
|
41 |
origin.send(st.clone(subject)); |
f84a6ad72548
mod_minimix: Handle missing subject
Kim Alvefur <zash@zash.se>
parents:
3122
diff
changeset
|
42 |
end |
2945
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
43 |
-- 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
|
44 |
-- 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
|
45 |
return true; |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
46 |
end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
47 |
|
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
48 |
local account_join = st.clone(stanza); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
49 |
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
|
50 |
module:send(account_join); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
51 |
|
3122 | 52 |
data:set(username, room_jid, "joined", nickname); |
53 |
||
2945
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
54 |
return true; |
3122 | 55 |
elseif stanza.attr.type == "unavailable" then |
56 |
if origin.joined_rooms and origin.joined_rooms[room_jid] then |
|
57 |
origin.joined_rooms[room_jid] = nil; |
|
58 |
end |
|
2945
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
59 |
origin.send(st.reply(stanza)); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
60 |
return true; |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
61 |
end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
62 |
end); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
63 |
|
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
64 |
module:hook("pre-message/bare", function (event) |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
65 |
local origin, stanza = event.origin, event.stanza; |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
66 |
local username = origin.username; |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
67 |
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
|
68 |
|
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
69 |
module:log("info", "%s", stanza) |
3122 | 70 |
if origin.joined_rooms and origin.joined_rooms[room_jid] then |
2945
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
71 |
local from_account = st.clone(stanza); |
3122 | 72 |
from_account.attr.from = jid_join(username, origin.host); |
2945
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
73 |
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
|
74 |
module:send(from_account, origin); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
75 |
return true; |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
76 |
end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
77 |
end); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
78 |
|
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
79 |
local function handle_to_bare_jid(event) |
3122 | 80 |
local stanza = event.stanza; |
2945
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
81 |
local username = jid_node(stanza.attr.to); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
82 |
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
|
83 |
|
3122 | 84 |
if data:get(username, room_jid) then |
2945
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
85 |
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
|
86 |
-- Broadcast to clients |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
87 |
|
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
88 |
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
|
89 |
and not stanza:get_child("body") and stanza:get_child("subject") then |
3122 | 90 |
data:set(username, room_jid, "subject", st.clone(stanza)); |
2945
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
91 |
elseif stanza.name == "presence" then |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
92 |
if stanza.attr.type == nil then |
3122 | 93 |
data:set(username, room_jid, "presence", stanza.attr.from, st.clone(stanza)); |
2945
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
94 |
elseif stanza.attr.type == "unavailable" then |
3122 | 95 |
data:set(username, room_jid, "presence", stanza.attr.from, nil); |
2945
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
96 |
end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
97 |
end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
98 |
|
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
99 |
if users[username] then |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
100 |
module:log("debug", "%s has sessions", username); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
101 |
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
|
102 |
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
|
103 |
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
|
104 |
module:log("debug", "Is joined"); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
105 |
local s = st.clone(stanza); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
106 |
s.attr.to = session.full_jid; |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
107 |
session.send(s); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
108 |
else |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
109 |
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
|
110 |
end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
111 |
end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
112 |
end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
113 |
|
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
114 |
return true; |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
115 |
end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
116 |
end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
117 |
|
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
118 |
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
|
119 |
module:hook("message/bare", handle_to_bare_jid); |