Software /
code /
prosody
Annotate
plugins/muc/muc.lib.lua @ 10684:de607875d4bd
MUC: Pass previous role to :publicise_occupant_status() whenever possible
Currently there is what amounts to a hack in presence_broadcast.lib.lua to
make it always broadcast presence with roles of "none". This is to ensure
that if you previously saw available presence for someone, you will also
see the unavailable presence (which always has role="none").
The correct approach is to take into account what the previous role was (
i.e. answer the question: "Was the available presence for this occupant
a role for which presence broadcast is enabled?).
The logic is already in place to do this correctly, but most call sites
do not provide the previous role (prev_role argument) of the occupant,
which causes it to not be used. In its place the hack to always broadcast
presence of role="none" has allowed things to continue to work.
The intention is that a subsequent commit will remove the unconditional
broadcast of role="none".
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Thu, 12 Mar 2020 14:10:12 +0000 |
parent | 10662:46373b97e648 |
child | 10686:ac3ec4f2b124 |
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 |
10550
0566b45da987
MUC: Remove some unused variables [luacheck]
Kim Alvefur <zash@zash.se>
parents:
10451
diff
changeset
|
388 local _, 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)); |
10684
de607875d4bd
MUC: Pass previous role to :publicise_occupant_status() whenever possible
Matthew Wild <mwild1@gmail.com>
parents:
10662
diff
changeset
|
395 local orig_role = occupant.role; |
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
|
396 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
|
397 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
|
398 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
|
399 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
|
400 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
|
401 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
|
402 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
|
403 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
|
404 end |
10684
de607875d4bd
MUC: Pass previous role to :publicise_occupant_status() whenever possible
Matthew Wild <mwild1@gmail.com>
parents:
10662
diff
changeset
|
405 self:publicise_occupant_status(new_occupant or occupant, x, nil, nil, nil, orig_role); |
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
|
406 if is_last_session then |
10048
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
407 module:fire_event("muc-occupant-left", { |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
408 room = self; |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
409 nick = occupant.nick; |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
410 occupant = occupant; |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
411 }); |
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
|
412 end |
6100
c78ba94d3261
plugins/muc/muc.lib: Move all kick code into one place
daurnimator <quae@daurnimator.com>
parents:
6099
diff
changeset
|
413 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
|
414 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
|
415 |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
416 -- Give the room creator owner affiliation |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
417 module:hook("muc-room-pre-create", function(event) |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
418 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
|
419 end, -1); |
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
420 |
6180
35388114439f
plugins/muc/muc.lib: non-function changes (reordering, semicolons and comments)
daurnimator <quae@daurnimator.com>
parents:
6179
diff
changeset
|
421 -- 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
|
422 module:hook("muc-occupant-pre-join", function(event) |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
423 local room, stanza = event.room, event.stanza; |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
424 local affiliation = room:get_affiliation(stanza.attr.from); |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
425 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
|
426 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
|
427 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
|
428 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
|
429 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
|
430 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
|
431 end, -10); |
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
432 |
9024
43241e74bb19
MUC: Reject invisible nicknames (fixes #979)
Kim Alvefur <zash@zash.se>
parents:
9023
diff
changeset
|
433 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
|
434 local room = event.room; |
9026
91b5a5667016
MUC: Use nickname from occupant object
Kim Alvefur <zash@zash.se>
parents:
9025
diff
changeset
|
435 local nick = jid_resource(event.occupant.nick); |
9024
43241e74bb19
MUC: Reject invisible nicknames (fixes #979)
Kim Alvefur <zash@zash.se>
parents:
9023
diff
changeset
|
436 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
|
437 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
|
438 return true; |
43241e74bb19
MUC: Reject invisible nicknames (fixes #979)
Kim Alvefur <zash@zash.se>
parents:
9023
diff
changeset
|
439 end |
43241e74bb19
MUC: Reject invisible nicknames (fixes #979)
Kim Alvefur <zash@zash.se>
parents:
9023
diff
changeset
|
440 end, 1); |
43241e74bb19
MUC: Reject invisible nicknames (fixes #979)
Kim Alvefur <zash@zash.se>
parents:
9023
diff
changeset
|
441 |
9027
4028eb4a9f7f
MUC: Also prevent changing to an invisible nickname
Kim Alvefur <zash@zash.se>
parents:
9026
diff
changeset
|
442 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
|
443 local room = event.room; |
9027
4028eb4a9f7f
MUC: Also prevent changing to an invisible nickname
Kim Alvefur <zash@zash.se>
parents:
9026
diff
changeset
|
444 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
|
445 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
|
446 return true; |
4028eb4a9f7f
MUC: Also prevent changing to an invisible nickname
Kim Alvefur <zash@zash.se>
parents:
9026
diff
changeset
|
447 end |
4028eb4a9f7f
MUC: Also prevent changing to an invisible nickname
Kim Alvefur <zash@zash.se>
parents:
9026
diff
changeset
|
448 end, 1); |
4028eb4a9f7f
MUC: Also prevent changing to an invisible nickname
Kim Alvefur <zash@zash.se>
parents:
9026
diff
changeset
|
449 |
10361
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
450 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
|
451 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
|
452 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
|
453 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
|
454 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
|
455 return true; |
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
456 end |
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
457 end, 2); |
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
458 |
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
459 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
|
460 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
|
461 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
|
462 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
|
463 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
|
464 return true; |
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
465 end |
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
466 end, 2); |
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
467 |
7410
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
468 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
|
469 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
|
470 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
|
471 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
|
472 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
|
473 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
|
474 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
|
475 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
|
476 }) 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
|
477 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
|
478 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
|
479 |
7706
d92e186c2a1c
MUC: Include the appropriate status code if nickname is changed during join process
Kim Alvefur <zash@zash.se>
parents:
7705
diff
changeset
|
480 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
|
481 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
|
482 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
|
483 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
|
484 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
|
485 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
|
486 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
|
487 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
|
488 }) 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
|
489 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
|
490 |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
491 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
|
492 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
|
493 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
|
494 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
|
495 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
|
496 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
|
497 if nick_changed then |
9022
293ebfed71f7
MUC: Simplify creation of <{muc}x> for room creation
Kim Alvefur <zash@zash.se>
parents:
9017
diff
changeset
|
498 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
|
499 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
|
500 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
|
501 |
9022
293ebfed71f7
MUC: Simplify creation of <{muc}x> for room creation
Kim Alvefur <zash@zash.se>
parents:
9017
diff
changeset
|
502 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
|
503 |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
504 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
|
505 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
|
506 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
|
507 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
|
508 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
|
509 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
|
510 }); |
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
511 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
|
512 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
|
513 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
|
514 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
|
515 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
|
516 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
|
517 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
|
518 }); |
7411
f385cd6127b2
MUC: Add event for when room is done being created
Kim Alvefur <zash@zash.se>
parents:
7410
diff
changeset
|
519 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
|
520 room = self; |
f385cd6127b2
MUC: Add event for when room is done being created
Kim Alvefur <zash@zash.se>
parents:
7410
diff
changeset
|
521 creator = dest_occupant; |
f385cd6127b2
MUC: Add event for when room is done being created
Kim Alvefur <zash@zash.se>
parents:
7410
diff
changeset
|
522 stanza = stanza; |
f385cd6127b2
MUC: Add event for when room is done being created
Kim Alvefur <zash@zash.se>
parents:
7410
diff
changeset
|
523 origin = origin; |
f385cd6127b2
MUC: Add event for when room is done being created
Kim Alvefur <zash@zash.se>
parents:
7410
diff
changeset
|
524 }); |
7410
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
525 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
|
526 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
|
527 |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
528 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
|
529 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
|
530 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
|
531 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
|
532 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
|
533 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
|
534 |
8931
ae84911c1441
MUC: Avoid sending error for unavailable presence in GC 1.0 check
Kim Alvefur <zash@zash.se>
parents:
8915
diff
changeset
|
535 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
|
536 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
|
537 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
|
538 "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
|
539 return true; |
e9acb928c637
MUC: Remove support for GC 1.0 for joining
Kim Alvefur <zash@zash.se>
parents:
8913
diff
changeset
|
540 end |
e9acb928c637
MUC: Remove support for GC 1.0 for joining
Kim Alvefur <zash@zash.se>
parents:
8913
diff
changeset
|
541 |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
542 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
|
543 local dest_occupant; |
8754
ca40f9a5751a
MUC: Move something into empty if branch
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
544 if type == "unavailable" then |
ca40f9a5751a
MUC: Move something into empty if branch
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
545 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
|
546 -- dest_occupant = nil |
7426
3a90e9732204
Backed out changeset 63141a85beea, broke multi-session nicks
Kim Alvefur <zash@zash.se>
parents:
7423
diff
changeset
|
547 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
|
548 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
|
549 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
|
550 else |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
551 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
|
552 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
|
553 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
|
554 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
|
555 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
|
556 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
|
557 if orig_occupant then |
3db8372e203c
MUC: Keep role across nickname change (fixes #1466)
Kim Alvefur <zash@zash.se>
parents:
10293
diff
changeset
|
558 dest_occupant.role = orig_occupant.role; |
3db8372e203c
MUC: Keep role across nickname change (fixes #1466)
Kim Alvefur <zash@zash.se>
parents:
10293
diff
changeset
|
559 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
|
560 else |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
561 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
|
562 end |
3507
b639042bb0d5
MUC: Added a 'Name' property (muc#roomconfig_roomname)
Kim Alvefur <zash@zash.se>
parents:
3446
diff
changeset
|
563 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
|
564 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
|
565 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
|
566 -- 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
|
567 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
|
568 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
|
569 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
|
570 |
7706
d92e186c2a1c
MUC: Include the appropriate status code if nickname is changed during join process
Kim Alvefur <zash@zash.se>
parents:
7705
diff
changeset
|
571 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
|
572 |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
573 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
|
574 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
|
575 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
|
576 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
|
577 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
|
578 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
|
579 }; |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
580 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
|
581 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
|
582 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
|
583 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
|
584 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
|
585 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
|
586 else |
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_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
|
588 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
|
589 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
|
590 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
|
591 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
|
592 |
7706
d92e186c2a1c
MUC: Include the appropriate status code if nickname is changed during join process
Kim Alvefur <zash@zash.se>
parents:
7705
diff
changeset
|
593 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
|
594 |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
595 -- Check for nick conflicts |
7958
47cb54a08336
MUC: Split long line [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7706
diff
changeset
|
596 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
|
597 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
|
598 -- 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
|
599 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
|
600 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
|
601 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
|
602 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
|
603 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
|
604 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
|
605 |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
606 -- 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
|
607 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
|
608 local orig_x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";}); |
10684
de607875d4bd
MUC: Pass previous role to :publicise_occupant_status() whenever possible
Matthew Wild <mwild1@gmail.com>
parents:
10662
diff
changeset
|
609 local orig_role = orig_occupant.role; |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
610 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
|
611 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
|
612 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
|
613 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
|
614 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
|
615 end |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
616 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
|
617 else |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
618 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
|
619 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
|
620 orig_occupant:set_session(real_jid, generated_unavail); |
8856 | 621 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
|
622 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
|
623 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
|
624 -- 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
|
625 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
|
626 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
|
627 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
|
628 :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
|
629 :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
|
630 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
|
631 end |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
632 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
|
633 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
|
634 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
|
635 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
|
636 -- 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
|
637 -- 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
|
638 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
|
639 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
|
640 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
|
641 -- 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
|
642 -- 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
|
643 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
|
644 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
|
645 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
|
646 self:route_stanza(generated_unavail:add_child(x)); |
9615 | 647 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
|
648 end |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
649 end |
7667
5523880760b3
MUC: Insert the appropriate status code (210) if the nickname is overridden
Kim Alvefur <zash@zash.se>
parents:
7661
diff
changeset
|
650 |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
651 self:save_occupant(orig_occupant); |
10684
de607875d4bd
MUC: Pass previous role to :publicise_occupant_status() whenever possible
Matthew Wild <mwild1@gmail.com>
parents:
10662
diff
changeset
|
652 self:publicise_occupant_status(orig_occupant, orig_x, dest_nick, nil, nil, orig_role); |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
653 |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
654 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
|
655 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
|
656 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
|
657 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
|
658 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
|
659 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
|
660 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
|
661 }); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
662 end |
3261
fe1c93296abd
MUC: Added room:set_hidden(boolean) and room:is_hidden().
Waqas Hussain <waqas20@gmail.com>
parents:
3260
diff
changeset
|
663 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
|
664 |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
665 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
|
666 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
|
667 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
|
668 |
7427
bf43a08e5a74
MUC: Send participant list and subject on explicit joins (thanks daurnimator)
Kim Alvefur <zash@zash.se>
parents:
7426
diff
changeset
|
669 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
|
670 -- 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
|
671 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
|
672 -- 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
|
673 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
|
674 end) |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
675 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
|
676 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
|
677 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
|
678 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
|
679 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
|
680 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
|
681 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
|
682 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
|
683 end |
10684
de607875d4bd
MUC: Pass previous role to :publicise_occupant_status() whenever possible
Matthew Wild <mwild1@gmail.com>
parents:
10662
diff
changeset
|
684 self:publicise_occupant_status(dest_occupant, {base=dest_x,self=self_x}, nil, nil, nil, orig_occupant and orig_occupant.role or nil); |
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
685 |
9081
ce57c69a20e2
MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents:
9057
diff
changeset
|
686 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
|
687 -- 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
|
688 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
|
689 -- 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
|
690 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
|
691 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
|
692 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
|
693 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
|
694 -- 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
|
695 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
|
696 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
|
697 end |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
698 |
7427
bf43a08e5a74
MUC: Send participant list and subject on explicit joins (thanks daurnimator)
Kim Alvefur <zash@zash.se>
parents:
7426
diff
changeset
|
699 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
|
700 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
|
701 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
|
702 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
|
703 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
|
704 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
|
705 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
|
706 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
|
707 }); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
708 end |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
709 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
|
710 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
|
711 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
|
712 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
|
713 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
|
714 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
|
715 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
|
716 }); |
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
717 end |
4119
813adb81d7da
MUC: Add option to allow participants to change the subject.
Kim Alvefur <zash@zash.se>
parents:
3989
diff
changeset
|
718 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
|
719 return true; |
4528
875b90d5ce0f
muc - implement per channel history limits
Markus Kötter <koetter@rrzn-hiwi.uni-hannover.de>
parents:
4424
diff
changeset
|
720 end |
875b90d5ce0f
muc - implement per channel history limits
Markus Kötter <koetter@rrzn-hiwi.uni-hannover.de>
parents:
4424
diff
changeset
|
721 |
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
722 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
|
723 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
|
724 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
|
725 return self:handle_kickable(origin, stanza) |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
726 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
|
727 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
|
728 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
|
729 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
|
730 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
|
731 end |
5600
1b326a1e4da6
mod_muc: Add getter/setter for 'whois' (fixes traceback)
Matthew Wild <mwild1@gmail.com>
parents:
5580
diff
changeset
|
732 end |
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
733 return true; |
5600
1b326a1e4da6
mod_muc: Add getter/setter for 'whois' (fixes traceback)
Matthew Wild <mwild1@gmail.com>
parents:
5580
diff
changeset
|
734 end |
1b326a1e4da6
mod_muc: Add getter/setter for 'whois' (fixes traceback)
Matthew Wild <mwild1@gmail.com>
parents:
5580
diff
changeset
|
735 |
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
736 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
|
737 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
|
738 local type = stanza.attr.type; |
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
739 local id = stanza.attr.id; |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
740 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
|
741 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
|
742 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
|
743 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
|
744 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
|
745 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
|
746 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
|
747 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
|
748 local session_jid |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
749 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
|
750 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
|
751 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
|
752 break; |
538cdc3d8225
plugins/muc/muc.lib: Move (de)construct_stanza_id into `handle_iq_to_occupant`
daurnimator <quae@daurnimator.com>
parents:
6096
diff
changeset
|
753 end |
538cdc3d8225
plugins/muc/muc.lib: Move (de)construct_stanza_id into `handle_iq_to_occupant`
daurnimator <quae@daurnimator.com>
parents:
6096
diff
changeset
|
754 end |
538cdc3d8225
plugins/muc/muc.lib: Move (de)construct_stanza_id into `handle_iq_to_occupant`
daurnimator <quae@daurnimator.com>
parents:
6096
diff
changeset
|
755 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
|
756 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
|
757 end |
6096
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
758 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
|
759 self:route_stanza(stanza); |
6096
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
760 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
|
761 return true; |
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
762 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
|
763 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
|
764 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
|
765 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
|
766 return true; |
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
767 end |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
768 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
|
769 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
|
770 return true; |
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
771 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
|
772 -- 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
|
773 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
|
774 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
|
775 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
|
776 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
|
777 do -- construct_stanza_id |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
778 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
|
779 end |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
780 stanza.attr.from, stanza.attr.to = current_nick, occupant.jid; |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
781 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
|
782 local iq_ns = stanza.tags[1].attr.xmlns; |
9264
f13517b63e6c
MUC: Allow vCard4 requests trough
Kim Alvefur <zash@zash.se>
parents:
9263
diff
changeset
|
783 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
|
784 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
|
785 end |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
786 self:route_stanza(stanza); |
6096
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
787 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
|
788 return true; |
5061
186f34d88073
MUC: Fix private IQ and message routing.
Waqas Hussain <waqas20@gmail.com>
parents:
4999
diff
changeset
|
789 end |
186f34d88073
MUC: Fix private IQ and message routing.
Waqas Hussain <waqas20@gmail.com>
parents:
4999
diff
changeset
|
790 end |
186f34d88073
MUC: Fix private IQ and message routing.
Waqas Hussain <waqas20@gmail.com>
parents:
4999
diff
changeset
|
791 |
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
792 function room_mt:handle_message_to_occupant(origin, stanza) |
1734 | 793 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
|
794 local current_nick = self:get_occupant_jid(from); |
1734 | 795 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
|
796 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
|
797 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
|
798 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
|
799 end |
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
800 return true; |
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
801 end |
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
802 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
|
803 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
|
804 return true; |
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
805 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
|
806 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
|
807 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
|
808 end |
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
809 |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
810 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
|
811 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
|
812 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
|
813 return true; |
1734 | 814 end |
6096
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
815 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
|
816 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
|
817 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
|
818 stanza.attr.from = current_nick; |
10662
46373b97e648
mod_muc: add muc-private-message event
Maxime “pep” Buquet <pep@bouah.net>
parents:
10553
diff
changeset
|
819 if module:fire_event("muc-private-message", { room = self, origin = origin, stanza = stanza }) ~= false then |
46373b97e648
mod_muc: add muc-private-message event
Maxime “pep” Buquet <pep@bouah.net>
parents:
10553
diff
changeset
|
820 self:route_to_occupant(o_data, stanza) |
46373b97e648
mod_muc: add muc-private-message event
Maxime “pep” Buquet <pep@bouah.net>
parents:
10553
diff
changeset
|
821 end |
6180
35388114439f
plugins/muc/muc.lib: non-function changes (reordering, semicolons and comments)
daurnimator <quae@daurnimator.com>
parents:
6179
diff
changeset
|
822 -- 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
|
823 stanza.attr.from = from; |
6096
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
824 return true; |
1734 | 825 end |
826 | |
2216
dbbb5ed41365
MUC: Slightly refactored form processing.
Waqas Hussain <waqas20@gmail.com>
parents:
2174
diff
changeset
|
827 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
|
828 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
|
829 :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
|
830 ); |
dff4a77ee285
MUC: Parse submitted form with util.dataforms
Kim Alvefur <zash@zash.se>
parents:
3590
diff
changeset
|
831 end |
dff4a77ee285
MUC: Parse submitted form with util.dataforms
Kim Alvefur <zash@zash.se>
parents:
3590
diff
changeset
|
832 |
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
|
833 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
|
834 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
|
835 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
|
836 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
|
837 { |
530f7de1d265
MUC: Use util.dataforms to generate forms
Kim Alvefur <zash@zash.se>
parents:
3516
diff
changeset
|
838 name = 'FORM_TYPE', |
530f7de1d265
MUC: Use util.dataforms to generate forms
Kim Alvefur <zash@zash.se>
parents:
3516
diff
changeset
|
839 type = 'hidden', |
530f7de1d265
MUC: Use util.dataforms to generate forms
Kim Alvefur <zash@zash.se>
parents:
3516
diff
changeset
|
840 value = 'http://jabber.org/protocol/muc#roomconfig' |
530f7de1d265
MUC: Use util.dataforms to generate forms
Kim Alvefur <zash@zash.se>
parents:
3516
diff
changeset
|
841 } |
3591
dff4a77ee285
MUC: Parse submitted form with util.dataforms
Kim Alvefur <zash@zash.se>
parents:
3590
diff
changeset
|
842 }); |
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
|
843 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
|
844 end |
dbbb5ed41365
MUC: Slightly refactored form processing.
Waqas Hussain <waqas20@gmail.com>
parents:
2174
diff
changeset
|
845 |
dbbb5ed41365
MUC: Slightly refactored form processing.
Waqas Hussain <waqas20@gmail.com>
parents:
2174
diff
changeset
|
846 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
|
847 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
|
848 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
|
849 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
|
850 elseif form.attr.type == "submit" then |
10553
4d8119ffd433
MUC: Make note to handle configuration form errors [luacheck]
Kim Alvefur <zash@zash.se>
parents:
10550
diff
changeset
|
851 -- luacheck: ignore 231/errors |
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
|
852 local fields, errors, present; |
6391
4d334d00c635
plugins/muc/muc.lib: Add instant room support
daurnimator <quae@daurnimator.com>
parents:
6318
diff
changeset
|
853 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
|
854 fields, present = {}, {}; |
6391
4d334d00c635
plugins/muc/muc.lib: Add instant room support
daurnimator <quae@daurnimator.com>
parents:
6318
diff
changeset
|
855 else |
10553
4d8119ffd433
MUC: Make note to handle configuration form errors [luacheck]
Kim Alvefur <zash@zash.se>
parents:
10550
diff
changeset
|
856 -- FIXME handle form errors |
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
|
857 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
|
858 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
|
859 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
|
860 return true; |
4d334d00c635
plugins/muc/muc.lib: Add instant room support
daurnimator <quae@daurnimator.com>
parents:
6318
diff
changeset
|
861 end |
6202
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
862 end |
3508
9e4c2b048f9a
MUC: Added a 'Description' property (muc#roomconfig_roomdesc)
Kim Alvefur <zash@zash.se>
parents:
3507
diff
changeset
|
863 |
9052
5017e43ccc39
MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents:
9027
diff
changeset
|
864 local event = { |
5017e43ccc39
MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents:
9027
diff
changeset
|
865 room = self; |
5017e43ccc39
MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents:
9027
diff
changeset
|
866 origin = origin; |
5017e43ccc39
MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents:
9027
diff
changeset
|
867 stanza = stanza; |
5017e43ccc39
MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents:
9027
diff
changeset
|
868 fields = fields; |
5017e43ccc39
MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents:
9027
diff
changeset
|
869 status_codes = {}; |
5017e43ccc39
MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents:
9027
diff
changeset
|
870 actor = stanza.attr.from; |
5017e43ccc39
MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents:
9027
diff
changeset
|
871 }; |
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
|
872 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
|
873 local new = fields[field]; |
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
874 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
|
875 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
|
876 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
|
877 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
|
878 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
|
879 return true; |
6202
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
880 end |
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
881 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
|
882 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
|
883 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
|
884 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
|
885 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
|
886 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
|
887 |
7414
1b62c89014c4
MUC: Separate force-save parameter from save-entire-state flag
Kim Alvefur <zash@zash.se>
parents:
7413
diff
changeset
|
888 self:save(true); |
6202
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
889 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
|
890 |
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 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
|
892 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
|
893 :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
|
894 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
|
895 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
|
896 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
|
897 msg:up(); |
6215
1dd09dc04945
plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents:
6214
diff
changeset
|
898 self:broadcast_message(msg); |
6202
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
899 end |
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
900 else |
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
901 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
|
902 end |
6202
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
903 return true; |
1754
67b66eec9777
MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents:
1753
diff
changeset
|
904 end |
67b66eec9777
MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents:
1753
diff
changeset
|
905 |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
906 -- Removes everyone from the room |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
907 function room_mt:clear(x) |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
908 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
|
909 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
|
910 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
|
911 occupant.role = nil; |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
912 self:save_occupant(occupant); |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
913 occupants_updated[occupant] = true; |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
914 end |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
915 for occupant in pairs(occupants_updated) do |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
916 self:publicise_occupant_status(occupant, x); |
10048
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
917 module:fire_event("muc-occupant-left", { |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
918 room = self; |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
919 nick = occupant.nick; |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
920 occupant = occupant; |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
921 }); |
2412
e243b7c81de6
Added notification of configuration changes for MUCs
Rob Hoelz <rob@hoelzro.net>
parents:
2411
diff
changeset
|
922 end |
1754
67b66eec9777
MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents:
1753
diff
changeset
|
923 end |
67b66eec9777
MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents:
1753
diff
changeset
|
924 |
2217
838f6d546177
MUC: Added support for the room-destroy owner use case.
Waqas Hussain <waqas20@gmail.com>
parents:
2216
diff
changeset
|
925 function room_mt:destroy(newjid, reason, password) |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
926 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
|
927 :tag("destroy", {jid=newjid}); |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
928 if reason then x:tag("reason"):text(reason):up(); end |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
929 if password then x:tag("password"):text(password):up(); end |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
930 x:up(); |
9007
695904638cfa
MUC: Flag rooms being destroyed (fixes #887)
Kim Alvefur <zash@zash.se>
parents:
9003
diff
changeset
|
931 self.destroying = reason or true; |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
932 self:clear(x); |
9011
ce8e5206aeba
MUC: Include destruction reason and other info in destroyed event
Kim Alvefur <zash@zash.se>
parents:
9007
diff
changeset
|
933 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
|
934 return true; |
1754
67b66eec9777
MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents:
1753
diff
changeset
|
935 end |
67b66eec9777
MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents:
1753
diff
changeset
|
936 |
6101
a861dc18e08d
plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents:
6100
diff
changeset
|
937 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
|
938 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
|
939 return true; |
a861dc18e08d
plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents:
6100
diff
changeset
|
940 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
|
941 |
6101
a861dc18e08d
plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents:
6100
diff
changeset
|
942 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
|
943 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
|
944 return true; |
a861dc18e08d
plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents:
6100
diff
changeset
|
945 end |
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
946 |
6141
bf6de8ef66c2
plugins/muc: Rename admin query hook
daurnimator <quae@daurnimator.com>
parents:
6140
diff
changeset
|
947 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
|
948 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
|
949 if not item then |
494938dec5d8
MUC: Reject muc:admin query with missing <item> child
Kim Alvefur <zash@zash.se>
parents:
6835
diff
changeset
|
950 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
|
951 return true; |
6909
494938dec5d8
MUC: Reject muc:admin query with missing <item> child
Kim Alvefur <zash@zash.se>
parents:
6835
diff
changeset
|
952 end |
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
953 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
|
954 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
|
955 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
|
956 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
|
957 return true; |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
958 end |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
959 end |
9263
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
960 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
|
961 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
|
962 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
|
963 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
|
964 return true; |
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
965 end |
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
966 end |
9081
ce57c69a20e2
MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents:
9057
diff
changeset
|
967 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
|
968 -- 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
|
969 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
|
970 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
|
971 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
|
972 -- 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
|
973 local nick = self:get_occupant_jid(item.attr.jid); |
8856 | 974 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
|
975 end |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
976 local actor = stanza.attr.from; |
6112
819e00a86239
plugins/muc/muc.lib: Use more modern stanza methods
daurnimator <quae@daurnimator.com>
parents:
6111
diff
changeset
|
977 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
|
978 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
|
979 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
|
980 local registration_data; |
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
981 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
|
982 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
|
983 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
|
984 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
|
985 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
|
986 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
|
987 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
|
988 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
|
989 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
|
990 end |
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
991 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
|
992 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
|
993 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
|
994 else |
6181
6baa9a59aa03
plugins/muc/muc.lib: Remove callback parameter from set_role and set_affiliation
daurnimator <quae@daurnimator.com>
parents:
6180
diff
changeset
|
995 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
|
996 end |
7414
1b62c89014c4
MUC: Separate force-save parameter from save-entire-state flag
Kim Alvefur <zash@zash.se>
parents:
7413
diff
changeset
|
997 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
|
998 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
|
999 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
|
1000 else |
9019bc4c9a5a
MUC: Prevent double replies when MUC affiliation/role change requests fail.
Lance Stout <lancestout@gmail.com>
parents:
6827
diff
changeset
|
1001 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
|
1002 end |
6181
6baa9a59aa03
plugins/muc/muc.lib: Remove callback parameter from set_role and set_affiliation
daurnimator <quae@daurnimator.com>
parents:
6180
diff
changeset
|
1003 return true; |
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1004 end |
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1005 |
6141
bf6de8ef66c2
plugins/muc: Rename admin query hook
daurnimator <quae@daurnimator.com>
parents:
6140
diff
changeset
|
1006 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
|
1007 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
|
1008 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
|
1009 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
|
1010 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
|
1011 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
|
1012 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
|
1013 if _aff and _aff_rank and not _rol then |
9615 | 1014 -- 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
|
1015 -- 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
|
1016 local affiliation_rank = valid_affiliations[affiliation or "none"]; |
9612
abf9bacf77d4
MUC: Clarify condition with parenthesis
Kim Alvefur <zash@zash.se>
parents:
9599
diff
changeset
|
1017 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
|
1018 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
|
1019 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
|
1020 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
|
1021 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
|
1022 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
|
1023 end |
6452
e692ea8c09a0
plugins/muc/muc.lib: Add missing :up()
daurnimator <quae@daurnimator.com>
parents:
6451
diff
changeset
|
1024 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
|
1025 return true; |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1026 else |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1027 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
|
1028 return true; |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1029 end |
6453
14b62ad88d8a
plugins/muc/muc.lib: Validate affiliations and roles to admin query get
daurnimator <quae@daurnimator.com>
parents:
6452
diff
changeset
|
1030 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
|
1031 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
|
1032 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
|
1033 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
|
1034 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
|
1035 -- 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
|
1036 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
|
1037 if occupant.role == _rol then |
8856 | 1038 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
|
1039 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
|
1040 end |
2216
dbbb5ed41365
MUC: Slightly refactored form processing.
Waqas Hussain <waqas20@gmail.com>
parents:
2174
diff
changeset
|
1041 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
|
1042 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
|
1043 return true; |
1734 | 1044 else |
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1045 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
|
1046 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
|
1047 end |
1734 | 1048 else |
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1049 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
|
1050 return true; |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1051 end |
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 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
|
1055 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
|
1056 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
|
1057 return true; |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1058 end |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1059 |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1060 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
|
1061 return true; |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1062 end |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1063 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
|
1064 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
|
1065 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
|
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 end |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1068 |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1069 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
|
1070 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
|
1071 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
|
1072 return true; |
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1073 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
|
1074 local newjid = child.attr.jid; |
6112
819e00a86239
plugins/muc/muc.lib: Use more modern stanza methods
daurnimator <quae@daurnimator.com>
parents:
6111
diff
changeset
|
1075 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
|
1076 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
|
1077 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
|
1078 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
|
1079 return true; |
6202
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
1080 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
|
1081 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
|
1082 else |
1734 | 1083 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
|
1084 return true; |
1734 | 1085 end |
1086 end | |
1087 | |
6093
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1088 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
|
1089 local from = stanza.attr.from; |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1090 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
|
1091 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
|
1092 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
|
1093 end |
6429
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1094 if module:fire_event("muc-occupant-groupchat", { |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1095 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
|
1096 }) 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
|
1097 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
|
1098 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
|
1099 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
|
1100 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
|
1101 end |
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1102 |
6429
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1103 -- Role check |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1104 module:hook("muc-occupant-groupchat", function(event) |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1105 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
|
1106 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
|
1107 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
|
1108 return true; |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1109 elseif role_rank <= valid_roles.visitor then |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1110 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
|
1111 return true; |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1112 end |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1113 end, 50); |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1114 |
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 -- 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
|
1116 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
|
1117 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
|
1118 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
|
1119 if current_nick then |
1734 | 1120 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
|
1121 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
|
1122 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
|
1123 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
|
1124 end |
6100
c78ba94d3261
plugins/muc/muc.lib: Move all kick code into one place
daurnimator <quae@daurnimator.com>
parents:
6099
diff
changeset
|
1125 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
|
1126 end |
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1127 |
6195
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1128 -- 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
|
1129 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
|
1130 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
|
1131 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
|
1132 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
|
1133 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
|
1134 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
|
1135 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
|
1136 return true; |
25ba4e2b31b3
plugins/muc/muc: Check for mediated invites in a smarter way
daurnimator <quae@daurnimator.com>
parents:
6102
diff
changeset
|
1137 end |
6195
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1138 end); |
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1139 |
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1140 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
|
1141 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
|
1142 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
|
1143 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
|
1144 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
|
1145 return true; |
6229
8aa59b73f801
plugins/muc/muc.lib: Remove reversed conditionals when firing pre- events
daurnimator <quae@daurnimator.com>
parents:
6227
diff
changeset
|
1146 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
|
1147 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
|
1148 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
|
1149 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
|
1150 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
|
1151 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
|
1152 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
|
1153 :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
|
1154 :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
|
1155 :up() |
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1156 :up(); |
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1157 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
|
1158 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
|
1159 end |
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1160 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
|
1161 end |
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1162 |
6194
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1163 -- COMPAT: Some older clients expect this |
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1164 module:hook("muc-invite", function(event) |
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1165 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
|
1166 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
|
1167 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
|
1168 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
|
1169 :text(reason or "") |
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1170 :up(); |
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1171 end); |
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1172 |
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1173 -- 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
|
1174 module:hook("muc-invite", function(event) |
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1175 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
|
1176 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
|
1177 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
|
1178 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
|
1179 stanza:tag("body") |
9056
37e287113a8d
MUC: Fix inverted logic ()
Matthew Wild <mwild1@gmail.com>
parents:
9055
diff
changeset
|
1180 :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
|
1181 :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
|
1182 end |
6194
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1183 end); |
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1184 |
6123
7f82bbd249fe
plugins/muc/muc.lib: Remove `payload` argument from `handle_mediated_*`; extract it from inside.
daurnimator <quae@daurnimator.com>
parents:
6122
diff
changeset
|
1185 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
|
1186 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
|
1187 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
|
1188 if not declinee then |
6105
68f53b9a186e
plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents:
6104
diff
changeset
|
1189 origin.send(st.error_reply(stanza, "cancel", "jid-malformed")); |
68f53b9a186e
plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents:
6104
diff
changeset
|
1190 return true; |
6229
8aa59b73f801
plugins/muc/muc.lib: Remove reversed conditionals when firing pre- events
daurnimator <quae@daurnimator.com>
parents:
6227
diff
changeset
|
1191 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
|
1192 return true; |
6105
68f53b9a186e
plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents:
6104
diff
changeset
|
1193 end |
6273
7ef064101994
plugins/muc/muc.lib: Use original decline as template for medated decline
daurnimator <quae@daurnimator.com>
parents:
6272
diff
changeset
|
1194 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
|
1195 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
|
1196 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
|
1197 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
|
1198 :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
|
1199 :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
|
1200 :up() |
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1201 :up(); |
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1202 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
|
1203 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
|
1204 local occupant |
d891fa02e5e5
plugins/muc/muc.lib: Deliver declines to in-room jids correctly
daurnimator <quae@daurnimator.com>
parents:
6274
diff
changeset
|
1205 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
|
1206 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
|
1207 end |
6196
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1208 if occupant then |
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1209 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
|
1210 else |
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1211 self:route_stanza(decline); |
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1212 end |
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1213 end |
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1214 return true; |
6105
68f53b9a186e
plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents:
6104
diff
changeset
|
1215 end |
68f53b9a186e
plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents:
6104
diff
changeset
|
1216 |
6196
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1217 -- 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
|
1218 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
|
1219 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
|
1220 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
|
1221 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
|
1222 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
|
1223 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
|
1224 ..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
|
1225 end |
6196
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1226 end); |
6131
8dd0c6145603
plugins/muc/muc.lib: Add decline event for parity with invite
daurnimator <quae@daurnimator.com>
parents:
6130
diff
changeset
|
1227 |
6093
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1228 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
|
1229 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
|
1230 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
|
1231 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
|
1232 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
|
1233 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
|
1234 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
|
1235 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
|
1236 if x then |
25ba4e2b31b3
plugins/muc/muc: Check for mediated invites in a smarter way
daurnimator <quae@daurnimator.com>
parents:
6102
diff
changeset
|
1237 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
|
1238 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
|
1239 -- 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
|
1240 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
|
1241 return self:handle_mediated_invite(origin, stanza) |
6105
68f53b9a186e
plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents:
6104
diff
changeset
|
1242 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
|
1243 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
|
1244 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
|
1245 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
|
1246 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
|
1247 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
|
1248 |
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
|
1249 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
|
1250 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
|
1251 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
|
1252 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
|
1253 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
|
1254 end |
1734 | 1255 end |
1256 end | |
1257 | |
7089
890f4b2cc444
MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents:
7013
diff
changeset
|
1258 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
|
1259 module:send(stanza); |
6111
f8b94903be52
plugins/muc: Provide a reasonable default `route_stanza`
daurnimator <quae@daurnimator.com>
parents:
6108
diff
changeset
|
1260 end |
1735
81406277279e
MUC: The MUC lib is now metatable based. Cleaned up code, etc.
Waqas Hussain <waqas20@gmail.com>
parents:
1734
diff
changeset
|
1261 |
1737
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1262 function room_mt:get_affiliation(jid) |
10550
0566b45da987
MUC: Remove some unused variables [luacheck]
Kim Alvefur <zash@zash.se>
parents:
10451
diff
changeset
|
1263 local node, host = jid_split(jid); |
9081
ce57c69a20e2
MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents:
9057
diff
changeset
|
1264 -- 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
|
1265 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
|
1266 local result = self._affiliations[bare]; |
1737
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1267 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
|
1268 return result; |
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1269 end |
6186
85f7cd91dc31
plugins/muc/muc.lib: Smarter validation in set_affiliation
daurnimator <quae@daurnimator.com>
parents:
6185
diff
changeset
|
1270 |
6478
413923bbd1a0
plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents:
6476
diff
changeset
|
1271 -- Iterates over jid, affiliation pairs |
413923bbd1a0
plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents:
6476
diff
changeset
|
1272 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
|
1273 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
|
1274 return function(_, jid) |
f2d70dc13700
MUC: Include affiliation data when iterating over affiliations with a room
Matthew Wild <mwild1@gmail.com>
parents:
9530
diff
changeset
|
1275 local affiliation; |
f2d70dc13700
MUC: Include affiliation data when iterating over affiliations with a room
Matthew Wild <mwild1@gmail.com>
parents:
9530
diff
changeset
|
1276 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
|
1277 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
|
1278 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
|
1279 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
|
1280 end, nil, nil; |
6478
413923bbd1a0
plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents:
6476
diff
changeset
|
1281 end |
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1282 |
9237
b86c2e135797
MUC: Add support for storing additional data with MUC affiliations
Matthew Wild <mwild1@gmail.com>
parents:
9194
diff
changeset
|
1283 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
|
1284 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
|
1285 |
10550
0566b45da987
MUC: Remove some unused variables [luacheck]
Kim Alvefur <zash@zash.se>
parents:
10451
diff
changeset
|
1286 local node, host = jid_split(jid); |
6476
fb8a9873728b
plugins/muc/muc.lib: Kick users from outcast hosts
daurnimator <quae@daurnimator.com>
parents:
6475
diff
changeset
|
1287 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
|
1288 jid = jid_join(node, host); -- Bare |
fb8a9873728b
plugins/muc/muc.lib: Kick users from outcast hosts
daurnimator <quae@daurnimator.com>
parents:
6475
diff
changeset
|
1289 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
|
1290 |
85f7cd91dc31
plugins/muc/muc.lib: Smarter validation in set_affiliation
daurnimator <quae@daurnimator.com>
parents:
6185
diff
changeset
|
1291 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
|
1292 return nil, "modify", "not-acceptable"; |
1742
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
1293 end |
6186
85f7cd91dc31
plugins/muc/muc.lib: Smarter validation in set_affiliation
daurnimator <quae@daurnimator.com>
parents:
6185
diff
changeset
|
1294 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
|
1295 |
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1296 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
|
1297 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
|
1298 |
6475
3c815a64042b
plugins/muc/muc.lib: Fix passing actor along as a boolean (thanks fippo)
daurnimator <quae@daurnimator.com>
parents:
6454
diff
changeset
|
1299 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
|
1300 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
|
1301 else |
8842
463505cc75d5
MUC: Revert unstable MUC commits since 0.10.1
Matthew Wild <mwild1@gmail.com>
parents:
8839
diff
changeset
|
1302 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
|
1303 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
|
1304 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
|
1305 -- need at least one owner |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1306 local is_last = true; |
6478
413923bbd1a0
plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents:
6476
diff
changeset
|
1307 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
|
1308 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
|
1309 end |
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1310 if is_last then |
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1311 return nil, "cancel", "conflict"; |
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1312 end |
4357
d6928b78c548
MUC: Allow affiliation change when argument actor==true in room:set_affiliation().
Waqas Hussain <waqas20@gmail.com>
parents:
4326
diff
changeset
|
1313 end |
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1314 -- owners can do anything else |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1315 elseif affiliation == "owner" or affiliation == "admin" |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1316 or actor_affiliation ~= "admin" |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1317 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
|
1318 -- Can't demote owners or other admins |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1319 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
|
1320 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
|
1321 end |
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1322 |
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1323 -- Set in 'database' |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1324 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
|
1325 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
|
1326 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
|
1327 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
|
1328 elseif data then |
b86c2e135797
MUC: Add support for storing additional data with MUC affiliations
Matthew Wild <mwild1@gmail.com>
parents:
9194
diff
changeset
|
1329 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
|
1330 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
|
1331 end |
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1332 |
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1333 -- Update roles |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1334 local role = self:get_default_role(affiliation); |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1335 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
|
1336 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
|
1337 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
|
1338 if occupant.bare_jid == jid or ( |
fb8a9873728b
plugins/muc/muc.lib: Kick users from outcast hosts
daurnimator <quae@daurnimator.com>
parents:
6475
diff
changeset
|
1339 -- Outcast can be by host. |
fb8a9873728b
plugins/muc/muc.lib: Kick users from outcast hosts
daurnimator <quae@daurnimator.com>
parents:
6475
diff
changeset
|
1340 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
|
1341 ) then |
9615 | 1342 -- 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
|
1343 occupants_updated[occupant] = occupant.role; |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1344 if occupant.role ~= role and ( |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1345 is_downgrade or |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1346 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
|
1347 ) then |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1348 occupant.role = role; |
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1349 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
|
1350 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
|
1351 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
|
1352 end |
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1353 |
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1354 -- Tell the room of the new occupant affiliations+roles |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1355 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
|
1356 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
|
1357 if affiliation == "outcast" then |
463505cc75d5
MUC: Revert unstable MUC commits since 0.10.1
Matthew Wild <mwild1@gmail.com>
parents:
8839
diff
changeset
|
1358 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
|
1359 else |
463505cc75d5
MUC: Revert unstable MUC commits since 0.10.1
Matthew Wild <mwild1@gmail.com>
parents:
8839
diff
changeset
|
1360 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
|
1361 end |
1742
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
1362 end |
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1363 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
|
1364 |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1365 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
|
1366 for occupant, old_role in pairs(occupants_updated) do |
10684
de607875d4bd
MUC: Pass previous role to :publicise_occupant_status() whenever possible
Matthew Wild <mwild1@gmail.com>
parents:
10662
diff
changeset
|
1367 self:publicise_occupant_status(occupant, x, nil, actor, reason, old_role); |
9599
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1368 if occupant.role == nil then |
10048
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1369 module:fire_event("muc-occupant-left", { |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1370 room = self; |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1371 nick = occupant.nick; |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1372 occupant = occupant; |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1373 }); |
9599
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1374 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
|
1375 (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
|
1376 (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
|
1377 -- 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
|
1378 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
|
1379 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
|
1380 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
|
1381 end); |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1382 end |
1742
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
1383 end |
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
1384 end |
9599
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1385 else |
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1386 -- 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
|
1387 -- 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
|
1388 -- 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
|
1389 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
|
1390 :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
|
1391 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
|
1392 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
|
1393 end |
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1394 |
7414
1b62c89014c4
MUC: Separate force-save parameter from save-entire-state flag
Kim Alvefur <zash@zash.se>
parents:
7413
diff
changeset
|
1395 self:save(true); |
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1396 |
6393
fff6ca13cb0f
plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents:
6392
diff
changeset
|
1397 module:fire_event("muc-set-affiliation", { |
fff6ca13cb0f
plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents:
6392
diff
changeset
|
1398 room = self; |
fff6ca13cb0f
plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents:
6392
diff
changeset
|
1399 actor = actor; |
fff6ca13cb0f
plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents:
6392
diff
changeset
|
1400 jid = jid; |
fff6ca13cb0f
plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents:
6392
diff
changeset
|
1401 affiliation = affiliation or "none"; |
fff6ca13cb0f
plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents:
6392
diff
changeset
|
1402 reason = reason; |
fff6ca13cb0f
plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents:
6392
diff
changeset
|
1403 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
|
1404 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
|
1405 in_room = next(occupants_updated) ~= nil; |
fff6ca13cb0f
plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents:
6392
diff
changeset
|
1406 }); |
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1407 |
1742
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
1408 return true; |
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
1409 end |
1734 | 1410 |
9532
9bb33edd7255
MUC: Add function to retrieve affiliation data for a given JID
Matthew Wild <mwild1@gmail.com>
parents:
9531
diff
changeset
|
1411 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
|
1412 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
|
1413 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
|
1414 if key then |
9bb33edd7255
MUC: Add function to retrieve affiliation data for a given JID
Matthew Wild <mwild1@gmail.com>
parents:
9531
diff
changeset
|
1415 return data[key]; |
9bb33edd7255
MUC: Add function to retrieve affiliation data for a given JID
Matthew Wild <mwild1@gmail.com>
parents:
9531
diff
changeset
|
1416 end |
9bb33edd7255
MUC: Add function to retrieve affiliation data for a given JID
Matthew Wild <mwild1@gmail.com>
parents:
9531
diff
changeset
|
1417 return data; |
9bb33edd7255
MUC: Add function to retrieve affiliation data for a given JID
Matthew Wild <mwild1@gmail.com>
parents:
9531
diff
changeset
|
1418 end |
9bb33edd7255
MUC: Add function to retrieve affiliation data for a given JID
Matthew Wild <mwild1@gmail.com>
parents:
9531
diff
changeset
|
1419 |
1742
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
1420 function room_mt:get_role(nick) |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1421 local occupant = self:get_occupant_by_nick(nick); |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1422 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
|
1423 end |
6182
dbf0b09664cd
plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents:
6181
diff
changeset
|
1424 |
9830
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1425 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
|
1426 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
|
1427 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
|
1428 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
|
1429 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
|
1430 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
|
1431 }; |
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
|
1432 |
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
|
1433 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
|
1434 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
|
1435 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
|
1436 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
|
1437 |
9830
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1438 -- 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
|
1439 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
|
1440 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
|
1441 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
|
1442 end |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1443 |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1444 -- 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
|
1445 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
|
1446 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
|
1447 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
|
1448 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
|
1449 end |
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 -- 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
|
1453 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
|
1454 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
|
1455 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
|
1456 end |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1457 |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1458 return true; |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1459 end |
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
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 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
|
1462 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
|
1463 |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1464 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
|
1465 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
|
1466 |
6182
dbf0b09664cd
plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents:
6181
diff
changeset
|
1467 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
|
1468 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
|
1469 end |
dbf0b09664cd
plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents:
6181
diff
changeset
|
1470 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
|
1471 |
6475
3c815a64042b
plugins/muc/muc.lib: Fix passing actor along as a boolean (thanks fippo)
daurnimator <quae@daurnimator.com>
parents:
6454
diff
changeset
|
1472 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
|
1473 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
|
1474 else |
9830
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1475 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
|
1476 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
|
1477 return allowed, err, condition; |
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1478 end |
3279
8b0a4a7d2c6e
MUC: Added room:can_set_role().
Waqas Hussain <waqas20@gmail.com>
parents:
3264
diff
changeset
|
1479 end |
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1480 |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1481 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
|
1482 if not role then |
8842
463505cc75d5
MUC: Revert unstable MUC commits since 0.10.1
Matthew Wild <mwild1@gmail.com>
parents:
8839
diff
changeset
|
1483 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
|
1484 end |
10353
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
1485 |
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
1486 local prev_role = occupant.role; |
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1487 occupant.role = role; |
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1488 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
|
1489 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
|
1490 if role == nil then |
10048
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1491 module:fire_event("muc-occupant-left", { |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1492 room = self; |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1493 nick = occupant.nick; |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1494 occupant = occupant; |
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1495 }); |
3632
d82189efecc0
MUC: Include the user's current presence contents when broadcasting a role change.
Waqas Hussain <waqas20@gmail.com>
parents:
3631
diff
changeset
|
1496 end |
1737
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1497 return true; |
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1498 end |
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1499 |
6214
9813c74ce006
plugins/muc: Move `whois` code to seperate file
daurnimator <quae@daurnimator.com>
parents:
6213
diff
changeset
|
1500 local whois = module:require "muc/whois"; |
9813c74ce006
plugins/muc: Move `whois` code to seperate file
daurnimator <quae@daurnimator.com>
parents:
6213
diff
changeset
|
1501 room_mt.get_whois = whois.get; |
9813c74ce006
plugins/muc: Move `whois` code to seperate file
daurnimator <quae@daurnimator.com>
parents:
6213
diff
changeset
|
1502 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
|
1503 |
1737
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1504 local _M = {}; -- module "muc" |
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1505 |
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
|
1506 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
|
1507 return setmetatable({ |
1734 | 1508 jid = jid; |
1509 _jid_nick = {}; | |
1739
393abf245322
MUC: Renamed _participants table to _occupants
Waqas Hussain <waqas20@gmail.com>
parents:
1737
diff
changeset
|
1510 _occupants = {}; |
7362
032fcb7b80a1
MUC: Use config passed to rew_roow()
Kim Alvefur <zash@zash.se>
parents:
7360
diff
changeset
|
1511 _data = config or {}; |
1737
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1512 _affiliations = {}; |
9237
b86c2e135797
MUC: Add support for storing additional data with MUC affiliations
Matthew Wild <mwild1@gmail.com>
parents:
9194
diff
changeset
|
1513 _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
|
1514 }, room_mt); |
1734 | 1515 end |
1516 | |
7488
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1517 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
|
1518 |
7369
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1519 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
|
1520 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
|
1521 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
|
1522 frozen = { |
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1523 _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
|
1524 _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
|
1525 }; |
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1526 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
|
1527 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
|
1528 end |
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1529 else |
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1530 frozen = { |
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1531 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
|
1532 _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
|
1533 _affiliations = self._affiliations; |
9237
b86c2e135797
MUC: Add support for storing additional data with MUC affiliations
Matthew Wild <mwild1@gmail.com>
parents:
9194
diff
changeset
|
1534 _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
|
1535 }; |
7368
4e24aff1e4df
MUC: Flatten format of serialized rooms
Kim Alvefur <zash@zash.se>
parents:
7367
diff
changeset
|
1536 end |
7369
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1537 if live then |
7415
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1538 state = {}; |
7369
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1539 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
|
1540 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
|
1541 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
|
1542 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
|
1543 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
|
1544 } |
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1545 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
|
1546 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
|
1547 end |
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1548 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
|
1549 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
|
1550 if history and history[1] ~= nil then |
7415
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1551 state._last_message = st.preserialize(history[#history].stanza); |
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1552 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
|
1553 end |
7369
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1554 end |
7415
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1555 return frozen, state; |
7360
7a37fade5380
MUC: Move 'preserialization' step to muc.lib
Kim Alvefur <zash@zash.se>
parents:
7353
diff
changeset
|
1556 end |
7a37fade5380
MUC: Move 'preserialization' step to muc.lib
Kim Alvefur <zash@zash.se>
parents:
7353
diff
changeset
|
1557 |
7415
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1558 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
|
1559 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
|
1560 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
|
1561 |
7416
c33a1d6da016
MUC: Restore last message from state, not room config (missing change from cbb05b454c13)
Kim Alvefur <zash@zash.se>
parents:
7415
diff
changeset
|
1562 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
|
1563 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
|
1564 { 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
|
1565 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
|
1566 }; |
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
|
1567 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
|
1568 |
7369
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1569 local occupants = {}; |
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1570 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
|
1571 |
9265
585ef5c1b226
MUC: Initialize room with empty affiliation_data if none stored
Matthew Wild <mwild1@gmail.com>
parents:
9264
diff
changeset
|
1572 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
|
1573 |
7631
f50c039d6bb1
MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents:
7488
diff
changeset
|
1574 if frozen.jid and frozen._affiliations then |
9239
03e37f7d6c97
MUC: Add some comments for clarity
Matthew Wild <mwild1@gmail.com>
parents:
9238
diff
changeset
|
1575 -- Old storage format |
7631
f50c039d6bb1
MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents:
7488
diff
changeset
|
1576 room._affiliations = frozen._affiliations; |
f50c039d6bb1
MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents:
7488
diff
changeset
|
1577 else |
9239
03e37f7d6c97
MUC: Add some comments for clarity
Matthew Wild <mwild1@gmail.com>
parents:
9238
diff
changeset
|
1578 -- New storage format |
7631
f50c039d6bb1
MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents:
7488
diff
changeset
|
1579 for jid, data in pairs(frozen) do |
10550
0566b45da987
MUC: Remove some unused variables [luacheck]
Kim Alvefur <zash@zash.se>
parents:
10451
diff
changeset
|
1580 local _, host, resource = jid_split(jid); |
7631
f50c039d6bb1
MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents:
7488
diff
changeset
|
1581 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
|
1582 -- bare jid: affiliation |
f50c039d6bb1
MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents:
7488
diff
changeset
|
1583 room._affiliations[jid] = data; |
f50c039d6bb1
MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents:
7488
diff
changeset
|
1584 end |
7415
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1585 end |
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1586 end |
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1587 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
|
1588 local node, host, resource = jid_split(jid); |
7368
4e24aff1e4df
MUC: Flatten format of serialized rooms
Kim Alvefur <zash@zash.se>
parents:
7367
diff
changeset
|
1589 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
|
1590 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
|
1591 -- 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
|
1592 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
|
1593 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
|
1594 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
|
1595 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
|
1596 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
|
1597 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
|
1598 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
|
1599 -- 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
|
1600 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
|
1601 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
|
1602 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
|
1603 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
|
1604 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
|
1605 end |
7368
4e24aff1e4df
MUC: Flatten format of serialized rooms
Kim Alvefur <zash@zash.se>
parents:
7367
diff
changeset
|
1606 end |
4e24aff1e4df
MUC: Flatten format of serialized rooms
Kim Alvefur <zash@zash.se>
parents:
7367
diff
changeset
|
1607 end |
7369
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1608 |
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1609 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
|
1610 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
|
1611 end |
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1612 |
7367
2aef5e8b69e9
MUC: Move room deserialization to muc.lib
Kim Alvefur <zash@zash.se>
parents:
7366
diff
changeset
|
1613 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
|
1614 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
|
1615 |
5063
4bc202a7b351
MUC: Expose room metatable in the MUC lib.
Waqas Hussain <waqas20@gmail.com>
parents:
5061
diff
changeset
|
1616 _M.room_mt = room_mt; |
4bc202a7b351
MUC: Expose room metatable in the MUC lib.
Waqas Hussain <waqas20@gmail.com>
parents:
5061
diff
changeset
|
1617 |
1734 | 1618 return _M; |