Annotate

plugins/muc/muc.lib.lua @ 10799:763bb2ce3f60

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