Software /
code /
prosody
Annotate
plugins/muc/muc.lib.lua @ 10453:926d6086a95a
net.websocket: Fix traceback in case of ondisconnect being called twice
We want to figure out what situations the double ondisconnect happens in, and
aim to fix the root cause in the future.
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Tue, 26 Nov 2019 15:29:01 +0000 |
parent | 10451:347d16d70280 |
child | 10550:0566b45da987 |
rev | line source |
---|---|
1734 | 1 -- Prosody IM |
2923
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
2864
diff
changeset
|
2 -- Copyright (C) 2008-2010 Matthew Wild |
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
2864
diff
changeset
|
3 -- Copyright (C) 2008-2010 Waqas Hussain |
6102
385772166289
plugins/muc/muc: Add copyright for daurnimator
daurnimator <quae@daurnimator.com>
parents:
6101
diff
changeset
|
4 -- Copyright (C) 2014 Daurnimator |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5681
diff
changeset
|
5 -- |
1734 | 6 -- This project is MIT/X11 licensed. Please see the |
7 -- COPYING file in the source package for more information. | |
8 -- | |
9 | |
3281
fd6ab269ecc2
MUC: A little modification to improve code analysis.
Waqas Hussain <waqas20@gmail.com>
parents:
3280
diff
changeset
|
10 local select = select; |
7089
890f4b2cc444
MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents:
7013
diff
changeset
|
11 local pairs = pairs; |
6180
35388114439f
plugins/muc/muc.lib: non-function changes (reordering, semicolons and comments)
daurnimator <quae@daurnimator.com>
parents:
6179
diff
changeset
|
12 local next = next; |
35388114439f
plugins/muc/muc.lib: non-function changes (reordering, semicolons and comments)
daurnimator <quae@daurnimator.com>
parents:
6179
diff
changeset
|
13 local setmetatable = setmetatable; |
1734 | 14 |
3517
530f7de1d265
MUC: Use util.dataforms to generate forms
Kim Alvefur <zash@zash.se>
parents:
3516
diff
changeset
|
15 local dataform = require "util.dataforms"; |
6217
657c707d9229
plugins/muc/muc.lib: Use util.iterators to count occupants
daurnimator <quae@daurnimator.com>
parents:
6216
diff
changeset
|
16 local iterators = require "util.iterators"; |
1734 | 17 local jid_split = require "util.jid".split; |
18 local jid_bare = require "util.jid".bare; | |
1862
115f274dd17f
MUC: Prep given JID when changing affiliation.
Waqas Hussain <waqas20@gmail.com>
parents:
1826
diff
changeset
|
19 local jid_prep = require "util.jid".prep; |
6476
fb8a9873728b
plugins/muc/muc.lib: Kick users from outcast hosts
daurnimator <quae@daurnimator.com>
parents:
6475
diff
changeset
|
20 local jid_join = require "util.jid".join; |
8856 | 21 local jid_resource = require "util.jid".resource; |
9263
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
22 local resourceprep = require "util.encodings".stringprep.resourceprep; |
1734 | 23 local st = require "util.stanza"; |
1778
f4213d84ba8a
MUC: Correct routing of vCard requests to bare JID.
Waqas Hussain <waqas20@gmail.com>
parents:
1769
diff
changeset
|
24 local base64 = require "util.encodings".base64; |
f4213d84ba8a
MUC: Correct routing of vCard requests to bare JID.
Waqas Hussain <waqas20@gmail.com>
parents:
1769
diff
changeset
|
25 local md5 = require "util.hashes".md5; |
9766
f40b9649e929
MUC: Rename import to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents:
9761
diff
changeset
|
26 local new_id = require "util.id".medium; |
1734 | 27 |
7270
df22e314946c
MUC: Use already initialized logger
Kim Alvefur <zash@zash.se>
parents:
7120
diff
changeset
|
28 local log = module._log; |
5612
5404832d6f7a
mod_muc: Use stanza:maptags() instead of custom filtering functions, 7 insertions, 19 deletions!
Matthew Wild <mwild1@gmail.com>
parents:
5611
diff
changeset
|
29 |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
30 local occupant_lib = module:require "muc/occupant" |
6218
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
6217
diff
changeset
|
31 local muc_util = module:require "muc/util"; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
6217
diff
changeset
|
32 local is_kickable_error = muc_util.is_kickable_error; |
bf11910bad5a
plugins/muc: Move valid_roles, valid_affiliations and is_kickable_error to new muc/util module
daurnimator <quae@daurnimator.com>
parents:
6217
diff
changeset
|
33 local valid_roles, valid_affiliations = muc_util.valid_roles, muc_util.valid_affiliations; |
1734 | 34 |
1735
81406277279e
MUC: The MUC lib is now metatable based. Cleaned up code, etc.
Waqas Hussain <waqas20@gmail.com>
parents:
1734
diff
changeset
|
35 local room_mt = {}; |
1737
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
36 room_mt.__index = room_mt; |
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
37 |
5519
06e188268df1
MUC: add __tostring on room metatable
Matthew Wild <mwild1@gmail.com>
parents:
5397
diff
changeset
|
38 function room_mt:__tostring() |
06e188268df1
MUC: add __tostring on room metatable
Matthew Wild <mwild1@gmail.com>
parents:
5397
diff
changeset
|
39 return "MUC room ("..self.jid..")"; |
06e188268df1
MUC: add __tostring on room metatable
Matthew Wild <mwild1@gmail.com>
parents:
5397
diff
changeset
|
40 end |
06e188268df1
MUC: add __tostring on room metatable
Matthew Wild <mwild1@gmail.com>
parents:
5397
diff
changeset
|
41 |
7352
50b24b3476e6
MUC: Provide a noop stub room:save() method
Kim Alvefur <zash@zash.se>
parents:
7347
diff
changeset
|
42 function room_mt.save() |
9615 | 43 -- overridden by mod_muc.lua |
7352
50b24b3476e6
MUC: Provide a noop stub room:save() method
Kim Alvefur <zash@zash.se>
parents:
7347
diff
changeset
|
44 end |
50b24b3476e6
MUC: Provide a noop stub room:save() method
Kim Alvefur <zash@zash.se>
parents:
7347
diff
changeset
|
45 |
6119
c13f5d6b9b16
plugins/muc/muc.lib: Use `get_occupant_jid` method instead of indexing _jid_nick
daurnimator <quae@daurnimator.com>
parents:
6118
diff
changeset
|
46 function room_mt:get_occupant_jid(real_jid) |
c13f5d6b9b16
plugins/muc/muc.lib: Use `get_occupant_jid` method instead of indexing _jid_nick
daurnimator <quae@daurnimator.com>
parents:
6118
diff
changeset
|
47 return self._jid_nick[real_jid] |
c13f5d6b9b16
plugins/muc/muc.lib: Use `get_occupant_jid` method instead of indexing _jid_nick
daurnimator <quae@daurnimator.com>
parents:
6118
diff
changeset
|
48 end |
c13f5d6b9b16
plugins/muc/muc.lib: Use `get_occupant_jid` method instead of indexing _jid_nick
daurnimator <quae@daurnimator.com>
parents:
6118
diff
changeset
|
49 |
1737
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
50 function room_mt:get_default_role(affiliation) |
6220
4e7d205f49f7
plugins/muc/muc.lib: Turn get_default_role into an event
daurnimator <quae@daurnimator.com>
parents:
6219
diff
changeset
|
51 local role = module:fire_event("muc-get-default-role", { |
4e7d205f49f7
plugins/muc/muc.lib: Turn get_default_role into an event
daurnimator <quae@daurnimator.com>
parents:
6219
diff
changeset
|
52 room = self; |
4e7d205f49f7
plugins/muc/muc.lib: Turn get_default_role into an event
daurnimator <quae@daurnimator.com>
parents:
6219
diff
changeset
|
53 affiliation = affiliation; |
4e7d205f49f7
plugins/muc/muc.lib: Turn get_default_role into an event
daurnimator <quae@daurnimator.com>
parents:
6219
diff
changeset
|
54 affiliation_rank = valid_affiliations[affiliation or "none"]; |
4e7d205f49f7
plugins/muc/muc.lib: Turn get_default_role into an event
daurnimator <quae@daurnimator.com>
parents:
6219
diff
changeset
|
55 }); |
8915
2502be210a85
MUC: Normalize role value, fixes removal on loss of membership (thanks mimi89999)
Kim Alvefur <zash@zash.se>
parents:
8914
diff
changeset
|
56 role = role ~= "none" and role or nil; -- coerces `role == false` to `nil` |
6220
4e7d205f49f7
plugins/muc/muc.lib: Turn get_default_role into an event
daurnimator <quae@daurnimator.com>
parents:
6219
diff
changeset
|
57 return role, valid_roles[role or "none"]; |
4e7d205f49f7
plugins/muc/muc.lib: Turn get_default_role into an event
daurnimator <quae@daurnimator.com>
parents:
6219
diff
changeset
|
58 end |
4e7d205f49f7
plugins/muc/muc.lib: Turn get_default_role into an event
daurnimator <quae@daurnimator.com>
parents:
6219
diff
changeset
|
59 module:hook("muc-get-default-role", function(event) |
4e7d205f49f7
plugins/muc/muc.lib: Turn get_default_role into an event
daurnimator <quae@daurnimator.com>
parents:
6219
diff
changeset
|
60 if event.affiliation_rank >= valid_affiliations.admin then |
1737
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
61 return "moderator"; |
6226
7582deb85812
plugins/muc: Move 'moderated' code to seperate file; changes default "muc-get-default-role" behaviour
daurnimator <quae@daurnimator.com>
parents:
6225
diff
changeset
|
62 elseif event.affiliation_rank >= valid_affiliations.none then |
1737
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
63 return "participant"; |
6220
4e7d205f49f7
plugins/muc/muc.lib: Turn get_default_role into an event
daurnimator <quae@daurnimator.com>
parents:
6219
diff
changeset
|
64 end |
9716
5281a795d6df
MUC: Adjust priorities of muc-get-default-role handlers (fixes #1272)
Matthew Wild <mwild1@gmail.com>
parents:
9640
diff
changeset
|
65 end, -1); |
1735
81406277279e
MUC: The MUC lib is now metatable based. Cleaned up code, etc.
Waqas Hussain <waqas20@gmail.com>
parents:
1734
diff
changeset
|
66 |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
67 --- Occupant functions |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
68 function room_mt:new_occupant(bare_real_jid, nick) |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
69 local occupant = occupant_lib.new(bare_real_jid, nick); |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
70 local affiliation = self:get_affiliation(bare_real_jid); |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
71 occupant.role = self:get_default_role(affiliation); |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
72 return occupant; |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
73 end |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
74 |
9239
03e37f7d6c97
MUC: Add some comments for clarity
Matthew Wild <mwild1@gmail.com>
parents:
9238
diff
changeset
|
75 -- nick is in the form of an in-room JID |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
76 function room_mt:get_occupant_by_nick(nick) |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
77 local occupant = self._occupants[nick]; |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
78 if occupant == nil then return nil end |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
79 return occupant_lib.copy(occupant); |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
80 end |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
81 |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
82 do |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
83 local function next_copied_occupant(occupants, occupant_jid) |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
84 local next_occupant_jid, raw_occupant = next(occupants, occupant_jid); |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
85 if next_occupant_jid == nil then return nil end |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
86 return next_occupant_jid, occupant_lib.copy(raw_occupant); |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
87 end |
7089
890f4b2cc444
MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents:
7013
diff
changeset
|
88 -- FIXME Explain what 'read_only' is supposed to be |
890f4b2cc444
MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents:
7013
diff
changeset
|
89 function room_mt:each_occupant(read_only) -- luacheck: ignore 212 |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
90 return next_copied_occupant, self._occupants, nil; |
1737
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
91 end |
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
92 end |
1735
81406277279e
MUC: The MUC lib is now metatable based. Cleaned up code, etc.
Waqas Hussain <waqas20@gmail.com>
parents:
1734
diff
changeset
|
93 |
6237
a58685df9d16
plugins/muc: Add room:has_occupant() method
daurnimator <quae@daurnimator.com>
parents:
6231
diff
changeset
|
94 function room_mt:has_occupant() |
a58685df9d16
plugins/muc: Add room:has_occupant() method
daurnimator <quae@daurnimator.com>
parents:
6231
diff
changeset
|
95 return next(self._occupants, nil) ~= nil |
a58685df9d16
plugins/muc: Add room:has_occupant() method
daurnimator <quae@daurnimator.com>
parents:
6231
diff
changeset
|
96 end |
a58685df9d16
plugins/muc: Add room:has_occupant() method
daurnimator <quae@daurnimator.com>
parents:
6231
diff
changeset
|
97 |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
98 function room_mt:get_occupant_by_real_jid(real_jid) |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
99 local occupant_jid = self:get_occupant_jid(real_jid); |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
100 if occupant_jid == nil then return nil end |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
101 return self:get_occupant_by_nick(occupant_jid); |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
102 end |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
103 |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
104 function room_mt:save_occupant(occupant) |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
105 occupant = occupant_lib.copy(occupant); -- So that occupant can be modified more |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
106 local id = occupant.nick |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
107 |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
108 -- Need to maintain _jid_nick secondary index |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
109 local old_occupant = self._occupants[id]; |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
110 if old_occupant then |
6451
385932a83013
plugins/muc/muc.lib: Use occupants iterator instead of assuming pairs
daurnimator <quae@daurnimator.com>
parents:
6431
diff
changeset
|
111 for real_jid in old_occupant:each_session() do |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
112 self._jid_nick[real_jid] = nil; |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
113 end |
1734 | 114 end |
6250
454ef19e7925
plugins/muc/muc: Better check for live sessions
daurnimator <quae@daurnimator.com>
parents:
6249
diff
changeset
|
115 |
454ef19e7925
plugins/muc/muc: Better check for live sessions
daurnimator <quae@daurnimator.com>
parents:
6249
diff
changeset
|
116 local has_live_session = false |
454ef19e7925
plugins/muc/muc: Better check for live sessions
daurnimator <quae@daurnimator.com>
parents:
6249
diff
changeset
|
117 if occupant.role ~= nil then |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
118 for real_jid, presence in occupant:each_session() do |
6250
454ef19e7925
plugins/muc/muc: Better check for live sessions
daurnimator <quae@daurnimator.com>
parents:
6249
diff
changeset
|
119 if presence.attr.type == nil then |
454ef19e7925
plugins/muc/muc: Better check for live sessions
daurnimator <quae@daurnimator.com>
parents:
6249
diff
changeset
|
120 has_live_session = true |
454ef19e7925
plugins/muc/muc: Better check for live sessions
daurnimator <quae@daurnimator.com>
parents:
6249
diff
changeset
|
121 self._jid_nick[real_jid] = occupant.nick; |
454ef19e7925
plugins/muc/muc: Better check for live sessions
daurnimator <quae@daurnimator.com>
parents:
6249
diff
changeset
|
122 end |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
123 end |
6250
454ef19e7925
plugins/muc/muc: Better check for live sessions
daurnimator <quae@daurnimator.com>
parents:
6249
diff
changeset
|
124 if not has_live_session then |
454ef19e7925
plugins/muc/muc: Better check for live sessions
daurnimator <quae@daurnimator.com>
parents:
6249
diff
changeset
|
125 -- Has no live sessions left; they have left the room. |
454ef19e7925
plugins/muc/muc: Better check for live sessions
daurnimator <quae@daurnimator.com>
parents:
6249
diff
changeset
|
126 occupant.role = nil |
1734 | 127 end |
128 end | |
6250
454ef19e7925
plugins/muc/muc: Better check for live sessions
daurnimator <quae@daurnimator.com>
parents:
6249
diff
changeset
|
129 if not has_live_session then |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
130 occupant = nil |
1734 | 131 end |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
132 self._occupants[id] = occupant |
9002
1fcddb4a4d16
MUC: Return new occupant object from :save_occupant(), which can include useful info
Matthew Wild <mwild1@gmail.com>
parents:
8931
diff
changeset
|
133 return occupant |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
134 end |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
135 |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
136 function room_mt:route_to_occupant(occupant, stanza) |
6130
c95d9132592a
plugins/muc/muc.lib: Add route_to_occupant function to send a stanza to all occupant sessions
daurnimator <quae@daurnimator.com>
parents:
6129
diff
changeset
|
137 local to = stanza.attr.to; |
7089
890f4b2cc444
MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents:
7013
diff
changeset
|
138 for jid in occupant:each_session() do |
6253
2df9e7a67e56
plugins/muc/muc.lib: Even unavailable session need to be routed to sometimes (e.g. their own leave)
daurnimator <quae@daurnimator.com>
parents:
6252
diff
changeset
|
139 stanza.attr.to = jid; |
2df9e7a67e56
plugins/muc/muc.lib: Even unavailable session need to be routed to sometimes (e.g. their own leave)
daurnimator <quae@daurnimator.com>
parents:
6252
diff
changeset
|
140 self:route_stanza(stanza); |
6130
c95d9132592a
plugins/muc/muc.lib: Add route_to_occupant function to send a stanza to all occupant sessions
daurnimator <quae@daurnimator.com>
parents:
6129
diff
changeset
|
141 end |
2172
84dd0fada45b
MUC: Improved handling of incoming groupchat messages (state preserved for possible later use).
Waqas Hussain <waqas20@gmail.com>
parents:
2064
diff
changeset
|
142 stanza.attr.to = to; |
6130
c95d9132592a
plugins/muc/muc.lib: Add route_to_occupant function to send a stanza to all occupant sessions
daurnimator <quae@daurnimator.com>
parents:
6129
diff
changeset
|
143 end |
c95d9132592a
plugins/muc/muc.lib: Add route_to_occupant function to send a stanza to all occupant sessions
daurnimator <quae@daurnimator.com>
parents:
6129
diff
changeset
|
144 |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
145 -- actor is the attribute table |
6512
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
146 local function add_item(x, affiliation, role, jid, nick, actor_nick, actor_jid, reason) |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
147 x:tag("item", {affiliation = affiliation; role = role; jid = jid; nick = nick;}) |
6512
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
148 if actor_nick or actor_jid then |
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
149 x:tag("actor", {nick = actor_nick; jid = actor_jid;}):up() |
1734 | 150 end |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
151 if reason then |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
152 x:tag("reason"):text(reason):up() |
1734 | 153 end |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
154 x:up(); |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
155 return x |
1734 | 156 end |
6213
95bddf0142f4
plugins/muc/muc.lib: Remember to coerce nil role to "none"
daurnimator <quae@daurnimator.com>
parents:
6212
diff
changeset
|
157 |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
158 -- actor is (real) jid |
6512
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
159 function room_mt:build_item_list(occupant, x, is_anonymous, nick, actor_nick, actor_jid, reason) |
6213
95bddf0142f4
plugins/muc/muc.lib: Remember to coerce nil role to "none"
daurnimator <quae@daurnimator.com>
parents:
6212
diff
changeset
|
160 local affiliation = self:get_affiliation(occupant.bare_jid) or "none"; |
95bddf0142f4
plugins/muc/muc.lib: Remember to coerce nil role to "none"
daurnimator <quae@daurnimator.com>
parents:
6212
diff
changeset
|
161 local role = occupant.role or "none"; |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
162 if is_anonymous then |
6512
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
163 add_item(x, affiliation, role, nil, nick, actor_nick, actor_jid, reason); |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
164 else |
7089
890f4b2cc444
MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents:
7013
diff
changeset
|
165 for real_jid in occupant:each_session() do |
6512
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
166 add_item(x, affiliation, role, real_jid, nick, actor_nick, actor_jid, reason); |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
167 end |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
168 end |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
169 return x |
5982
2d5685c6262f
MUC: Split saving to history into a separate method
Kim Alvefur <zash@zash.se>
parents:
5854
diff
changeset
|
170 end |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
171 |
6215
1dd09dc04945
plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents:
6214
diff
changeset
|
172 function room_mt:broadcast_message(stanza) |
8481
d546815e555e
MUC: Move delayed delivery check into an event handler
Kim Alvefur <zash@zash.se>
parents:
8480
diff
changeset
|
173 if module:fire_event("muc-broadcast-message", {room = self, stanza = stanza}) then |
d546815e555e
MUC: Move delayed delivery check into an event handler
Kim Alvefur <zash@zash.se>
parents:
8480
diff
changeset
|
174 return true; |
d546815e555e
MUC: Move delayed delivery check into an event handler
Kim Alvefur <zash@zash.se>
parents:
8480
diff
changeset
|
175 end |
d546815e555e
MUC: Move delayed delivery check into an event handler
Kim Alvefur <zash@zash.se>
parents:
8480
diff
changeset
|
176 self:broadcast(stanza); |
d546815e555e
MUC: Move delayed delivery check into an event handler
Kim Alvefur <zash@zash.se>
parents:
8480
diff
changeset
|
177 return true; |
d546815e555e
MUC: Move delayed delivery check into an event handler
Kim Alvefur <zash@zash.se>
parents:
8480
diff
changeset
|
178 end |
d546815e555e
MUC: Move delayed delivery check into an event handler
Kim Alvefur <zash@zash.se>
parents:
8480
diff
changeset
|
179 |
d546815e555e
MUC: Move delayed delivery check into an event handler
Kim Alvefur <zash@zash.se>
parents:
8480
diff
changeset
|
180 -- Strip delay tags claiming to be from us |
8486 | 181 module:hook("muc-occupant-groupchat", function (event) |
8481
d546815e555e
MUC: Move delayed delivery check into an event handler
Kim Alvefur <zash@zash.se>
parents:
8480
diff
changeset
|
182 local stanza = event.stanza; |
8486 | 183 local room = event.room; |
184 local room_jid = room.jid; | |
8475
eb85b10e1fea
MUC: Ensure that <delay/> elements which match our from are stripped (fixes #1055)
Jonas Wielicki <jonas@wielicki.name>
parents:
8474
diff
changeset
|
185 |
eb85b10e1fea
MUC: Ensure that <delay/> elements which match our from are stripped (fixes #1055)
Jonas Wielicki <jonas@wielicki.name>
parents:
8474
diff
changeset
|
186 stanza:maptags(function (child) |
eb85b10e1fea
MUC: Ensure that <delay/> elements which match our from are stripped (fixes #1055)
Jonas Wielicki <jonas@wielicki.name>
parents:
8474
diff
changeset
|
187 if child.name == "delay" and child.attr["xmlns"] == "urn:xmpp:delay" then |
8476
082d12728645
MUC: Rename variable to make it clearer that it is the room JID and not the MUC host
Kim Alvefur <zash@zash.se>
parents:
8475
diff
changeset
|
188 if child.attr["from"] == room_jid then |
8475
eb85b10e1fea
MUC: Ensure that <delay/> elements which match our from are stripped (fixes #1055)
Jonas Wielicki <jonas@wielicki.name>
parents:
8474
diff
changeset
|
189 return nil; |
eb85b10e1fea
MUC: Ensure that <delay/> elements which match our from are stripped (fixes #1055)
Jonas Wielicki <jonas@wielicki.name>
parents:
8474
diff
changeset
|
190 end |
eb85b10e1fea
MUC: Ensure that <delay/> elements which match our from are stripped (fixes #1055)
Jonas Wielicki <jonas@wielicki.name>
parents:
8474
diff
changeset
|
191 end |
eb85b10e1fea
MUC: Ensure that <delay/> elements which match our from are stripped (fixes #1055)
Jonas Wielicki <jonas@wielicki.name>
parents:
8474
diff
changeset
|
192 if child.name == "x" and child.attr["xmlns"] == "jabber:x:delay" then |
8476
082d12728645
MUC: Rename variable to make it clearer that it is the room JID and not the MUC host
Kim Alvefur <zash@zash.se>
parents:
8475
diff
changeset
|
193 if child.attr["from"] == room_jid then |
8475
eb85b10e1fea
MUC: Ensure that <delay/> elements which match our from are stripped (fixes #1055)
Jonas Wielicki <jonas@wielicki.name>
parents:
8474
diff
changeset
|
194 return nil; |
eb85b10e1fea
MUC: Ensure that <delay/> elements which match our from are stripped (fixes #1055)
Jonas Wielicki <jonas@wielicki.name>
parents:
8474
diff
changeset
|
195 end |
eb85b10e1fea
MUC: Ensure that <delay/> elements which match our from are stripped (fixes #1055)
Jonas Wielicki <jonas@wielicki.name>
parents:
8474
diff
changeset
|
196 end |
eb85b10e1fea
MUC: Ensure that <delay/> elements which match our from are stripped (fixes #1055)
Jonas Wielicki <jonas@wielicki.name>
parents:
8474
diff
changeset
|
197 return child; |
eb85b10e1fea
MUC: Ensure that <delay/> elements which match our from are stripped (fixes #1055)
Jonas Wielicki <jonas@wielicki.name>
parents:
8474
diff
changeset
|
198 end) |
8481
d546815e555e
MUC: Move delayed delivery check into an event handler
Kim Alvefur <zash@zash.se>
parents:
8480
diff
changeset
|
199 end); |
8475
eb85b10e1fea
MUC: Ensure that <delay/> elements which match our from are stripped (fixes #1055)
Jonas Wielicki <jonas@wielicki.name>
parents:
8474
diff
changeset
|
200 |
6140
e4cdb3e5d7d0
plugins/muc/muc.lib: Add :broadcast method; use it from :broadcast_except_nick and :broadcast_message
daurnimator <quae@daurnimator.com>
parents:
6139
diff
changeset
|
201 -- Broadcast a stanza to all occupants in the room. |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
202 -- optionally checks conditional called with (nick, occupant) |
6140
e4cdb3e5d7d0
plugins/muc/muc.lib: Add :broadcast method; use it from :broadcast_except_nick and :broadcast_message
daurnimator <quae@daurnimator.com>
parents:
6139
diff
changeset
|
203 function room_mt:broadcast(stanza, cond_func) |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
204 for nick, occupant in self:each_occupant() do |
6140
e4cdb3e5d7d0
plugins/muc/muc.lib: Add :broadcast method; use it from :broadcast_except_nick and :broadcast_message
daurnimator <quae@daurnimator.com>
parents:
6139
diff
changeset
|
205 if cond_func == nil or cond_func(nick, occupant) then |
6133
5d8949bb15b0
plugins/muc/muc.lib: Additional `route_to_occupant` usage
daurnimator <quae@daurnimator.com>
parents:
6132
diff
changeset
|
206 self:route_to_occupant(occupant, stanza) |
1742
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
207 end |
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
208 end |
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
209 end |
1734 | 210 |
6211
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
211 local function can_see_real_jids(whois, occupant) |
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
212 if whois == "anyone" then |
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
213 return true; |
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
214 elseif whois == "moderators" then |
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
215 return valid_roles[occupant.role or "none"] >= valid_roles.moderator; |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
216 end |
6211
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
217 end |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
218 |
6278
fcc3ef191293
plugins/muc/muc: Fire broadcast presences event before creating full/anon presences
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
219 -- Broadcasts an occupant's presence to the whole room |
fcc3ef191293
plugins/muc/muc: Fire broadcast presences event before creating full/anon presences
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
220 -- Takes the x element that goes into the stanzas |
10353
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
221 function room_mt:publicise_occupant_status(occupant, x, nick, actor, reason, prev_role, force_unavailable) |
7705
0a29a5e64f1d
mod_muc/muc.lib: Allow passing different <x> elements to be passed to :publicise_occupant_status()
Kim Alvefur <zash@zash.se>
parents:
7686
diff
changeset
|
222 local base_x = x.base or x; |
6278
fcc3ef191293
plugins/muc/muc: Fire broadcast presences event before creating full/anon presences
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
223 -- Build real jid and (optionally) occupant jid template presences |
6801
5032d4817a30
plugins/muc/muc.lib: Fix issue #505 where unavailable presences were never used
daurnimator <quae@daurnimator.com>
parents:
6776
diff
changeset
|
224 local base_presence do |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
225 -- Try to use main jid's presence |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
226 local pr = occupant:get_presence(); |
10353
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
227 if pr and (occupant.role ~= nil or pr.attr.type == "unavailable") and not force_unavailable then |
6278
fcc3ef191293
plugins/muc/muc: Fire broadcast presences event before creating full/anon presences
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
228 base_presence = st.clone(pr); |
6801
5032d4817a30
plugins/muc/muc.lib: Fix issue #505 where unavailable presences were never used
daurnimator <quae@daurnimator.com>
parents:
6776
diff
changeset
|
229 else -- user is leaving but didn't send a leave presence. make one for them |
5032d4817a30
plugins/muc/muc.lib: Fix issue #505 where unavailable presences were never used
daurnimator <quae@daurnimator.com>
parents:
6776
diff
changeset
|
230 base_presence = st.presence {from = occupant.nick; type = "unavailable";}; |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
231 end |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
232 end |
6211
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
233 |
6278
fcc3ef191293
plugins/muc/muc: Fire broadcast presences event before creating full/anon presences
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
234 -- Fire event (before full_p and anon_p are created) |
6513
3bbd59c03aeb
plugins/muc/muc.lib: Allow muc-broadcast-presence event listeners to modify nick, actor, reason
daurnimator <quae@daurnimator.com>
parents:
6512
diff
changeset
|
235 local event = { |
6317
ec57067c1e0d
mod_muc/muc.lib: Pass all info to muc-broadcast-presence handlers that would be required to use room:build_item_list() - useful for plugins
Matthew Wild <mwild1@gmail.com>
parents:
6278
diff
changeset
|
236 room = self; stanza = base_presence; x = base_x; |
6318
e5e7a789ef55
mod_muc/muc.lib: Remove is_anonymous from event (fix for ec57067c1e0d)
Matthew Wild <mwild1@gmail.com>
parents:
6317
diff
changeset
|
237 occupant = occupant; nick = nick; actor = actor; |
e5e7a789ef55
mod_muc/muc.lib: Remove is_anonymous from event (fix for ec57067c1e0d)
Matthew Wild <mwild1@gmail.com>
parents:
6317
diff
changeset
|
238 reason = reason; |
6513
3bbd59c03aeb
plugins/muc/muc.lib: Allow muc-broadcast-presence event listeners to modify nick, actor, reason
daurnimator <quae@daurnimator.com>
parents:
6512
diff
changeset
|
239 } |
3bbd59c03aeb
plugins/muc/muc.lib: Allow muc-broadcast-presence event listeners to modify nick, actor, reason
daurnimator <quae@daurnimator.com>
parents:
6512
diff
changeset
|
240 module:fire_event("muc-broadcast-presence", event); |
3bbd59c03aeb
plugins/muc/muc.lib: Allow muc-broadcast-presence event listeners to modify nick, actor, reason
daurnimator <quae@daurnimator.com>
parents:
6512
diff
changeset
|
241 |
3bbd59c03aeb
plugins/muc/muc.lib: Allow muc-broadcast-presence event listeners to modify nick, actor, reason
daurnimator <quae@daurnimator.com>
parents:
6512
diff
changeset
|
242 -- Allow muc-broadcast-presence listeners to change things |
3bbd59c03aeb
plugins/muc/muc.lib: Allow muc-broadcast-presence event listeners to modify nick, actor, reason
daurnimator <quae@daurnimator.com>
parents:
6512
diff
changeset
|
243 nick = event.nick; |
3bbd59c03aeb
plugins/muc/muc.lib: Allow muc-broadcast-presence event listeners to modify nick, actor, reason
daurnimator <quae@daurnimator.com>
parents:
6512
diff
changeset
|
244 actor = event.actor; |
3bbd59c03aeb
plugins/muc/muc.lib: Allow muc-broadcast-presence event listeners to modify nick, actor, reason
daurnimator <quae@daurnimator.com>
parents:
6512
diff
changeset
|
245 reason = event.reason; |
6278
fcc3ef191293
plugins/muc/muc: Fire broadcast presences event before creating full/anon presences
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
246 |
6512
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
247 local whois = self:get_whois(); |
6513
3bbd59c03aeb
plugins/muc/muc.lib: Allow muc-broadcast-presence event listeners to modify nick, actor, reason
daurnimator <quae@daurnimator.com>
parents:
6512
diff
changeset
|
248 |
6512
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
249 local actor_nick; |
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
250 if actor then |
8856 | 251 actor_nick = jid_resource(self:get_occupant_jid(actor)); |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
252 end |
6278
fcc3ef191293
plugins/muc/muc: Fire broadcast presences event before creating full/anon presences
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
253 |
6512
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
254 local full_p, full_x; |
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
255 local function get_full_p() |
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
256 if full_p == nil then |
7705
0a29a5e64f1d
mod_muc/muc.lib: Allow passing different <x> elements to be passed to :publicise_occupant_status()
Kim Alvefur <zash@zash.se>
parents:
7686
diff
changeset
|
257 full_x = st.clone(x.full or base_x); |
6512
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
258 self:build_item_list(occupant, full_x, false, nick, actor_nick, actor, reason); |
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
259 full_p = st.clone(base_presence):add_child(full_x); |
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
260 end |
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
261 return full_p, full_x; |
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
262 end |
6266
cabeff5fc687
plugins/muc/muc.lib: Fire event for presence broadcast
daurnimator <quae@daurnimator.com>
parents:
6253
diff
changeset
|
263 |
6211
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
264 local anon_p, anon_x; |
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
265 local function get_anon_p() |
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
266 if anon_p == nil then |
7705
0a29a5e64f1d
mod_muc/muc.lib: Allow passing different <x> elements to be passed to :publicise_occupant_status()
Kim Alvefur <zash@zash.se>
parents:
7686
diff
changeset
|
267 anon_x = st.clone(x.anon or base_x); |
6512
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
268 self:build_item_list(occupant, anon_x, true, nick, actor_nick, nil, reason); |
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
269 anon_p = st.clone(base_presence):add_child(anon_x); |
6211
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
270 end |
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
271 return anon_p, anon_x; |
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
272 end |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
273 |
6512
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
274 local self_p, self_x; |
9023
ce461a67d2cc
MUC: Fix to send status code 100 *only* to the joining (fixes #680)
Kim Alvefur <zash@zash.se>
parents:
9022
diff
changeset
|
275 do |
6512
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
276 -- Can always see your own full jids |
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
277 -- But not allowed to see actor's |
7705
0a29a5e64f1d
mod_muc/muc.lib: Allow passing different <x> elements to be passed to :publicise_occupant_status()
Kim Alvefur <zash@zash.se>
parents:
7686
diff
changeset
|
278 self_x = st.clone(x.self or base_x); |
6512
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
279 self:build_item_list(occupant, self_x, false, nick, actor_nick, nil, reason); |
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
280 self_p = st.clone(base_presence):add_child(self_x); |
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
281 end |
6211
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
282 |
10353
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
283 local broadcast_roles = self:get_presence_broadcast(); |
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
284 |
9615 | 285 -- General populace |
7089
890f4b2cc444
MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents:
7013
diff
changeset
|
286 for occupant_nick, n_occupant in self:each_occupant() do |
890f4b2cc444
MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents:
7013
diff
changeset
|
287 if occupant_nick ~= occupant.nick then |
6211
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
288 local pr; |
6512
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
289 if can_see_real_jids(whois, n_occupant) then |
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
290 pr = get_full_p(); |
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
291 elseif occupant.bare_jid == n_occupant.bare_jid then |
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
292 pr = self_p; |
6211
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
293 else |
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
294 pr = get_anon_p(); |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
295 end |
10353
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
296 if broadcast_roles[occupant.role or "none"] or force_unavailable then |
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
297 self:route_to_occupant(n_occupant, pr); |
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
298 elseif prev_role and broadcast_roles[prev_role] then |
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
299 pr.attr.type = 'unavailable'; |
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
300 self:route_to_occupant(n_occupant, pr); |
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
301 end |
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
302 |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
303 end |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
304 end |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
305 |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
306 -- Presences for occupant itself |
6512
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
307 self_x:tag("status", {code = "110";}):up(); |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
308 if occupant.role == nil then |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
309 -- They get an unavailable |
6512
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
310 self:route_to_occupant(occupant, self_p); |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
311 else |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
312 -- use their own presences as templates |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
313 for full_jid, pr in occupant:each_session() do |
6212
b82523f92b06
plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents:
6211
diff
changeset
|
314 pr = st.clone(pr); |
b82523f92b06
plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents:
6211
diff
changeset
|
315 pr.attr.to = full_jid; |
6512
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
316 pr:add_child(self_x); |
6212
b82523f92b06
plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents:
6211
diff
changeset
|
317 self:route_stanza(pr); |
1734 | 318 end |
319 end | |
320 end | |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5681
diff
changeset
|
321 |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
322 function room_mt:send_occupant_list(to, filter) |
6185
d4a8840e72f9
plugins/muc/muc.lib: Fix anonymous check in `send_occupant_list`
daurnimator <quae@daurnimator.com>
parents:
6184
diff
changeset
|
323 local to_bare = jid_bare(to); |
6269
f89d2dec2977
plugins/muc/muc.lib: Fix incorrect whois logic (thanks mva)
daurnimator <quae@daurnimator.com>
parents:
6268
diff
changeset
|
324 local is_anonymous = false; |
6211
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
325 local whois = self:get_whois(); |
10353
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
326 local broadcast_roles = self:get_presence_broadcast(); |
6211
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
327 if whois ~= "anyone" then |
6185
d4a8840e72f9
plugins/muc/muc.lib: Fix anonymous check in `send_occupant_list`
daurnimator <quae@daurnimator.com>
parents:
6184
diff
changeset
|
328 local affiliation = self:get_affiliation(to); |
d4a8840e72f9
plugins/muc/muc.lib: Fix anonymous check in `send_occupant_list`
daurnimator <quae@daurnimator.com>
parents:
6184
diff
changeset
|
329 if affiliation ~= "admin" and affiliation ~= "owner" then |
d4a8840e72f9
plugins/muc/muc.lib: Fix anonymous check in `send_occupant_list`
daurnimator <quae@daurnimator.com>
parents:
6184
diff
changeset
|
330 local occupant = self:get_occupant_by_real_jid(to); |
6269
f89d2dec2977
plugins/muc/muc.lib: Fix incorrect whois logic (thanks mva)
daurnimator <quae@daurnimator.com>
parents:
6268
diff
changeset
|
331 if not (occupant and can_see_real_jids(whois, occupant)) then |
f89d2dec2977
plugins/muc/muc.lib: Fix incorrect whois logic (thanks mva)
daurnimator <quae@daurnimator.com>
parents:
6268
diff
changeset
|
332 is_anonymous = true; |
2880
a3f6cc3417f2
MUC: Added support for letting clients manage discussion history.
Waqas Hussain <waqas20@gmail.com>
parents:
2658
diff
changeset
|
333 end |
a3f6cc3417f2
MUC: Added support for letting clients manage discussion history.
Waqas Hussain <waqas20@gmail.com>
parents:
2658
diff
changeset
|
334 end |
1734 | 335 end |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
336 for occupant_jid, occupant in self:each_occupant() do |
6184
2bfc4b12ec8f
plugins/muc/muc.lib: Allow `:send_occupant_list` to have no filter
daurnimator <quae@daurnimator.com>
parents:
6183
diff
changeset
|
337 if filter == nil or filter(occupant_jid, occupant) then |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
338 local x = st.stanza("x", {xmlns='http://jabber.org/protocol/muc#user'}); |
6185
d4a8840e72f9
plugins/muc/muc.lib: Fix anonymous check in `send_occupant_list`
daurnimator <quae@daurnimator.com>
parents:
6184
diff
changeset
|
339 self:build_item_list(occupant, x, is_anonymous and to_bare ~= occupant.bare_jid); -- can always see your own jids |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
340 local pres = st.clone(occupant:get_presence()); |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
341 pres.attr.to = to; |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
342 pres:add_child(x); |
10353
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
343 if to_bare == occupant.bare_jid or broadcast_roles[occupant.role or "none"] then |
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
344 self:route_stanza(pres); |
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
345 end |
1734 | 346 end |
347 end | |
5983
930109558aa2
MUC: Split out sending of the topic into method separate from sending history
Kim Alvefur <zash@zash.se>
parents:
5982
diff
changeset
|
348 end |
1734 | 349 |
2503
bb6b0bd7f2cf
MUC: Converted some local functions into methods.
Waqas Hussain <waqas20@gmail.com>
parents:
2416
diff
changeset
|
350 function room_mt:get_disco_info(stanza) |
9238
0c1a1172d942
MUC: Add support for separate events for disco#info queries with a 'node'
Matthew Wild <mwild1@gmail.com>
parents:
9237
diff
changeset
|
351 local node = stanza.tags[1].attr.node or ""; |
9299
2466b533f63d
MUC: Fix to correctly return 'node' in disco#info responses (thanks jc)
Matthew Wild <mwild1@gmail.com>
parents:
9265
diff
changeset
|
352 local reply = st.reply(stanza):tag("query", { xmlns = "http://jabber.org/protocol/disco#info", node = node }); |
9238
0c1a1172d942
MUC: Add support for separate events for disco#info queries with a 'node'
Matthew Wild <mwild1@gmail.com>
parents:
9237
diff
changeset
|
353 local event_name = "muc-disco#info"; |
0c1a1172d942
MUC: Add support for separate events for disco#info queries with a 'node'
Matthew Wild <mwild1@gmail.com>
parents:
9237
diff
changeset
|
354 local event_data = { room = self, reply = reply, stanza = stanza }; |
0c1a1172d942
MUC: Add support for separate events for disco#info queries with a 'node'
Matthew Wild <mwild1@gmail.com>
parents:
9237
diff
changeset
|
355 |
0c1a1172d942
MUC: Add support for separate events for disco#info queries with a 'node'
Matthew Wild <mwild1@gmail.com>
parents:
9237
diff
changeset
|
356 if node ~= "" then |
0c1a1172d942
MUC: Add support for separate events for disco#info queries with a 'node'
Matthew Wild <mwild1@gmail.com>
parents:
9237
diff
changeset
|
357 event_name = event_name.."/"..node; |
0c1a1172d942
MUC: Add support for separate events for disco#info queries with a 'node'
Matthew Wild <mwild1@gmail.com>
parents:
9237
diff
changeset
|
358 else |
0c1a1172d942
MUC: Add support for separate events for disco#info queries with a 'node'
Matthew Wild <mwild1@gmail.com>
parents:
9237
diff
changeset
|
359 event_data.form = dataform.new { |
0c1a1172d942
MUC: Add support for separate events for disco#info queries with a 'node'
Matthew Wild <mwild1@gmail.com>
parents:
9237
diff
changeset
|
360 { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/muc#roominfo" }; |
0c1a1172d942
MUC: Add support for separate events for disco#info queries with a 'node'
Matthew Wild <mwild1@gmail.com>
parents:
9237
diff
changeset
|
361 }; |
0c1a1172d942
MUC: Add support for separate events for disco#info queries with a 'node'
Matthew Wild <mwild1@gmail.com>
parents:
9237
diff
changeset
|
362 event_data.formdata = {}; |
0c1a1172d942
MUC: Add support for separate events for disco#info queries with a 'node'
Matthew Wild <mwild1@gmail.com>
parents:
9237
diff
changeset
|
363 end |
0c1a1172d942
MUC: Add support for separate events for disco#info queries with a 'node'
Matthew Wild <mwild1@gmail.com>
parents:
9237
diff
changeset
|
364 module:fire_event(event_name, event_data); |
0c1a1172d942
MUC: Add support for separate events for disco#info queries with a 'node'
Matthew Wild <mwild1@gmail.com>
parents:
9237
diff
changeset
|
365 if event_data.form then |
0c1a1172d942
MUC: Add support for separate events for disco#info queries with a 'node'
Matthew Wild <mwild1@gmail.com>
parents:
9237
diff
changeset
|
366 reply:add_child(event_data.form:form(event_data.formdata, "result")); |
0c1a1172d942
MUC: Add support for separate events for disco#info queries with a 'node'
Matthew Wild <mwild1@gmail.com>
parents:
9237
diff
changeset
|
367 end |
7118
dacc07833b86
MUC: Fire a muc-disco#info event like in trunk so modules can extend the reply
Kim Alvefur <zash@zash.se>
parents:
7012
diff
changeset
|
368 return reply; |
1756
b2291156a9c2
MUC: Added service discovery replies for rooms.
Waqas Hussain <waqas20@gmail.com>
parents:
1755
diff
changeset
|
369 end |
6200
57bc52f67564
plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents:
6199
diff
changeset
|
370 module:hook("muc-disco#info", function(event) |
57bc52f67564
plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents:
6199
diff
changeset
|
371 event.reply:tag("feature", {var = "http://jabber.org/protocol/muc"}):up(); |
8571
44217f40ff4a
MUC: send muc#stanza_id feature as per XEP-0045 v1.31 (fixes #1097)
Jonas Wielicki <jonas@wielicki.name>
parents:
8527
diff
changeset
|
372 event.reply:tag("feature", {var = "http://jabber.org/protocol/muc#stable_id"}):up(); |
10211
224e681c4db2
MUC: Advertise XEP-0410 support
Kim Alvefur <zash@zash.se>
parents:
9819
diff
changeset
|
373 event.reply:tag("feature", {var = "http://jabber.org/protocol/muc#self-ping-optimization"}):up(); |
6200
57bc52f67564
plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents:
6199
diff
changeset
|
374 end); |
57bc52f67564
plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents:
6199
diff
changeset
|
375 module:hook("muc-disco#info", function(event) |
7119
50b9a7e86de9
MUC: Separate form data from form in disco#info event
Kim Alvefur <zash@zash.se>
parents:
7089
diff
changeset
|
376 table.insert(event.form, { name = "muc#roominfo_occupants", label = "Number of occupants" }); |
50b9a7e86de9
MUC: Separate form data from form in disco#info event
Kim Alvefur <zash@zash.se>
parents:
7089
diff
changeset
|
377 event.formdata["muc#roominfo_occupants"] = tostring(iterators.count(event.room:each_occupant())); |
6200
57bc52f67564
plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents:
6199
diff
changeset
|
378 end); |
57bc52f67564
plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents:
6199
diff
changeset
|
379 |
8891
d9b7db6f140f
MUC: Ignore unused 'self' [luacheck]
Kim Alvefur <zash@zash.se>
parents:
8888
diff
changeset
|
380 function room_mt:get_disco_items(stanza) -- luacheck: ignore 212 |
8887
c47f220580fd
Backed out changeset b8c3dbf76a2e (fixes #1162)
Kim Alvefur <zash@zash.se>
parents:
8842
diff
changeset
|
381 return st.reply(stanza):query("http://jabber.org/protocol/disco#items"); |
1756
b2291156a9c2
MUC: Added service discovery replies for rooms.
Waqas Hussain <waqas20@gmail.com>
parents:
1755
diff
changeset
|
382 end |
1734 | 383 |
7089
890f4b2cc444
MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents:
7013
diff
changeset
|
384 function room_mt:handle_kickable(origin, stanza) -- luacheck: ignore 212 |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
385 local real_jid = stanza.attr.from; |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
386 local occupant = self:get_occupant_by_real_jid(real_jid); |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
387 if occupant == nil then return nil; end |
2529
7968e8b3ecf9
MUC: Fixes and refactoring for the previous commit to work in all cases, text of error stanzas is now broadcast
Matthew Wild <mwild1@gmail.com>
parents:
2528
diff
changeset
|
388 local type, condition, text = stanza:get_error(); |
3506
0f46acca11cc
MUC: Fixed traceback on presence errors lacking a condition.
Waqas Hussain <waqas20@gmail.com>
parents:
3446
diff
changeset
|
389 local error_message = "Kicked: "..(condition and condition:gsub("%-", " ") or "presence error"); |
9147
e2bf4cd6d7a3
mod_muc: Fix incorrect variable usage [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
9145
diff
changeset
|
390 if text and self:get_whois() == "anyone" then |
2529
7968e8b3ecf9
MUC: Fixes and refactoring for the previous commit to work in all cases, text of error stanzas is now broadcast
Matthew Wild <mwild1@gmail.com>
parents:
2528
diff
changeset
|
391 error_message = error_message..": "..text; |
7968e8b3ecf9
MUC: Fixes and refactoring for the previous commit to work in all cases, text of error stanzas is now broadcast
Matthew Wild <mwild1@gmail.com>
parents:
2528
diff
changeset
|
392 end |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
393 occupant:set_session(real_jid, st.presence({type="unavailable"}) |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
394 :tag('status'):text(error_message)); |
9003
a971023e9b6e
MUC: Bring handling of presence errors to the room more in line with unavailable presence
Matthew Wild <mwild1@gmail.com>
parents:
9002
diff
changeset
|
395 local is_last_session = occupant.jid == real_jid; |
a971023e9b6e
MUC: Bring handling of presence errors to the room more in line with unavailable presence
Matthew Wild <mwild1@gmail.com>
parents:
9002
diff
changeset
|
396 if is_last_session then |
a971023e9b6e
MUC: Bring handling of presence errors to the room more in line with unavailable presence
Matthew Wild <mwild1@gmail.com>
parents:
9002
diff
changeset
|
397 occupant.role = nil; |
a971023e9b6e
MUC: Bring handling of presence errors to the room more in line with unavailable presence
Matthew Wild <mwild1@gmail.com>
parents:
9002
diff
changeset
|
398 end |
a971023e9b6e
MUC: Bring handling of presence errors to the room more in line with unavailable presence
Matthew Wild <mwild1@gmail.com>
parents:
9002
diff
changeset
|
399 local new_occupant = self:save_occupant(occupant); |
a971023e9b6e
MUC: Bring handling of presence errors to the room more in line with unavailable presence
Matthew Wild <mwild1@gmail.com>
parents:
9002
diff
changeset
|
400 local x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";}); |
a971023e9b6e
MUC: Bring handling of presence errors to the room more in line with unavailable presence
Matthew Wild <mwild1@gmail.com>
parents:
9002
diff
changeset
|
401 if is_last_session then |
9148
a474c94d0b0a
MUC: Remove 307 status from error-kicks (fixes #939)
Matthew Wild <mwild1@gmail.com>
parents:
9147
diff
changeset
|
402 x:tag("status", {code = "333"}); |
9003
a971023e9b6e
MUC: Bring handling of presence errors to the room more in line with unavailable presence
Matthew Wild <mwild1@gmail.com>
parents:
9002
diff
changeset
|
403 end |
a971023e9b6e
MUC: Bring handling of presence errors to the room more in line with unavailable presence
Matthew Wild <mwild1@gmail.com>
parents:
9002
diff
changeset
|
404 self:publicise_occupant_status(new_occupant or occupant, x); |
a971023e9b6e
MUC: Bring handling of presence errors to the room more in line with unavailable presence
Matthew Wild <mwild1@gmail.com>
parents:
9002
diff
changeset
|
405 if is_last_session then |
10048
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
406 module:fire_event("muc-occupant-left", { |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
407 room = self; |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
408 nick = occupant.nick; |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
409 occupant = occupant; |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
410 }); |
6454
6842b07fc7bc
plugins/muc/muc.lib: Fire muc-occupant-left from other places an occupant may leave the room
daurnimator <quae@daurnimator.com>
parents:
6453
diff
changeset
|
411 end |
6100
c78ba94d3261
plugins/muc/muc.lib: Move all kick code into one place
daurnimator <quae@daurnimator.com>
parents:
6099
diff
changeset
|
412 return true; |
2529
7968e8b3ecf9
MUC: Fixes and refactoring for the previous commit to work in all cases, text of error stanzas is now broadcast
Matthew Wild <mwild1@gmail.com>
parents:
2528
diff
changeset
|
413 end |
7968e8b3ecf9
MUC: Fixes and refactoring for the previous commit to work in all cases, text of error stanzas is now broadcast
Matthew Wild <mwild1@gmail.com>
parents:
2528
diff
changeset
|
414 |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
415 -- Give the room creator owner affiliation |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
416 module:hook("muc-room-pre-create", function(event) |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
417 event.room:set_affiliation(true, jid_bare(event.stanza.attr.from), "owner"); |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
418 end, -1); |
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
419 |
6180
35388114439f
plugins/muc/muc.lib: non-function changes (reordering, semicolons and comments)
daurnimator <quae@daurnimator.com>
parents:
6179
diff
changeset
|
420 -- check if user is banned |
6193
b9074126639f
plugins/muc/muc.lib: Remove top level pre-join event. Assign event priorities for other handlers
daurnimator <quae@daurnimator.com>
parents:
6192
diff
changeset
|
421 module:hook("muc-occupant-pre-join", function(event) |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
422 local room, stanza = event.room, event.stanza; |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
423 local affiliation = room:get_affiliation(stanza.attr.from); |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
424 if affiliation == "outcast" then |
10449
2e36a54906e4
MUC: Indicate that the room is the origin of various errors where 'from' is an occupant JID
Kim Alvefur <zash@zash.se>
parents:
10434
diff
changeset
|
425 local reply = st.error_reply(stanza, "auth", "forbidden", nil, room.jid):up(); |
6135
6b061f8c6e11
plugins/muc/muc.lib: Add muc-occupant-prejoin events; Use it for banned, members-only, password, nick-conflict and lock checks
daurnimator <quae@daurnimator.com>
parents:
6134
diff
changeset
|
426 reply.tags[1].attr.code = "403"; |
6b061f8c6e11
plugins/muc/muc.lib: Add muc-occupant-prejoin events; Use it for banned, members-only, password, nick-conflict and lock checks
daurnimator <quae@daurnimator.com>
parents:
6134
diff
changeset
|
427 event.origin.send(reply:tag("x", {xmlns = "http://jabber.org/protocol/muc"})); |
6b061f8c6e11
plugins/muc/muc.lib: Add muc-occupant-prejoin events; Use it for banned, members-only, password, nick-conflict and lock checks
daurnimator <quae@daurnimator.com>
parents:
6134
diff
changeset
|
428 return true; |
3254
a01c6411fdfb
MUC: Added room:set_members_only(boolean) and room:is_members_only().
Waqas Hussain <waqas20@gmail.com>
parents:
3253
diff
changeset
|
429 end |
6193
b9074126639f
plugins/muc/muc.lib: Remove top level pre-join event. Assign event priorities for other handlers
daurnimator <quae@daurnimator.com>
parents:
6192
diff
changeset
|
430 end, -10); |
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
431 |
9024
43241e74bb19
MUC: Reject invisible nicknames (fixes #979)
Kim Alvefur <zash@zash.se>
parents:
9023
diff
changeset
|
432 module:hook("muc-occupant-pre-join", function(event) |
10449
2e36a54906e4
MUC: Indicate that the room is the origin of various errors where 'from' is an occupant JID
Kim Alvefur <zash@zash.se>
parents:
10434
diff
changeset
|
433 local room = event.room; |
9026
91b5a5667016
MUC: Use nickname from occupant object
Kim Alvefur <zash@zash.se>
parents:
9025
diff
changeset
|
434 local nick = jid_resource(event.occupant.nick); |
9024
43241e74bb19
MUC: Reject invisible nicknames (fixes #979)
Kim Alvefur <zash@zash.se>
parents:
9023
diff
changeset
|
435 if not nick:find("%S") then |
10449
2e36a54906e4
MUC: Indicate that the room is the origin of various errors where 'from' is an occupant JID
Kim Alvefur <zash@zash.se>
parents:
10434
diff
changeset
|
436 event.origin.send(st.error_reply(event.stanza, "modify", "not-allowed", "Invisible Nicknames are forbidden", room.jid)); |
9024
43241e74bb19
MUC: Reject invisible nicknames (fixes #979)
Kim Alvefur <zash@zash.se>
parents:
9023
diff
changeset
|
437 return true; |
43241e74bb19
MUC: Reject invisible nicknames (fixes #979)
Kim Alvefur <zash@zash.se>
parents:
9023
diff
changeset
|
438 end |
43241e74bb19
MUC: Reject invisible nicknames (fixes #979)
Kim Alvefur <zash@zash.se>
parents:
9023
diff
changeset
|
439 end, 1); |
43241e74bb19
MUC: Reject invisible nicknames (fixes #979)
Kim Alvefur <zash@zash.se>
parents:
9023
diff
changeset
|
440 |
9027
4028eb4a9f7f
MUC: Also prevent changing to an invisible nickname
Kim Alvefur <zash@zash.se>
parents:
9026
diff
changeset
|
441 module:hook("muc-occupant-pre-change", function(event) |
10449
2e36a54906e4
MUC: Indicate that the room is the origin of various errors where 'from' is an occupant JID
Kim Alvefur <zash@zash.se>
parents:
10434
diff
changeset
|
442 local room = event.room; |
9027
4028eb4a9f7f
MUC: Also prevent changing to an invisible nickname
Kim Alvefur <zash@zash.se>
parents:
9026
diff
changeset
|
443 if not jid_resource(event.dest_occupant.nick):find("%S") then |
10449
2e36a54906e4
MUC: Indicate that the room is the origin of various errors where 'from' is an occupant JID
Kim Alvefur <zash@zash.se>
parents:
10434
diff
changeset
|
444 event.origin.send(st.error_reply(event.stanza, "modify", "not-allowed", "Invisible Nicknames are forbidden", room.jid)); |
9027
4028eb4a9f7f
MUC: Also prevent changing to an invisible nickname
Kim Alvefur <zash@zash.se>
parents:
9026
diff
changeset
|
445 return true; |
4028eb4a9f7f
MUC: Also prevent changing to an invisible nickname
Kim Alvefur <zash@zash.se>
parents:
9026
diff
changeset
|
446 end |
4028eb4a9f7f
MUC: Also prevent changing to an invisible nickname
Kim Alvefur <zash@zash.se>
parents:
9026
diff
changeset
|
447 end, 1); |
4028eb4a9f7f
MUC: Also prevent changing to an invisible nickname
Kim Alvefur <zash@zash.se>
parents:
9026
diff
changeset
|
448 |
10361
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
449 module:hook("muc-occupant-pre-join", function(event) |
10449
2e36a54906e4
MUC: Indicate that the room is the origin of various errors where 'from' is an occupant JID
Kim Alvefur <zash@zash.se>
parents:
10434
diff
changeset
|
450 local room = event.room; |
10361
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
451 local nick = jid_resource(event.occupant.nick); |
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
452 if not resourceprep(nick, true) then -- strict |
10449
2e36a54906e4
MUC: Indicate that the room is the origin of various errors where 'from' is an occupant JID
Kim Alvefur <zash@zash.se>
parents:
10434
diff
changeset
|
453 event.origin.send(st.error_reply(event.stanza, "modify", "jid-malformed", "Nickname must pass strict validation", room.jid)); |
10361
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
454 return true; |
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
455 end |
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
456 end, 2); |
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
457 |
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
458 module:hook("muc-occupant-pre-change", function(event) |
10451
347d16d70280
MUC: Add missing reference to room (thanks buildbot) [luacheck]
Kim Alvefur <zash@zash.se>
parents:
10449
diff
changeset
|
459 local room = event.room; |
10361
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
460 local nick = jid_resource(event.dest_occupant.nick); |
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
461 if not resourceprep(nick, true) then -- strict |
10449
2e36a54906e4
MUC: Indicate that the room is the origin of various errors where 'from' is an occupant JID
Kim Alvefur <zash@zash.se>
parents:
10434
diff
changeset
|
462 event.origin.send(st.error_reply(event.stanza, "modify", "jid-malformed", "Nickname must pass strict validation", room.jid)); |
10361
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
463 return true; |
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
464 end |
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
465 end, 2); |
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
466 |
7410
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
467 function room_mt:handle_first_presence(origin, stanza) |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
468 local real_jid = stanza.attr.from; |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
469 local dest_jid = stanza.attr.to; |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
470 local bare_jid = jid_bare(real_jid); |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
471 if module:fire_event("muc-room-pre-create", { |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
472 room = self; |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
473 origin = origin; |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
474 stanza = stanza; |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
475 }) then return true; end |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
476 local is_first_dest_session = true; |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
477 local dest_occupant = self:new_occupant(bare_jid, dest_jid); |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
478 |
7706
d92e186c2a1c
MUC: Include the appropriate status code if nickname is changed during join process
Kim Alvefur <zash@zash.se>
parents:
7705
diff
changeset
|
479 local orig_nick = dest_occupant.nick; |
7410
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
480 if module:fire_event("muc-occupant-pre-join", { |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
481 room = self; |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
482 origin = origin; |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
483 stanza = stanza; |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
484 is_first_session = is_first_dest_session; |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
485 is_new_room = true; |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
486 occupant = dest_occupant; |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
487 }) then return true; end |
7706
d92e186c2a1c
MUC: Include the appropriate status code if nickname is changed during join process
Kim Alvefur <zash@zash.se>
parents:
7705
diff
changeset
|
488 local nick_changed = orig_nick ~= dest_occupant.nick; |
7410
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
489 |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
490 dest_occupant:set_session(real_jid, stanza); |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
491 local dest_x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";}); |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
492 dest_x:tag("status", {code = "201"}):up(); |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
493 if self:get_whois() == "anyone" then |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
494 dest_x:tag("status", {code = "100"}):up(); |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
495 end |
7706
d92e186c2a1c
MUC: Include the appropriate status code if nickname is changed during join process
Kim Alvefur <zash@zash.se>
parents:
7705
diff
changeset
|
496 if nick_changed then |
9022
293ebfed71f7
MUC: Simplify creation of <{muc}x> for room creation
Kim Alvefur <zash@zash.se>
parents:
9017
diff
changeset
|
497 dest_x:tag("status", {code = "210"}):up(); |
7706
d92e186c2a1c
MUC: Include the appropriate status code if nickname is changed during join process
Kim Alvefur <zash@zash.se>
parents:
7705
diff
changeset
|
498 end |
7410
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
499 self:save_occupant(dest_occupant); |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
500 |
9022
293ebfed71f7
MUC: Simplify creation of <{muc}x> for room creation
Kim Alvefur <zash@zash.se>
parents:
9017
diff
changeset
|
501 self:publicise_occupant_status(dest_occupant, dest_x); |
7410
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
502 |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
503 module:fire_event("muc-occupant-joined", { |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
504 room = self; |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
505 nick = dest_occupant.nick; |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
506 occupant = dest_occupant; |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
507 stanza = stanza; |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
508 origin = origin; |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
509 }); |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
510 module:fire_event("muc-occupant-session-new", { |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
511 room = self; |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
512 nick = dest_occupant.nick; |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
513 occupant = dest_occupant; |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
514 stanza = stanza; |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
515 origin = origin; |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
516 jid = real_jid; |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
517 }); |
7411
f385cd6127b2
MUC: Add event for when room is done being created
Kim Alvefur <zash@zash.se>
parents:
7410
diff
changeset
|
518 module:fire_event("muc-room-created", { |
f385cd6127b2
MUC: Add event for when room is done being created
Kim Alvefur <zash@zash.se>
parents:
7410
diff
changeset
|
519 room = self; |
f385cd6127b2
MUC: Add event for when room is done being created
Kim Alvefur <zash@zash.se>
parents:
7410
diff
changeset
|
520 creator = dest_occupant; |
f385cd6127b2
MUC: Add event for when room is done being created
Kim Alvefur <zash@zash.se>
parents:
7410
diff
changeset
|
521 stanza = stanza; |
f385cd6127b2
MUC: Add event for when room is done being created
Kim Alvefur <zash@zash.se>
parents:
7410
diff
changeset
|
522 origin = origin; |
f385cd6127b2
MUC: Add event for when room is done being created
Kim Alvefur <zash@zash.se>
parents:
7410
diff
changeset
|
523 }); |
7410
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
524 return true; |
2529
7968e8b3ecf9
MUC: Fixes and refactoring for the previous commit to work in all cases, text of error stanzas is now broadcast
Matthew Wild <mwild1@gmail.com>
parents:
2528
diff
changeset
|
525 end |
7968e8b3ecf9
MUC: Fixes and refactoring for the previous commit to work in all cases, text of error stanzas is now broadcast
Matthew Wild <mwild1@gmail.com>
parents:
2528
diff
changeset
|
526 |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
527 function room_mt:handle_normal_presence(origin, stanza) |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
528 local type = stanza.attr.type; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
529 local real_jid = stanza.attr.from; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
530 local bare_jid = jid_bare(real_jid); |
7410
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
531 local orig_occupant = self:get_occupant_by_real_jid(real_jid); |
8912
43806beda970
MUC: Move extraction of <{muc}x> earlier, to be used later to differentiate between join and presence update
Kim Alvefur <zash@zash.se>
parents:
8891
diff
changeset
|
532 local muc_x = stanza:get_child("x", "http://jabber.org/protocol/muc"); |
8914
e9acb928c637
MUC: Remove support for GC 1.0 for joining
Kim Alvefur <zash@zash.se>
parents:
8913
diff
changeset
|
533 |
8931
ae84911c1441
MUC: Avoid sending error for unavailable presence in GC 1.0 check
Kim Alvefur <zash@zash.se>
parents:
8915
diff
changeset
|
534 if orig_occupant == nil and not muc_x and stanza.attr.type == nil then |
8914
e9acb928c637
MUC: Remove support for GC 1.0 for joining
Kim Alvefur <zash@zash.se>
parents:
8913
diff
changeset
|
535 module:log("debug", "Attempted join without <x>, possibly desynced"); |
9081
ce57c69a20e2
MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents:
9057
diff
changeset
|
536 origin.send(st.error_reply(stanza, "cancel", "item-not-found", |
10449
2e36a54906e4
MUC: Indicate that the room is the origin of various errors where 'from' is an occupant JID
Kim Alvefur <zash@zash.se>
parents:
10434
diff
changeset
|
537 "You are not currently connected to this chat", self.jid)); |
8914
e9acb928c637
MUC: Remove support for GC 1.0 for joining
Kim Alvefur <zash@zash.se>
parents:
8913
diff
changeset
|
538 return true; |
e9acb928c637
MUC: Remove support for GC 1.0 for joining
Kim Alvefur <zash@zash.se>
parents:
8913
diff
changeset
|
539 end |
e9acb928c637
MUC: Remove support for GC 1.0 for joining
Kim Alvefur <zash@zash.se>
parents:
8913
diff
changeset
|
540 |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
541 local is_first_dest_session; |
7410
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
542 local dest_occupant; |
8754
ca40f9a5751a
MUC: Move something into empty if branch
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
543 if type == "unavailable" then |
ca40f9a5751a
MUC: Move something into empty if branch
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
544 if orig_occupant == nil then return true; end -- Unavailable from someone not in the room |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
545 -- dest_occupant = nil |
7426
3a90e9732204
Backed out changeset 63141a85beea, broke multi-session nicks
Kim Alvefur <zash@zash.se>
parents:
7423
diff
changeset
|
546 elseif orig_occupant and orig_occupant.nick == stanza.attr.to then -- Just a presence update |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
547 log("debug", "presence update for %s from session %s", orig_occupant.nick, real_jid); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
548 dest_occupant = orig_occupant; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
549 else |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
550 local dest_jid = stanza.attr.to; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
551 dest_occupant = self:get_occupant_by_nick(dest_jid); |
7426
3a90e9732204
Backed out changeset 63141a85beea, broke multi-session nicks
Kim Alvefur <zash@zash.se>
parents:
7423
diff
changeset
|
552 if dest_occupant == nil then |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
553 log("debug", "no occupant found for %s; creating new occupant object for %s", dest_jid, real_jid); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
554 is_first_dest_session = true; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
555 dest_occupant = self:new_occupant(bare_jid, dest_jid); |
10431
3db8372e203c
MUC: Keep role across nickname change (fixes #1466)
Kim Alvefur <zash@zash.se>
parents:
10293
diff
changeset
|
556 if orig_occupant then |
3db8372e203c
MUC: Keep role across nickname change (fixes #1466)
Kim Alvefur <zash@zash.se>
parents:
10293
diff
changeset
|
557 dest_occupant.role = orig_occupant.role; |
3db8372e203c
MUC: Keep role across nickname change (fixes #1466)
Kim Alvefur <zash@zash.se>
parents:
10293
diff
changeset
|
558 end |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
559 else |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
560 is_first_dest_session = false; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
561 end |
3507
b639042bb0d5
MUC: Added a 'Name' property (muc#roomconfig_roomname)
Kim Alvefur <zash@zash.se>
parents:
3446
diff
changeset
|
562 end |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
563 local is_last_orig_session; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
564 if orig_occupant ~= nil then |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
565 -- Is there are least 2 sessions? |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
566 local iter, ob, last = orig_occupant:each_session(); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
567 is_last_orig_session = iter(ob, iter(ob, last)) == nil; |
3508
9e4c2b048f9a
MUC: Added a 'Description' property (muc#roomconfig_roomdesc)
Kim Alvefur <zash@zash.se>
parents:
3507
diff
changeset
|
568 end |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
569 |
7706
d92e186c2a1c
MUC: Include the appropriate status code if nickname is changed during join process
Kim Alvefur <zash@zash.se>
parents:
7705
diff
changeset
|
570 local orig_nick = dest_occupant and dest_occupant.nick; |
d92e186c2a1c
MUC: Include the appropriate status code if nickname is changed during join process
Kim Alvefur <zash@zash.se>
parents:
7705
diff
changeset
|
571 |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
572 local event, event_name = { |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
573 room = self; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
574 origin = origin; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
575 stanza = stanza; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
576 is_first_session = is_first_dest_session; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
577 is_last_session = is_last_orig_session; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
578 }; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
579 if orig_occupant == nil then |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
580 event_name = "muc-occupant-pre-join"; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
581 event.occupant = dest_occupant; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
582 elseif dest_occupant == nil then |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
583 event_name = "muc-occupant-pre-leave"; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
584 event.occupant = orig_occupant; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
585 else |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
586 event_name = "muc-occupant-pre-change"; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
587 event.orig_occupant = orig_occupant; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
588 event.dest_occupant = dest_occupant; |
3250
38402e874b45
MUC: Added room:set_moderated(boolean) and room:is_moderated().
Waqas Hussain <waqas20@gmail.com>
parents:
3249
diff
changeset
|
589 end |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
590 if module:fire_event(event_name, event) then return true; end |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
591 |
7706
d92e186c2a1c
MUC: Include the appropriate status code if nickname is changed during join process
Kim Alvefur <zash@zash.se>
parents:
7705
diff
changeset
|
592 local nick_changed = dest_occupant and orig_nick ~= dest_occupant.nick; |
d92e186c2a1c
MUC: Include the appropriate status code if nickname is changed during join process
Kim Alvefur <zash@zash.se>
parents:
7705
diff
changeset
|
593 |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
594 -- Check for nick conflicts |
7958
47cb54a08336
MUC: Split long line [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7706
diff
changeset
|
595 if dest_occupant ~= nil and not is_first_dest_session |
47cb54a08336
MUC: Split long line [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7706
diff
changeset
|
596 and bare_jid ~= jid_bare(dest_occupant.bare_jid) then |
47cb54a08336
MUC: Split long line [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7706
diff
changeset
|
597 -- new nick or has different bare real jid |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
598 log("debug", "%s couldn't join due to nick conflict: %s", real_jid, dest_occupant.nick); |
10449
2e36a54906e4
MUC: Indicate that the room is the origin of various errors where 'from' is an occupant JID
Kim Alvefur <zash@zash.se>
parents:
10434
diff
changeset
|
599 local reply = st.error_reply(stanza, "cancel", "conflict", nil, self.jid):up(); |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
600 reply.tags[1].attr.code = "409"; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
601 origin.send(reply:tag("x", {xmlns = "http://jabber.org/protocol/muc"})); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
602 return true; |
3254
a01c6411fdfb
MUC: Added room:set_members_only(boolean) and room:is_members_only().
Waqas Hussain <waqas20@gmail.com>
parents:
3253
diff
changeset
|
603 end |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
604 |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
605 -- Send presence stanza about original occupant |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
606 if orig_occupant ~= nil and orig_occupant ~= dest_occupant then |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
607 local orig_x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";}); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
608 local dest_nick; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
609 if dest_occupant == nil then -- Session is leaving |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
610 log("debug", "session %s is leaving occupant %s", real_jid, orig_occupant.nick); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
611 if is_last_orig_session then |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
612 orig_occupant.role = nil; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
613 end |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
614 orig_occupant:set_session(real_jid, stanza); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
615 else |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
616 log("debug", "session %s is changing from occupant %s to %s", real_jid, orig_occupant.nick, dest_occupant.nick); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
617 local generated_unavail = st.presence {from = orig_occupant.nick, to = real_jid, type = "unavailable"}; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
618 orig_occupant:set_session(real_jid, generated_unavail); |
8856 | 619 dest_nick = jid_resource(dest_occupant.nick); |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
620 if not is_first_dest_session then -- User is swapping into another pre-existing session |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
621 log("debug", "session %s is swapping into multisession %s, showing it leave.", real_jid, dest_occupant.nick); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
622 -- Show the other session leaving |
7418
e9f7043b86b5
MUC: Move status text out of <x> element (thanks Tobias)
Kim Alvefur <zash@zash.se>
parents:
7416
diff
changeset
|
623 local x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";}); |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
624 add_item(x, self:get_affiliation(bare_jid), "none"); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
625 local pr = st.presence{from = dest_occupant.nick, to = real_jid, type = "unavailable"} |
7418
e9f7043b86b5
MUC: Move status text out of <x> element (thanks Tobias)
Kim Alvefur <zash@zash.se>
parents:
7416
diff
changeset
|
626 :tag("status"):text("you are joining pre-existing session " .. dest_nick):up() |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
627 :add_child(x); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
628 self:route_stanza(pr); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
629 end |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
630 if is_first_dest_session and is_last_orig_session then -- Normal nick change |
8728
41c959c5c84b
Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents:
8591
diff
changeset
|
631 log("debug", "no sessions in %s left; publicly marking as nick change", orig_occupant.nick); |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
632 orig_x:tag("status", {code = "303";}):up(); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
633 else -- The session itself always needs to see a nick change |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
634 -- don't want to get our old nick's available presence, |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
635 -- so remove our session from there, and manually generate an unavailable |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
636 orig_occupant:remove_session(real_jid); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
637 log("debug", "generating nick change for %s", real_jid); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
638 local x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";}); |
9081
ce57c69a20e2
MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents:
9057
diff
changeset
|
639 -- COMPAT: clients get confused if they see other items besides their own |
ce57c69a20e2
MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents:
9057
diff
changeset
|
640 -- self:build_item_list(orig_occupant, x, false, dest_nick); |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
641 add_item(x, self:get_affiliation(bare_jid), orig_occupant.role, real_jid, dest_nick); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
642 x:tag("status", {code = "303";}):up(); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
643 x:tag("status", {code = "110";}):up(); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
644 self:route_stanza(generated_unavail:add_child(x)); |
9615 | 645 dest_nick = nil; -- set dest_nick to nil; so general populace doesn't see it for whole orig_occupant |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
646 end |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
647 end |
7667
5523880760b3
MUC: Insert the appropriate status code (210) if the nickname is overridden
Kim Alvefur <zash@zash.se>
parents:
7661
diff
changeset
|
648 |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
649 self:save_occupant(orig_occupant); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
650 self:publicise_occupant_status(orig_occupant, orig_x, dest_nick); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
651 |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
652 if is_last_orig_session then |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
653 module:fire_event("muc-occupant-left", { |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
654 room = self; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
655 nick = orig_occupant.nick; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
656 occupant = orig_occupant; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
657 origin = origin; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
658 stanza = stanza; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
659 }); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
660 end |
3261
fe1c93296abd
MUC: Added room:set_hidden(boolean) and room:is_hidden().
Waqas Hussain <waqas20@gmail.com>
parents:
3260
diff
changeset
|
661 end |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
662 |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
663 if dest_occupant ~= nil then |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
664 dest_occupant:set_session(real_jid, stanza); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
665 self:save_occupant(dest_occupant); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
666 |
7427
bf43a08e5a74
MUC: Send participant list and subject on explicit joins (thanks daurnimator)
Kim Alvefur <zash@zash.se>
parents:
7426
diff
changeset
|
667 if orig_occupant == nil or muc_x then |
8914
e9acb928c637
MUC: Remove support for GC 1.0 for joining
Kim Alvefur <zash@zash.se>
parents:
8913
diff
changeset
|
668 -- Send occupant list to newly joined or desynced user |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
669 self:send_occupant_list(real_jid, function(nick, occupant) -- luacheck: ignore 212 |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
670 -- Don't include self |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
671 return occupant:get_presence(real_jid) == nil; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
672 end) |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
673 end |
9023
ce461a67d2cc
MUC: Fix to send status code 100 *only* to the joining (fixes #680)
Kim Alvefur <zash@zash.se>
parents:
9022
diff
changeset
|
674 local dest_x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";}); |
ce461a67d2cc
MUC: Fix to send status code 100 *only* to the joining (fixes #680)
Kim Alvefur <zash@zash.se>
parents:
9022
diff
changeset
|
675 local self_x = st.clone(dest_x); |
ce461a67d2cc
MUC: Fix to send status code 100 *only* to the joining (fixes #680)
Kim Alvefur <zash@zash.se>
parents:
9022
diff
changeset
|
676 if orig_occupant == nil and self:get_whois() == "anyone" then |
ce461a67d2cc
MUC: Fix to send status code 100 *only* to the joining (fixes #680)
Kim Alvefur <zash@zash.se>
parents:
9022
diff
changeset
|
677 self_x:tag("status", {code = "100"}):up(); |
ce461a67d2cc
MUC: Fix to send status code 100 *only* to the joining (fixes #680)
Kim Alvefur <zash@zash.se>
parents:
9022
diff
changeset
|
678 end |
7706
d92e186c2a1c
MUC: Include the appropriate status code if nickname is changed during join process
Kim Alvefur <zash@zash.se>
parents:
7705
diff
changeset
|
679 if nick_changed then |
d92e186c2a1c
MUC: Include the appropriate status code if nickname is changed during join process
Kim Alvefur <zash@zash.se>
parents:
7705
diff
changeset
|
680 self_x:tag("status", {code="210"}):up(); |
d92e186c2a1c
MUC: Include the appropriate status code if nickname is changed during join process
Kim Alvefur <zash@zash.se>
parents:
7705
diff
changeset
|
681 end |
d92e186c2a1c
MUC: Include the appropriate status code if nickname is changed during join process
Kim Alvefur <zash@zash.se>
parents:
7705
diff
changeset
|
682 self:publicise_occupant_status(dest_occupant, {base=dest_x,self=self_x}); |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
683 |
9081
ce57c69a20e2
MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents:
9057
diff
changeset
|
684 if orig_occupant ~= nil and orig_occupant ~= dest_occupant and not is_last_orig_session then |
ce57c69a20e2
MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents:
9057
diff
changeset
|
685 -- If user is swapping and wasn't last original session |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
686 log("debug", "session %s split nicks; showing %s rejoining", real_jid, orig_occupant.nick); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
687 -- Show the original nick joining again |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
688 local pr = st.clone(orig_occupant:get_presence()); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
689 pr.attr.to = real_jid; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
690 local x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";}); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
691 self:build_item_list(orig_occupant, x, false); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
692 -- TODO: new status code to inform client this was the multi-session it left? |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
693 pr:add_child(x); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
694 self:route_stanza(pr); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
695 end |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
696 |
7427
bf43a08e5a74
MUC: Send participant list and subject on explicit joins (thanks daurnimator)
Kim Alvefur <zash@zash.se>
parents:
7426
diff
changeset
|
697 if orig_occupant == nil or muc_x then |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
698 if is_first_dest_session then |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
699 module:fire_event("muc-occupant-joined", { |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
700 room = self; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
701 nick = dest_occupant.nick; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
702 occupant = dest_occupant; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
703 stanza = stanza; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
704 origin = origin; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
705 }); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
706 end |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
707 module:fire_event("muc-occupant-session-new", { |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
708 room = self; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
709 nick = dest_occupant.nick; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
710 occupant = dest_occupant; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
711 stanza = stanza; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
712 origin = origin; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
713 jid = real_jid; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
714 }); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
715 end |
4119
813adb81d7da
MUC: Add option to allow participants to change the subject.
Kim Alvefur <zash@zash.se>
parents:
3989
diff
changeset
|
716 end |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
717 return true; |
4528
875b90d5ce0f
muc - implement per channel history limits
Markus Kötter <koetter@rrzn-hiwi.uni-hannover.de>
parents:
4424
diff
changeset
|
718 end |
875b90d5ce0f
muc - implement per channel history limits
Markus Kötter <koetter@rrzn-hiwi.uni-hannover.de>
parents:
4424
diff
changeset
|
719 |
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
720 function room_mt:handle_presence_to_occupant(origin, stanza) |
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
721 local type = stanza.attr.type; |
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
722 if type == "error" then -- error, kick em out! |
6100
c78ba94d3261
plugins/muc/muc.lib: Move all kick code into one place
daurnimator <quae@daurnimator.com>
parents:
6099
diff
changeset
|
723 return self:handle_kickable(origin, stanza) |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
724 elseif type == nil or type == "unavailable" then |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
725 return self:handle_normal_presence(origin, stanza); |
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
726 elseif type ~= 'result' then -- bad type |
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
727 if type ~= 'visible' and type ~= 'invisible' then -- COMPAT ejabberd can broadcast or forward XEP-0018 presences |
10449
2e36a54906e4
MUC: Indicate that the room is the origin of various errors where 'from' is an occupant JID
Kim Alvefur <zash@zash.se>
parents:
10434
diff
changeset
|
728 origin.send(st.error_reply(stanza, "modify", "bad-request", nil, self.jid)); -- FIXME correct error? |
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
729 end |
5600
1b326a1e4da6
mod_muc: Add getter/setter for 'whois' (fixes traceback)
Matthew Wild <mwild1@gmail.com>
parents:
5580
diff
changeset
|
730 end |
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
731 return true; |
5600
1b326a1e4da6
mod_muc: Add getter/setter for 'whois' (fixes traceback)
Matthew Wild <mwild1@gmail.com>
parents:
5580
diff
changeset
|
732 end |
1b326a1e4da6
mod_muc: Add getter/setter for 'whois' (fixes traceback)
Matthew Wild <mwild1@gmail.com>
parents:
5580
diff
changeset
|
733 |
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
734 function room_mt:handle_iq_to_occupant(origin, stanza) |
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
735 local from, to = stanza.attr.from, stanza.attr.to; |
6096
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
736 local type = stanza.attr.type; |
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
737 local id = stanza.attr.id; |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
738 local occupant = self:get_occupant_by_nick(to); |
6096
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
739 if (type == "error" or type == "result") then |
6097
538cdc3d8225
plugins/muc/muc.lib: Move (de)construct_stanza_id into `handle_iq_to_occupant`
daurnimator <quae@daurnimator.com>
parents:
6096
diff
changeset
|
740 do -- deconstruct_stanza_id |
6216
50b8b7caf200
plugins/muc/muc.lib: Move occupancy check to later in `deconstruct_stanza_id`: As vcards are from the bare jid, you need to use the `from_jid` out of the encoded `id`
daurnimator <quae@daurnimator.com>
parents:
6215
diff
changeset
|
741 if not occupant then return nil; end |
7089
890f4b2cc444
MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents:
7013
diff
changeset
|
742 local from_jid, orig_id, to_jid_hash = (base64.decode(id) or ""):match("^(%Z+)%z(%Z*)%z(.+)$"); |
6097
538cdc3d8225
plugins/muc/muc.lib: Move (de)construct_stanza_id into `handle_iq_to_occupant`
daurnimator <quae@daurnimator.com>
parents:
6096
diff
changeset
|
743 if not(from == from_jid or from == jid_bare(from_jid)) then return nil; end |
6216
50b8b7caf200
plugins/muc/muc.lib: Move occupancy check to later in `deconstruct_stanza_id`: As vcards are from the bare jid, you need to use the `from_jid` out of the encoded `id`
daurnimator <quae@daurnimator.com>
parents:
6215
diff
changeset
|
744 local from_occupant_jid = self:get_occupant_jid(from_jid); |
50b8b7caf200
plugins/muc/muc.lib: Move occupancy check to later in `deconstruct_stanza_id`: As vcards are from the bare jid, you need to use the `from_jid` out of the encoded `id`
daurnimator <quae@daurnimator.com>
parents:
6215
diff
changeset
|
745 if from_occupant_jid == nil then return nil; end |
6097
538cdc3d8225
plugins/muc/muc.lib: Move (de)construct_stanza_id into `handle_iq_to_occupant`
daurnimator <quae@daurnimator.com>
parents:
6096
diff
changeset
|
746 local session_jid |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
747 for to_jid in occupant:each_session() do |
6097
538cdc3d8225
plugins/muc/muc.lib: Move (de)construct_stanza_id into `handle_iq_to_occupant`
daurnimator <quae@daurnimator.com>
parents:
6096
diff
changeset
|
748 if md5(to_jid) == to_jid_hash then |
538cdc3d8225
plugins/muc/muc.lib: Move (de)construct_stanza_id into `handle_iq_to_occupant`
daurnimator <quae@daurnimator.com>
parents:
6096
diff
changeset
|
749 session_jid = to_jid; |
538cdc3d8225
plugins/muc/muc.lib: Move (de)construct_stanza_id into `handle_iq_to_occupant`
daurnimator <quae@daurnimator.com>
parents:
6096
diff
changeset
|
750 break; |
538cdc3d8225
plugins/muc/muc.lib: Move (de)construct_stanza_id into `handle_iq_to_occupant`
daurnimator <quae@daurnimator.com>
parents:
6096
diff
changeset
|
751 end |
538cdc3d8225
plugins/muc/muc.lib: Move (de)construct_stanza_id into `handle_iq_to_occupant`
daurnimator <quae@daurnimator.com>
parents:
6096
diff
changeset
|
752 end |
538cdc3d8225
plugins/muc/muc.lib: Move (de)construct_stanza_id into `handle_iq_to_occupant`
daurnimator <quae@daurnimator.com>
parents:
6096
diff
changeset
|
753 if session_jid == nil then return nil; end |
7089
890f4b2cc444
MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents:
7013
diff
changeset
|
754 stanza.attr.from, stanza.attr.to, stanza.attr.id = from_occupant_jid, session_jid, orig_id; |
5061
186f34d88073
MUC: Fix private IQ and message routing.
Waqas Hussain <waqas20@gmail.com>
parents:
4999
diff
changeset
|
755 end |
6096
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
756 log("debug", "%s sent private iq stanza to %s (%s)", from, to, stanza.attr.to); |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
757 self:route_stanza(stanza); |
6096
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
758 stanza.attr.from, stanza.attr.to, stanza.attr.id = from, to, id; |
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
759 return true; |
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
760 else -- Type is "get" or "set" |
6216
50b8b7caf200
plugins/muc/muc.lib: Move occupancy check to later in `deconstruct_stanza_id`: As vcards are from the bare jid, you need to use the `from_jid` out of the encoded `id`
daurnimator <quae@daurnimator.com>
parents:
6215
diff
changeset
|
761 local current_nick = self:get_occupant_jid(from); |
6096
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
762 if not current_nick then |
10449
2e36a54906e4
MUC: Indicate that the room is the origin of various errors where 'from' is an occupant JID
Kim Alvefur <zash@zash.se>
parents:
10434
diff
changeset
|
763 origin.send(st.error_reply(stanza, "cancel", "not-acceptable", "You are not currently connected to this chat", self.jid)); |
6096
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
764 return true; |
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
765 end |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
766 if not occupant then -- recipient not in room |
10449
2e36a54906e4
MUC: Indicate that the room is the origin of various errors where 'from' is an occupant JID
Kim Alvefur <zash@zash.se>
parents:
10434
diff
changeset
|
767 origin.send(st.error_reply(stanza, "cancel", "item-not-found", "Recipient not in room", self.jid)); |
6096
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
768 return true; |
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
769 end |
9444
7c1cdf5f9f83
MUC: Respond to ping per XEP-0410: MUC Self-Ping server optimization (closes #1220)
Kim Alvefur <zash@zash.se>
parents:
9315
diff
changeset
|
770 -- XEP-0410 MUC Self-Ping #1220 |
7c1cdf5f9f83
MUC: Respond to ping per XEP-0410: MUC Self-Ping server optimization (closes #1220)
Kim Alvefur <zash@zash.se>
parents:
9315
diff
changeset
|
771 if to == current_nick and stanza.attr.type == "get" and stanza:get_child("ping", "urn:xmpp:ping") then |
7c1cdf5f9f83
MUC: Respond to ping per XEP-0410: MUC Self-Ping server optimization (closes #1220)
Kim Alvefur <zash@zash.se>
parents:
9315
diff
changeset
|
772 self:route_stanza(st.reply(stanza)); |
7c1cdf5f9f83
MUC: Respond to ping per XEP-0410: MUC Self-Ping server optimization (closes #1220)
Kim Alvefur <zash@zash.se>
parents:
9315
diff
changeset
|
773 return true; |
7c1cdf5f9f83
MUC: Respond to ping per XEP-0410: MUC Self-Ping server optimization (closes #1220)
Kim Alvefur <zash@zash.se>
parents:
9315
diff
changeset
|
774 end |
6097
538cdc3d8225
plugins/muc/muc.lib: Move (de)construct_stanza_id into `handle_iq_to_occupant`
daurnimator <quae@daurnimator.com>
parents:
6096
diff
changeset
|
775 do -- construct_stanza_id |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
776 stanza.attr.id = base64.encode(occupant.jid.."\0"..stanza.attr.id.."\0"..md5(from)); |
6097
538cdc3d8225
plugins/muc/muc.lib: Move (de)construct_stanza_id into `handle_iq_to_occupant`
daurnimator <quae@daurnimator.com>
parents:
6096
diff
changeset
|
777 end |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
778 stanza.attr.from, stanza.attr.to = current_nick, occupant.jid; |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
779 log("debug", "%s sent private iq stanza to %s (%s)", from, to, occupant.jid); |
9194
11a0b32fef24
MUC: Direct PubSub queries to occupants to their real bare JID
Kim Alvefur <zash@zash.se>
parents:
9148
diff
changeset
|
780 local iq_ns = stanza.tags[1].attr.xmlns; |
9264
f13517b63e6c
MUC: Allow vCard4 requests trough
Kim Alvefur <zash@zash.se>
parents:
9263
diff
changeset
|
781 if iq_ns == 'vcard-temp' or iq_ns == "http://jabber.org/protocol/pubsub" or iq_ns == "urn:ietf:params:xml:ns:vcard-4.0" then |
6096
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
782 stanza.attr.to = jid_bare(stanza.attr.to); |
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
783 end |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
784 self:route_stanza(stanza); |
6096
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
785 stanza.attr.from, stanza.attr.to, stanza.attr.id = from, to, id; |
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
786 return true; |
5061
186f34d88073
MUC: Fix private IQ and message routing.
Waqas Hussain <waqas20@gmail.com>
parents:
4999
diff
changeset
|
787 end |
186f34d88073
MUC: Fix private IQ and message routing.
Waqas Hussain <waqas20@gmail.com>
parents:
4999
diff
changeset
|
788 end |
186f34d88073
MUC: Fix private IQ and message routing.
Waqas Hussain <waqas20@gmail.com>
parents:
4999
diff
changeset
|
789 |
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
790 function room_mt:handle_message_to_occupant(origin, stanza) |
1734 | 791 local from, to = stanza.attr.from, stanza.attr.to; |
6119
c13f5d6b9b16
plugins/muc/muc.lib: Use `get_occupant_jid` method instead of indexing _jid_nick
daurnimator <quae@daurnimator.com>
parents:
6118
diff
changeset
|
792 local current_nick = self:get_occupant_jid(from); |
1734 | 793 local type = stanza.attr.type; |
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
794 if not current_nick then -- not in room |
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
795 if type ~= "error" then |
10449
2e36a54906e4
MUC: Indicate that the room is the origin of various errors where 'from' is an occupant JID
Kim Alvefur <zash@zash.se>
parents:
10434
diff
changeset
|
796 origin.send(st.error_reply(stanza, "cancel", "not-acceptable", "You are not currently connected to this chat", self.jid)); |
1778
f4213d84ba8a
MUC: Correct routing of vCard requests to bare JID.
Waqas Hussain <waqas20@gmail.com>
parents:
1769
diff
changeset
|
797 end |
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
798 return true; |
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
799 end |
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
800 if type == "groupchat" then -- groupchat messages not allowed in PM |
10449
2e36a54906e4
MUC: Indicate that the room is the origin of various errors where 'from' is an occupant JID
Kim Alvefur <zash@zash.se>
parents:
10434
diff
changeset
|
801 origin.send(st.error_reply(stanza, "modify", "bad-request", nil, self.jid)); |
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
802 return true; |
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
803 elseif type == "error" and is_kickable_error(stanza) then |
1996
3e6b36c6d7b7
MUC: Kick occupants on sending error messages to other occupants.
Waqas Hussain <waqas20@gmail.com>
parents:
1989
diff
changeset
|
804 log("debug", "%s kicked from %s for sending an error message", current_nick, self.jid); |
6100
c78ba94d3261
plugins/muc/muc.lib: Move all kick code into one place
daurnimator <quae@daurnimator.com>
parents:
6099
diff
changeset
|
805 return self:handle_kickable(origin, stanza); -- send unavailable |
6096
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
806 end |
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
807 |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
808 local o_data = self:get_occupant_by_nick(to); |
6096
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
809 if not o_data then |
10449
2e36a54906e4
MUC: Indicate that the room is the origin of various errors where 'from' is an occupant JID
Kim Alvefur <zash@zash.se>
parents:
10434
diff
changeset
|
810 origin.send(st.error_reply(stanza, "cancel", "item-not-found", "Recipient not in room", self.jid)); |
6096
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
811 return true; |
1734 | 812 end |
6096
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
813 log("debug", "%s sent private message stanza to %s (%s)", from, to, o_data.jid); |
10293
f9301d93de72
MUC: Strip tags with MUC-related namespaces from private messages (fixes #1427)
Kim Alvefur <zash@zash.se>
parents:
10211
diff
changeset
|
814 stanza = muc_util.filter_muc_x(st.clone(stanza)); |
6096
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
815 stanza:tag("x", { xmlns = "http://jabber.org/protocol/muc#user" }):up(); |
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
816 stanza.attr.from = current_nick; |
6130
c95d9132592a
plugins/muc/muc.lib: Add route_to_occupant function to send a stanza to all occupant sessions
daurnimator <quae@daurnimator.com>
parents:
6129
diff
changeset
|
817 self:route_to_occupant(o_data, stanza) |
6180
35388114439f
plugins/muc/muc.lib: non-function changes (reordering, semicolons and comments)
daurnimator <quae@daurnimator.com>
parents:
6179
diff
changeset
|
818 -- TODO: Remove x tag? |
6130
c95d9132592a
plugins/muc/muc.lib: Add route_to_occupant function to send a stanza to all occupant sessions
daurnimator <quae@daurnimator.com>
parents:
6129
diff
changeset
|
819 stanza.attr.from = from; |
6096
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
820 return true; |
1734 | 821 end |
822 | |
2216
dbbb5ed41365
MUC: Slightly refactored form processing.
Waqas Hussain <waqas20@gmail.com>
parents:
2174
diff
changeset
|
823 function room_mt:send_form(origin, stanza) |
3591
dff4a77ee285
MUC: Parse submitted form with util.dataforms
Kim Alvefur <zash@zash.se>
parents:
3590
diff
changeset
|
824 origin.send(st.reply(stanza):query("http://jabber.org/protocol/muc#owner") |
5601
f55ab5fa939f
mod_muc: Pass actor (requesting JID) when generating the config form, and to the muc-config-form event handler
Matthew Wild <mwild1@gmail.com>
parents:
5600
diff
changeset
|
825 :add_child(self:get_form_layout(stanza.attr.from):form()) |
3591
dff4a77ee285
MUC: Parse submitted form with util.dataforms
Kim Alvefur <zash@zash.se>
parents:
3590
diff
changeset
|
826 ); |
dff4a77ee285
MUC: Parse submitted form with util.dataforms
Kim Alvefur <zash@zash.se>
parents:
3590
diff
changeset
|
827 end |
dff4a77ee285
MUC: Parse submitted form with util.dataforms
Kim Alvefur <zash@zash.se>
parents:
3590
diff
changeset
|
828 |
5601
f55ab5fa939f
mod_muc: Pass actor (requesting JID) when generating the config form, and to the muc-config-form event handler
Matthew Wild <mwild1@gmail.com>
parents:
5600
diff
changeset
|
829 function room_mt:get_form_layout(actor) |
5541
1997671d5e46
MUC: Allow plugins to add and handle options in the MUC config form
Matthew Wild <mwild1@gmail.com>
parents:
5519
diff
changeset
|
830 local form = dataform.new({ |
1997671d5e46
MUC: Allow plugins to add and handle options in the MUC config form
Matthew Wild <mwild1@gmail.com>
parents:
5519
diff
changeset
|
831 title = "Configuration for "..self.jid, |
1997671d5e46
MUC: Allow plugins to add and handle options in the MUC config form
Matthew Wild <mwild1@gmail.com>
parents:
5519
diff
changeset
|
832 instructions = "Complete and submit this form to configure the room.", |
3517
530f7de1d265
MUC: Use util.dataforms to generate forms
Kim Alvefur <zash@zash.se>
parents:
3516
diff
changeset
|
833 { |
530f7de1d265
MUC: Use util.dataforms to generate forms
Kim Alvefur <zash@zash.se>
parents:
3516
diff
changeset
|
834 name = 'FORM_TYPE', |
530f7de1d265
MUC: Use util.dataforms to generate forms
Kim Alvefur <zash@zash.se>
parents:
3516
diff
changeset
|
835 type = 'hidden', |
530f7de1d265
MUC: Use util.dataforms to generate forms
Kim Alvefur <zash@zash.se>
parents:
3516
diff
changeset
|
836 value = 'http://jabber.org/protocol/muc#roomconfig' |
530f7de1d265
MUC: Use util.dataforms to generate forms
Kim Alvefur <zash@zash.se>
parents:
3516
diff
changeset
|
837 } |
3591
dff4a77ee285
MUC: Parse submitted form with util.dataforms
Kim Alvefur <zash@zash.se>
parents:
3590
diff
changeset
|
838 }); |
5601
f55ab5fa939f
mod_muc: Pass actor (requesting JID) when generating the config form, and to the muc-config-form event handler
Matthew Wild <mwild1@gmail.com>
parents:
5600
diff
changeset
|
839 return module:fire_event("muc-config-form", { room = self, actor = actor, form = form }) or form; |
2216
dbbb5ed41365
MUC: Slightly refactored form processing.
Waqas Hussain <waqas20@gmail.com>
parents:
2174
diff
changeset
|
840 end |
dbbb5ed41365
MUC: Slightly refactored form processing.
Waqas Hussain <waqas20@gmail.com>
parents:
2174
diff
changeset
|
841 |
dbbb5ed41365
MUC: Slightly refactored form processing.
Waqas Hussain <waqas20@gmail.com>
parents:
2174
diff
changeset
|
842 function room_mt:process_form(origin, stanza) |
6202
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
843 local form = stanza.tags[1]:get_child("x", "jabber:x:data"); |
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
844 if form.attr.type == "cancel" then |
7383
69827ee1f951
MUC: Accept missing form as "instant room" request (fixes #377)
Kim Alvefur <zash@zash.se>
parents:
7011
diff
changeset
|
845 origin.send(st.reply(stanza)); |
6202
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
846 elseif form.attr.type == "submit" then |
6990
f476e2497568
MUC: Fire per-field events for the config form, including those with value == nil (no <value/> element in form)
Matthew Wild <mwild1@gmail.com>
parents:
6988
diff
changeset
|
847 local fields, errors, present; |
6391
4d334d00c635
plugins/muc/muc.lib: Add instant room support
daurnimator <quae@daurnimator.com>
parents:
6318
diff
changeset
|
848 if form.tags[1] == nil then -- Instant room |
6990
f476e2497568
MUC: Fire per-field events for the config form, including those with value == nil (no <value/> element in form)
Matthew Wild <mwild1@gmail.com>
parents:
6988
diff
changeset
|
849 fields, present = {}, {}; |
6391
4d334d00c635
plugins/muc/muc.lib: Add instant room support
daurnimator <quae@daurnimator.com>
parents:
6318
diff
changeset
|
850 else |
6990
f476e2497568
MUC: Fire per-field events for the config form, including those with value == nil (no <value/> element in form)
Matthew Wild <mwild1@gmail.com>
parents:
6988
diff
changeset
|
851 fields, errors, present = self:get_form_layout(stanza.attr.from):data(form); |
6391
4d334d00c635
plugins/muc/muc.lib: Add instant room support
daurnimator <quae@daurnimator.com>
parents:
6318
diff
changeset
|
852 if fields.FORM_TYPE ~= "http://jabber.org/protocol/muc#roomconfig" then |
4d334d00c635
plugins/muc/muc.lib: Add instant room support
daurnimator <quae@daurnimator.com>
parents:
6318
diff
changeset
|
853 origin.send(st.error_reply(stanza, "cancel", "bad-request", "Form is not of type room configuration")); |
4d334d00c635
plugins/muc/muc.lib: Add instant room support
daurnimator <quae@daurnimator.com>
parents:
6318
diff
changeset
|
854 return true; |
4d334d00c635
plugins/muc/muc.lib: Add instant room support
daurnimator <quae@daurnimator.com>
parents:
6318
diff
changeset
|
855 end |
6202
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
856 end |
3508
9e4c2b048f9a
MUC: Added a 'Description' property (muc#roomconfig_roomdesc)
Kim Alvefur <zash@zash.se>
parents:
3507
diff
changeset
|
857 |
9052
5017e43ccc39
MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents:
9027
diff
changeset
|
858 local event = { |
5017e43ccc39
MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents:
9027
diff
changeset
|
859 room = self; |
5017e43ccc39
MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents:
9027
diff
changeset
|
860 origin = origin; |
5017e43ccc39
MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents:
9027
diff
changeset
|
861 stanza = stanza; |
5017e43ccc39
MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents:
9027
diff
changeset
|
862 fields = fields; |
5017e43ccc39
MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents:
9027
diff
changeset
|
863 status_codes = {}; |
5017e43ccc39
MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents:
9027
diff
changeset
|
864 actor = stanza.attr.from; |
5017e43ccc39
MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents:
9027
diff
changeset
|
865 }; |
6203
b6ffce01e6cf
plugins/muc/muc.lib: Modify muc-config-submitted to keep a list of status codes instead of fields changed
daurnimator <quae@daurnimator.com>
parents:
6202
diff
changeset
|
866 function event.update_option(name, field, allowed) |
6202
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
867 local new = fields[field]; |
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
868 if new == nil then return; end |
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
869 if allowed and not allowed[new] then return; end |
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
870 if new == self["get_"..name](self) then return; end |
6203
b6ffce01e6cf
plugins/muc/muc.lib: Modify muc-config-submitted to keep a list of status codes instead of fields changed
daurnimator <quae@daurnimator.com>
parents:
6202
diff
changeset
|
871 event.status_codes["104"] = true; |
6202
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
872 self["set_"..name](self, new); |
6203
b6ffce01e6cf
plugins/muc/muc.lib: Modify muc-config-submitted to keep a list of status codes instead of fields changed
daurnimator <quae@daurnimator.com>
parents:
6202
diff
changeset
|
873 return true; |
6202
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
874 end |
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
875 module:fire_event("muc-config-submitted", event); |
6990
f476e2497568
MUC: Fire per-field events for the config form, including those with value == nil (no <value/> element in form)
Matthew Wild <mwild1@gmail.com>
parents:
6988
diff
changeset
|
876 for submitted_field in pairs(present) do |
f476e2497568
MUC: Fire per-field events for the config form, including those with value == nil (no <value/> element in form)
Matthew Wild <mwild1@gmail.com>
parents:
6988
diff
changeset
|
877 event.field, event.value = submitted_field, fields[submitted_field]; |
f476e2497568
MUC: Fire per-field events for the config form, including those with value == nil (no <value/> element in form)
Matthew Wild <mwild1@gmail.com>
parents:
6988
diff
changeset
|
878 module:fire_event("muc-config-submitted/"..submitted_field, event); |
f476e2497568
MUC: Fire per-field events for the config form, including those with value == nil (no <value/> element in form)
Matthew Wild <mwild1@gmail.com>
parents:
6988
diff
changeset
|
879 end |
f476e2497568
MUC: Fire per-field events for the config form, including those with value == nil (no <value/> element in form)
Matthew Wild <mwild1@gmail.com>
parents:
6988
diff
changeset
|
880 event.field, event.value = nil, nil; |
4119
813adb81d7da
MUC: Add option to allow participants to change the subject.
Kim Alvefur <zash@zash.se>
parents:
3989
diff
changeset
|
881 |
7414
1b62c89014c4
MUC: Separate force-save parameter from save-entire-state flag
Kim Alvefur <zash@zash.se>
parents:
7413
diff
changeset
|
882 self:save(true); |
6202
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
883 origin.send(st.reply(stanza)); |
3248
f8d14ea3ad0e
MUC: Added a password field to the room config dialog.
Waqas Hussain <waqas20@gmail.com>
parents:
3247
diff
changeset
|
884 |
6203
b6ffce01e6cf
plugins/muc/muc.lib: Modify muc-config-submitted to keep a list of status codes instead of fields changed
daurnimator <quae@daurnimator.com>
parents:
6202
diff
changeset
|
885 if next(event.status_codes) then |
6202
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
886 local msg = st.message({type='groupchat', from=self.jid}) |
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
887 :tag('x', {xmlns='http://jabber.org/protocol/muc#user'}) |
6203
b6ffce01e6cf
plugins/muc/muc.lib: Modify muc-config-submitted to keep a list of status codes instead of fields changed
daurnimator <quae@daurnimator.com>
parents:
6202
diff
changeset
|
888 for code in pairs(event.status_codes) do |
b6ffce01e6cf
plugins/muc/muc.lib: Modify muc-config-submitted to keep a list of status codes instead of fields changed
daurnimator <quae@daurnimator.com>
parents:
6202
diff
changeset
|
889 msg:tag("status", {code = code;}):up(); |
6202
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
890 end |
6203
b6ffce01e6cf
plugins/muc/muc.lib: Modify muc-config-submitted to keep a list of status codes instead of fields changed
daurnimator <quae@daurnimator.com>
parents:
6202
diff
changeset
|
891 msg:up(); |
6215
1dd09dc04945
plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents:
6214
diff
changeset
|
892 self:broadcast_message(msg); |
6202
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
893 end |
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
894 else |
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
895 origin.send(st.error_reply(stanza, "cancel", "bad-request", "Not a submitted form")); |
5808
026367992a0f
mod_muc: Support for locking newly-created rooms until they are configured (enabled with muc_room_locking = true)
Matthew Wild <mwild1@gmail.com>
parents:
5776
diff
changeset
|
896 end |
6202
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
897 return true; |
1754
67b66eec9777
MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents:
1753
diff
changeset
|
898 end |
67b66eec9777
MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents:
1753
diff
changeset
|
899 |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
900 -- Removes everyone from the room |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
901 function room_mt:clear(x) |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
902 x = x or st.stanza("x", {xmlns='http://jabber.org/protocol/muc#user'}); |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
903 local occupants_updated = {}; |
7089
890f4b2cc444
MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents:
7013
diff
changeset
|
904 for nick, occupant in self:each_occupant() do -- luacheck: ignore 213 |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
905 occupant.role = nil; |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
906 self:save_occupant(occupant); |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
907 occupants_updated[occupant] = true; |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
908 end |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
909 for occupant in pairs(occupants_updated) do |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
910 self:publicise_occupant_status(occupant, x); |
10048
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
911 module:fire_event("muc-occupant-left", { |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
912 room = self; |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
913 nick = occupant.nick; |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
914 occupant = occupant; |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
915 }); |
2412
e243b7c81de6
Added notification of configuration changes for MUCs
Rob Hoelz <rob@hoelzro.net>
parents:
2411
diff
changeset
|
916 end |
1754
67b66eec9777
MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents:
1753
diff
changeset
|
917 end |
67b66eec9777
MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents:
1753
diff
changeset
|
918 |
2217
838f6d546177
MUC: Added support for the room-destroy owner use case.
Waqas Hussain <waqas20@gmail.com>
parents:
2216
diff
changeset
|
919 function room_mt:destroy(newjid, reason, password) |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
920 local x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user"}) |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
921 :tag("destroy", {jid=newjid}); |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
922 if reason then x:tag("reason"):text(reason):up(); end |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
923 if password then x:tag("password"):text(password):up(); end |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
924 x:up(); |
9007
695904638cfa
MUC: Flag rooms being destroyed (fixes #887)
Kim Alvefur <zash@zash.se>
parents:
9003
diff
changeset
|
925 self.destroying = reason or true; |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
926 self:clear(x); |
9011
ce8e5206aeba
MUC: Include destruction reason and other info in destroyed event
Kim Alvefur <zash@zash.se>
parents:
9007
diff
changeset
|
927 module:fire_event("muc-room-destroyed", { room = self, reason = reason, newjid = newjid, password = password }); |
7684
65ba769d9f05
MUC: Return 'true' from room:destroy() so that use from the telnet console says 'OK'
Kim Alvefur <zash@zash.se>
parents:
7443
diff
changeset
|
928 return true; |
1754
67b66eec9777
MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents:
1753
diff
changeset
|
929 end |
67b66eec9777
MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents:
1753
diff
changeset
|
930 |
6101
a861dc18e08d
plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents:
6100
diff
changeset
|
931 function room_mt:handle_disco_info_get_query(origin, stanza) |
a861dc18e08d
plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents:
6100
diff
changeset
|
932 origin.send(self:get_disco_info(stanza)); |
a861dc18e08d
plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents:
6100
diff
changeset
|
933 return true; |
a861dc18e08d
plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents:
6100
diff
changeset
|
934 end |
8791
8da11142fabf
muc: Allow clients to change multiple affiliations or roles at once (#345)
Lennart Sauerbeck <devel@lennart.sauerbeck.org>
parents:
8590
diff
changeset
|
935 |
6101
a861dc18e08d
plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents:
6100
diff
changeset
|
936 function room_mt:handle_disco_items_get_query(origin, stanza) |
a861dc18e08d
plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents:
6100
diff
changeset
|
937 origin.send(self:get_disco_items(stanza)); |
a861dc18e08d
plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents:
6100
diff
changeset
|
938 return true; |
a861dc18e08d
plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents:
6100
diff
changeset
|
939 end |
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
940 |
6141
bf6de8ef66c2
plugins/muc: Rename admin query hook
daurnimator <quae@daurnimator.com>
parents:
6140
diff
changeset
|
941 function room_mt:handle_admin_query_set_command(origin, stanza) |
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
942 local item = stanza.tags[1].tags[1]; |
6909
494938dec5d8
MUC: Reject muc:admin query with missing <item> child
Kim Alvefur <zash@zash.se>
parents:
6835
diff
changeset
|
943 if not item then |
494938dec5d8
MUC: Reject muc:admin query with missing <item> child
Kim Alvefur <zash@zash.se>
parents:
6835
diff
changeset
|
944 origin.send(st.error_reply(stanza, "cancel", "bad-request")); |
9640
28d4b9d5a432
MUC: Fix traceback on muc#admin query with missing <item> child (#1242)
Kim Alvefur <zash@zash.se>
parents:
9613
diff
changeset
|
945 return true; |
6909
494938dec5d8
MUC: Reject muc:admin query with missing <item> child
Kim Alvefur <zash@zash.se>
parents:
6835
diff
changeset
|
946 end |
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
947 if item.attr.jid then -- Validate provided JID |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
948 item.attr.jid = jid_prep(item.attr.jid); |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
949 if not item.attr.jid then |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
950 origin.send(st.error_reply(stanza, "modify", "jid-malformed")); |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
951 return true; |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
952 end |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
953 end |
9263
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
954 if item.attr.nick then -- Validate provided nick |
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
955 item.attr.nick = resourceprep(item.attr.nick); |
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
956 if not item.attr.nick then |
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
957 origin.send(st.error_reply(stanza, "modify", "jid-malformed", "invalid nickname")); |
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
958 return true; |
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
959 end |
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
960 end |
9081
ce57c69a20e2
MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents:
9057
diff
changeset
|
961 if not item.attr.jid and item.attr.nick then |
ce57c69a20e2
MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents:
9057
diff
changeset
|
962 -- COMPAT Workaround for Miranda sending 'nick' instead of 'jid' when changing affiliation |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
963 local occupant = self:get_occupant_by_nick(self.jid.."/"..item.attr.nick); |
9530
3bc5c22e2ca4
MUC: Use the bare JID when performing a lookup for COMPAT with clients that don't set it (fixes #1224)
Matthew Wild <mwild1@gmail.com>
parents:
9444
diff
changeset
|
964 if occupant then item.attr.jid = occupant.bare_jid; end |
9263
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
965 elseif item.attr.role and not item.attr.nick and item.attr.jid then |
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
966 -- Role changes should use nick, but we have a JID so pull the nick from that |
6119
c13f5d6b9b16
plugins/muc/muc.lib: Use `get_occupant_jid` method instead of indexing _jid_nick
daurnimator <quae@daurnimator.com>
parents:
6118
diff
changeset
|
967 local nick = self:get_occupant_jid(item.attr.jid); |
8856 | 968 if nick then item.attr.nick = jid_resource(nick); end |
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
969 end |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
970 local actor = stanza.attr.from; |
6112
819e00a86239
plugins/muc/muc.lib: Use more modern stanza methods
daurnimator <quae@daurnimator.com>
parents:
6111
diff
changeset
|
971 local reason = item:get_child_text("reason"); |
6181
6baa9a59aa03
plugins/muc/muc.lib: Remove callback parameter from set_role and set_affiliation
daurnimator <quae@daurnimator.com>
parents:
6180
diff
changeset
|
972 local success, errtype, err |
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
973 if item.attr.affiliation and item.attr.jid and not item.attr.role then |
9263
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
974 local registration_data; |
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
975 if item.attr.nick then |
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
976 local room_nick = self.jid.."/"..item.attr.nick; |
9315
a47bba3b35f3
MUC: Don't kick user of a reserved nick if it's theirs (thanks pep.)
Matthew Wild <mwild1@gmail.com>
parents:
9312
diff
changeset
|
977 local existing_occupant = self:get_occupant_by_nick(room_nick); |
a47bba3b35f3
MUC: Don't kick user of a reserved nick if it's theirs (thanks pep.)
Matthew Wild <mwild1@gmail.com>
parents:
9312
diff
changeset
|
978 if existing_occupant and existing_occupant.bare_jid ~= item.attr.jid then |
a47bba3b35f3
MUC: Don't kick user of a reserved nick if it's theirs (thanks pep.)
Matthew Wild <mwild1@gmail.com>
parents:
9312
diff
changeset
|
979 module:log("debug", "Existing occupant for %s: %s does not match %s", room_nick, existing_occupant.bare_jid, item.attr.jid); |
9263
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
980 self:set_role(true, room_nick, nil, "This nickname is reserved"); |
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
981 end |
9315
a47bba3b35f3
MUC: Don't kick user of a reserved nick if it's theirs (thanks pep.)
Matthew Wild <mwild1@gmail.com>
parents:
9312
diff
changeset
|
982 module:log("debug", "Reserving %s for %s (%s)", item.attr.nick, item.attr.jid, item.attr.affiliation); |
9263
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
983 registration_data = { reserved_nickname = item.attr.nick }; |
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
984 end |
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
985 success, errtype, err = self:set_affiliation(actor, item.attr.jid, item.attr.affiliation, reason, registration_data); |
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
986 elseif item.attr.role and item.attr.nick and not item.attr.affiliation then |
6181
6baa9a59aa03
plugins/muc/muc.lib: Remove callback parameter from set_role and set_affiliation
daurnimator <quae@daurnimator.com>
parents:
6180
diff
changeset
|
987 success, errtype, err = self:set_role(actor, self.jid.."/"..item.attr.nick, item.attr.role, reason); |
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
988 else |
6181
6baa9a59aa03
plugins/muc/muc.lib: Remove callback parameter from set_role and set_affiliation
daurnimator <quae@daurnimator.com>
parents:
6180
diff
changeset
|
989 success, errtype, err = nil, "cancel", "bad-request"; |
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
990 end |
7414
1b62c89014c4
MUC: Separate force-save parameter from save-entire-state flag
Kim Alvefur <zash@zash.se>
parents:
7413
diff
changeset
|
991 self:save(true); |
6828
9019bc4c9a5a
MUC: Prevent double replies when MUC affiliation/role change requests fail.
Lance Stout <lancestout@gmail.com>
parents:
6827
diff
changeset
|
992 if not success then |
9019bc4c9a5a
MUC: Prevent double replies when MUC affiliation/role change requests fail.
Lance Stout <lancestout@gmail.com>
parents:
6827
diff
changeset
|
993 origin.send(st.error_reply(stanza, errtype, err)); |
9019bc4c9a5a
MUC: Prevent double replies when MUC affiliation/role change requests fail.
Lance Stout <lancestout@gmail.com>
parents:
6827
diff
changeset
|
994 else |
9019bc4c9a5a
MUC: Prevent double replies when MUC affiliation/role change requests fail.
Lance Stout <lancestout@gmail.com>
parents:
6827
diff
changeset
|
995 origin.send(st.reply(stanza)); |
9019bc4c9a5a
MUC: Prevent double replies when MUC affiliation/role change requests fail.
Lance Stout <lancestout@gmail.com>
parents:
6827
diff
changeset
|
996 end |
6181
6baa9a59aa03
plugins/muc/muc.lib: Remove callback parameter from set_role and set_affiliation
daurnimator <quae@daurnimator.com>
parents:
6180
diff
changeset
|
997 return true; |
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
998 end |
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
999 |
6141
bf6de8ef66c2
plugins/muc: Rename admin query hook
daurnimator <quae@daurnimator.com>
parents:
6140
diff
changeset
|
1000 function room_mt:handle_admin_query_get_command(origin, stanza) |
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1001 local actor = stanza.attr.from; |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1002 local affiliation = self:get_affiliation(actor); |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1003 local item = stanza.tags[1].tags[1]; |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1004 local _aff = item.attr.affiliation; |
6453
14b62ad88d8a
plugins/muc/muc.lib: Validate affiliations and roles to admin query get
daurnimator <quae@daurnimator.com>
parents:
6452
diff
changeset
|
1005 local _aff_rank = valid_affiliations[_aff or "none"]; |
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1006 local _rol = item.attr.role; |
6453
14b62ad88d8a
plugins/muc/muc.lib: Validate affiliations and roles to admin query get
daurnimator <quae@daurnimator.com>
parents:
6452
diff
changeset
|
1007 if _aff and _aff_rank and not _rol then |
9615 | 1008 -- You need to be at least an admin, and be requesting info about your affiliation or lower |
6453
14b62ad88d8a
plugins/muc/muc.lib: Validate affiliations and roles to admin query get
daurnimator <quae@daurnimator.com>
parents:
6452
diff
changeset
|
1009 -- e.g. an admin can't ask for a list of owners |
6827
19c4532946b3
MUC: Fix traceback in request for MUC affiliation lists by non-affiliated (thanks Lance)
Kim Alvefur <zash@zash.se>
parents:
6801
diff
changeset
|
1010 local affiliation_rank = valid_affiliations[affiliation or "none"]; |
9612
abf9bacf77d4
MUC: Clarify condition with parenthesis
Kim Alvefur <zash@zash.se>
parents:
9599
diff
changeset
|
1011 if (affiliation_rank >= valid_affiliations.admin and affiliation_rank >= _aff_rank) |
9613
4d7b925652d9
MUC: Allow anyone read access to all affiliation lists in non-anonymous rooms (fixes #1230)
Kim Alvefur <zash@zash.se>
parents:
9612
diff
changeset
|
1012 or (self:get_whois() == "anyone") then |
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1013 local reply = st.reply(stanza):query("http://jabber.org/protocol/muc#admin"); |
6478
413923bbd1a0
plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents:
6476
diff
changeset
|
1014 for jid in self:each_affiliation(_aff or "none") do |
9312
6cab07323274
MUC: Include 'nick' attribute in affiliation lists (thanks jc)
Matthew Wild <mwild1@gmail.com>
parents:
9299
diff
changeset
|
1015 local nick = self:get_registered_nick(jid); |
6cab07323274
MUC: Include 'nick' attribute in affiliation lists (thanks jc)
Matthew Wild <mwild1@gmail.com>
parents:
9299
diff
changeset
|
1016 reply:tag("item", {affiliation = _aff, jid = jid, nick = nick }):up(); |
1742
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
1017 end |
6452
e692ea8c09a0
plugins/muc/muc.lib: Add missing :up()
daurnimator <quae@daurnimator.com>
parents:
6451
diff
changeset
|
1018 origin.send(reply:up()); |
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1019 return true; |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1020 else |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1021 origin.send(st.error_reply(stanza, "auth", "forbidden")); |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1022 return true; |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1023 end |
6453
14b62ad88d8a
plugins/muc/muc.lib: Validate affiliations and roles to admin query get
daurnimator <quae@daurnimator.com>
parents:
6452
diff
changeset
|
1024 elseif _rol and valid_roles[_rol or "none"] and not _aff then |
6126
122e0f26e8f6
plugins/muc/muc.lib: Use `get_role` in `handle_admin_item_get_command`. Removed a TODO that's already done
daurnimator <quae@daurnimator.com>
parents:
6125
diff
changeset
|
1025 local role = self:get_role(self:get_occupant_jid(actor)) or self:get_default_role(affiliation); |
6219
a90159cfa530
plugins/muc/muc.lib: Fix getting a list of occupants by role (it was sending presences instead of items inside an iq)
daurnimator <quae@daurnimator.com>
parents:
6218
diff
changeset
|
1026 if valid_roles[role or "none"] >= valid_roles.moderator then |
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1027 if _rol == "none" then _rol = nil; end |
6219
a90159cfa530
plugins/muc/muc.lib: Fix getting a list of occupants by role (it was sending presences instead of items inside an iq)
daurnimator <quae@daurnimator.com>
parents:
6218
diff
changeset
|
1028 local reply = st.reply(stanza):query("http://jabber.org/protocol/muc#admin"); |
a90159cfa530
plugins/muc/muc.lib: Fix getting a list of occupants by role (it was sending presences instead of items inside an iq)
daurnimator <quae@daurnimator.com>
parents:
6218
diff
changeset
|
1029 -- TODO: whois check here? (though fully anonymous rooms are not supported) |
a90159cfa530
plugins/muc/muc.lib: Fix getting a list of occupants by role (it was sending presences instead of items inside an iq)
daurnimator <quae@daurnimator.com>
parents:
6218
diff
changeset
|
1030 for occupant_jid, occupant in self:each_occupant() do |
a90159cfa530
plugins/muc/muc.lib: Fix getting a list of occupants by role (it was sending presences instead of items inside an iq)
daurnimator <quae@daurnimator.com>
parents:
6218
diff
changeset
|
1031 if occupant.role == _rol then |
8856 | 1032 local nick = jid_resource(occupant_jid); |
6219
a90159cfa530
plugins/muc/muc.lib: Fix getting a list of occupants by role (it was sending presences instead of items inside an iq)
daurnimator <quae@daurnimator.com>
parents:
6218
diff
changeset
|
1033 self:build_item_list(occupant, reply, false, nick); |
2217
838f6d546177
MUC: Added support for the room-destroy owner use case.
Waqas Hussain <waqas20@gmail.com>
parents:
2216
diff
changeset
|
1034 end |
2216
dbbb5ed41365
MUC: Slightly refactored form processing.
Waqas Hussain <waqas20@gmail.com>
parents:
2174
diff
changeset
|
1035 end |
6219
a90159cfa530
plugins/muc/muc.lib: Fix getting a list of occupants by role (it was sending presences instead of items inside an iq)
daurnimator <quae@daurnimator.com>
parents:
6218
diff
changeset
|
1036 origin.send(reply:up()); |
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1037 return true; |
1734 | 1038 else |
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1039 origin.send(st.error_reply(stanza, "auth", "forbidden")); |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1040 return true; |
2005
478ba7e85862
MUC: Rewrote code for mediated invites to be more robust, and to support legacy clients.
Waqas Hussain <waqas20@gmail.com>
parents:
1999
diff
changeset
|
1041 end |
1734 | 1042 else |
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1043 origin.send(st.error_reply(stanza, "cancel", "bad-request")); |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1044 return true; |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1045 end |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1046 end |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1047 |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1048 function room_mt:handle_owner_query_get_to_room(origin, stanza) |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1049 if self:get_affiliation(stanza.attr.from) ~= "owner" then |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1050 origin.send(st.error_reply(stanza, "auth", "forbidden", "Only owners can configure rooms")); |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1051 return true; |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1052 end |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1053 |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1054 self:send_form(origin, stanza); |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1055 return true; |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1056 end |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1057 function room_mt:handle_owner_query_set_to_room(origin, stanza) |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1058 if self:get_affiliation(stanza.attr.from) ~= "owner" then |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1059 origin.send(st.error_reply(stanza, "auth", "forbidden", "Only owners can configure rooms")); |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1060 return true; |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1061 end |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1062 |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1063 local child = stanza.tags[1].tags[1]; |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1064 if not child then |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1065 origin.send(st.error_reply(stanza, "modify", "bad-request")); |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1066 return true; |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1067 elseif child.name == "destroy" then |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1068 local newjid = child.attr.jid; |
6112
819e00a86239
plugins/muc/muc.lib: Use more modern stanza methods
daurnimator <quae@daurnimator.com>
parents:
6111
diff
changeset
|
1069 local reason = child:get_child_text("reason"); |
819e00a86239
plugins/muc/muc.lib: Use more modern stanza methods
daurnimator <quae@daurnimator.com>
parents:
6111
diff
changeset
|
1070 local password = child:get_child_text("password"); |
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1071 self:destroy(newjid, reason, password); |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1072 origin.send(st.reply(stanza)); |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1073 return true; |
6202
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
1074 elseif child.name == "x" and child.attr.xmlns == "jabber:x:data" then |
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
1075 return self:process_form(origin, stanza); |
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1076 else |
1734 | 1077 origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); |
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1078 return true; |
1734 | 1079 end |
1080 end | |
1081 | |
6093
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1082 function room_mt:handle_groupchat_to_room(origin, stanza) |
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1083 local from = stanza.attr.from; |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1084 local occupant = self:get_occupant_by_real_jid(from); |
9761
8e83f90bf96b
MUC: add ID to message if no ID is present
Jonas Wielicki <jonas@wielicki.name>
parents:
9719
diff
changeset
|
1085 if not stanza.attr.id then |
9766
f40b9649e929
MUC: Rename import to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents:
9761
diff
changeset
|
1086 stanza.attr.id = new_id() |
9761
8e83f90bf96b
MUC: add ID to message if no ID is present
Jonas Wielicki <jonas@wielicki.name>
parents:
9719
diff
changeset
|
1087 end |
6429
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1088 if module:fire_event("muc-occupant-groupchat", { |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1089 room = self; origin = origin; stanza = stanza; from = from; occupant = occupant; |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1090 }) then return true; end |
6223
2a7ce69844ca
plugins/muc/muc.lib: Refactor subject logic; fix bug of mixed up subject/author
daurnimator <quae@daurnimator.com>
parents:
6222
diff
changeset
|
1091 stanza.attr.from = occupant.nick; |
2a7ce69844ca
plugins/muc/muc.lib: Refactor subject logic; fix bug of mixed up subject/author
daurnimator <quae@daurnimator.com>
parents:
6222
diff
changeset
|
1092 self:broadcast_message(stanza); |
2a7ce69844ca
plugins/muc/muc.lib: Refactor subject logic; fix bug of mixed up subject/author
daurnimator <quae@daurnimator.com>
parents:
6222
diff
changeset
|
1093 stanza.attr.from = from; |
2a7ce69844ca
plugins/muc/muc.lib: Refactor subject logic; fix bug of mixed up subject/author
daurnimator <quae@daurnimator.com>
parents:
6222
diff
changeset
|
1094 return true; |
6093
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1095 end |
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1096 |
6429
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1097 -- Role check |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1098 module:hook("muc-occupant-groupchat", function(event) |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1099 local role_rank = valid_roles[event.occupant and event.occupant.role or "none"]; |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1100 if role_rank <= valid_roles.none then |
9819
11671a2e07a9
MUC: Add error message to error bounces when not joined to room
Matthew Wild <mwild1@gmail.com>
parents:
9718
diff
changeset
|
1101 event.origin.send(st.error_reply(event.stanza, "cancel", "not-acceptable", "You are not currently connected to this chat")); |
6429
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1102 return true; |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1103 elseif role_rank <= valid_roles.visitor then |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1104 event.origin.send(st.error_reply(event.stanza, "auth", "forbidden")); |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1105 return true; |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1106 end |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1107 end, 50); |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1108 |
6093
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1109 -- hack - some buggy clients send presence updates to the room rather than their nick |
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1110 function room_mt:handle_presence_to_room(origin, stanza) |
6119
c13f5d6b9b16
plugins/muc/muc.lib: Use `get_occupant_jid` method instead of indexing _jid_nick
daurnimator <quae@daurnimator.com>
parents:
6118
diff
changeset
|
1111 local current_nick = self:get_occupant_jid(stanza.attr.from); |
6100
c78ba94d3261
plugins/muc/muc.lib: Move all kick code into one place
daurnimator <quae@daurnimator.com>
parents:
6099
diff
changeset
|
1112 local handled |
6093
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1113 if current_nick then |
1734 | 1114 local to = stanza.attr.to; |
6093
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1115 stanza.attr.to = current_nick; |
6100
c78ba94d3261
plugins/muc/muc.lib: Move all kick code into one place
daurnimator <quae@daurnimator.com>
parents:
6099
diff
changeset
|
1116 handled = self:handle_presence_to_occupant(origin, stanza); |
6093
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1117 stanza.attr.to = to; |
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1118 end |
6100
c78ba94d3261
plugins/muc/muc.lib: Move all kick code into one place
daurnimator <quae@daurnimator.com>
parents:
6099
diff
changeset
|
1119 return handled; |
6093
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1120 end |
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1121 |
6195
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1122 -- Need visitor role or higher to invite |
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1123 module:hook("muc-pre-invite", function(event) |
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1124 local room, stanza = event.room, event.stanza; |
7089
890f4b2cc444
MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents:
7013
diff
changeset
|
1125 local _from = stanza.attr.from; |
6195
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1126 local inviter = room:get_occupant_by_real_jid(_from); |
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1127 local role = inviter and inviter.role or room:get_default_role(room:get_affiliation(_from)); |
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1128 if valid_roles[role or "none"] <= valid_roles.visitor then |
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1129 event.origin.send(st.error_reply(stanza, "auth", "forbidden")); |
6103
25ba4e2b31b3
plugins/muc/muc: Check for mediated invites in a smarter way
daurnimator <quae@daurnimator.com>
parents:
6102
diff
changeset
|
1130 return true; |
25ba4e2b31b3
plugins/muc/muc: Check for mediated invites in a smarter way
daurnimator <quae@daurnimator.com>
parents:
6102
diff
changeset
|
1131 end |
6195
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1132 end); |
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1133 |
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1134 function room_mt:handle_mediated_invite(origin, stanza) |
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1135 local payload = stanza:get_child("x", "http://jabber.org/protocol/muc#user"):get_child("invite"); |
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1136 local invitee = jid_prep(payload.attr.to); |
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1137 if not invitee then |
6093
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1138 origin.send(st.error_reply(stanza, "cancel", "jid-malformed")); |
6098
1d7e5d091980
plugins/muc/muc.lib: Add some missing return values
daurnimator <quae@daurnimator.com>
parents:
6097
diff
changeset
|
1139 return true; |
6229
8aa59b73f801
plugins/muc/muc.lib: Remove reversed conditionals when firing pre- events
daurnimator <quae@daurnimator.com>
parents:
6227
diff
changeset
|
1140 elseif module:fire_event("muc-pre-invite", {room = self, origin = origin, stanza = stanza}) then |
6195
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1141 return true; |
6093
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1142 end |
6272
90054f21d1af
plugins/muc/muc: When forwarding mediated invites; use filtered version of original invite instead of new object
daurnimator <quae@daurnimator.com>
parents:
6269
diff
changeset
|
1143 local invite = muc_util.filter_muc_x(st.clone(stanza)); |
90054f21d1af
plugins/muc/muc: When forwarding mediated invites; use filtered version of original invite instead of new object
daurnimator <quae@daurnimator.com>
parents:
6269
diff
changeset
|
1144 invite.attr.from = self.jid; |
90054f21d1af
plugins/muc/muc: When forwarding mediated invites; use filtered version of original invite instead of new object
daurnimator <quae@daurnimator.com>
parents:
6269
diff
changeset
|
1145 invite.attr.to = invitee; |
90054f21d1af
plugins/muc/muc: When forwarding mediated invites; use filtered version of original invite instead of new object
daurnimator <quae@daurnimator.com>
parents:
6269
diff
changeset
|
1146 invite:tag('x', {xmlns='http://jabber.org/protocol/muc#user'}) |
6195
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1147 :tag('invite', {from = stanza.attr.from;}) |
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1148 :tag('reason'):text(payload:get_child_text("reason")):up() |
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1149 :up() |
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1150 :up(); |
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1151 if not module:fire_event("muc-invite", {room = self, stanza = invite, origin = origin, incoming = stanza}) then |
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1152 self:route_stanza(invite); |
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1153 end |
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1154 return true; |
6093
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1155 end |
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1156 |
6194
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1157 -- COMPAT: Some older clients expect this |
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1158 module:hook("muc-invite", function(event) |
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1159 local room, stanza = event.room, event.stanza; |
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1160 local invite = stanza:get_child("x", "http://jabber.org/protocol/muc#user"):get_child("invite"); |
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1161 local reason = invite:get_child_text("reason"); |
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1162 stanza:tag('x', {xmlns = "jabber:x:conference"; jid = room.jid;}) |
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1163 :text(reason or "") |
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1164 :up(); |
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1165 end); |
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1166 |
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1167 -- Add a plain message for clients which don't support invites |
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1168 module:hook("muc-invite", function(event) |
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1169 local room, stanza = event.room, event.stanza; |
6274
77bdbaec3b7f
plugins/muc/muc.lib: Don't add invite/decline bodies if they already have one
daurnimator <quae@daurnimator.com>
parents:
6273
diff
changeset
|
1170 if not stanza:get_child("body") then |
77bdbaec3b7f
plugins/muc/muc.lib: Don't add invite/decline bodies if they already have one
daurnimator <quae@daurnimator.com>
parents:
6273
diff
changeset
|
1171 local invite = stanza:get_child("x", "http://jabber.org/protocol/muc#user"):get_child("invite"); |
77bdbaec3b7f
plugins/muc/muc.lib: Don't add invite/decline bodies if they already have one
daurnimator <quae@daurnimator.com>
parents:
6273
diff
changeset
|
1172 local reason = invite:get_child_text("reason") or ""; |
77bdbaec3b7f
plugins/muc/muc.lib: Don't add invite/decline bodies if they already have one
daurnimator <quae@daurnimator.com>
parents:
6273
diff
changeset
|
1173 stanza:tag("body") |
9056
37e287113a8d
MUC: Fix inverted logic ()
Matthew Wild <mwild1@gmail.com>
parents:
9055
diff
changeset
|
1174 :text(invite.attr.from.." invited you to the room "..room.jid..(reason ~= "" and (" ("..reason..")") or "")) |
6274
77bdbaec3b7f
plugins/muc/muc.lib: Don't add invite/decline bodies if they already have one
daurnimator <quae@daurnimator.com>
parents:
6273
diff
changeset
|
1175 :up(); |
77bdbaec3b7f
plugins/muc/muc.lib: Don't add invite/decline bodies if they already have one
daurnimator <quae@daurnimator.com>
parents:
6273
diff
changeset
|
1176 end |
6194
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1177 end); |
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1178 |
6123
7f82bbd249fe
plugins/muc/muc.lib: Remove `payload` argument from `handle_mediated_*`; extract it from inside.
daurnimator <quae@daurnimator.com>
parents:
6122
diff
changeset
|
1179 function room_mt:handle_mediated_decline(origin, stanza) |
6196
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1180 local payload = stanza:get_child("x", "http://jabber.org/protocol/muc#user"):get_child("decline"); |
6105
68f53b9a186e
plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents:
6104
diff
changeset
|
1181 local declinee = jid_prep(payload.attr.to); |
6196
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1182 if not declinee then |
6105
68f53b9a186e
plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents:
6104
diff
changeset
|
1183 origin.send(st.error_reply(stanza, "cancel", "jid-malformed")); |
68f53b9a186e
plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents:
6104
diff
changeset
|
1184 return true; |
6229
8aa59b73f801
plugins/muc/muc.lib: Remove reversed conditionals when firing pre- events
daurnimator <quae@daurnimator.com>
parents:
6227
diff
changeset
|
1185 elseif module:fire_event("muc-pre-decline", {room = self, origin = origin, stanza = stanza}) then |
6196
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1186 return true; |
6105
68f53b9a186e
plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents:
6104
diff
changeset
|
1187 end |
6273
7ef064101994
plugins/muc/muc.lib: Use original decline as template for medated decline
daurnimator <quae@daurnimator.com>
parents:
6272
diff
changeset
|
1188 local decline = muc_util.filter_muc_x(st.clone(stanza)); |
7ef064101994
plugins/muc/muc.lib: Use original decline as template for medated decline
daurnimator <quae@daurnimator.com>
parents:
6272
diff
changeset
|
1189 decline.attr.from = self.jid; |
7ef064101994
plugins/muc/muc.lib: Use original decline as template for medated decline
daurnimator <quae@daurnimator.com>
parents:
6272
diff
changeset
|
1190 decline.attr.to = declinee; |
7ef064101994
plugins/muc/muc.lib: Use original decline as template for medated decline
daurnimator <quae@daurnimator.com>
parents:
6272
diff
changeset
|
1191 decline:tag("x", {xmlns = "http://jabber.org/protocol/muc#user"}) |
6196
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1192 :tag("decline", {from = stanza.attr.from}) |
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1193 :tag("reason"):text(payload:get_child_text("reason")):up() |
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1194 :up() |
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1195 :up(); |
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1196 if not module:fire_event("muc-decline", {room = self, stanza = decline, origin = origin, incoming = stanza}) then |
7089
890f4b2cc444
MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents:
7013
diff
changeset
|
1197 declinee = decline.attr.to; -- re-fetch, in case event modified it |
6275
d891fa02e5e5
plugins/muc/muc.lib: Deliver declines to in-room jids correctly
daurnimator <quae@daurnimator.com>
parents:
6274
diff
changeset
|
1198 local occupant |
d891fa02e5e5
plugins/muc/muc.lib: Deliver declines to in-room jids correctly
daurnimator <quae@daurnimator.com>
parents:
6274
diff
changeset
|
1199 if jid_bare(declinee) == self.jid then -- declinee jid is already an in-room jid |
d891fa02e5e5
plugins/muc/muc.lib: Deliver declines to in-room jids correctly
daurnimator <quae@daurnimator.com>
parents:
6274
diff
changeset
|
1200 occupant = self:get_occupant_by_nick(declinee); |
d891fa02e5e5
plugins/muc/muc.lib: Deliver declines to in-room jids correctly
daurnimator <quae@daurnimator.com>
parents:
6274
diff
changeset
|
1201 end |
6196
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1202 if occupant then |
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1203 self:route_to_occupant(occupant, decline); |
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1204 else |
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1205 self:route_stanza(decline); |
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1206 end |
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1207 end |
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1208 return true; |
6105
68f53b9a186e
plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents:
6104
diff
changeset
|
1209 end |
68f53b9a186e
plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents:
6104
diff
changeset
|
1210 |
6196
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1211 -- Add a plain message for clients which don't support declines |
6131
8dd0c6145603
plugins/muc/muc.lib: Add decline event for parity with invite
daurnimator <quae@daurnimator.com>
parents:
6130
diff
changeset
|
1212 module:hook("muc-decline", function(event) |
6196
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1213 local room, stanza = event.room, event.stanza; |
6274
77bdbaec3b7f
plugins/muc/muc.lib: Don't add invite/decline bodies if they already have one
daurnimator <quae@daurnimator.com>
parents:
6273
diff
changeset
|
1214 if not stanza:get_child("body") then |
77bdbaec3b7f
plugins/muc/muc.lib: Don't add invite/decline bodies if they already have one
daurnimator <quae@daurnimator.com>
parents:
6273
diff
changeset
|
1215 local decline = stanza:get_child("x", "http://jabber.org/protocol/muc#user"):get_child("decline"); |
77bdbaec3b7f
plugins/muc/muc.lib: Don't add invite/decline bodies if they already have one
daurnimator <quae@daurnimator.com>
parents:
6273
diff
changeset
|
1216 local reason = decline:get_child_text("reason") or ""; |
9081
ce57c69a20e2
MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents:
9057
diff
changeset
|
1217 stanza:body(decline.attr.from.." declined your invite to the room " |
ce57c69a20e2
MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents:
9057
diff
changeset
|
1218 ..room.jid..(reason ~= "" and (" ("..reason..")") or "")); |
6274
77bdbaec3b7f
plugins/muc/muc.lib: Don't add invite/decline bodies if they already have one
daurnimator <quae@daurnimator.com>
parents:
6273
diff
changeset
|
1219 end |
6196
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1220 end); |
6131
8dd0c6145603
plugins/muc/muc.lib: Add decline event for parity with invite
daurnimator <quae@daurnimator.com>
parents:
6130
diff
changeset
|
1221 |
6093
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1222 function room_mt:handle_message_to_room(origin, stanza) |
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1223 local type = stanza.attr.type; |
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1224 if type == "groupchat" then |
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1225 return self:handle_groupchat_to_room(origin, stanza) |
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1226 elseif type == "error" and is_kickable_error(stanza) then |
6100
c78ba94d3261
plugins/muc/muc.lib: Move all kick code into one place
daurnimator <quae@daurnimator.com>
parents:
6099
diff
changeset
|
1227 return self:handle_kickable(origin, stanza) |
8526
f1a46eef9df1
MUC: Treat missing type and type=normal the same
Kim Alvefur <zash@zash.se>
parents:
8519
diff
changeset
|
1228 elseif type == nil or type == "normal" then |
6103
25ba4e2b31b3
plugins/muc/muc: Check for mediated invites in a smarter way
daurnimator <quae@daurnimator.com>
parents:
6102
diff
changeset
|
1229 local x = stanza:get_child("x", "http://jabber.org/protocol/muc#user"); |
25ba4e2b31b3
plugins/muc/muc: Check for mediated invites in a smarter way
daurnimator <quae@daurnimator.com>
parents:
6102
diff
changeset
|
1230 if x then |
25ba4e2b31b3
plugins/muc/muc: Check for mediated invites in a smarter way
daurnimator <quae@daurnimator.com>
parents:
6102
diff
changeset
|
1231 local payload = x.tags[1]; |
7089
890f4b2cc444
MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents:
7013
diff
changeset
|
1232 if payload == nil then --luacheck: ignore 542 |
6104
260a18062cb2
plugins/muc/muc: Rename `handle_invite_to_room` to `handle_mediated_invite`; clean up logic
daurnimator <quae@daurnimator.com>
parents:
6103
diff
changeset
|
1233 -- fallthrough |
260a18062cb2
plugins/muc/muc: Rename `handle_invite_to_room` to `handle_mediated_invite`; clean up logic
daurnimator <quae@daurnimator.com>
parents:
6103
diff
changeset
|
1234 elseif payload.name == "invite" and payload.attr.to then |
6123
7f82bbd249fe
plugins/muc/muc.lib: Remove `payload` argument from `handle_mediated_*`; extract it from inside.
daurnimator <quae@daurnimator.com>
parents:
6122
diff
changeset
|
1235 return self:handle_mediated_invite(origin, stanza) |
6105
68f53b9a186e
plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents:
6104
diff
changeset
|
1236 elseif payload.name == "decline" and payload.attr.to then |
6123
7f82bbd249fe
plugins/muc/muc.lib: Remove `payload` argument from `handle_mediated_*`; extract it from inside.
daurnimator <quae@daurnimator.com>
parents:
6122
diff
changeset
|
1237 return self:handle_mediated_decline(origin, stanza) |
6103
25ba4e2b31b3
plugins/muc/muc: Check for mediated invites in a smarter way
daurnimator <quae@daurnimator.com>
parents:
6102
diff
changeset
|
1238 end |
2005
478ba7e85862
MUC: Rewrote code for mediated invites to be more robust, and to support legacy clients.
Waqas Hussain <waqas20@gmail.com>
parents:
1999
diff
changeset
|
1239 origin.send(st.error_reply(stanza, "cancel", "bad-request")); |
6098
1d7e5d091980
plugins/muc/muc.lib: Add some missing return values
daurnimator <quae@daurnimator.com>
parents:
6097
diff
changeset
|
1240 return true; |
2005
478ba7e85862
MUC: Rewrote code for mediated invites to be more robust, and to support legacy clients.
Waqas Hussain <waqas20@gmail.com>
parents:
1999
diff
changeset
|
1241 end |
8851
ab5f678f1376
MUC: Support MUC voice requests and approvals in moderated rooms (closes #655) (thanks to Lance Stout)
Kim Alvefur <zash@zash.se>
parents:
8843
diff
changeset
|
1242 |
ab5f678f1376
MUC: Support MUC voice requests and approvals in moderated rooms (closes #655) (thanks to Lance Stout)
Kim Alvefur <zash@zash.se>
parents:
8843
diff
changeset
|
1243 local form = stanza:get_child("x", "jabber:x:data"); |
8865
2a8bbfcb6868
MUC: Move voice request into its own lib
Kim Alvefur <zash@zash.se>
parents:
8861
diff
changeset
|
1244 local form_type = dataform.get_type(form); |
2a8bbfcb6868
MUC: Move voice request into its own lib
Kim Alvefur <zash@zash.se>
parents:
8861
diff
changeset
|
1245 if form_type == "http://jabber.org/protocol/muc#request" then |
2a8bbfcb6868
MUC: Move voice request into its own lib
Kim Alvefur <zash@zash.se>
parents:
8861
diff
changeset
|
1246 self:handle_role_request(origin, stanza, form); |
2a8bbfcb6868
MUC: Move voice request into its own lib
Kim Alvefur <zash@zash.se>
parents:
8861
diff
changeset
|
1247 return true; |
8851
ab5f678f1376
MUC: Support MUC voice requests and approvals in moderated rooms (closes #655) (thanks to Lance Stout)
Kim Alvefur <zash@zash.se>
parents:
8843
diff
changeset
|
1248 end |
1734 | 1249 end |
1250 end | |
1251 | |
7089
890f4b2cc444
MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents:
7013
diff
changeset
|
1252 function room_mt:route_stanza(stanza) -- luacheck: ignore 212 |
6180
35388114439f
plugins/muc/muc.lib: non-function changes (reordering, semicolons and comments)
daurnimator <quae@daurnimator.com>
parents:
6179
diff
changeset
|
1253 module:send(stanza); |
6111
f8b94903be52
plugins/muc: Provide a reasonable default `route_stanza`
daurnimator <quae@daurnimator.com>
parents:
6108
diff
changeset
|
1254 end |
1735
81406277279e
MUC: The MUC lib is now metatable based. Cleaned up code, etc.
Waqas Hussain <waqas20@gmail.com>
parents:
1734
diff
changeset
|
1255 |
1737
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1256 function room_mt:get_affiliation(jid) |
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1257 local node, host, resource = jid_split(jid); |
9081
ce57c69a20e2
MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents:
9057
diff
changeset
|
1258 -- Affiliations are granted, revoked, and maintained based on the user's bare JID. |
1737
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1259 local bare = node and node.."@"..host or host; |
9081
ce57c69a20e2
MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents:
9057
diff
changeset
|
1260 local result = self._affiliations[bare]; |
1737
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1261 if not result and self._affiliations[host] == "outcast" then result = "outcast"; end -- host banned |
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1262 return result; |
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1263 end |
6186
85f7cd91dc31
plugins/muc/muc.lib: Smarter validation in set_affiliation
daurnimator <quae@daurnimator.com>
parents:
6185
diff
changeset
|
1264 |
6478
413923bbd1a0
plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents:
6476
diff
changeset
|
1265 -- Iterates over jid, affiliation pairs |
413923bbd1a0
plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents:
6476
diff
changeset
|
1266 function room_mt:each_affiliation(with_affiliation) |
9531
f2d70dc13700
MUC: Include affiliation data when iterating over affiliations with a room
Matthew Wild <mwild1@gmail.com>
parents:
9530
diff
changeset
|
1267 local _affiliations, _affiliation_data = self._affiliations, self._affiliation_data; |
f2d70dc13700
MUC: Include affiliation data when iterating over affiliations with a room
Matthew Wild <mwild1@gmail.com>
parents:
9530
diff
changeset
|
1268 return function(_, jid) |
f2d70dc13700
MUC: Include affiliation data when iterating over affiliations with a room
Matthew Wild <mwild1@gmail.com>
parents:
9530
diff
changeset
|
1269 local affiliation; |
f2d70dc13700
MUC: Include affiliation data when iterating over affiliations with a room
Matthew Wild <mwild1@gmail.com>
parents:
9530
diff
changeset
|
1270 repeat -- Iterate until we get a match |
f2d70dc13700
MUC: Include affiliation data when iterating over affiliations with a room
Matthew Wild <mwild1@gmail.com>
parents:
9530
diff
changeset
|
1271 jid, affiliation = next(_affiliations, jid); |
f2d70dc13700
MUC: Include affiliation data when iterating over affiliations with a room
Matthew Wild <mwild1@gmail.com>
parents:
9530
diff
changeset
|
1272 until with_affiliation == nil or jid == nil or affiliation == with_affiliation |
f2d70dc13700
MUC: Include affiliation data when iterating over affiliations with a room
Matthew Wild <mwild1@gmail.com>
parents:
9530
diff
changeset
|
1273 return jid, affiliation, _affiliation_data[jid]; |
f2d70dc13700
MUC: Include affiliation data when iterating over affiliations with a room
Matthew Wild <mwild1@gmail.com>
parents:
9530
diff
changeset
|
1274 end, nil, nil; |
6478
413923bbd1a0
plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents:
6476
diff
changeset
|
1275 end |
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1276 |
9237
b86c2e135797
MUC: Add support for storing additional data with MUC affiliations
Matthew Wild <mwild1@gmail.com>
parents:
9194
diff
changeset
|
1277 function room_mt:set_affiliation(actor, jid, affiliation, reason, data) |
6186
85f7cd91dc31
plugins/muc/muc.lib: Smarter validation in set_affiliation
daurnimator <quae@daurnimator.com>
parents:
6185
diff
changeset
|
1278 if not actor then return nil, "modify", "not-acceptable"; end; |
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1279 |
6476
fb8a9873728b
plugins/muc/muc.lib: Kick users from outcast hosts
daurnimator <quae@daurnimator.com>
parents:
6475
diff
changeset
|
1280 local node, host, resource = jid_split(jid); |
fb8a9873728b
plugins/muc/muc.lib: Kick users from outcast hosts
daurnimator <quae@daurnimator.com>
parents:
6475
diff
changeset
|
1281 if not host then return nil, "modify", "not-acceptable"; end |
fb8a9873728b
plugins/muc/muc.lib: Kick users from outcast hosts
daurnimator <quae@daurnimator.com>
parents:
6475
diff
changeset
|
1282 jid = jid_join(node, host); -- Bare |
fb8a9873728b
plugins/muc/muc.lib: Kick users from outcast hosts
daurnimator <quae@daurnimator.com>
parents:
6475
diff
changeset
|
1283 local is_host_only = node == nil; |
6186
85f7cd91dc31
plugins/muc/muc.lib: Smarter validation in set_affiliation
daurnimator <quae@daurnimator.com>
parents:
6185
diff
changeset
|
1284 |
85f7cd91dc31
plugins/muc/muc.lib: Smarter validation in set_affiliation
daurnimator <quae@daurnimator.com>
parents:
6185
diff
changeset
|
1285 if valid_affiliations[affiliation or "none"] == nil then |
8842
463505cc75d5
MUC: Revert unstable MUC commits since 0.10.1
Matthew Wild <mwild1@gmail.com>
parents:
8839
diff
changeset
|
1286 return nil, "modify", "not-acceptable"; |
1742
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
1287 end |
6186
85f7cd91dc31
plugins/muc/muc.lib: Smarter validation in set_affiliation
daurnimator <quae@daurnimator.com>
parents:
6185
diff
changeset
|
1288 affiliation = affiliation ~= "none" and affiliation or nil; -- coerces `affiliation == false` to `nil` |
85f7cd91dc31
plugins/muc/muc.lib: Smarter validation in set_affiliation
daurnimator <quae@daurnimator.com>
parents:
6185
diff
changeset
|
1289 |
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1290 local target_affiliation = self._affiliations[jid]; -- Raw; don't want to check against host |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1291 local is_downgrade = valid_affiliations[target_affiliation or "none"] > valid_affiliations[affiliation or "none"]; |
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1292 |
6475
3c815a64042b
plugins/muc/muc.lib: Fix passing actor along as a boolean (thanks fippo)
daurnimator <quae@daurnimator.com>
parents:
6454
diff
changeset
|
1293 if actor == true then |
3c815a64042b
plugins/muc/muc.lib: Fix passing actor along as a boolean (thanks fippo)
daurnimator <quae@daurnimator.com>
parents:
6454
diff
changeset
|
1294 actor = nil -- So we can pass it safely to 'publicise_occupant_status' below |
3c815a64042b
plugins/muc/muc.lib: Fix passing actor along as a boolean (thanks fippo)
daurnimator <quae@daurnimator.com>
parents:
6454
diff
changeset
|
1295 else |
8842
463505cc75d5
MUC: Revert unstable MUC commits since 0.10.1
Matthew Wild <mwild1@gmail.com>
parents:
8839
diff
changeset
|
1296 local actor_affiliation = self:get_affiliation(actor); |
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1297 if actor_affiliation == "owner" then |
9718
81ef96368bff
MUC: Allow changing data attached to an only owner (fixes #1273)
Kim Alvefur <zash@zash.se>
parents:
9716
diff
changeset
|
1298 if jid_bare(actor) == jid and is_downgrade then -- self change |
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1299 -- need at least one owner |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1300 local is_last = true; |
6478
413923bbd1a0
plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents:
6476
diff
changeset
|
1301 for j in self:each_affiliation("owner") do |
413923bbd1a0
plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents:
6476
diff
changeset
|
1302 if j ~= jid then is_last = false; break; end |
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1303 end |
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1304 if is_last then |
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1305 return nil, "cancel", "conflict"; |
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1306 end |
4357
d6928b78c548
MUC: Allow affiliation change when argument actor==true in room:set_affiliation().
Waqas Hussain <waqas20@gmail.com>
parents:
4326
diff
changeset
|
1307 end |
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1308 -- owners can do anything else |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1309 elseif affiliation == "owner" or affiliation == "admin" |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1310 or actor_affiliation ~= "admin" |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1311 or target_affiliation == "owner" or target_affiliation == "admin" then |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1312 -- Can't demote owners or other admins |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1313 return nil, "cancel", "not-allowed"; |
8836
564e897f0790
MUC: reject non-bare JIDs in set_affiliation requests with not-acceptable
Jonas Wielicki <jonas@wielicki.name>
parents:
8835
diff
changeset
|
1314 end |
4202
dff7df4a191b
MUC: Don't limit affiliation changes to owners, and allow owners to remove themselves if they are not the last owner.
Waqas Hussain <waqas20@gmail.com>
parents:
4201
diff
changeset
|
1315 end |
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1316 |
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1317 -- Set in 'database' |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1318 self._affiliations[jid] = affiliation; |
9237
b86c2e135797
MUC: Add support for storing additional data with MUC affiliations
Matthew Wild <mwild1@gmail.com>
parents:
9194
diff
changeset
|
1319 if not affiliation or data == false or (data ~= nil and next(data) == nil) then |
b86c2e135797
MUC: Add support for storing additional data with MUC affiliations
Matthew Wild <mwild1@gmail.com>
parents:
9194
diff
changeset
|
1320 module:log("debug", "Clearing affiliation data for %s", jid); |
b86c2e135797
MUC: Add support for storing additional data with MUC affiliations
Matthew Wild <mwild1@gmail.com>
parents:
9194
diff
changeset
|
1321 self._affiliation_data[jid] = nil; |
b86c2e135797
MUC: Add support for storing additional data with MUC affiliations
Matthew Wild <mwild1@gmail.com>
parents:
9194
diff
changeset
|
1322 elseif data then |
b86c2e135797
MUC: Add support for storing additional data with MUC affiliations
Matthew Wild <mwild1@gmail.com>
parents:
9194
diff
changeset
|
1323 module:log("debug", "Updating affiliation data for %s", jid); |
b86c2e135797
MUC: Add support for storing additional data with MUC affiliations
Matthew Wild <mwild1@gmail.com>
parents:
9194
diff
changeset
|
1324 self._affiliation_data[jid] = data; |
b86c2e135797
MUC: Add support for storing additional data with MUC affiliations
Matthew Wild <mwild1@gmail.com>
parents:
9194
diff
changeset
|
1325 end |
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1326 |
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1327 -- Update roles |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1328 local role = self:get_default_role(affiliation); |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1329 local role_rank = valid_roles[role or "none"]; |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1330 local occupants_updated = {}; -- Filled with old roles |
7089
890f4b2cc444
MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents:
7013
diff
changeset
|
1331 for nick, occupant in self:each_occupant() do -- luacheck: ignore 213 |
6476
fb8a9873728b
plugins/muc/muc.lib: Kick users from outcast hosts
daurnimator <quae@daurnimator.com>
parents:
6475
diff
changeset
|
1332 if occupant.bare_jid == jid or ( |
fb8a9873728b
plugins/muc/muc.lib: Kick users from outcast hosts
daurnimator <quae@daurnimator.com>
parents:
6475
diff
changeset
|
1333 -- Outcast can be by host. |
fb8a9873728b
plugins/muc/muc.lib: Kick users from outcast hosts
daurnimator <quae@daurnimator.com>
parents:
6475
diff
changeset
|
1334 is_host_only and affiliation == "outcast" and select(2, jid_split(occupant.bare_jid)) == host |
fb8a9873728b
plugins/muc/muc.lib: Kick users from outcast hosts
daurnimator <quae@daurnimator.com>
parents:
6475
diff
changeset
|
1335 ) then |
9615 | 1336 -- need to publicize in all cases; as affiliation in <item/> has changed. |
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1337 occupants_updated[occupant] = occupant.role; |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1338 if occupant.role ~= role and ( |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1339 is_downgrade or |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1340 valid_roles[occupant.role or "none"] < role_rank -- upgrade |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1341 ) then |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1342 occupant.role = role; |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1343 self:save_occupant(occupant); |
4357
d6928b78c548
MUC: Allow affiliation change when argument actor==true in room:set_affiliation().
Waqas Hussain <waqas20@gmail.com>
parents:
4326
diff
changeset
|
1344 end |
4202
dff7df4a191b
MUC: Don't limit affiliation changes to owners, and allow owners to remove themselves if they are not the last owner.
Waqas Hussain <waqas20@gmail.com>
parents:
4201
diff
changeset
|
1345 end |
dff7df4a191b
MUC: Don't limit affiliation changes to owners, and allow owners to remove themselves if they are not the last owner.
Waqas Hussain <waqas20@gmail.com>
parents:
4201
diff
changeset
|
1346 end |
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1347 |
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1348 -- Tell the room of the new occupant affiliations+roles |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1349 local x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user"}); |
8842
463505cc75d5
MUC: Revert unstable MUC commits since 0.10.1
Matthew Wild <mwild1@gmail.com>
parents:
8839
diff
changeset
|
1350 if not role then -- getting kicked |
463505cc75d5
MUC: Revert unstable MUC commits since 0.10.1
Matthew Wild <mwild1@gmail.com>
parents:
8839
diff
changeset
|
1351 if affiliation == "outcast" then |
463505cc75d5
MUC: Revert unstable MUC commits since 0.10.1
Matthew Wild <mwild1@gmail.com>
parents:
8839
diff
changeset
|
1352 x:tag("status", {code="301"}):up(); -- banned |
463505cc75d5
MUC: Revert unstable MUC commits since 0.10.1
Matthew Wild <mwild1@gmail.com>
parents:
8839
diff
changeset
|
1353 else |
463505cc75d5
MUC: Revert unstable MUC commits since 0.10.1
Matthew Wild <mwild1@gmail.com>
parents:
8839
diff
changeset
|
1354 x:tag("status", {code="321"}):up(); -- affiliation change |
463505cc75d5
MUC: Revert unstable MUC commits since 0.10.1
Matthew Wild <mwild1@gmail.com>
parents:
8839
diff
changeset
|
1355 end |
1742
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
1356 end |
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1357 local is_semi_anonymous = self:get_whois() == "moderators"; |
9599
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1358 |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1359 if next(occupants_updated) ~= nil then |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1360 for occupant, old_role in pairs(occupants_updated) do |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1361 self:publicise_occupant_status(occupant, x, nil, actor, reason); |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1362 if occupant.role == nil then |
10048
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1363 module:fire_event("muc-occupant-left", { |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1364 room = self; |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1365 nick = occupant.nick; |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1366 occupant = occupant; |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1367 }); |
9599
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1368 elseif is_semi_anonymous and |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1369 (old_role == "moderator" and occupant.role ~= "moderator") or |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1370 (old_role ~= "moderator" and occupant.role == "moderator") then -- Has gained or lost moderator status |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1371 -- Send everyone else's presences (as jid visibility has changed) |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1372 for real_jid in occupant:each_session() do |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1373 self:send_occupant_list(real_jid, function(occupant_jid, occupant) --luacheck: ignore 212 433 |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1374 return occupant.bare_jid ~= jid; |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1375 end); |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1376 end |
1742
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
1377 end |
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
1378 end |
9599
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1379 else |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1380 -- Announce affiliation change for a user that is not currently in the room, |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1381 -- XEP-0045 (v1.31.2) example 195 |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1382 -- add_item(x, affiliation, role, jid, nick, actor_nick, actor_jid, reason) |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1383 local announce_msg = st.message({ from = self.jid }) |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1384 :add_child(add_item(st.clone(x), affiliation, nil, jid, nil, nil, nil, reason)); |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1385 local min_role = is_semi_anonymous and "moderator" or "none"; |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1386 self:broadcast(announce_msg, muc_util.only_with_min_role(min_role)); |
1742
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
1387 end |
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1388 |
7414
1b62c89014c4
MUC: Separate force-save parameter from save-entire-state flag
Kim Alvefur <zash@zash.se>
parents:
7413
diff
changeset
|
1389 self:save(true); |
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1390 |
6393
fff6ca13cb0f
plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents:
6392
diff
changeset
|
1391 module:fire_event("muc-set-affiliation", { |
fff6ca13cb0f
plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents:
6392
diff
changeset
|
1392 room = self; |
fff6ca13cb0f
plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents:
6392
diff
changeset
|
1393 actor = actor; |
fff6ca13cb0f
plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents:
6392
diff
changeset
|
1394 jid = jid; |
fff6ca13cb0f
plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents:
6392
diff
changeset
|
1395 affiliation = affiliation or "none"; |
fff6ca13cb0f
plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents:
6392
diff
changeset
|
1396 reason = reason; |
fff6ca13cb0f
plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents:
6392
diff
changeset
|
1397 previous_affiliation = target_affiliation; |
9237
b86c2e135797
MUC: Add support for storing additional data with MUC affiliations
Matthew Wild <mwild1@gmail.com>
parents:
9194
diff
changeset
|
1398 data = data and data or nil; -- coerce false to nil |
6393
fff6ca13cb0f
plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents:
6392
diff
changeset
|
1399 in_room = next(occupants_updated) ~= nil; |
fff6ca13cb0f
plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents:
6392
diff
changeset
|
1400 }); |
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1401 |
1742
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
1402 return true; |
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
1403 end |
1734 | 1404 |
9532
9bb33edd7255
MUC: Add function to retrieve affiliation data for a given JID
Matthew Wild <mwild1@gmail.com>
parents:
9531
diff
changeset
|
1405 function room_mt:get_affiliation_data(jid, key) |
9bb33edd7255
MUC: Add function to retrieve affiliation data for a given JID
Matthew Wild <mwild1@gmail.com>
parents:
9531
diff
changeset
|
1406 local data = self._affiliation_data[jid]; |
9bb33edd7255
MUC: Add function to retrieve affiliation data for a given JID
Matthew Wild <mwild1@gmail.com>
parents:
9531
diff
changeset
|
1407 if not data then return nil; end |
9bb33edd7255
MUC: Add function to retrieve affiliation data for a given JID
Matthew Wild <mwild1@gmail.com>
parents:
9531
diff
changeset
|
1408 if key then |
9bb33edd7255
MUC: Add function to retrieve affiliation data for a given JID
Matthew Wild <mwild1@gmail.com>
parents:
9531
diff
changeset
|
1409 return data[key]; |
9bb33edd7255
MUC: Add function to retrieve affiliation data for a given JID
Matthew Wild <mwild1@gmail.com>
parents:
9531
diff
changeset
|
1410 end |
9bb33edd7255
MUC: Add function to retrieve affiliation data for a given JID
Matthew Wild <mwild1@gmail.com>
parents:
9531
diff
changeset
|
1411 return data; |
9bb33edd7255
MUC: Add function to retrieve affiliation data for a given JID
Matthew Wild <mwild1@gmail.com>
parents:
9531
diff
changeset
|
1412 end |
9bb33edd7255
MUC: Add function to retrieve affiliation data for a given JID
Matthew Wild <mwild1@gmail.com>
parents:
9531
diff
changeset
|
1413 |
1742
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
1414 function room_mt:get_role(nick) |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1415 local occupant = self:get_occupant_by_nick(nick); |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1416 return occupant and occupant.role or nil; |
1742
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
1417 end |
6182
dbf0b09664cd
plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents:
6181
diff
changeset
|
1418 |
9830
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1419 function room_mt:may_set_role(actor, occupant, role) |
9831
43f81e85cec2
MUC: Fire an event to allow affecting decision of whether to allow a role change
Kim Alvefur <zash@zash.se>
parents:
9830
diff
changeset
|
1420 local event = { |
43f81e85cec2
MUC: Fire an event to allow affecting decision of whether to allow a role change
Kim Alvefur <zash@zash.se>
parents:
9830
diff
changeset
|
1421 room = self, |
43f81e85cec2
MUC: Fire an event to allow affecting decision of whether to allow a role change
Kim Alvefur <zash@zash.se>
parents:
9830
diff
changeset
|
1422 actor = actor, |
43f81e85cec2
MUC: Fire an event to allow affecting decision of whether to allow a role change
Kim Alvefur <zash@zash.se>
parents:
9830
diff
changeset
|
1423 occupant = occupant, |
43f81e85cec2
MUC: Fire an event to allow affecting decision of whether to allow a role change
Kim Alvefur <zash@zash.se>
parents:
9830
diff
changeset
|
1424 role = role, |
43f81e85cec2
MUC: Fire an event to allow affecting decision of whether to allow a role change
Kim Alvefur <zash@zash.se>
parents:
9830
diff
changeset
|
1425 }; |
43f81e85cec2
MUC: Fire an event to allow affecting decision of whether to allow a role change
Kim Alvefur <zash@zash.se>
parents:
9830
diff
changeset
|
1426 |
43f81e85cec2
MUC: Fire an event to allow affecting decision of whether to allow a role change
Kim Alvefur <zash@zash.se>
parents:
9830
diff
changeset
|
1427 module:fire_event("muc-pre-set-role", event); |
43f81e85cec2
MUC: Fire an event to allow affecting decision of whether to allow a role change
Kim Alvefur <zash@zash.se>
parents:
9830
diff
changeset
|
1428 if event.allowed ~= nil then |
43f81e85cec2
MUC: Fire an event to allow affecting decision of whether to allow a role change
Kim Alvefur <zash@zash.se>
parents:
9830
diff
changeset
|
1429 return event.allowed, event.error, event.condition; |
43f81e85cec2
MUC: Fire an event to allow affecting decision of whether to allow a role change
Kim Alvefur <zash@zash.se>
parents:
9830
diff
changeset
|
1430 end |
43f81e85cec2
MUC: Fire an event to allow affecting decision of whether to allow a role change
Kim Alvefur <zash@zash.se>
parents:
9830
diff
changeset
|
1431 |
9830
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1432 -- Can't do anything to other owners or admins |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1433 local occupant_affiliation = self:get_affiliation(occupant.bare_jid); |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1434 if occupant_affiliation == "owner" or occupant_affiliation == "admin" then |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1435 return nil, "cancel", "not-allowed"; |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1436 end |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1437 |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1438 -- If you are trying to give or take moderator role you need to be an owner or admin |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1439 if occupant.role == "moderator" or role == "moderator" then |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1440 local actor_affiliation = self:get_affiliation(actor); |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1441 if actor_affiliation ~= "owner" and actor_affiliation ~= "admin" then |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1442 return nil, "cancel", "not-allowed"; |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1443 end |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1444 end |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1445 |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1446 -- Need to be in the room and a moderator |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1447 local actor_occupant = self:get_occupant_by_real_jid(actor); |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1448 if not actor_occupant or actor_occupant.role ~= "moderator" then |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1449 return nil, "cancel", "not-allowed"; |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1450 end |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1451 |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1452 return true; |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1453 end |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1454 |
6182
dbf0b09664cd
plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents:
6181
diff
changeset
|
1455 function room_mt:set_role(actor, occupant_jid, role, reason) |
dbf0b09664cd
plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents:
6181
diff
changeset
|
1456 if not actor then return nil, "modify", "not-acceptable"; end |
3279
8b0a4a7d2c6e
MUC: Added room:can_set_role().
Waqas Hussain <waqas20@gmail.com>
parents:
3264
diff
changeset
|
1457 |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1458 local occupant = self:get_occupant_by_nick(occupant_jid); |
7396
71a7140200fc
MUC: Return item-not-found as error when attempting to change role of non-existant occupant
Kim Alvefur <zash@zash.se>
parents:
7386
diff
changeset
|
1459 if not occupant then return nil, "modify", "item-not-found"; end |
5542
329ebdfb39a2
MUC: Allow actor == true to set roles (like affiliations)
Matthew Wild <mwild1@gmail.com>
parents:
5541
diff
changeset
|
1460 |
6182
dbf0b09664cd
plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents:
6181
diff
changeset
|
1461 if valid_roles[role or "none"] == nil then |
dbf0b09664cd
plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents:
6181
diff
changeset
|
1462 return nil, "modify", "not-acceptable"; |
dbf0b09664cd
plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents:
6181
diff
changeset
|
1463 end |
dbf0b09664cd
plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents:
6181
diff
changeset
|
1464 role = role ~= "none" and role or nil; -- coerces `role == false` to `nil` |
5542
329ebdfb39a2
MUC: Allow actor == true to set roles (like affiliations)
Matthew Wild <mwild1@gmail.com>
parents:
5541
diff
changeset
|
1465 |
6475
3c815a64042b
plugins/muc/muc.lib: Fix passing actor along as a boolean (thanks fippo)
daurnimator <quae@daurnimator.com>
parents:
6454
diff
changeset
|
1466 if actor == true then |
3c815a64042b
plugins/muc/muc.lib: Fix passing actor along as a boolean (thanks fippo)
daurnimator <quae@daurnimator.com>
parents:
6454
diff
changeset
|
1467 actor = nil -- So we can pass it safely to 'publicise_occupant_status' below |
3c815a64042b
plugins/muc/muc.lib: Fix passing actor along as a boolean (thanks fippo)
daurnimator <quae@daurnimator.com>
parents:
6454
diff
changeset
|
1468 else |
9830
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1469 local allowed, err, condition = self:may_set_role(actor, occupant, role) |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1470 if not allowed then |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1471 return allowed, err, condition; |
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1472 end |
3279
8b0a4a7d2c6e
MUC: Added room:can_set_role().
Waqas Hussain <waqas20@gmail.com>
parents:
3264
diff
changeset
|
1473 end |
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1474 |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1475 local x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user"}); |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1476 if not role then |
8842
463505cc75d5
MUC: Revert unstable MUC commits since 0.10.1
Matthew Wild <mwild1@gmail.com>
parents:
8839
diff
changeset
|
1477 x:tag("status", {code = "307"}):up(); |
463505cc75d5
MUC: Revert unstable MUC commits since 0.10.1
Matthew Wild <mwild1@gmail.com>
parents:
8839
diff
changeset
|
1478 end |
10353
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
1479 |
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
1480 local prev_role = occupant.role; |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1481 occupant.role = role; |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1482 self:save_occupant(occupant); |
10353
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
1483 self:publicise_occupant_status(occupant, x, nil, actor, reason, prev_role); |
6454
6842b07fc7bc
plugins/muc/muc.lib: Fire muc-occupant-left from other places an occupant may leave the room
daurnimator <quae@daurnimator.com>
parents:
6453
diff
changeset
|
1484 if role == nil then |
10048
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1485 module:fire_event("muc-occupant-left", { |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1486 room = self; |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1487 nick = occupant.nick; |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1488 occupant = occupant; |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1489 }); |
3632
d82189efecc0
MUC: Include the user's current presence contents when broadcasting a role change.
Waqas Hussain <waqas20@gmail.com>
parents:
3631
diff
changeset
|
1490 end |
1737
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1491 return true; |
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1492 end |
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1493 |
6214
9813c74ce006
plugins/muc: Move `whois` code to seperate file
daurnimator <quae@daurnimator.com>
parents:
6213
diff
changeset
|
1494 local whois = module:require "muc/whois"; |
9813c74ce006
plugins/muc: Move `whois` code to seperate file
daurnimator <quae@daurnimator.com>
parents:
6213
diff
changeset
|
1495 room_mt.get_whois = whois.get; |
9813c74ce006
plugins/muc: Move `whois` code to seperate file
daurnimator <quae@daurnimator.com>
parents:
6213
diff
changeset
|
1496 room_mt.set_whois = whois.set; |
2064
1ee862fd1afe
MUC: Include occupants' real JIDs in their presence (semi-anonymous rooms).
Waqas Hussain <waqas20@gmail.com>
parents:
2053
diff
changeset
|
1497 |
1737
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1498 local _M = {}; -- module "muc" |
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1499 |
3330
bdc325ce9fbc
MUC: Make number of stored history messages configurable with option max_history_messages (thanks michal and others who requested)
Matthew Wild <mwild1@gmail.com>
parents:
3281
diff
changeset
|
1500 function _M.new_room(jid, config) |
1735
81406277279e
MUC: The MUC lib is now metatable based. Cleaned up code, etc.
Waqas Hussain <waqas20@gmail.com>
parents:
1734
diff
changeset
|
1501 return setmetatable({ |
1734 | 1502 jid = jid; |
1503 _jid_nick = {}; | |
1739
393abf245322
MUC: Renamed _participants table to _occupants
Waqas Hussain <waqas20@gmail.com>
parents:
1737
diff
changeset
|
1504 _occupants = {}; |
7362
032fcb7b80a1
MUC: Use config passed to rew_roow()
Kim Alvefur <zash@zash.se>
parents:
7360
diff
changeset
|
1505 _data = config or {}; |
1737
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1506 _affiliations = {}; |
9237
b86c2e135797
MUC: Add support for storing additional data with MUC affiliations
Matthew Wild <mwild1@gmail.com>
parents:
9194
diff
changeset
|
1507 _affiliation_data = {}; |
1735
81406277279e
MUC: The MUC lib is now metatable based. Cleaned up code, etc.
Waqas Hussain <waqas20@gmail.com>
parents:
1734
diff
changeset
|
1508 }, room_mt); |
1734 | 1509 end |
1510 | |
7488
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1511 local new_format = module:get_option_boolean("new_muc_storage_format", false); |
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1512 |
7369
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1513 function room_mt:freeze(live) |
7488
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1514 local frozen, state; |
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1515 if new_format then |
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1516 frozen = { |
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1517 _jid = self.jid; |
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1518 _data = self._data; |
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1519 }; |
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1520 for user, affiliation in pairs(self._affiliations) do |
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1521 frozen[user] = affiliation; |
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1522 end |
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1523 else |
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1524 frozen = { |
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1525 jid = self.jid; |
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1526 _data = self._data; |
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1527 _affiliations = self._affiliations; |
9237
b86c2e135797
MUC: Add support for storing additional data with MUC affiliations
Matthew Wild <mwild1@gmail.com>
parents:
9194
diff
changeset
|
1528 _affiliation_data = self._affiliation_data; |
7488
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1529 }; |
7368
4e24aff1e4df
MUC: Flatten format of serialized rooms
Kim Alvefur <zash@zash.se>
parents:
7367
diff
changeset
|
1530 end |
7369
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1531 if live then |
7415
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1532 state = {}; |
7369
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1533 for nick, occupant in self:each_occupant() do |
7415
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1534 state[nick] = { |
7369
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1535 bare_jid = occupant.bare_jid; |
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1536 role = occupant.role; |
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1537 jid = occupant.jid; |
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1538 } |
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1539 for jid, presence in occupant:each_session() do |
7415
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1540 state[jid] = st.preserialize(presence); |
7369
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1541 end |
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1542 end |
7412
f9744effae04
MUC: Include the very last message in serialized form to keep it across eviction and restore
Kim Alvefur <zash@zash.se>
parents:
7411
diff
changeset
|
1543 local history = self._history; |
8519
e7808f8d7d11
MUC: Prevent traceback in case of no history items to serialize (fixes #1083)
Kim Alvefur <zash@zash.se>
parents:
8486
diff
changeset
|
1544 if history and history[1] ~= nil then |
7415
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1545 state._last_message = st.preserialize(history[#history].stanza); |
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1546 state._last_message_at = history[#history].timestamp; |
7412
f9744effae04
MUC: Include the very last message in serialized form to keep it across eviction and restore
Kim Alvefur <zash@zash.se>
parents:
7411
diff
changeset
|
1547 end |
7369
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1548 end |
7415
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1549 return frozen, state; |
7360
7a37fade5380
MUC: Move 'preserialization' step to muc.lib
Kim Alvefur <zash@zash.se>
parents:
7353
diff
changeset
|
1550 end |
7a37fade5380
MUC: Move 'preserialization' step to muc.lib
Kim Alvefur <zash@zash.se>
parents:
7353
diff
changeset
|
1551 |
7415
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1552 function _M.restore_room(frozen, state) |
7631
f50c039d6bb1
MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents:
7488
diff
changeset
|
1553 local room_jid = frozen._jid or frozen.jid; |
7367
2aef5e8b69e9
MUC: Move room deserialization to muc.lib
Kim Alvefur <zash@zash.se>
parents:
7366
diff
changeset
|
1554 local room = _M.new_room(room_jid, frozen._data); |
7368
4e24aff1e4df
MUC: Flatten format of serialized rooms
Kim Alvefur <zash@zash.se>
parents:
7367
diff
changeset
|
1555 |
7416
c33a1d6da016
MUC: Restore last message from state, not room config (missing change from cbb05b454c13)
Kim Alvefur <zash@zash.se>
parents:
7415
diff
changeset
|
1556 if state and state._last_message and state._last_message_at then |
7412
f9744effae04
MUC: Include the very last message in serialized form to keep it across eviction and restore
Kim Alvefur <zash@zash.se>
parents:
7411
diff
changeset
|
1557 room._history = { |
7416
c33a1d6da016
MUC: Restore last message from state, not room config (missing change from cbb05b454c13)
Kim Alvefur <zash@zash.se>
parents:
7415
diff
changeset
|
1558 { stanza = st.deserialize(state._last_message), |
c33a1d6da016
MUC: Restore last message from state, not room config (missing change from cbb05b454c13)
Kim Alvefur <zash@zash.se>
parents:
7415
diff
changeset
|
1559 timestamp = state._last_message_at, }, |
7412
f9744effae04
MUC: Include the very last message in serialized form to keep it across eviction and restore
Kim Alvefur <zash@zash.se>
parents:
7411
diff
changeset
|
1560 }; |
f9744effae04
MUC: Include the very last message in serialized form to keep it across eviction and restore
Kim Alvefur <zash@zash.se>
parents:
7411
diff
changeset
|
1561 end |
f9744effae04
MUC: Include the very last message in serialized form to keep it across eviction and restore
Kim Alvefur <zash@zash.se>
parents:
7411
diff
changeset
|
1562 |
7369
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1563 local occupants = {}; |
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1564 local room_name, room_host = jid_split(room_jid); |
7631
f50c039d6bb1
MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents:
7488
diff
changeset
|
1565 |
9265
585ef5c1b226
MUC: Initialize room with empty affiliation_data if none stored
Matthew Wild <mwild1@gmail.com>
parents:
9264
diff
changeset
|
1566 room._affiliation_data = frozen._affiliation_data or {}; |
9237
b86c2e135797
MUC: Add support for storing additional data with MUC affiliations
Matthew Wild <mwild1@gmail.com>
parents:
9194
diff
changeset
|
1567 |
7631
f50c039d6bb1
MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents:
7488
diff
changeset
|
1568 if frozen.jid and frozen._affiliations then |
9239
03e37f7d6c97
MUC: Add some comments for clarity
Matthew Wild <mwild1@gmail.com>
parents:
9238
diff
changeset
|
1569 -- Old storage format |
7631
f50c039d6bb1
MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents:
7488
diff
changeset
|
1570 room._affiliations = frozen._affiliations; |
f50c039d6bb1
MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents:
7488
diff
changeset
|
1571 else |
9239
03e37f7d6c97
MUC: Add some comments for clarity
Matthew Wild <mwild1@gmail.com>
parents:
9238
diff
changeset
|
1572 -- New storage format |
7631
f50c039d6bb1
MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents:
7488
diff
changeset
|
1573 for jid, data in pairs(frozen) do |
f50c039d6bb1
MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents:
7488
diff
changeset
|
1574 local node, host, resource = jid_split(jid); |
f50c039d6bb1
MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents:
7488
diff
changeset
|
1575 if host:sub(1,1) ~= "_" and not resource and type(data) == "string" then |
f50c039d6bb1
MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents:
7488
diff
changeset
|
1576 -- bare jid: affiliation |
f50c039d6bb1
MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents:
7488
diff
changeset
|
1577 room._affiliations[jid] = data; |
f50c039d6bb1
MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents:
7488
diff
changeset
|
1578 end |
7415
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1579 end |
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1580 end |
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1581 for jid, data in pairs(state or frozen) do |
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1582 local node, host, resource = jid_split(jid); |
7368
4e24aff1e4df
MUC: Flatten format of serialized rooms
Kim Alvefur <zash@zash.se>
parents:
7367
diff
changeset
|
1583 if node or host:sub(1,1) ~= "_" then |
7415
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1584 if host == room_host and node == room_name and resource and type(data) == "table" then |
7369
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1585 -- full room jid: bare real jid and role |
7661
37ab6c6326fe
MUC: Fix conflict when restoring room where the same bare JID has joined as multiple participants
Kim Alvefur <zash@zash.se>
parents:
7631
diff
changeset
|
1586 local nick = jid; |
37ab6c6326fe
MUC: Fix conflict when restoring room where the same bare JID has joined as multiple participants
Kim Alvefur <zash@zash.se>
parents:
7631
diff
changeset
|
1587 local occupant = occupants[nick] or occupant_lib.new(data.bare_jid, nick); |
37ab6c6326fe
MUC: Fix conflict when restoring room where the same bare JID has joined as multiple participants
Kim Alvefur <zash@zash.se>
parents:
7631
diff
changeset
|
1588 occupant.bare_jid = data.bare_jid; |
7369
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1589 occupant.role = data.role; |
7661
37ab6c6326fe
MUC: Fix conflict when restoring room where the same bare JID has joined as multiple participants
Kim Alvefur <zash@zash.se>
parents:
7631
diff
changeset
|
1590 occupant.jid = data.jid; -- Primary session JID |
37ab6c6326fe
MUC: Fix conflict when restoring room where the same bare JID has joined as multiple participants
Kim Alvefur <zash@zash.se>
parents:
7631
diff
changeset
|
1591 occupants[nick] = occupant; |
37ab6c6326fe
MUC: Fix conflict when restoring room where the same bare JID has joined as multiple participants
Kim Alvefur <zash@zash.se>
parents:
7631
diff
changeset
|
1592 elseif type(data) == "table" and data.name == "presence" then |
7369
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1593 -- full user jid: presence |
7661
37ab6c6326fe
MUC: Fix conflict when restoring room where the same bare JID has joined as multiple participants
Kim Alvefur <zash@zash.se>
parents:
7631
diff
changeset
|
1594 local nick = data.attr.from; |
37ab6c6326fe
MUC: Fix conflict when restoring room where the same bare JID has joined as multiple participants
Kim Alvefur <zash@zash.se>
parents:
7631
diff
changeset
|
1595 local occupant = occupants[nick] or occupant_lib.new(nil, nick); |
7369
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1596 local presence = st.deserialize(data); |
7661
37ab6c6326fe
MUC: Fix conflict when restoring room where the same bare JID has joined as multiple participants
Kim Alvefur <zash@zash.se>
parents:
7631
diff
changeset
|
1597 occupant:set_session(jid, presence); |
37ab6c6326fe
MUC: Fix conflict when restoring room where the same bare JID has joined as multiple participants
Kim Alvefur <zash@zash.se>
parents:
7631
diff
changeset
|
1598 occupants[nick] = occupant; |
7369
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1599 end |
7368
4e24aff1e4df
MUC: Flatten format of serialized rooms
Kim Alvefur <zash@zash.se>
parents:
7367
diff
changeset
|
1600 end |
4e24aff1e4df
MUC: Flatten format of serialized rooms
Kim Alvefur <zash@zash.se>
parents:
7367
diff
changeset
|
1601 end |
7369
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1602 |
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1603 for _, occupant in pairs(occupants) do |
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1604 room:save_occupant(occupant); |
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1605 end |
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1606 |
7367
2aef5e8b69e9
MUC: Move room deserialization to muc.lib
Kim Alvefur <zash@zash.se>
parents:
7366
diff
changeset
|
1607 return room; |
5195
ce5d7538ac48
muc: Make max_history_messages simply a service-wide config option, and don't store it per-room (rooms still have their own history_message, but this is a global limit)
Matthew Wild <mwild1@gmail.com>
parents:
5144
diff
changeset
|
1608 end |
ce5d7538ac48
muc: Make max_history_messages simply a service-wide config option, and don't store it per-room (rooms still have their own history_message, but this is a global limit)
Matthew Wild <mwild1@gmail.com>
parents:
5144
diff
changeset
|
1609 |
5063
4bc202a7b351
MUC: Expose room metatable in the MUC lib.
Waqas Hussain <waqas20@gmail.com>
parents:
5061
diff
changeset
|
1610 _M.room_mt = room_mt; |
4bc202a7b351
MUC: Expose room metatable in the MUC lib.
Waqas Hussain <waqas20@gmail.com>
parents:
5061
diff
changeset
|
1611 |
1734 | 1612 return _M; |