Software /
code /
prosody-modules
Annotate
mod_minimix/mod_minimix.lua @ 3122:c69f32c9c576
mod_minimix: Don't consider oneself fully joined until subject message
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Tue, 19 Jun 2018 21:59:34 +0200 |
parent | 3120:b914ee44b49f |
child | 3123:f4e86d2662ec |
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"); |
35 for _, pres in pairs(presences) do | |
36 origin.send(st.clone(pres)); | |
2941
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
37 end |
3118 | 38 -- FIXME should send ones own presence last |
3119
f84a6ad72548
mod_minimix: Handle missing subject
Kim Alvefur <zash@zash.se>
parents:
3118
diff
changeset
|
39 local subject = data:get(username, room_jid, "subject"); |
f84a6ad72548
mod_minimix: Handle missing subject
Kim Alvefur <zash@zash.se>
parents:
3118
diff
changeset
|
40 if subject then |
f84a6ad72548
mod_minimix: Handle missing subject
Kim Alvefur <zash@zash.se>
parents:
3118
diff
changeset
|
41 origin.send(st.clone(subject)); |
f84a6ad72548
mod_minimix: Handle missing subject
Kim Alvefur <zash@zash.se>
parents:
3118
diff
changeset
|
42 end |
2941
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 |
3118 | 52 data:set(username, room_jid, "joined", nickname); |
53 | |
2941
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
54 return true; |
3118 | 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 | |
2941
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; |
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
|
61 elseif stanza.attr.type == nil and origin.joined_rooms and origin.joined_rooms[room_jid] then |
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
|
62 return true; -- Supress these |
2941
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
63 end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
64 end); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
65 |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
66 module:hook("pre-message/bare", function (event) |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
67 local origin, stanza = event.origin, event.stanza; |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
68 local username = origin.username; |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
69 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
|
70 |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
71 module:log("info", "%s", stanza) |
3118 | 72 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
|
73 local from_account = st.clone(stanza); |
3118 | 74 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
|
75 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
|
76 module:send(from_account, origin); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
77 return true; |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
78 end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
79 end); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
80 |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
81 local function handle_to_bare_jid(event) |
3118 | 82 local stanza = event.stanza; |
2941
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
83 local username = jid_node(stanza.attr.to); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
84 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
|
85 |
3118 | 86 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
|
87 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
|
88 -- Broadcast to clients |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
89 |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
90 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
|
91 and not stanza:get_child("body") and stanza:get_child("subject") then |
3118 | 92 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
|
93 elseif stanza.name == "presence" then |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
94 if stanza.attr.type == nil then |
3118 | 95 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
|
96 elseif stanza.attr.type == "unavailable" then |
3118 | 97 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
|
98 end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
99 end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
100 |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
101 if users[username] then |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
102 module:log("debug", "%s has sessions", username); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
103 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
|
104 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
|
105 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
|
106 module:log("debug", "Is joined"); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
107 local s = st.clone(stanza); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
108 s.attr.to = session.full_jid; |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
109 session.send(s); |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
110 else |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
111 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
|
112 end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
113 end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
114 end |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
115 |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
116 return true; |
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 |
a57ed544fece
mod_minimix: Experiment in account-based MUC joins
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
120 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
|
121 module:hook("message/bare", handle_to_bare_jid); |