Mercurial > prosody-hg
annotate plugins/muc/muc.lib.lua @ 11245:43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
The following patch allows Prosody to respond to `probe` presences and send out the probed occupant's current presence.
This is based on line 17.3 in XEP-0045:
A MUC service MAY handle presence probes sent to the room JID <room@service> or an occupant JID <room@service/nick>
(e.g, these might be sent by an occupant's home server to determine if the room is still online or to synchronize
presence information if the user or the user's server has gone offline temporarily or has started sharing presence again,
as for instance when Stanza Interception and Filtering Technology (XEP-0273) is used).
| author | JC Brand <jc@opkode.com> |
|---|---|
| date | Sun, 19 Apr 2020 21:49:45 +0200 |
| parents | b1d7027be61e |
| children | ab189e707705 |
| 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) |
|
10753
925081396c59
MUC: Always include 'affiliation'/'role' attributes, defaulting to 'none' if nil
Matthew Wild <mwild1@gmail.com>
parents:
10690
diff
changeset
|
147 x:tag("item", {affiliation = affiliation or "none"; 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 |
|
11245
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
219 |
|
6278
fcc3ef191293
plugins/muc/muc: Fire broadcast presences event before creating full/anon presences
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
220 -- 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
|
221 -- Takes the x element that goes into the stanzas |
|
11245
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
222 function room_mt:publicise_occupant_status(occupant, x, nick, actor, reason, prev_role, force_unavailable, recipient) |
|
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
|
223 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
|
224 -- 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
|
225 local base_presence do |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
226 -- Try to use main jid's presence |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
227 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
|
228 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
|
229 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
|
230 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
|
231 base_presence = st.presence {from = occupant.nick; type = "unavailable";}; |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
232 end |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
233 end |
|
6211
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
234 |
|
6278
fcc3ef191293
plugins/muc/muc: Fire broadcast presences event before creating full/anon presences
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
235 -- 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
|
236 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
|
237 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
|
238 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
|
239 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
|
240 } |
|
10712
dc24a8783c5d
MUC: Add new event 'muc-build-occupant-presence' for plugins to extend occupant presence
Matthew Wild <mwild1@gmail.com>
parents:
10691
diff
changeset
|
241 module:fire_event("muc-build-occupant-presence", event); |
|
11245
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
242 if not recipient then |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
243 module:fire_event("muc-broadcast-presence", event); |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
244 end |
|
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
|
245 |
|
3bbd59c03aeb
plugins/muc/muc.lib: Allow muc-broadcast-presence event listeners to modify nick, actor, reason
daurnimator <quae@daurnimator.com>
parents:
6512
diff
changeset
|
246 -- 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
|
247 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
|
248 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
|
249 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
|
250 |
|
6512
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
251 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
|
252 |
|
6512
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
253 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
|
254 if actor then |
| 8856 | 255 actor_nick = jid_resource(self:get_occupant_jid(actor)); |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
256 end |
|
6278
fcc3ef191293
plugins/muc/muc: Fire broadcast presences event before creating full/anon presences
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
257 |
|
6512
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
258 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
|
259 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
|
260 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
|
261 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
|
262 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
|
263 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
|
264 end |
|
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
265 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
|
266 end |
|
6266
cabeff5fc687
plugins/muc/muc.lib: Fire event for presence broadcast
daurnimator <quae@daurnimator.com>
parents:
6253
diff
changeset
|
267 |
|
6211
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
268 local anon_p, anon_x; |
|
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
269 local function get_anon_p() |
|
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
270 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
|
271 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
|
272 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
|
273 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
|
274 end |
|
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
275 return anon_p, anon_x; |
|
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
276 end |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
277 |
|
6512
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
278 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
|
279 do |
|
6512
ad159be9e9d7
plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents:
6478
diff
changeset
|
280 -- 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
|
281 -- 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
|
282 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
|
283 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
|
284 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
|
285 end |
|
6211
a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents:
6209
diff
changeset
|
286 |
|
11245
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
287 local function get_p(rec_occupant) |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
288 local pr; |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
289 if can_see_real_jids(whois, rec_occupant) then |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
290 pr = get_full_p(); |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
291 elseif occupant.bare_jid == rec_occupant.bare_jid then |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
292 pr = self_p; |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
293 else |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
294 pr = get_anon_p(); |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
295 end |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
296 return pr |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
297 end |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
298 |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
299 if recipient then |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
300 return self:route_to_occupant(recipient, get_p(recipient)); |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
301 end |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
302 |
|
10353
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
303 local broadcast_roles = self:get_presence_broadcast(); |
| 9615 | 304 -- General populace |
|
7089
890f4b2cc444
MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents:
7013
diff
changeset
|
305 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
|
306 if occupant_nick ~= occupant.nick then |
|
11245
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
307 local pr = get_p(n_occupant); |
|
10353
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
308 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
|
309 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
|
310 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
|
311 pr.attr.type = 'unavailable'; |
|
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
312 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
|
313 end |
|
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
314 |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
315 end |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
316 end |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
317 |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
318 -- 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
|
319 self_x:tag("status", {code = "110";}):up(); |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
320 if occupant.role == nil then |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
321 -- 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
|
322 self:route_to_occupant(occupant, self_p); |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
323 else |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
324 -- use their own presences as templates |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
325 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
|
326 pr = st.clone(pr); |
|
10804
4dc57789f51b
Fixes #1533 Hats don't get sent out to own MUC user
JC Brand <jc@opkode.com>
parents:
10757
diff
changeset
|
327 module:fire_event("muc-build-occupant-presence", { room = self, occupant = occupant, stanza = pr }); |
|
6212
b82523f92b06
plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents:
6211
diff
changeset
|
328 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
|
329 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
|
330 self:route_stanza(pr); |
| 1734 | 331 end |
| 332 end | |
| 333 end | |
|
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5681
diff
changeset
|
334 |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
335 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
|
336 local to_bare = jid_bare(to); |
|
10353
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
337 local broadcast_roles = self:get_presence_broadcast(); |
|
11245
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
338 local is_anonymous = self:is_anonymous_for(to); |
|
10687
8c2c5b4fde32
MUC: Support for broadcasting unavailable presence for affiliated offline users
Matthew Wild <mwild1@gmail.com>
parents:
10686
diff
changeset
|
339 local broadcast_bare_jids = {}; -- Track which bare JIDs we have sent presence for |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
340 for occupant_jid, occupant in self:each_occupant() do |
|
10687
8c2c5b4fde32
MUC: Support for broadcasting unavailable presence for affiliated offline users
Matthew Wild <mwild1@gmail.com>
parents:
10686
diff
changeset
|
341 broadcast_bare_jids[occupant.bare_jid] = true; |
|
6184
2bfc4b12ec8f
plugins/muc/muc.lib: Allow `:send_occupant_list` to have no filter
daurnimator <quae@daurnimator.com>
parents:
6183
diff
changeset
|
342 if filter == nil or filter(occupant_jid, occupant) then |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
343 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
|
344 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
|
345 local pres = st.clone(occupant:get_presence()); |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
346 pres.attr.to = to; |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
347 pres:add_child(x); |
|
10712
dc24a8783c5d
MUC: Add new event 'muc-build-occupant-presence' for plugins to extend occupant presence
Matthew Wild <mwild1@gmail.com>
parents:
10691
diff
changeset
|
348 module:fire_event("muc-build-occupant-presence", { room = self, occupant = occupant, stanza = pres }); |
|
10353
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
349 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
|
350 self:route_stanza(pres); |
|
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
351 end |
| 1734 | 352 end |
| 353 end | |
|
10687
8c2c5b4fde32
MUC: Support for broadcasting unavailable presence for affiliated offline users
Matthew Wild <mwild1@gmail.com>
parents:
10686
diff
changeset
|
354 if broadcast_roles.none then |
|
8c2c5b4fde32
MUC: Support for broadcasting unavailable presence for affiliated offline users
Matthew Wild <mwild1@gmail.com>
parents:
10686
diff
changeset
|
355 -- Broadcast stanzas for affiliated users not currently in the MUC |
|
8c2c5b4fde32
MUC: Support for broadcasting unavailable presence for affiliated offline users
Matthew Wild <mwild1@gmail.com>
parents:
10686
diff
changeset
|
356 for affiliated_jid, affiliation, affiliation_data in self:each_affiliation() do |
|
8c2c5b4fde32
MUC: Support for broadcasting unavailable presence for affiliated offline users
Matthew Wild <mwild1@gmail.com>
parents:
10686
diff
changeset
|
357 local nick = affiliation_data and affiliation_data.reserved_nickname; |
|
8c2c5b4fde32
MUC: Support for broadcasting unavailable presence for affiliated offline users
Matthew Wild <mwild1@gmail.com>
parents:
10686
diff
changeset
|
358 if (nick or not is_anonymous) and not broadcast_bare_jids[affiliated_jid] |
|
8c2c5b4fde32
MUC: Support for broadcasting unavailable presence for affiliated offline users
Matthew Wild <mwild1@gmail.com>
parents:
10686
diff
changeset
|
359 and (filter == nil or filter(affiliated_jid, nil)) then |
|
8c2c5b4fde32
MUC: Support for broadcasting unavailable presence for affiliated offline users
Matthew Wild <mwild1@gmail.com>
parents:
10686
diff
changeset
|
360 local from = nick and (self.jid.."/"..nick) or self.jid; |
|
8c2c5b4fde32
MUC: Support for broadcasting unavailable presence for affiliated offline users
Matthew Wild <mwild1@gmail.com>
parents:
10686
diff
changeset
|
361 local pres = st.presence({ to = to, from = from, type = "unavailable" }) |
|
8c2c5b4fde32
MUC: Support for broadcasting unavailable presence for affiliated offline users
Matthew Wild <mwild1@gmail.com>
parents:
10686
diff
changeset
|
362 :tag("x", { xmlns = 'http://jabber.org/protocol/muc#user' }) |
|
8c2c5b4fde32
MUC: Support for broadcasting unavailable presence for affiliated offline users
Matthew Wild <mwild1@gmail.com>
parents:
10686
diff
changeset
|
363 :tag("item", { |
|
8c2c5b4fde32
MUC: Support for broadcasting unavailable presence for affiliated offline users
Matthew Wild <mwild1@gmail.com>
parents:
10686
diff
changeset
|
364 affiliation = affiliation; |
|
8c2c5b4fde32
MUC: Support for broadcasting unavailable presence for affiliated offline users
Matthew Wild <mwild1@gmail.com>
parents:
10686
diff
changeset
|
365 role = "none"; |
|
8c2c5b4fde32
MUC: Support for broadcasting unavailable presence for affiliated offline users
Matthew Wild <mwild1@gmail.com>
parents:
10686
diff
changeset
|
366 nick = nick; |
|
8c2c5b4fde32
MUC: Support for broadcasting unavailable presence for affiliated offline users
Matthew Wild <mwild1@gmail.com>
parents:
10686
diff
changeset
|
367 jid = not is_anonymous and affiliated_jid or nil }):up() |
|
8c2c5b4fde32
MUC: Support for broadcasting unavailable presence for affiliated offline users
Matthew Wild <mwild1@gmail.com>
parents:
10686
diff
changeset
|
368 :up(); |
|
8c2c5b4fde32
MUC: Support for broadcasting unavailable presence for affiliated offline users
Matthew Wild <mwild1@gmail.com>
parents:
10686
diff
changeset
|
369 self:route_stanza(pres); |
|
8c2c5b4fde32
MUC: Support for broadcasting unavailable presence for affiliated offline users
Matthew Wild <mwild1@gmail.com>
parents:
10686
diff
changeset
|
370 end |
| 1734 | 371 end |
| 372 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
|
373 end |
| 1734 | 374 |
|
2503
bb6b0bd7f2cf
MUC: Converted some local functions into methods.
Waqas Hussain <waqas20@gmail.com>
parents:
2416
diff
changeset
|
375 function room_mt:get_disco_info(stanza) |
|
11142
552cafd30eb2
MUC: Preserve disco 'node' attribute (or lack thereof) in response (fix #1595) (thanks lessthan3)
Kim Alvefur <zash@zash.se>
parents:
10753
diff
changeset
|
376 local node = stanza.tags[1].attr.node; |
|
9299
2466b533f63d
MUC: Fix to correctly return 'node' in disco#info responses (thanks jc)
Matthew Wild <mwild1@gmail.com>
parents:
9265
diff
changeset
|
377 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
|
378 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
|
379 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
|
380 |
|
11142
552cafd30eb2
MUC: Preserve disco 'node' attribute (or lack thereof) in response (fix #1595) (thanks lessthan3)
Kim Alvefur <zash@zash.se>
parents:
10753
diff
changeset
|
381 if node and node ~= "" then |
|
9238
0c1a1172d942
MUC: Add support for separate events for disco#info queries with a 'node'
Matthew Wild <mwild1@gmail.com>
parents:
9237
diff
changeset
|
382 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
|
383 else |
|
0c1a1172d942
MUC: Add support for separate events for disco#info queries with a 'node'
Matthew Wild <mwild1@gmail.com>
parents:
9237
diff
changeset
|
384 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
|
385 { 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
|
386 }; |
|
0c1a1172d942
MUC: Add support for separate events for disco#info queries with a 'node'
Matthew Wild <mwild1@gmail.com>
parents:
9237
diff
changeset
|
387 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
|
388 end |
|
0c1a1172d942
MUC: Add support for separate events for disco#info queries with a 'node'
Matthew Wild <mwild1@gmail.com>
parents:
9237
diff
changeset
|
389 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
|
390 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
|
391 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
|
392 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
|
393 return reply; |
|
1756
b2291156a9c2
MUC: Added service discovery replies for rooms.
Waqas Hussain <waqas20@gmail.com>
parents:
1755
diff
changeset
|
394 end |
|
6200
57bc52f67564
plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents:
6199
diff
changeset
|
395 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
|
396 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
|
397 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
|
398 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
|
399 end); |
|
57bc52f67564
plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents:
6199
diff
changeset
|
400 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
|
401 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
|
402 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
|
403 end); |
|
57bc52f67564
plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents:
6199
diff
changeset
|
404 |
|
8891
d9b7db6f140f
MUC: Ignore unused 'self' [luacheck]
Kim Alvefur <zash@zash.se>
parents:
8888
diff
changeset
|
405 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
|
406 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
|
407 end |
| 1734 | 408 |
|
7089
890f4b2cc444
MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents:
7013
diff
changeset
|
409 function room_mt:handle_kickable(origin, stanza) -- luacheck: ignore 212 |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
410 local real_jid = stanza.attr.from; |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
411 local occupant = self:get_occupant_by_real_jid(real_jid); |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
412 if occupant == nil then return nil; end |
|
10550
0566b45da987
MUC: Remove some unused variables [luacheck]
Kim Alvefur <zash@zash.se>
parents:
10451
diff
changeset
|
413 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
|
414 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
|
415 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
|
416 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
|
417 end |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
418 occupant:set_session(real_jid, st.presence({type="unavailable"}) |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
419 :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
|
420 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
|
421 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
|
422 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
|
423 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
|
424 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
|
425 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
|
426 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
|
427 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
|
428 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
|
429 end |
|
10684
de607875d4bd
MUC: Pass previous role to :publicise_occupant_status() whenever possible
Matthew Wild <mwild1@gmail.com>
parents:
10662
diff
changeset
|
430 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
|
431 if is_last_session then |
|
10048
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
432 module:fire_event("muc-occupant-left", { |
|
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
433 room = self; |
|
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
434 nick = occupant.nick; |
|
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
435 occupant = occupant; |
|
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
436 }); |
|
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
|
437 end |
|
6100
c78ba94d3261
plugins/muc/muc.lib: Move all kick code into one place
daurnimator <quae@daurnimator.com>
parents:
6099
diff
changeset
|
438 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
|
439 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
|
440 |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
441 -- Give the room creator owner affiliation |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
442 module:hook("muc-room-pre-create", function(event) |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
443 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
|
444 end, -1); |
|
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
445 |
|
6180
35388114439f
plugins/muc/muc.lib: non-function changes (reordering, semicolons and comments)
daurnimator <quae@daurnimator.com>
parents:
6179
diff
changeset
|
446 -- 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
|
447 module:hook("muc-occupant-pre-join", function(event) |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
448 local room, stanza = event.room, event.stanza; |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
449 local affiliation = room:get_affiliation(stanza.attr.from); |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
450 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
|
451 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
|
452 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
|
453 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
|
454 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
|
455 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
|
456 end, -10); |
|
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
457 |
|
9024
43241e74bb19
MUC: Reject invisible nicknames (fixes #979)
Kim Alvefur <zash@zash.se>
parents:
9023
diff
changeset
|
458 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
|
459 local room = event.room; |
|
9026
91b5a5667016
MUC: Use nickname from occupant object
Kim Alvefur <zash@zash.se>
parents:
9025
diff
changeset
|
460 local nick = jid_resource(event.occupant.nick); |
|
9024
43241e74bb19
MUC: Reject invisible nicknames (fixes #979)
Kim Alvefur <zash@zash.se>
parents:
9023
diff
changeset
|
461 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
|
462 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
|
463 return true; |
|
43241e74bb19
MUC: Reject invisible nicknames (fixes #979)
Kim Alvefur <zash@zash.se>
parents:
9023
diff
changeset
|
464 end |
|
43241e74bb19
MUC: Reject invisible nicknames (fixes #979)
Kim Alvefur <zash@zash.se>
parents:
9023
diff
changeset
|
465 end, 1); |
|
43241e74bb19
MUC: Reject invisible nicknames (fixes #979)
Kim Alvefur <zash@zash.se>
parents:
9023
diff
changeset
|
466 |
|
9027
4028eb4a9f7f
MUC: Also prevent changing to an invisible nickname
Kim Alvefur <zash@zash.se>
parents:
9026
diff
changeset
|
467 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
|
468 local room = event.room; |
|
9027
4028eb4a9f7f
MUC: Also prevent changing to an invisible nickname
Kim Alvefur <zash@zash.se>
parents:
9026
diff
changeset
|
469 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
|
470 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
|
471 return true; |
|
4028eb4a9f7f
MUC: Also prevent changing to an invisible nickname
Kim Alvefur <zash@zash.se>
parents:
9026
diff
changeset
|
472 end |
|
4028eb4a9f7f
MUC: Also prevent changing to an invisible nickname
Kim Alvefur <zash@zash.se>
parents:
9026
diff
changeset
|
473 end, 1); |
|
4028eb4a9f7f
MUC: Also prevent changing to an invisible nickname
Kim Alvefur <zash@zash.se>
parents:
9026
diff
changeset
|
474 |
|
10361
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
475 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
|
476 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
|
477 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
|
478 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
|
479 event.origin.send(st.error_reply(event.stanza, "modify", "jid-malformed", "Nickname must pass strict validation", room.jid)); |
|
8913
560419b759c8
MUC: Remove support for GC 1.0 during room creation
Kim Alvefur <zash@zash.se>
parents:
8912
diff
changeset
|
480 return true; |
|
560419b759c8
MUC: Remove support for GC 1.0 during room creation
Kim Alvefur <zash@zash.se>
parents:
8912
diff
changeset
|
481 end |
|
10361
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
482 end, 2); |
|
8913
560419b759c8
MUC: Remove support for GC 1.0 during room creation
Kim Alvefur <zash@zash.se>
parents:
8912
diff
changeset
|
483 |
|
10361
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
484 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
|
485 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
|
486 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
|
487 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
|
488 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
|
489 return true; |
|
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
490 end |
|
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
491 end, 2); |
|
6e051bfca12d
MUC: Enforce strict resourceprep on nicknames (bye bye robot face)
Kim Alvefur <zash@zash.se>
parents:
10353
diff
changeset
|
492 |
|
7410
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
493 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
|
494 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
|
495 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
|
496 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
|
497 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
|
498 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
|
499 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
|
500 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
|
501 }) 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
|
502 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
|
503 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
|
504 |
|
7706
d92e186c2a1c
MUC: Include the appropriate status code if nickname is changed during join process
Kim Alvefur <zash@zash.se>
parents:
7705
diff
changeset
|
505 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
|
506 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
|
507 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
|
508 origin = origin; |
|
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
509 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
|
510 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
|
511 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
|
512 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
|
513 }) 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
|
514 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
|
515 |
|
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
516 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
|
517 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
|
518 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
|
519 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
|
520 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
|
521 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
|
522 if nick_changed then |
|
9022
293ebfed71f7
MUC: Simplify creation of <{muc}x> for room creation
Kim Alvefur <zash@zash.se>
parents:
9017
diff
changeset
|
523 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
|
524 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
|
525 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
|
526 |
|
9022
293ebfed71f7
MUC: Simplify creation of <{muc}x> for room creation
Kim Alvefur <zash@zash.se>
parents:
9017
diff
changeset
|
527 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
|
528 |
|
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
529 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
|
530 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
|
531 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
|
532 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
|
533 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
|
534 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
|
535 }); |
|
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
536 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
|
537 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
|
538 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
|
539 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
|
540 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
|
541 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
|
542 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
|
543 }); |
|
7411
f385cd6127b2
MUC: Add event for when room is done being created
Kim Alvefur <zash@zash.se>
parents:
7410
diff
changeset
|
544 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
|
545 room = self; |
|
f385cd6127b2
MUC: Add event for when room is done being created
Kim Alvefur <zash@zash.se>
parents:
7410
diff
changeset
|
546 creator = dest_occupant; |
|
f385cd6127b2
MUC: Add event for when room is done being created
Kim Alvefur <zash@zash.se>
parents:
7410
diff
changeset
|
547 stanza = stanza; |
|
f385cd6127b2
MUC: Add event for when room is done being created
Kim Alvefur <zash@zash.se>
parents:
7410
diff
changeset
|
548 origin = origin; |
|
f385cd6127b2
MUC: Add event for when room is done being created
Kim Alvefur <zash@zash.se>
parents:
7410
diff
changeset
|
549 }); |
|
7410
45f543c82893
MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7409
diff
changeset
|
550 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
|
551 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
|
552 |
|
11245
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
553 |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
554 function room_mt:is_anonymous_for(jid) |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
555 local is_anonymous = false; |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
556 local whois = self:get_whois(); |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
557 if whois ~= "anyone" then |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
558 local affiliation = self:get_affiliation(jid); |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
559 if affiliation ~= "admin" and affiliation ~= "owner" then |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
560 local occupant = self:get_occupant_by_real_jid(jid); |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
561 if not (occupant and can_see_real_jids(whois, occupant)) then |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
562 is_anonymous = true; |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
563 end |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
564 end |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
565 end |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
566 return is_anonymous; |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
567 end |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
568 |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
569 |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
570 function room_mt:build_unavailable_presence(from_muc_jid, to_jid) |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
571 local nick = jid_resource(from_muc_jid); |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
572 local from_jid = self:get_registered_jid(nick); |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
573 if (not from_jid) then |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
574 module:log("debug", "Received presence probe for unavailable nickname that's not registered"); |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
575 return; |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
576 end |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
577 local is_anonymous = self:is_anonymous_for(to_jid); |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
578 local affiliation = self:get_affiliation(from_jid) or "none"; |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
579 local pr = st.presence({ to = to_jid, from = from_muc_jid, type = "unavailable" }) |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
580 :tag("x", { xmlns = 'http://jabber.org/protocol/muc#user' }) |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
581 :tag("item", { |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
582 affiliation = affiliation; |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
583 role = "none"; |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
584 nick = nick; |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
585 jid = not is_anonymous and from_jid or nil }):up() |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
586 :up(); |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
587 |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
588 local x = pr:get_child("x", "http://jabber.org/protocol/muc"); |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
589 local event = { |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
590 room = self; stanza = pr; x = x; |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
591 bare_jid = from_jid; |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
592 nick = nick; |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
593 } |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
594 module:fire_event("muc-build-occupant-presence", event); |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
595 return event.stanza; |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
596 end |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
597 |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
598 |
|
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 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
|
600 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
|
601 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
|
602 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
|
603 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
|
604 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
|
605 |
|
8931
ae84911c1441
MUC: Avoid sending error for unavailable presence in GC 1.0 check
Kim Alvefur <zash@zash.se>
parents:
8915
diff
changeset
|
606 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
|
607 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
|
608 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
|
609 "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
|
610 return true; |
|
e9acb928c637
MUC: Remove support for GC 1.0 for joining
Kim Alvefur <zash@zash.se>
parents:
8913
diff
changeset
|
611 end |
|
e9acb928c637
MUC: Remove support for GC 1.0 for joining
Kim Alvefur <zash@zash.se>
parents:
8913
diff
changeset
|
612 |
|
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
613 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
|
614 local dest_occupant; |
|
8754
ca40f9a5751a
MUC: Move something into empty if branch
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
615 if type == "unavailable" then |
|
ca40f9a5751a
MUC: Move something into empty if branch
Kim Alvefur <zash@zash.se>
parents:
8728
diff
changeset
|
616 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
|
617 -- dest_occupant = nil |
|
11245
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
618 elseif type == "probe" then |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
619 local occupant = self:get_occupant_by_nick(stanza.attr.to); |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
620 if occupant == nil then |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
621 local from_muc_jid = stanza.attr.to; |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
622 local to_jid = real_jid; |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
623 local pr = self:build_unavailable_presence(from_muc_jid, to_jid); |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
624 if pr then |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
625 self:route_stanza(pr); |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
626 end |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
627 return true; |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
628 end |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
629 local x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user"}); |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
630 self:publicise_occupant_status(occupant, x, nil, nil, nil, nil, false, orig_occupant); |
|
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
631 return true; |
|
7426
3a90e9732204
Backed out changeset 63141a85beea, broke multi-session nicks
Kim Alvefur <zash@zash.se>
parents:
7423
diff
changeset
|
632 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
|
633 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
|
634 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
|
635 else |
|
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
636 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
|
637 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
|
638 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
|
639 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
|
640 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
|
641 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
|
642 if orig_occupant then |
|
3db8372e203c
MUC: Keep role across nickname change (fixes #1466)
Kim Alvefur <zash@zash.se>
parents:
10293
diff
changeset
|
643 dest_occupant.role = orig_occupant.role; |
|
3db8372e203c
MUC: Keep role across nickname change (fixes #1466)
Kim Alvefur <zash@zash.se>
parents:
10293
diff
changeset
|
644 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
|
645 else |
|
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
646 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
|
647 end |
|
3507
b639042bb0d5
MUC: Added a 'Name' property (muc#roomconfig_roomname)
Kim Alvefur <zash@zash.se>
parents:
3446
diff
changeset
|
648 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
|
649 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
|
650 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
|
651 -- 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
|
652 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
|
653 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
|
654 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
|
655 |
|
7706
d92e186c2a1c
MUC: Include the appropriate status code if nickname is changed during join process
Kim Alvefur <zash@zash.se>
parents:
7705
diff
changeset
|
656 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
|
657 |
|
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
658 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
|
659 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
|
660 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
|
661 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
|
662 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
|
663 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
|
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 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
|
666 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
|
667 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
|
668 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
|
669 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
|
670 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
|
671 else |
|
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
672 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
|
673 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
|
674 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
|
675 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
|
676 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
|
677 |
|
7706
d92e186c2a1c
MUC: Include the appropriate status code if nickname is changed during join process
Kim Alvefur <zash@zash.se>
parents:
7705
diff
changeset
|
678 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
|
679 |
|
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
680 -- Check for nick conflicts |
|
7958
47cb54a08336
MUC: Split long line [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7706
diff
changeset
|
681 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
|
682 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
|
683 -- 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
|
684 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
|
685 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
|
686 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
|
687 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
|
688 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
|
689 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
|
690 |
|
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
691 -- 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
|
692 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
|
693 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
|
694 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
|
695 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
|
696 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
|
697 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
|
698 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
|
699 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
|
700 end |
|
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
701 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
|
702 else |
|
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
703 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
|
704 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
|
705 orig_occupant:set_session(real_jid, generated_unavail); |
| 8856 | 706 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
|
707 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
|
708 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
|
709 -- 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
|
710 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
|
711 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
|
712 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
|
713 :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
|
714 :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
|
715 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
|
716 end |
|
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
717 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
|
718 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
|
719 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
|
720 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
|
721 -- 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
|
722 -- 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
|
723 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
|
724 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
|
725 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
|
726 -- 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
|
727 -- 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
|
728 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
|
729 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
|
730 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
|
731 self:route_stanza(generated_unavail:add_child(x)); |
| 9615 | 732 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
|
733 end |
|
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
734 end |
|
7667
5523880760b3
MUC: Insert the appropriate status code (210) if the nickname is overridden
Kim Alvefur <zash@zash.se>
parents:
7661
diff
changeset
|
735 |
|
7409
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
736 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
|
737 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
|
738 |
|
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
739 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
|
740 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
|
741 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
|
742 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
|
743 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
|
744 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
|
745 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
|
746 }); |
|
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
747 end |
|
3261
fe1c93296abd
MUC: Added room:set_hidden(boolean) and room:is_hidden().
Waqas Hussain <waqas20@gmail.com>
parents:
3260
diff
changeset
|
748 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
|
749 |
|
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
750 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
|
751 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
|
752 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
|
753 |
|
7427
bf43a08e5a74
MUC: Send participant list and subject on explicit joins (thanks daurnimator)
Kim Alvefur <zash@zash.se>
parents:
7426
diff
changeset
|
754 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
|
755 -- 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
|
756 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
|
757 -- Don't include self |
|
10687
8c2c5b4fde32
MUC: Support for broadcasting unavailable presence for affiliated offline users
Matthew Wild <mwild1@gmail.com>
parents:
10686
diff
changeset
|
758 return (not occupant) or occupant:get_presence(real_jid) == 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
|
759 end) |
|
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
760 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
|
761 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
|
762 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
|
763 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
|
764 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
|
765 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
|
766 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
|
767 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
|
768 end |
|
10684
de607875d4bd
MUC: Pass previous role to :publicise_occupant_status() whenever possible
Matthew Wild <mwild1@gmail.com>
parents:
10662
diff
changeset
|
769 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
|
770 |
|
9081
ce57c69a20e2
MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents:
9057
diff
changeset
|
771 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
|
772 -- 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
|
773 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
|
774 -- 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
|
775 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
|
776 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
|
777 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
|
778 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
|
779 -- 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
|
780 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
|
781 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
|
782 end |
|
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
783 |
|
7427
bf43a08e5a74
MUC: Send participant list and subject on explicit joins (thanks daurnimator)
Kim Alvefur <zash@zash.se>
parents:
7426
diff
changeset
|
784 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
|
785 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
|
786 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
|
787 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
|
788 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
|
789 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
|
790 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
|
791 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
|
792 }); |
|
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
793 end |
|
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
794 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
|
795 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
|
796 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
|
797 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
|
798 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
|
799 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
|
800 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
|
801 }); |
|
9a3ce6da3256
MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents:
7406
diff
changeset
|
802 end |
|
4119
813adb81d7da
MUC: Add option to allow participants to change the subject.
Kim Alvefur <zash@zash.se>
parents:
3989
diff
changeset
|
803 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
|
804 return true; |
|
4528
875b90d5ce0f
muc - implement per channel history limits
Markus Kötter <koetter@rrzn-hiwi.uni-hannover.de>
parents:
4424
diff
changeset
|
805 end |
|
875b90d5ce0f
muc - implement per channel history limits
Markus Kötter <koetter@rrzn-hiwi.uni-hannover.de>
parents:
4424
diff
changeset
|
806 |
|
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
807 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
|
808 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
|
809 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
|
810 return self:handle_kickable(origin, stanza) |
|
11245
43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
JC Brand <jc@opkode.com>
parents:
11236
diff
changeset
|
811 elseif type == nil or type == "unavailable" or type == "probe" 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
|
812 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
|
813 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
|
814 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
|
815 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
|
816 end |
|
5600
1b326a1e4da6
mod_muc: Add getter/setter for 'whois' (fixes traceback)
Matthew Wild <mwild1@gmail.com>
parents:
5580
diff
changeset
|
817 end |
|
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
818 return true; |
|
5600
1b326a1e4da6
mod_muc: Add getter/setter for 'whois' (fixes traceback)
Matthew Wild <mwild1@gmail.com>
parents:
5580
diff
changeset
|
819 end |
|
1b326a1e4da6
mod_muc: Add getter/setter for 'whois' (fixes traceback)
Matthew Wild <mwild1@gmail.com>
parents:
5580
diff
changeset
|
820 |
|
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
821 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
|
822 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
|
823 local type = stanza.attr.type; |
|
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
824 local id = stanza.attr.id; |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
825 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
|
826 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
|
827 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
|
828 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
|
829 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
|
830 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
|
831 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
|
832 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
|
833 local session_jid |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
834 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
|
835 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
|
836 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
|
837 break; |
|
538cdc3d8225
plugins/muc/muc.lib: Move (de)construct_stanza_id into `handle_iq_to_occupant`
daurnimator <quae@daurnimator.com>
parents:
6096
diff
changeset
|
838 end |
|
538cdc3d8225
plugins/muc/muc.lib: Move (de)construct_stanza_id into `handle_iq_to_occupant`
daurnimator <quae@daurnimator.com>
parents:
6096
diff
changeset
|
839 end |
|
538cdc3d8225
plugins/muc/muc.lib: Move (de)construct_stanza_id into `handle_iq_to_occupant`
daurnimator <quae@daurnimator.com>
parents:
6096
diff
changeset
|
840 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
|
841 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
|
842 end |
|
6096
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
843 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
|
844 self:route_stanza(stanza); |
|
6096
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
845 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
|
846 return true; |
|
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
847 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
|
848 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
|
849 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
|
850 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
|
851 return true; |
|
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
852 end |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
853 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
|
854 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
|
855 return true; |
|
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
856 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
|
857 -- 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
|
858 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
|
859 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
|
860 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
|
861 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
|
862 do -- construct_stanza_id |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
863 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
|
864 end |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
865 stanza.attr.from, stanza.attr.to = current_nick, occupant.jid; |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
866 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
|
867 local iq_ns = stanza.tags[1].attr.xmlns; |
|
9264
f13517b63e6c
MUC: Allow vCard4 requests trough
Kim Alvefur <zash@zash.se>
parents:
9263
diff
changeset
|
868 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
|
869 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
|
870 end |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
871 self:route_stanza(stanza); |
|
6096
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
872 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
|
873 return true; |
|
5061
186f34d88073
MUC: Fix private IQ and message routing.
Waqas Hussain <waqas20@gmail.com>
parents:
4999
diff
changeset
|
874 end |
|
186f34d88073
MUC: Fix private IQ and message routing.
Waqas Hussain <waqas20@gmail.com>
parents:
4999
diff
changeset
|
875 end |
|
186f34d88073
MUC: Fix private IQ and message routing.
Waqas Hussain <waqas20@gmail.com>
parents:
4999
diff
changeset
|
876 |
|
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
877 function room_mt:handle_message_to_occupant(origin, stanza) |
| 1734 | 878 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
|
879 local current_nick = self:get_occupant_jid(from); |
| 1734 | 880 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
|
881 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
|
882 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
|
883 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
|
884 end |
|
6094
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
885 return true; |
|
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
886 end |
|
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
887 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
|
888 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
|
889 return true; |
|
db2faeb151b6
plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents:
6093
diff
changeset
|
890 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
|
891 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
|
892 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
|
893 end |
|
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
894 |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
895 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
|
896 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
|
897 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
|
898 return true; |
| 1734 | 899 end |
|
6096
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
900 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
|
901 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
|
902 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
|
903 stanza.attr.from = current_nick; |
|
10662
46373b97e648
mod_muc: add muc-private-message event
Maxime “pep” Buquet <pep@bouah.net>
parents:
10553
diff
changeset
|
904 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
|
905 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
|
906 end |
|
6180
35388114439f
plugins/muc/muc.lib: non-function changes (reordering, semicolons and comments)
daurnimator <quae@daurnimator.com>
parents:
6179
diff
changeset
|
907 -- 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
|
908 stanza.attr.from = from; |
|
6096
84f9123637d4
plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents:
6095
diff
changeset
|
909 return true; |
| 1734 | 910 end |
| 911 | |
|
2216
dbbb5ed41365
MUC: Slightly refactored form processing.
Waqas Hussain <waqas20@gmail.com>
parents:
2174
diff
changeset
|
912 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
|
913 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
|
914 :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
|
915 ); |
|
dff4a77ee285
MUC: Parse submitted form with util.dataforms
Kim Alvefur <zash@zash.se>
parents:
3590
diff
changeset
|
916 end |
|
dff4a77ee285
MUC: Parse submitted form with util.dataforms
Kim Alvefur <zash@zash.se>
parents:
3590
diff
changeset
|
917 |
|
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
|
918 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
|
919 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
|
920 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
|
921 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
|
922 { |
|
530f7de1d265
MUC: Use util.dataforms to generate forms
Kim Alvefur <zash@zash.se>
parents:
3516
diff
changeset
|
923 name = 'FORM_TYPE', |
|
530f7de1d265
MUC: Use util.dataforms to generate forms
Kim Alvefur <zash@zash.se>
parents:
3516
diff
changeset
|
924 type = 'hidden', |
|
530f7de1d265
MUC: Use util.dataforms to generate forms
Kim Alvefur <zash@zash.se>
parents:
3516
diff
changeset
|
925 value = 'http://jabber.org/protocol/muc#roomconfig' |
|
530f7de1d265
MUC: Use util.dataforms to generate forms
Kim Alvefur <zash@zash.se>
parents:
3516
diff
changeset
|
926 } |
|
3591
dff4a77ee285
MUC: Parse submitted form with util.dataforms
Kim Alvefur <zash@zash.se>
parents:
3590
diff
changeset
|
927 }); |
|
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
|
928 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
|
929 end |
|
dbbb5ed41365
MUC: Slightly refactored form processing.
Waqas Hussain <waqas20@gmail.com>
parents:
2174
diff
changeset
|
930 |
|
dbbb5ed41365
MUC: Slightly refactored form processing.
Waqas Hussain <waqas20@gmail.com>
parents:
2174
diff
changeset
|
931 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
|
932 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
|
933 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
|
934 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
|
935 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
|
936 -- 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
|
937 local fields, errors, present; |
|
6391
4d334d00c635
plugins/muc/muc.lib: Add instant room support
daurnimator <quae@daurnimator.com>
parents:
6318
diff
changeset
|
938 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
|
939 fields, present = {}, {}; |
|
6391
4d334d00c635
plugins/muc/muc.lib: Add instant room support
daurnimator <quae@daurnimator.com>
parents:
6318
diff
changeset
|
940 else |
|
10553
4d8119ffd433
MUC: Make note to handle configuration form errors [luacheck]
Kim Alvefur <zash@zash.se>
parents:
10550
diff
changeset
|
941 -- 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
|
942 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
|
943 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
|
944 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
|
945 return true; |
|
4d334d00c635
plugins/muc/muc.lib: Add instant room support
daurnimator <quae@daurnimator.com>
parents:
6318
diff
changeset
|
946 end |
|
6202
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
947 end |
|
3508
9e4c2b048f9a
MUC: Added a 'Description' property (muc#roomconfig_roomdesc)
Kim Alvefur <zash@zash.se>
parents:
3507
diff
changeset
|
948 |
|
9052
5017e43ccc39
MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents:
9027
diff
changeset
|
949 local event = { |
|
5017e43ccc39
MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents:
9027
diff
changeset
|
950 room = self; |
|
5017e43ccc39
MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents:
9027
diff
changeset
|
951 origin = origin; |
|
5017e43ccc39
MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents:
9027
diff
changeset
|
952 stanza = stanza; |
|
5017e43ccc39
MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents:
9027
diff
changeset
|
953 fields = fields; |
|
5017e43ccc39
MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents:
9027
diff
changeset
|
954 status_codes = {}; |
|
5017e43ccc39
MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents:
9027
diff
changeset
|
955 actor = stanza.attr.from; |
|
5017e43ccc39
MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents:
9027
diff
changeset
|
956 }; |
|
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
|
957 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
|
958 local new = fields[field]; |
|
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
959 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
|
960 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
|
961 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
|
962 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
|
963 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
|
964 return true; |
|
6202
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
965 end |
|
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
966 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
|
967 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
|
968 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
|
969 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
|
970 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
|
971 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
|
972 |
|
7414
1b62c89014c4
MUC: Separate force-save parameter from save-entire-state flag
Kim Alvefur <zash@zash.se>
parents:
7413
diff
changeset
|
973 self:save(true); |
|
6202
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
974 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
|
975 |
|
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
|
976 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
|
977 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
|
978 :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
|
979 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
|
980 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
|
981 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
|
982 msg:up(); |
|
6215
1dd09dc04945
plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents:
6214
diff
changeset
|
983 self:broadcast_message(msg); |
|
6202
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
984 end |
|
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
985 else |
|
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
986 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
|
987 end |
|
6202
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
988 return true; |
|
1754
67b66eec9777
MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents:
1753
diff
changeset
|
989 end |
|
67b66eec9777
MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents:
1753
diff
changeset
|
990 |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
991 -- Removes everyone from the room |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
992 function room_mt:clear(x) |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
993 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
|
994 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
|
995 for nick, occupant in self:each_occupant() do -- luacheck: ignore 213 |
|
10686
ac3ec4f2b124
MUC: Pass previous role to :publicise_occupant_status() when destroying a MUC
Matthew Wild <mwild1@gmail.com>
parents:
10684
diff
changeset
|
996 local prev_role = occupant.role; |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
997 occupant.role = nil; |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
998 self:save_occupant(occupant); |
|
10686
ac3ec4f2b124
MUC: Pass previous role to :publicise_occupant_status() when destroying a MUC
Matthew Wild <mwild1@gmail.com>
parents:
10684
diff
changeset
|
999 occupants_updated[occupant] = prev_role; |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1000 end |
|
10686
ac3ec4f2b124
MUC: Pass previous role to :publicise_occupant_status() when destroying a MUC
Matthew Wild <mwild1@gmail.com>
parents:
10684
diff
changeset
|
1001 for occupant, prev_role in pairs(occupants_updated) do |
|
ac3ec4f2b124
MUC: Pass previous role to :publicise_occupant_status() when destroying a MUC
Matthew Wild <mwild1@gmail.com>
parents:
10684
diff
changeset
|
1002 self:publicise_occupant_status(occupant, x, nil, nil, nil, prev_role); |
|
10048
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1003 module:fire_event("muc-occupant-left", { |
|
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1004 room = self; |
|
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1005 nick = occupant.nick; |
|
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1006 occupant = occupant; |
|
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1007 }); |
|
2412
e243b7c81de6
Added notification of configuration changes for MUCs
Rob Hoelz <rob@hoelzro.net>
parents:
2411
diff
changeset
|
1008 end |
|
1754
67b66eec9777
MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents:
1753
diff
changeset
|
1009 end |
|
67b66eec9777
MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents:
1753
diff
changeset
|
1010 |
|
2217
838f6d546177
MUC: Added support for the room-destroy owner use case.
Waqas Hussain <waqas20@gmail.com>
parents:
2216
diff
changeset
|
1011 function room_mt:destroy(newjid, reason, password) |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1012 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
|
1013 :tag("destroy", {jid=newjid}); |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1014 if reason then x:tag("reason"):text(reason):up(); end |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1015 if password then x:tag("password"):text(password):up(); end |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1016 x:up(); |
|
9007
695904638cfa
MUC: Flag rooms being destroyed (fixes #887)
Kim Alvefur <zash@zash.se>
parents:
9003
diff
changeset
|
1017 self.destroying = reason or true; |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1018 self:clear(x); |
|
9011
ce8e5206aeba
MUC: Include destruction reason and other info in destroyed event
Kim Alvefur <zash@zash.se>
parents:
9007
diff
changeset
|
1019 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
|
1020 return true; |
|
1754
67b66eec9777
MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents:
1753
diff
changeset
|
1021 end |
|
67b66eec9777
MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents:
1753
diff
changeset
|
1022 |
|
6101
a861dc18e08d
plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents:
6100
diff
changeset
|
1023 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
|
1024 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
|
1025 return true; |
|
a861dc18e08d
plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents:
6100
diff
changeset
|
1026 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
|
1027 |
|
6101
a861dc18e08d
plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents:
6100
diff
changeset
|
1028 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
|
1029 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
|
1030 return true; |
|
a861dc18e08d
plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents:
6100
diff
changeset
|
1031 end |
|
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1032 |
|
6141
bf6de8ef66c2
plugins/muc: Rename admin query hook
daurnimator <quae@daurnimator.com>
parents:
6140
diff
changeset
|
1033 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
|
1034 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
|
1035 if not item then |
|
494938dec5d8
MUC: Reject muc:admin query with missing <item> child
Kim Alvefur <zash@zash.se>
parents:
6835
diff
changeset
|
1036 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
|
1037 return true; |
|
6909
494938dec5d8
MUC: Reject muc:admin query with missing <item> child
Kim Alvefur <zash@zash.se>
parents:
6835
diff
changeset
|
1038 end |
|
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1039 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
|
1040 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
|
1041 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
|
1042 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
|
1043 return true; |
|
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1044 end |
|
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1045 end |
|
9263
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
1046 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
|
1047 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
|
1048 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
|
1049 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
|
1050 return true; |
|
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
1051 end |
|
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
1052 end |
|
9081
ce57c69a20e2
MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents:
9057
diff
changeset
|
1053 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
|
1054 -- 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
|
1055 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
|
1056 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
|
1057 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
|
1058 -- 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
|
1059 local nick = self:get_occupant_jid(item.attr.jid); |
| 8856 | 1060 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
|
1061 end |
|
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1062 local actor = stanza.attr.from; |
|
6112
819e00a86239
plugins/muc/muc.lib: Use more modern stanza methods
daurnimator <quae@daurnimator.com>
parents:
6111
diff
changeset
|
1063 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
|
1064 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
|
1065 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
|
1066 local registration_data; |
|
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
1067 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
|
1068 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
|
1069 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
|
1070 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
|
1071 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
|
1072 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
|
1073 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
|
1074 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
|
1075 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
|
1076 end |
|
4285d1efaf03
MUC: Allow admins to include a registered nick when setting affiliation
Matthew Wild <mwild1@gmail.com>
parents:
9239
diff
changeset
|
1077 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
|
1078 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
|
1079 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
|
1080 else |
|
6181
6baa9a59aa03
plugins/muc/muc.lib: Remove callback parameter from set_role and set_affiliation
daurnimator <quae@daurnimator.com>
parents:
6180
diff
changeset
|
1081 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
|
1082 end |
|
7414
1b62c89014c4
MUC: Separate force-save parameter from save-entire-state flag
Kim Alvefur <zash@zash.se>
parents:
7413
diff
changeset
|
1083 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
|
1084 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
|
1085 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
|
1086 else |
|
9019bc4c9a5a
MUC: Prevent double replies when MUC affiliation/role change requests fail.
Lance Stout <lancestout@gmail.com>
parents:
6827
diff
changeset
|
1087 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
|
1088 end |
|
6181
6baa9a59aa03
plugins/muc/muc.lib: Remove callback parameter from set_role and set_affiliation
daurnimator <quae@daurnimator.com>
parents:
6180
diff
changeset
|
1089 return true; |
|
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1090 end |
|
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1091 |
|
6141
bf6de8ef66c2
plugins/muc: Rename admin query hook
daurnimator <quae@daurnimator.com>
parents:
6140
diff
changeset
|
1092 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
|
1093 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
|
1094 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
|
1095 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
|
1096 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
|
1097 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
|
1098 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
|
1099 if _aff and _aff_rank and not _rol then |
| 9615 | 1100 -- 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
|
1101 -- 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
|
1102 local affiliation_rank = valid_affiliations[affiliation or "none"]; |
|
9612
abf9bacf77d4
MUC: Clarify condition with parenthesis
Kim Alvefur <zash@zash.se>
parents:
9599
diff
changeset
|
1103 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
|
1104 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
|
1105 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
|
1106 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
|
1107 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
|
1108 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
|
1109 end |
|
6452
e692ea8c09a0
plugins/muc/muc.lib: Add missing :up()
daurnimator <quae@daurnimator.com>
parents:
6451
diff
changeset
|
1110 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
|
1111 return true; |
|
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1112 else |
|
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1113 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
|
1114 return true; |
|
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1115 end |
|
6453
14b62ad88d8a
plugins/muc/muc.lib: Validate affiliations and roles to admin query get
daurnimator <quae@daurnimator.com>
parents:
6452
diff
changeset
|
1116 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
|
1117 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
|
1118 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
|
1119 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
|
1120 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
|
1121 -- 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
|
1122 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
|
1123 if occupant.role == _rol then |
| 8856 | 1124 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
|
1125 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
|
1126 end |
|
2216
dbbb5ed41365
MUC: Slightly refactored form processing.
Waqas Hussain <waqas20@gmail.com>
parents:
2174
diff
changeset
|
1127 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
|
1128 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
|
1129 return true; |
| 1734 | 1130 else |
|
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1131 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
|
1132 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
|
1133 end |
| 1734 | 1134 else |
|
6095
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1135 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
|
1136 return true; |
|
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1137 end |
|
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1138 end |
|
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1139 |
|
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1140 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
|
1141 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
|
1142 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
|
1143 return true; |
|
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1144 end |
|
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1145 |
|
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1146 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
|
1147 return true; |
|
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1148 end |
|
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1149 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
|
1150 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
|
1151 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
|
1152 return true; |
|
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1153 end |
|
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1154 |
|
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1155 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
|
1156 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
|
1157 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
|
1158 return true; |
|
7900ebc544ce
plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents:
6094
diff
changeset
|
1159 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
|
1160 local newjid = child.attr.jid; |
|
6112
819e00a86239
plugins/muc/muc.lib: Use more modern stanza methods
daurnimator <quae@daurnimator.com>
parents:
6111
diff
changeset
|
1161 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
|
1162 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
|
1163 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
|
1164 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
|
1165 return true; |
|
6202
64ed7f538f81
plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents:
6201
diff
changeset
|
1166 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
|
1167 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
|
1168 else |
| 1734 | 1169 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
|
1170 return true; |
| 1734 | 1171 end |
| 1172 end | |
| 1173 | |
|
6093
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1174 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
|
1175 local from = stanza.attr.from; |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1176 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
|
1177 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
|
1178 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
|
1179 end |
|
6429
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1180 if module:fire_event("muc-occupant-groupchat", { |
|
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1181 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
|
1182 }) 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
|
1183 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
|
1184 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
|
1185 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
|
1186 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
|
1187 end |
|
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1188 |
|
6429
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1189 -- Role check |
|
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1190 module:hook("muc-occupant-groupchat", function(event) |
|
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1191 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
|
1192 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
|
1193 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
|
1194 return true; |
|
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1195 elseif role_rank <= valid_roles.visitor then |
|
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1196 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
|
1197 return true; |
|
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1198 end |
|
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1199 end, 50); |
|
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6419
diff
changeset
|
1200 |
|
6093
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1201 -- 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
|
1202 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
|
1203 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
|
1204 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
|
1205 if current_nick then |
| 1734 | 1206 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
|
1207 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
|
1208 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
|
1209 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
|
1210 end |
|
6100
c78ba94d3261
plugins/muc/muc.lib: Move all kick code into one place
daurnimator <quae@daurnimator.com>
parents:
6099
diff
changeset
|
1211 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
|
1212 end |
|
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1213 |
|
6195
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1214 -- 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
|
1215 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
|
1216 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
|
1217 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
|
1218 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
|
1219 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
|
1220 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
|
1221 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
|
1222 return true; |
|
25ba4e2b31b3
plugins/muc/muc: Check for mediated invites in a smarter way
daurnimator <quae@daurnimator.com>
parents:
6102
diff
changeset
|
1223 end |
|
6195
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1224 end); |
|
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1225 |
|
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1226 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
|
1227 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
|
1228 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
|
1229 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
|
1230 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
|
1231 return true; |
|
6229
8aa59b73f801
plugins/muc/muc.lib: Remove reversed conditionals when firing pre- events
daurnimator <quae@daurnimator.com>
parents:
6227
diff
changeset
|
1232 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
|
1233 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
|
1234 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
|
1235 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
|
1236 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
|
1237 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
|
1238 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
|
1239 :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
|
1240 :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
|
1241 :up() |
|
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1242 :up(); |
|
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1243 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
|
1244 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
|
1245 end |
|
9f6a003baf2e
plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents:
6194
diff
changeset
|
1246 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
|
1247 end |
|
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1248 |
|
6194
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1249 -- COMPAT: Some older clients expect this |
|
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1250 module:hook("muc-invite", function(event) |
|
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1251 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
|
1252 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
|
1253 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
|
1254 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
|
1255 :text(reason or "") |
|
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1256 :up(); |
|
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1257 end); |
|
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1258 |
|
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1259 -- 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
|
1260 module:hook("muc-invite", function(event) |
|
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1261 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
|
1262 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
|
1263 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
|
1264 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
|
1265 stanza:tag("body") |
|
9056
37e287113a8d
MUC: Fix inverted logic ()
Matthew Wild <mwild1@gmail.com>
parents:
9055
diff
changeset
|
1266 :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
|
1267 :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
|
1268 end |
|
6194
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1269 end); |
|
9b6c2d89f143
plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents:
6193
diff
changeset
|
1270 |
|
6123
7f82bbd249fe
plugins/muc/muc.lib: Remove `payload` argument from `handle_mediated_*`; extract it from inside.
daurnimator <quae@daurnimator.com>
parents:
6122
diff
changeset
|
1271 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
|
1272 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
|
1273 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
|
1274 if not declinee then |
|
6105
68f53b9a186e
plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents:
6104
diff
changeset
|
1275 origin.send(st.error_reply(stanza, "cancel", "jid-malformed")); |
|
68f53b9a186e
plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents:
6104
diff
changeset
|
1276 return true; |
|
6229
8aa59b73f801
plugins/muc/muc.lib: Remove reversed conditionals when firing pre- events
daurnimator <quae@daurnimator.com>
parents:
6227
diff
changeset
|
1277 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
|
1278 return true; |
|
6105
68f53b9a186e
plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents:
6104
diff
changeset
|
1279 end |
|
6273
7ef064101994
plugins/muc/muc.lib: Use original decline as template for medated decline
daurnimator <quae@daurnimator.com>
parents:
6272
diff
changeset
|
1280 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
|
1281 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
|
1282 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
|
1283 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
|
1284 :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
|
1285 :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
|
1286 :up() |
|
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1287 :up(); |
|
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1288 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
|
1289 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
|
1290 local occupant |
|
d891fa02e5e5
plugins/muc/muc.lib: Deliver declines to in-room jids correctly
daurnimator <quae@daurnimator.com>
parents:
6274
diff
changeset
|
1291 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
|
1292 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
|
1293 end |
|
6196
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1294 if occupant then |
|
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1295 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
|
1296 else |
|
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1297 self:route_stanza(decline); |
|
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1298 end |
|
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1299 end |
|
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1300 return true; |
|
6105
68f53b9a186e
plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents:
6104
diff
changeset
|
1301 end |
|
68f53b9a186e
plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents:
6104
diff
changeset
|
1302 |
|
6196
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1303 -- 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
|
1304 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
|
1305 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
|
1306 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
|
1307 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
|
1308 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
|
1309 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
|
1310 ..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
|
1311 end |
|
6196
e73bb1568d87
plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents:
6195
diff
changeset
|
1312 end); |
|
6131
8dd0c6145603
plugins/muc/muc.lib: Add decline event for parity with invite
daurnimator <quae@daurnimator.com>
parents:
6130
diff
changeset
|
1313 |
|
6093
9a7eaf0a35b6
plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents:
6092
diff
changeset
|
1314 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
|
1315 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
|
1316 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
|
1317 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
|
1318 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
|
1319 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
|
1320 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
|
1321 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
|
1322 if x then |
|
25ba4e2b31b3
plugins/muc/muc: Check for mediated invites in a smarter way
daurnimator <quae@daurnimator.com>
parents:
6102
diff
changeset
|
1323 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
|
1324 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
|
1325 -- 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
|
1326 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
|
1327 return self:handle_mediated_invite(origin, stanza) |
|
6105
68f53b9a186e
plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents:
6104
diff
changeset
|
1328 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
|
1329 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
|
1330 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
|
1331 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
|
1332 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
|
1333 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
|
1334 |
|
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
|
1335 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
|
1336 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
|
1337 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
|
1338 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
|
1339 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
|
1340 end |
| 1734 | 1341 end |
| 1342 end | |
| 1343 | |
|
7089
890f4b2cc444
MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents:
7013
diff
changeset
|
1344 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
|
1345 module:send(stanza); |
|
6111
f8b94903be52
plugins/muc: Provide a reasonable default `route_stanza`
daurnimator <quae@daurnimator.com>
parents:
6108
diff
changeset
|
1346 end |
|
1735
81406277279e
MUC: The MUC lib is now metatable based. Cleaned up code, etc.
Waqas Hussain <waqas20@gmail.com>
parents:
1734
diff
changeset
|
1347 |
|
1737
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1348 function room_mt:get_affiliation(jid) |
|
10550
0566b45da987
MUC: Remove some unused variables [luacheck]
Kim Alvefur <zash@zash.se>
parents:
10451
diff
changeset
|
1349 local node, host = jid_split(jid); |
|
9081
ce57c69a20e2
MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents:
9057
diff
changeset
|
1350 -- 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
|
1351 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
|
1352 local result = self._affiliations[bare]; |
|
1737
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1353 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
|
1354 return result; |
|
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1355 end |
|
6186
85f7cd91dc31
plugins/muc/muc.lib: Smarter validation in set_affiliation
daurnimator <quae@daurnimator.com>
parents:
6185
diff
changeset
|
1356 |
|
6478
413923bbd1a0
plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents:
6476
diff
changeset
|
1357 -- Iterates over jid, affiliation pairs |
|
413923bbd1a0
plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents:
6476
diff
changeset
|
1358 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
|
1359 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
|
1360 return function(_, jid) |
|
f2d70dc13700
MUC: Include affiliation data when iterating over affiliations with a room
Matthew Wild <mwild1@gmail.com>
parents:
9530
diff
changeset
|
1361 local affiliation; |
|
f2d70dc13700
MUC: Include affiliation data when iterating over affiliations with a room
Matthew Wild <mwild1@gmail.com>
parents:
9530
diff
changeset
|
1362 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
|
1363 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
|
1364 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
|
1365 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
|
1366 end, nil, nil; |
|
6478
413923bbd1a0
plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents:
6476
diff
changeset
|
1367 end |
|
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1368 |
|
9237
b86c2e135797
MUC: Add support for storing additional data with MUC affiliations
Matthew Wild <mwild1@gmail.com>
parents:
9194
diff
changeset
|
1369 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
|
1370 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
|
1371 |
|
10550
0566b45da987
MUC: Remove some unused variables [luacheck]
Kim Alvefur <zash@zash.se>
parents:
10451
diff
changeset
|
1372 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
|
1373 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
|
1374 jid = jid_join(node, host); -- Bare |
|
fb8a9873728b
plugins/muc/muc.lib: Kick users from outcast hosts
daurnimator <quae@daurnimator.com>
parents:
6475
diff
changeset
|
1375 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
|
1376 |
|
85f7cd91dc31
plugins/muc/muc.lib: Smarter validation in set_affiliation
daurnimator <quae@daurnimator.com>
parents:
6185
diff
changeset
|
1377 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
|
1378 return nil, "modify", "not-acceptable"; |
|
1742
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
1379 end |
|
6186
85f7cd91dc31
plugins/muc/muc.lib: Smarter validation in set_affiliation
daurnimator <quae@daurnimator.com>
parents:
6185
diff
changeset
|
1380 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
|
1381 |
|
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1382 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
|
1383 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
|
1384 |
|
6475
3c815a64042b
plugins/muc/muc.lib: Fix passing actor along as a boolean (thanks fippo)
daurnimator <quae@daurnimator.com>
parents:
6454
diff
changeset
|
1385 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
|
1386 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
|
1387 else |
|
8842
463505cc75d5
MUC: Revert unstable MUC commits since 0.10.1
Matthew Wild <mwild1@gmail.com>
parents:
8839
diff
changeset
|
1388 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
|
1389 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
|
1390 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
|
1391 -- need at least one owner |
|
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1392 local is_last = true; |
|
6478
413923bbd1a0
plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents:
6476
diff
changeset
|
1393 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
|
1394 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
|
1395 end |
|
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1396 if is_last then |
|
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1397 return nil, "cancel", "conflict"; |
|
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1398 end |
|
4357
d6928b78c548
MUC: Allow affiliation change when argument actor==true in room:set_affiliation().
Waqas Hussain <waqas20@gmail.com>
parents:
4326
diff
changeset
|
1399 end |
|
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1400 -- owners can do anything else |
|
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1401 elseif affiliation == "owner" or affiliation == "admin" |
|
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1402 or actor_affiliation ~= "admin" |
|
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1403 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
|
1404 -- Can't demote owners or other admins |
|
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1405 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
|
1406 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
|
1407 end |
|
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1408 |
|
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1409 -- Set in 'database' |
|
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1410 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
|
1411 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
|
1412 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
|
1413 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
|
1414 elseif data then |
|
b86c2e135797
MUC: Add support for storing additional data with MUC affiliations
Matthew Wild <mwild1@gmail.com>
parents:
9194
diff
changeset
|
1415 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
|
1416 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
|
1417 end |
|
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1418 |
|
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1419 -- Update roles |
|
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1420 local role = self:get_default_role(affiliation); |
|
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1421 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
|
1422 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
|
1423 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
|
1424 if occupant.bare_jid == jid or ( |
|
fb8a9873728b
plugins/muc/muc.lib: Kick users from outcast hosts
daurnimator <quae@daurnimator.com>
parents:
6475
diff
changeset
|
1425 -- Outcast can be by host. |
|
fb8a9873728b
plugins/muc/muc.lib: Kick users from outcast hosts
daurnimator <quae@daurnimator.com>
parents:
6475
diff
changeset
|
1426 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
|
1427 ) then |
| 9615 | 1428 -- 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
|
1429 occupants_updated[occupant] = occupant.role; |
|
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1430 if occupant.role ~= role and ( |
|
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1431 is_downgrade or |
|
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1432 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
|
1433 ) then |
|
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1434 occupant.role = role; |
|
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1435 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
|
1436 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
|
1437 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
|
1438 end |
|
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1439 |
|
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1440 -- Tell the room of the new occupant affiliations+roles |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1441 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
|
1442 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
|
1443 if affiliation == "outcast" then |
|
463505cc75d5
MUC: Revert unstable MUC commits since 0.10.1
Matthew Wild <mwild1@gmail.com>
parents:
8839
diff
changeset
|
1444 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
|
1445 else |
|
463505cc75d5
MUC: Revert unstable MUC commits since 0.10.1
Matthew Wild <mwild1@gmail.com>
parents:
8839
diff
changeset
|
1446 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
|
1447 end |
|
1742
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
1448 end |
|
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1449 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
|
1450 |
|
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1451 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
|
1452 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
|
1453 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
|
1454 if occupant.role == nil then |
|
10048
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1455 module:fire_event("muc-occupant-left", { |
|
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1456 room = self; |
|
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1457 nick = occupant.nick; |
|
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1458 occupant = occupant; |
|
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1459 }); |
|
9599
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1460 elseif is_semi_anonymous and |
|
11235
1dba335eacea
MUC: Fix logic bug causing unnecessary presence to be sent, fixes #1615 (thanks damencho)
Matthew Wild <mwild1@gmail.com>
parents:
11142
diff
changeset
|
1461 ((old_role == "moderator" and occupant.role ~= "moderator") or |
|
1dba335eacea
MUC: Fix logic bug causing unnecessary presence to be sent, fixes #1615 (thanks damencho)
Matthew Wild <mwild1@gmail.com>
parents:
11142
diff
changeset
|
1462 (old_role ~= "moderator" and occupant.role == "moderator")) then -- Has gained or lost moderator status |
|
9599
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1463 -- 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
|
1464 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
|
1465 self:send_occupant_list(real_jid, function(occupant_jid, occupant) --luacheck: ignore 212 433 |
|
10687
8c2c5b4fde32
MUC: Support for broadcasting unavailable presence for affiliated offline users
Matthew Wild <mwild1@gmail.com>
parents:
10686
diff
changeset
|
1466 return (not occupant) or occupant.bare_jid ~= jid; |
|
9599
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1467 end); |
|
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1468 end |
|
1742
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
1469 end |
|
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
1470 end |
|
9599
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1471 else |
|
5a2135964ed3
MUC: Announce affiliation changes for JIDs that are not in the room
Matthew Wild <mwild1@gmail.com>
parents:
9547
diff
changeset
|
1472 -- 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
|
1473 -- 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
|
1474 -- 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
|
1475 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
|
1476 :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
|
1477 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
|
1478 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
|
1479 end |
|
6187
c0b4b5d41e55
plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents:
6186
diff
changeset
|
1480 |
|
7414
1b62c89014c4
MUC: Separate force-save parameter from save-entire-state flag
Kim Alvefur <zash@zash.se>
parents:
7413
diff
changeset
|
1481 self:save(true); |
|
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1482 |
|
6393
fff6ca13cb0f
plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents:
6392
diff
changeset
|
1483 module:fire_event("muc-set-affiliation", { |
|
fff6ca13cb0f
plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents:
6392
diff
changeset
|
1484 room = self; |
|
fff6ca13cb0f
plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents:
6392
diff
changeset
|
1485 actor = actor; |
|
fff6ca13cb0f
plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents:
6392
diff
changeset
|
1486 jid = jid; |
|
fff6ca13cb0f
plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents:
6392
diff
changeset
|
1487 affiliation = affiliation or "none"; |
|
fff6ca13cb0f
plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents:
6392
diff
changeset
|
1488 reason = reason; |
|
fff6ca13cb0f
plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents:
6392
diff
changeset
|
1489 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
|
1490 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
|
1491 in_room = next(occupants_updated) ~= nil; |
|
fff6ca13cb0f
plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents:
6392
diff
changeset
|
1492 }); |
|
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1493 |
|
1742
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
1494 return true; |
|
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
1495 end |
| 1734 | 1496 |
|
9532
9bb33edd7255
MUC: Add function to retrieve affiliation data for a given JID
Matthew Wild <mwild1@gmail.com>
parents:
9531
diff
changeset
|
1497 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
|
1498 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
|
1499 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
|
1500 if key then |
|
9bb33edd7255
MUC: Add function to retrieve affiliation data for a given JID
Matthew Wild <mwild1@gmail.com>
parents:
9531
diff
changeset
|
1501 return data[key]; |
|
9bb33edd7255
MUC: Add function to retrieve affiliation data for a given JID
Matthew Wild <mwild1@gmail.com>
parents:
9531
diff
changeset
|
1502 end |
|
9bb33edd7255
MUC: Add function to retrieve affiliation data for a given JID
Matthew Wild <mwild1@gmail.com>
parents:
9531
diff
changeset
|
1503 return data; |
|
9bb33edd7255
MUC: Add function to retrieve affiliation data for a given JID
Matthew Wild <mwild1@gmail.com>
parents:
9531
diff
changeset
|
1504 end |
|
9bb33edd7255
MUC: Add function to retrieve affiliation data for a given JID
Matthew Wild <mwild1@gmail.com>
parents:
9531
diff
changeset
|
1505 |
|
1742
1483a62d69bb
MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1740
diff
changeset
|
1506 function room_mt:get_role(nick) |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1507 local occupant = self:get_occupant_by_nick(nick); |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1508 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
|
1509 end |
|
6182
dbf0b09664cd
plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents:
6181
diff
changeset
|
1510 |
|
9830
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1511 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
|
1512 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
|
1513 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
|
1514 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
|
1515 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
|
1516 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
|
1517 }; |
|
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
|
1518 |
|
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
|
1519 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
|
1520 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
|
1521 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
|
1522 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
|
1523 |
|
9830
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1524 -- 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
|
1525 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
|
1526 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
|
1527 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
|
1528 end |
|
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1529 |
|
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1530 -- 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
|
1531 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
|
1532 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
|
1533 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
|
1534 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
|
1535 end |
|
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1536 end |
|
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1537 |
|
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1538 -- 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
|
1539 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
|
1540 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
|
1541 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
|
1542 end |
|
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1543 |
|
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1544 return true; |
|
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1545 end |
|
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1546 |
|
6182
dbf0b09664cd
plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents:
6181
diff
changeset
|
1547 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
|
1548 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
|
1549 |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1550 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
|
1551 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
|
1552 |
|
6182
dbf0b09664cd
plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents:
6181
diff
changeset
|
1553 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
|
1554 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
|
1555 end |
|
dbf0b09664cd
plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents:
6181
diff
changeset
|
1556 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
|
1557 |
|
6475
3c815a64042b
plugins/muc/muc.lib: Fix passing actor along as a boolean (thanks fippo)
daurnimator <quae@daurnimator.com>
parents:
6454
diff
changeset
|
1558 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
|
1559 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
|
1560 else |
|
9830
d935a0f0de24
MUC: Factor out role change permission check into its own method
Kim Alvefur <zash@zash.se>
parents:
9820
diff
changeset
|
1561 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
|
1562 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
|
1563 return allowed, err, condition; |
|
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1564 end |
|
3279
8b0a4a7d2c6e
MUC: Added room:can_set_role().
Waqas Hussain <waqas20@gmail.com>
parents:
3264
diff
changeset
|
1565 end |
|
8792
c2b99fa134b3
MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents:
8791
diff
changeset
|
1566 |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1567 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
|
1568 if not role then |
|
8842
463505cc75d5
MUC: Revert unstable MUC commits since 0.10.1
Matthew Wild <mwild1@gmail.com>
parents:
8839
diff
changeset
|
1569 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
|
1570 end |
|
10353
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
1571 |
|
7b602e13c3b6
MUC: Add controls for whose presence is broadcast (closes #1335)
Lance Stout <lancestout@gmail.com>
parents:
10294
diff
changeset
|
1572 local prev_role = occupant.role; |
|
6179
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1573 occupant.role = role; |
|
e488a90195bc
plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
6143
diff
changeset
|
1574 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
|
1575 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
|
1576 if role == nil then |
|
10048
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1577 module:fire_event("muc-occupant-left", { |
|
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1578 room = self; |
|
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1579 nick = occupant.nick; |
|
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1580 occupant = occupant; |
|
e5532fbdd163
MUC: Reflow event tables to improve readability
Kim Alvefur <zash@zash.se>
parents:
9862
diff
changeset
|
1581 }); |
|
3632
d82189efecc0
MUC: Include the user's current presence contents when broadcasting a role change.
Waqas Hussain <waqas20@gmail.com>
parents:
3631
diff
changeset
|
1582 end |
|
1737
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1583 return true; |
|
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1584 end |
|
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1585 |
|
6214
9813c74ce006
plugins/muc: Move `whois` code to seperate file
daurnimator <quae@daurnimator.com>
parents:
6213
diff
changeset
|
1586 local whois = module:require "muc/whois"; |
|
9813c74ce006
plugins/muc: Move `whois` code to seperate file
daurnimator <quae@daurnimator.com>
parents:
6213
diff
changeset
|
1587 room_mt.get_whois = whois.get; |
|
9813c74ce006
plugins/muc: Move `whois` code to seperate file
daurnimator <quae@daurnimator.com>
parents:
6213
diff
changeset
|
1588 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
|
1589 |
|
1737
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1590 local _M = {}; -- module "muc" |
|
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1591 |
|
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
|
1592 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
|
1593 return setmetatable({ |
| 1734 | 1594 jid = jid; |
| 1595 _jid_nick = {}; | |
|
1739
393abf245322
MUC: Renamed _participants table to _occupants
Waqas Hussain <waqas20@gmail.com>
parents:
1737
diff
changeset
|
1596 _occupants = {}; |
|
7362
032fcb7b80a1
MUC: Use config passed to rew_roow()
Kim Alvefur <zash@zash.se>
parents:
7360
diff
changeset
|
1597 _data = config or {}; |
|
1737
31c3eb5797c7
MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents:
1736
diff
changeset
|
1598 _affiliations = {}; |
|
9237
b86c2e135797
MUC: Add support for storing additional data with MUC affiliations
Matthew Wild <mwild1@gmail.com>
parents:
9194
diff
changeset
|
1599 _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
|
1600 }, room_mt); |
| 1734 | 1601 end |
| 1602 | |
|
10688
83668e16b9a3
MUC: Switch to new storage format by default
Matthew Wild <mwild1@gmail.com>
parents:
10687
diff
changeset
|
1603 local new_format = module:get_option_boolean("new_muc_storage_format", true); |
|
7488
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1604 |
|
7369
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1605 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
|
1606 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
|
1607 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
|
1608 frozen = { |
|
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1609 _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
|
1610 _data = self._data; |
|
10690
27d15097c235
MUC: Persist affiliation_data in new MUC format!
Matthew Wild <mwild1@gmail.com>
parents:
10431
diff
changeset
|
1611 _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
|
1612 }; |
|
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1613 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
|
1614 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
|
1615 end |
|
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1616 else |
|
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1617 frozen = { |
|
cdabf8199903
MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents:
7444
diff
changeset
|
1618 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
|
1619 _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
|
1620 _affiliations = self._affiliations; |
|
9237
b86c2e135797
MUC: Add support for storing additional data with MUC affiliations
Matthew Wild <mwild1@gmail.com>
parents:
9194
diff
changeset
|
1621 _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
|
1622 }; |
|
7368
4e24aff1e4df
MUC: Flatten format of serialized rooms
Kim Alvefur <zash@zash.se>
parents:
7367
diff
changeset
|
1623 end |
|
7369
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1624 if live then |
|
7415
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1625 state = {}; |
|
7369
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1626 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
|
1627 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
|
1628 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
|
1629 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
|
1630 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
|
1631 } |
|
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1632 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
|
1633 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
|
1634 end |
|
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1635 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
|
1636 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
|
1637 if history and history[1] ~= nil then |
|
7415
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1638 state._last_message = st.preserialize(history[#history].stanza); |
|
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1639 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
|
1640 end |
|
7369
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1641 end |
|
7415
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1642 return frozen, state; |
|
7360
7a37fade5380
MUC: Move 'preserialization' step to muc.lib
Kim Alvefur <zash@zash.se>
parents:
7353
diff
changeset
|
1643 end |
|
7a37fade5380
MUC: Move 'preserialization' step to muc.lib
Kim Alvefur <zash@zash.se>
parents:
7353
diff
changeset
|
1644 |
|
7415
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1645 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
|
1646 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
|
1647 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
|
1648 |
|
7416
c33a1d6da016
MUC: Restore last message from state, not room config (missing change from cbb05b454c13)
Kim Alvefur <zash@zash.se>
parents:
7415
diff
changeset
|
1649 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
|
1650 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
|
1651 { 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
|
1652 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
|
1653 }; |
|
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
|
1654 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
|
1655 |
|
7369
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1656 local occupants = {}; |
|
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1657 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
|
1658 |
|
9265
585ef5c1b226
MUC: Initialize room with empty affiliation_data if none stored
Matthew Wild <mwild1@gmail.com>
parents:
9264
diff
changeset
|
1659 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
|
1660 |
|
7631
f50c039d6bb1
MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents:
7488
diff
changeset
|
1661 if frozen.jid and frozen._affiliations then |
|
9239
03e37f7d6c97
MUC: Add some comments for clarity
Matthew Wild <mwild1@gmail.com>
parents:
9238
diff
changeset
|
1662 -- Old storage format |
|
7631
f50c039d6bb1
MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents:
7488
diff
changeset
|
1663 room._affiliations = frozen._affiliations; |
|
f50c039d6bb1
MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents:
7488
diff
changeset
|
1664 else |
|
9239
03e37f7d6c97
MUC: Add some comments for clarity
Matthew Wild <mwild1@gmail.com>
parents:
9238
diff
changeset
|
1665 -- New storage format |
|
7631
f50c039d6bb1
MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents:
7488
diff
changeset
|
1666 for jid, data in pairs(frozen) do |
|
10550
0566b45da987
MUC: Remove some unused variables [luacheck]
Kim Alvefur <zash@zash.se>
parents:
10451
diff
changeset
|
1667 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
|
1668 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
|
1669 -- bare jid: affiliation |
|
f50c039d6bb1
MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents:
7488
diff
changeset
|
1670 room._affiliations[jid] = data; |
|
f50c039d6bb1
MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents:
7488
diff
changeset
|
1671 end |
|
7415
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1672 end |
|
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1673 end |
|
cbb05b454c13
MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents:
7414
diff
changeset
|
1674 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
|
1675 local node, host, resource = jid_split(jid); |
|
7368
4e24aff1e4df
MUC: Flatten format of serialized rooms
Kim Alvefur <zash@zash.se>
parents:
7367
diff
changeset
|
1676 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
|
1677 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
|
1678 -- 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
|
1679 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
|
1680 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
|
1681 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
|
1682 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
|
1683 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
|
1684 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
|
1685 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
|
1686 -- 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
|
1687 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
|
1688 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
|
1689 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
|
1690 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
|
1691 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
|
1692 end |
|
7368
4e24aff1e4df
MUC: Flatten format of serialized rooms
Kim Alvefur <zash@zash.se>
parents:
7367
diff
changeset
|
1693 end |
|
4e24aff1e4df
MUC: Flatten format of serialized rooms
Kim Alvefur <zash@zash.se>
parents:
7367
diff
changeset
|
1694 end |
|
7369
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1695 |
|
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1696 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
|
1697 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
|
1698 end |
|
c5cae59831d7
MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents:
7368
diff
changeset
|
1699 |
|
7367
2aef5e8b69e9
MUC: Move room deserialization to muc.lib
Kim Alvefur <zash@zash.se>
parents:
7366
diff
changeset
|
1700 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
|
1701 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
|
1702 |
|
5063
4bc202a7b351
MUC: Expose room metatable in the MUC lib.
Waqas Hussain <waqas20@gmail.com>
parents:
5061
diff
changeset
|
1703 _M.room_mt = room_mt; |
|
4bc202a7b351
MUC: Expose room metatable in the MUC lib.
Waqas Hussain <waqas20@gmail.com>
parents:
5061
diff
changeset
|
1704 |
| 1734 | 1705 return _M; |
