Annotate

plugins/muc/muc.lib.lua @ 9089:3a7a0b9f42f3

util.dataforms: Skip all fields for the 'cancel' form type XEP-0004 says: > a data form of type "cancel" SHOULD NOT contain any <field/> elements. The title and instructions don't seem to be of much value in this case either. I'm not aware of 'cancel' being used anywhere, so this should break nothing. Early return is always nice.
author Kim Alvefur <zash@zash.se>
date Fri, 03 Aug 2018 21:06:59 +0200
parent 9081:ce57c69a20e2
child 9145:51c5dd7a8ab9
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;
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
22 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
23 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
24 local md5 = require "util.hashes".md5;
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
25
7270
df22e314946c MUC: Use already initialized logger
Kim Alvefur <zash@zash.se>
parents: 7120
diff changeset
26 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
27
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
28 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
29 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
30 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
31 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
32
1735
81406277279e MUC: The MUC lib is now metatable based. Cleaned up code, etc.
Waqas Hussain <waqas20@gmail.com>
parents: 1734
diff changeset
33 local room_mt = {};
1737
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
34 room_mt.__index = room_mt;
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
35
5519
06e188268df1 MUC: add __tostring on room metatable
Matthew Wild <mwild1@gmail.com>
parents: 5397
diff changeset
36 function room_mt:__tostring()
06e188268df1 MUC: add __tostring on room metatable
Matthew Wild <mwild1@gmail.com>
parents: 5397
diff changeset
37 return "MUC room ("..self.jid..")";
06e188268df1 MUC: add __tostring on room metatable
Matthew Wild <mwild1@gmail.com>
parents: 5397
diff changeset
38 end
06e188268df1 MUC: add __tostring on room metatable
Matthew Wild <mwild1@gmail.com>
parents: 5397
diff changeset
39
7352
50b24b3476e6 MUC: Provide a noop stub room:save() method
Kim Alvefur <zash@zash.se>
parents: 7347
diff changeset
40 function room_mt.save()
50b24b3476e6 MUC: Provide a noop stub room:save() method
Kim Alvefur <zash@zash.se>
parents: 7347
diff changeset
41 -- overriden by mod_muc.lua
50b24b3476e6 MUC: Provide a noop stub room:save() method
Kim Alvefur <zash@zash.se>
parents: 7347
diff changeset
42 end
50b24b3476e6 MUC: Provide a noop stub room:save() method
Kim Alvefur <zash@zash.se>
parents: 7347
diff changeset
43
6119
c13f5d6b9b16 plugins/muc/muc.lib: Use `get_occupant_jid` method instead of indexing _jid_nick
daurnimator <quae@daurnimator.com>
parents: 6118
diff changeset
44 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
45 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
46 end
c13f5d6b9b16 plugins/muc/muc.lib: Use `get_occupant_jid` method instead of indexing _jid_nick
daurnimator <quae@daurnimator.com>
parents: 6118
diff changeset
47
1737
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
48 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
49 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
50 room = self;
4e7d205f49f7 plugins/muc/muc.lib: Turn get_default_role into an event
daurnimator <quae@daurnimator.com>
parents: 6219
diff changeset
51 affiliation = affiliation;
4e7d205f49f7 plugins/muc/muc.lib: Turn get_default_role into an event
daurnimator <quae@daurnimator.com>
parents: 6219
diff changeset
52 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
53 });
8915
2502be210a85 MUC: Normalize role value, fixes removal on loss of membership (thanks mimi89999)
Kim Alvefur <zash@zash.se>
parents: 8914
diff changeset
54 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
55 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
56 end
4e7d205f49f7 plugins/muc/muc.lib: Turn get_default_role into an event
daurnimator <quae@daurnimator.com>
parents: 6219
diff changeset
57 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
58 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
59 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
60 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
61 return "participant";
6220
4e7d205f49f7 plugins/muc/muc.lib: Turn get_default_role into an event
daurnimator <quae@daurnimator.com>
parents: 6219
diff changeset
62 end
4e7d205f49f7 plugins/muc/muc.lib: Turn get_default_role into an event
daurnimator <quae@daurnimator.com>
parents: 6219
diff changeset
63 end);
1735
81406277279e MUC: The MUC lib is now metatable based. Cleaned up code, etc.
Waqas Hussain <waqas20@gmail.com>
parents: 1734
diff changeset
64
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
65 --- Occupant functions
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
66 function room_mt:new_occupant(bare_real_jid, nick)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
67 local occupant = occupant_lib.new(bare_real_jid, nick);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
68 local affiliation = self:get_affiliation(bare_real_jid);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
69 occupant.role = self:get_default_role(affiliation);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
70 return occupant;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
71 end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
72
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
73 function room_mt:get_occupant_by_nick(nick)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
74 local occupant = self._occupants[nick];
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
75 if occupant == nil then return nil end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
76 return occupant_lib.copy(occupant);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
77 end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
78
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
79 do
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
80 local function next_copied_occupant(occupants, occupant_jid)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
81 local next_occupant_jid, raw_occupant = next(occupants, occupant_jid);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
82 if next_occupant_jid == nil then return nil end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
83 return next_occupant_jid, occupant_lib.copy(raw_occupant);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
84 end
7089
890f4b2cc444 MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents: 7013
diff changeset
85 -- 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
86 function room_mt:each_occupant(read_only) -- luacheck: ignore 212
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
87 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
88 end
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
89 end
1735
81406277279e MUC: The MUC lib is now metatable based. Cleaned up code, etc.
Waqas Hussain <waqas20@gmail.com>
parents: 1734
diff changeset
90
6237
a58685df9d16 plugins/muc: Add room:has_occupant() method
daurnimator <quae@daurnimator.com>
parents: 6231
diff changeset
91 function room_mt:has_occupant()
a58685df9d16 plugins/muc: Add room:has_occupant() method
daurnimator <quae@daurnimator.com>
parents: 6231
diff changeset
92 return next(self._occupants, nil) ~= nil
a58685df9d16 plugins/muc: Add room:has_occupant() method
daurnimator <quae@daurnimator.com>
parents: 6231
diff changeset
93 end
a58685df9d16 plugins/muc: Add room:has_occupant() method
daurnimator <quae@daurnimator.com>
parents: 6231
diff changeset
94
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
95 function room_mt:get_occupant_by_real_jid(real_jid)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
96 local occupant_jid = self:get_occupant_jid(real_jid);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
97 if occupant_jid == nil then return nil end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
98 return self:get_occupant_by_nick(occupant_jid);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
99 end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
100
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
101 function room_mt:save_occupant(occupant)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
102 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
103 local id = occupant.nick
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
104
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
105 -- Need to maintain _jid_nick secondary index
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
106 local old_occupant = self._occupants[id];
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
107 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
108 for real_jid in old_occupant:each_session() do
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
109 self._jid_nick[real_jid] = nil;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
110 end
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
111 end
6250
454ef19e7925 plugins/muc/muc: Better check for live sessions
daurnimator <quae@daurnimator.com>
parents: 6249
diff changeset
112
454ef19e7925 plugins/muc/muc: Better check for live sessions
daurnimator <quae@daurnimator.com>
parents: 6249
diff changeset
113 local has_live_session = false
454ef19e7925 plugins/muc/muc: Better check for live sessions
daurnimator <quae@daurnimator.com>
parents: 6249
diff changeset
114 if occupant.role ~= nil then
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
115 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
116 if presence.attr.type == nil then
454ef19e7925 plugins/muc/muc: Better check for live sessions
daurnimator <quae@daurnimator.com>
parents: 6249
diff changeset
117 has_live_session = true
454ef19e7925 plugins/muc/muc: Better check for live sessions
daurnimator <quae@daurnimator.com>
parents: 6249
diff changeset
118 self._jid_nick[real_jid] = occupant.nick;
454ef19e7925 plugins/muc/muc: Better check for live sessions
daurnimator <quae@daurnimator.com>
parents: 6249
diff changeset
119 end
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
120 end
6250
454ef19e7925 plugins/muc/muc: Better check for live sessions
daurnimator <quae@daurnimator.com>
parents: 6249
diff changeset
121 if not has_live_session then
454ef19e7925 plugins/muc/muc: Better check for live sessions
daurnimator <quae@daurnimator.com>
parents: 6249
diff changeset
122 -- 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
123 occupant.role = nil
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
124 end
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
125 end
6250
454ef19e7925 plugins/muc/muc: Better check for live sessions
daurnimator <quae@daurnimator.com>
parents: 6249
diff changeset
126 if not has_live_session then
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
127 occupant = nil
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
128 end
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
129 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
130 return occupant
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
131 end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
132
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
133 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
134 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
135 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
136 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
137 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
138 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
139 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
140 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
141
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
142 -- 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
143 local function add_item(x, affiliation, role, jid, nick, actor_nick, actor_jid, reason)
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
144 x:tag("item", {affiliation = affiliation; role = role; jid = jid; nick = nick;})
6512
ad159be9e9d7 plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents: 6478
diff changeset
145 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
146 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
147 end
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
148 if reason then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
149 x:tag("reason"):text(reason):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 x:up();
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
152 return x
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
153 end
6213
95bddf0142f4 plugins/muc/muc.lib: Remember to coerce nil role to "none"
daurnimator <quae@daurnimator.com>
parents: 6212
diff changeset
154
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
155 -- 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
156 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
157 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
158 local role = occupant.role or "none";
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
159 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
160 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
161 else
7089
890f4b2cc444 MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents: 7013
diff changeset
162 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
163 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
164 end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
165 end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
166 return x
5982
2d5685c6262f MUC: Split saving to history into a separate method
Kim Alvefur <zash@zash.se>
parents: 5854
diff changeset
167 end
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
168
6215
1dd09dc04945 plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents: 6214
diff changeset
169 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
170 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
171 return true;
d546815e555e MUC: Move delayed delivery check into an event handler
Kim Alvefur <zash@zash.se>
parents: 8480
diff changeset
172 end
d546815e555e MUC: Move delayed delivery check into an event handler
Kim Alvefur <zash@zash.se>
parents: 8480
diff changeset
173 self:broadcast(stanza);
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
d546815e555e MUC: Move delayed delivery check into an event handler
Kim Alvefur <zash@zash.se>
parents: 8480
diff changeset
177 -- Strip delay tags claiming to be from us
8486
c50101b527bf MUC: Hook the correct event
Kim Alvefur <zash@zash.se>
parents: 8482
diff changeset
178 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
179 local stanza = event.stanza;
8486
c50101b527bf MUC: Hook the correct event
Kim Alvefur <zash@zash.se>
parents: 8482
diff changeset
180 local room = event.room;
c50101b527bf MUC: Hook the correct event
Kim Alvefur <zash@zash.se>
parents: 8482
diff changeset
181 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
182
eb85b10e1fea MUC: Ensure that <delay/> elements which match our from are stripped (fixes #1055)
Jonas Wielicki <jonas@wielicki.name>
parents: 8474
diff changeset
183 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
184 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
185 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
186 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
187 end
eb85b10e1fea MUC: Ensure that <delay/> elements which match our from are stripped (fixes #1055)
Jonas Wielicki <jonas@wielicki.name>
parents: 8474
diff changeset
188 end
eb85b10e1fea MUC: Ensure that <delay/> elements which match our from are stripped (fixes #1055)
Jonas Wielicki <jonas@wielicki.name>
parents: 8474
diff changeset
189 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
190 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
191 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
192 end
eb85b10e1fea MUC: Ensure that <delay/> elements which match our from are stripped (fixes #1055)
Jonas Wielicki <jonas@wielicki.name>
parents: 8474
diff changeset
193 end
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 child;
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)
8481
d546815e555e MUC: Move delayed delivery check into an event handler
Kim Alvefur <zash@zash.se>
parents: 8480
diff changeset
196 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
197
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
198 -- Broadcast a stanza to all occupants in the room.
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
199 -- 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
200 function room_mt:broadcast(stanza, cond_func)
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
201 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
202 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
203 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
204 end
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
205 end
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
206 end
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
207
6211
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
208 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
209 if whois == "anyone" then
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
210 return true;
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
211 elseif whois == "moderators" then
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
212 return valid_roles[occupant.role or "none"] >= valid_roles.moderator;
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
213 end
6211
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
214 end
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
215
6278
fcc3ef191293 plugins/muc/muc: Fire broadcast presences event before creating full/anon presences
daurnimator <quae@daurnimator.com>
parents: 6277
diff changeset
216 -- 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
217 -- Takes the x element that goes into the stanzas
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
218 function room_mt:publicise_occupant_status(occupant, x, nick, actor, reason)
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
219 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
220 -- 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
221 local base_presence do
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
222 -- Try to use main jid's presence
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
223 local pr = occupant:get_presence();
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
224 if pr and (occupant.role ~= nil or pr.attr.type == "unavailable") then
6278
fcc3ef191293 plugins/muc/muc: Fire broadcast presences event before creating full/anon presences
daurnimator <quae@daurnimator.com>
parents: 6277
diff changeset
225 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
226 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
227 base_presence = st.presence {from = occupant.nick; type = "unavailable";};
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
228 end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
229 end
6211
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
230
6278
fcc3ef191293 plugins/muc/muc: Fire broadcast presences event before creating full/anon presences
daurnimator <quae@daurnimator.com>
parents: 6277
diff changeset
231 -- 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
232 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
233 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
234 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
235 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
236 }
3bbd59c03aeb plugins/muc/muc.lib: Allow muc-broadcast-presence event listeners to modify nick, actor, reason
daurnimator <quae@daurnimator.com>
parents: 6512
diff changeset
237 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
238
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 -- 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
240 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
241 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
242 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
243
6512
ad159be9e9d7 plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents: 6478
diff changeset
244 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
245
6512
ad159be9e9d7 plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents: 6478
diff changeset
246 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
247 if actor then
8856
538bb632a2b6 MUC: Use util.jid.resource
Kim Alvefur <zash@zash.se>
parents: 8853
diff changeset
248 actor_nick = jid_resource(self:get_occupant_jid(actor));
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
249 end
6278
fcc3ef191293 plugins/muc/muc: Fire broadcast presences event before creating full/anon presences
daurnimator <quae@daurnimator.com>
parents: 6277
diff changeset
250
6512
ad159be9e9d7 plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents: 6478
diff changeset
251 local 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
252 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
253 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
254 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
255 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
256 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
257 end
ad159be9e9d7 plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents: 6478
diff changeset
258 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
259 end
6266
cabeff5fc687 plugins/muc/muc.lib: Fire event for presence broadcast
daurnimator <quae@daurnimator.com>
parents: 6253
diff changeset
260
6211
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
261 local anon_p, anon_x;
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
262 local function get_anon_p()
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
263 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
264 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
265 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
266 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
267 end
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
268 return anon_p, anon_x;
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
269 end
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
270
6512
ad159be9e9d7 plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents: 6478
diff changeset
271 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
272 do
6512
ad159be9e9d7 plugins/muc/muc.lib: Don't expose actor jids to users when anonymous
daurnimator <quae@daurnimator.com>
parents: 6478
diff changeset
273 -- 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
274 -- 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
275 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
276 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
277 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
278 end
6211
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
279
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
280 -- General populance
7089
890f4b2cc444 MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents: 7013
diff changeset
281 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
282 if occupant_nick ~= occupant.nick then
6211
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
283 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
284 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
285 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
286 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
287 pr = self_p;
6211
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
288 else
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
289 pr = get_anon_p();
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
290 end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
291 self:route_to_occupant(n_occupant, pr);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
292 end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
293 end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
294
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
295 -- 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
296 self_x:tag("status", {code = "110";}):up();
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
297 if occupant.role == nil then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
298 -- 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
299 self:route_to_occupant(occupant, self_p);
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
300 else
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
301 -- use their own presences as templates
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
302 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
303 pr = st.clone(pr);
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
304 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
305 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
306 self:route_stanza(pr);
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
307 end
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
308 end
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
309 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5681
diff changeset
310
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
311 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
312 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
313 local is_anonymous = false;
6211
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
314 local whois = self:get_whois();
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
315 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
316 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
317 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
318 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
319 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
320 is_anonymous = true;
2880
a3f6cc3417f2 MUC: Added support for letting clients manage discussion history.
Waqas Hussain <waqas20@gmail.com>
parents: 2658
diff changeset
321 end
a3f6cc3417f2 MUC: Added support for letting clients manage discussion history.
Waqas Hussain <waqas20@gmail.com>
parents: 2658
diff changeset
322 end
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
323 end
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
324 for occupant_jid, occupant in self:each_occupant() do
6184
2bfc4b12ec8f plugins/muc/muc.lib: Allow `:send_occupant_list` to have no filter
daurnimator <quae@daurnimator.com>
parents: 6183
diff changeset
325 if filter == nil or filter(occupant_jid, occupant) then
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
326 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
327 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
328 local pres = st.clone(occupant:get_presence());
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
329 pres.attr.to = to;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
330 pres:add_child(x);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
331 self:route_stanza(pres);
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
332 end
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
333 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
334 end
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
335
2503
bb6b0bd7f2cf MUC: Converted some local functions into methods.
Waqas Hussain <waqas20@gmail.com>
parents: 2416
diff changeset
336 function room_mt:get_disco_info(stanza)
6200
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
337 local reply = st.reply(stanza):query("http://jabber.org/protocol/disco#info");
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
338 local form = dataform.new {
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
339 { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/muc#roominfo" };
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
340 };
7119
50b9a7e86de9 MUC: Separate form data from form in disco#info event
Kim Alvefur <zash@zash.se>
parents: 7089
diff changeset
341 local formdata = {};
50b9a7e86de9 MUC: Separate form data from form in disco#info event
Kim Alvefur <zash@zash.se>
parents: 7089
diff changeset
342 module:fire_event("muc-disco#info", {room = self; reply = reply; form = form, formdata = formdata ;});
50b9a7e86de9 MUC: Separate form data from form in disco#info event
Kim Alvefur <zash@zash.se>
parents: 7089
diff changeset
343 reply:add_child(form:form(formdata, "result"));
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
344 return reply;
1756
b2291156a9c2 MUC: Added service discovery replies for rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1755
diff changeset
345 end
6200
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
346 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
347 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
348 event.reply:tag("feature", {var = "http://jabber.org/protocol/muc#stable_id"}):up();
6200
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
349 end);
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
350 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
351 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
352 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
353 end);
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
354
8891
d9b7db6f140f MUC: Ignore unused 'self' [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8888
diff changeset
355 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
356 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
357 end
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
358
7089
890f4b2cc444 MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents: 7013
diff changeset
359 function room_mt:handle_kickable(origin, stanza) -- luacheck: ignore 212
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
360 local real_jid = stanza.attr.from;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
361 local occupant = self:get_occupant_by_real_jid(real_jid);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
362 if occupant == nil then return nil; end
2529
7968e8b3ecf9 MUC: Fixes and refactoring for the previous commit to work in all cases, text of error stanzas is now broadcast
Matthew Wild <mwild1@gmail.com>
parents: 2528
diff changeset
363 local type, condition, text = stanza:get_error();
3506
0f46acca11cc MUC: Fixed traceback on presence errors lacking a condition.
Waqas Hussain <waqas20@gmail.com>
parents: 3446
diff changeset
364 local error_message = "Kicked: "..(condition and condition:gsub("%-", " ") or "presence error");
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
365 if text then
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
366 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
367 end
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
368 occupant:set_session(real_jid, st.presence({type="unavailable"})
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
369 :tag('status'):text(error_message));
9003
a971023e9b6e MUC: Bring handling of presence errors to the room more in line with unavailable presence
Matthew Wild <mwild1@gmail.com>
parents: 9002
diff changeset
370 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
371 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
372 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
373 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
374 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
375 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
376 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
377 x:tag("status", {code = "307"}):up()
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
378 :tag("status", {code = "333"});
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
379 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
380 self:publicise_occupant_status(new_occupant or occupant, x);
a971023e9b6e MUC: Bring handling of presence errors to the room more in line with unavailable presence
Matthew Wild <mwild1@gmail.com>
parents: 9002
diff changeset
381 if is_last_session then
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
382 module:fire_event("muc-occupant-left", {room = self; nick = occupant.nick; occupant = occupant;});
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
383 end
6100
c78ba94d3261 plugins/muc/muc.lib: Move all kick code into one place
daurnimator <quae@daurnimator.com>
parents: 6099
diff changeset
384 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
385 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
386
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
387 -- Give the room creator owner affiliation
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
388 module:hook("muc-room-pre-create", function(event)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
389 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
390 end, -1);
6094
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
391
6180
35388114439f plugins/muc/muc.lib: non-function changes (reordering, semicolons and comments)
daurnimator <quae@daurnimator.com>
parents: 6179
diff changeset
392 -- 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
393 module:hook("muc-occupant-pre-join", function(event)
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
394 local room, stanza = event.room, event.stanza;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
395 local affiliation = room:get_affiliation(stanza.attr.from);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
396 if affiliation == "outcast" then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
397 local reply = st.error_reply(stanza, "auth", "forbidden"):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
398 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
399 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
400 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
401 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
402 end, -10);
6094
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
403
9024
43241e74bb19 MUC: Reject invisible nicknames (fixes #979)
Kim Alvefur <zash@zash.se>
parents: 9023
diff changeset
404 module:hook("muc-occupant-pre-join", function(event)
9026
91b5a5667016 MUC: Use nickname from occupant object
Kim Alvefur <zash@zash.se>
parents: 9025
diff changeset
405 local nick = jid_resource(event.occupant.nick);
9024
43241e74bb19 MUC: Reject invisible nicknames (fixes #979)
Kim Alvefur <zash@zash.se>
parents: 9023
diff changeset
406 if not nick:find("%S") then
9025
0f12d46cf754 MUC: Fix stanza reference
Kim Alvefur <zash@zash.se>
parents: 9024
diff changeset
407 event.origin.send(st.error_reply(event.stanza, "modify", "not-allowed", "Invisible Nicknames are forbidden"));
9024
43241e74bb19 MUC: Reject invisible nicknames (fixes #979)
Kim Alvefur <zash@zash.se>
parents: 9023
diff changeset
408 return true;
43241e74bb19 MUC: Reject invisible nicknames (fixes #979)
Kim Alvefur <zash@zash.se>
parents: 9023
diff changeset
409 end
43241e74bb19 MUC: Reject invisible nicknames (fixes #979)
Kim Alvefur <zash@zash.se>
parents: 9023
diff changeset
410 end, 1);
43241e74bb19 MUC: Reject invisible nicknames (fixes #979)
Kim Alvefur <zash@zash.se>
parents: 9023
diff changeset
411
9027
4028eb4a9f7f MUC: Also prevent changing to an invisible nickname
Kim Alvefur <zash@zash.se>
parents: 9026
diff changeset
412 module:hook("muc-occupant-pre-change", function(event)
4028eb4a9f7f MUC: Also prevent changing to an invisible nickname
Kim Alvefur <zash@zash.se>
parents: 9026
diff changeset
413 if not jid_resource(event.dest_occupant.nick):find("%S") then
4028eb4a9f7f MUC: Also prevent changing to an invisible nickname
Kim Alvefur <zash@zash.se>
parents: 9026
diff changeset
414 event.origin.send(st.error_reply(event.stanza, "modify", "not-allowed", "Invisible Nicknames are forbidden"));
4028eb4a9f7f MUC: Also prevent changing to an invisible nickname
Kim Alvefur <zash@zash.se>
parents: 9026
diff changeset
415 return true;
4028eb4a9f7f MUC: Also prevent changing to an invisible nickname
Kim Alvefur <zash@zash.se>
parents: 9026
diff changeset
416 end
4028eb4a9f7f MUC: Also prevent changing to an invisible nickname
Kim Alvefur <zash@zash.se>
parents: 9026
diff changeset
417 end, 1);
4028eb4a9f7f MUC: Also prevent changing to an invisible nickname
Kim Alvefur <zash@zash.se>
parents: 9026
diff changeset
418
7410
45f543c82893 MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7409
diff changeset
419 function room_mt:handle_first_presence(origin, stanza)
8913
560419b759c8 MUC: Remove support for GC 1.0 during room creation
Kim Alvefur <zash@zash.se>
parents: 8912
diff changeset
420 if not stanza:get_child("x", "http://jabber.org/protocol/muc") then
560419b759c8 MUC: Remove support for GC 1.0 during room creation
Kim Alvefur <zash@zash.se>
parents: 8912
diff changeset
421 module:log("debug", "Room creation without <x>, possibly desynced");
560419b759c8 MUC: Remove support for GC 1.0 during room creation
Kim Alvefur <zash@zash.se>
parents: 8912
diff changeset
422
560419b759c8 MUC: Remove support for GC 1.0 during room creation
Kim Alvefur <zash@zash.se>
parents: 8912
diff changeset
423 origin.send(st.error_reply(stanza, "cancel", "item-not-found"));
560419b759c8 MUC: Remove support for GC 1.0 during room creation
Kim Alvefur <zash@zash.se>
parents: 8912
diff changeset
424 return true;
560419b759c8 MUC: Remove support for GC 1.0 during room creation
Kim Alvefur <zash@zash.se>
parents: 8912
diff changeset
425 end
560419b759c8 MUC: Remove support for GC 1.0 during room creation
Kim Alvefur <zash@zash.se>
parents: 8912
diff changeset
426
7410
45f543c82893 MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7409
diff changeset
427 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
428 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
429 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
430 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
431 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
432 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
433 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
434 }) 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
435 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
436 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
437
7706
d92e186c2a1c MUC: Include the appropriate status code if nickname is changed during join process
Kim Alvefur <zash@zash.se>
parents: 7705
diff changeset
438 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
439 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
440 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
441 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
442 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
443 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
444 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
445 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
446 }) 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
447 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
448
45f543c82893 MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7409
diff changeset
449 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
450 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
451 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
452 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
453 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
454 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
455 if nick_changed then
9022
293ebfed71f7 MUC: Simplify creation of <{muc}x> for room creation
Kim Alvefur <zash@zash.se>
parents: 9017
diff changeset
456 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
457 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
458 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
459
9022
293ebfed71f7 MUC: Simplify creation of <{muc}x> for room creation
Kim Alvefur <zash@zash.se>
parents: 9017
diff changeset
460 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
461
45f543c82893 MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7409
diff changeset
462 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
463 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
464 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
465 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
466 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
467 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
468 });
45f543c82893 MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7409
diff changeset
469 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
470 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
471 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
472 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
473 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
474 origin = origin;
45f543c82893 MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7409
diff changeset
475 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
476 });
7411
f385cd6127b2 MUC: Add event for when room is done being created
Kim Alvefur <zash@zash.se>
parents: 7410
diff changeset
477 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
478 room = self;
f385cd6127b2 MUC: Add event for when room is done being created
Kim Alvefur <zash@zash.se>
parents: 7410
diff changeset
479 creator = dest_occupant;
f385cd6127b2 MUC: Add event for when room is done being created
Kim Alvefur <zash@zash.se>
parents: 7410
diff changeset
480 stanza = stanza;
f385cd6127b2 MUC: Add event for when room is done being created
Kim Alvefur <zash@zash.se>
parents: 7410
diff changeset
481 origin = origin;
f385cd6127b2 MUC: Add event for when room is done being created
Kim Alvefur <zash@zash.se>
parents: 7410
diff changeset
482 });
7410
45f543c82893 MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7409
diff changeset
483 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
484 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
485
7409
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
486 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
487 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
488 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
489 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
490 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
491 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
492
8931
ae84911c1441 MUC: Avoid sending error for unavailable presence in GC 1.0 check
Kim Alvefur <zash@zash.se>
parents: 8915
diff changeset
493 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
494 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
495 origin.send(st.error_reply(stanza, "cancel", "item-not-found",
ce57c69a20e2 MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents: 9057
diff changeset
496 "You must join the room before sending presence updates"));
8914
e9acb928c637 MUC: Remove support for GC 1.0 for joining
Kim Alvefur <zash@zash.se>
parents: 8913
diff changeset
497 return true;
e9acb928c637 MUC: Remove support for GC 1.0 for joining
Kim Alvefur <zash@zash.se>
parents: 8913
diff changeset
498 end
e9acb928c637 MUC: Remove support for GC 1.0 for joining
Kim Alvefur <zash@zash.se>
parents: 8913
diff changeset
499
7409
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
500 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
501 local dest_occupant;
8754
ca40f9a5751a MUC: Move something into empty if branch
Kim Alvefur <zash@zash.se>
parents: 8728
diff changeset
502 if type == "unavailable" then
ca40f9a5751a MUC: Move something into empty if branch
Kim Alvefur <zash@zash.se>
parents: 8728
diff changeset
503 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
504 -- dest_occupant = nil
7426
3a90e9732204 Backed out changeset 63141a85beea, broke multi-session nicks
Kim Alvefur <zash@zash.se>
parents: 7423
diff changeset
505 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
506 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
507 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
508 else
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
509 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
510 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
511 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
512 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
513 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
514 dest_occupant = self:new_occupant(bare_jid, dest_jid);
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
515 else
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
516 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
517 end
3507
b639042bb0d5 MUC: Added a 'Name' property (muc#roomconfig_roomname)
Kim Alvefur <zash@zash.se>
parents: 3446
diff changeset
518 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
519 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
520 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
521 -- 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
522 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
523 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
524 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
525
7706
d92e186c2a1c MUC: Include the appropriate status code if nickname is changed during join process
Kim Alvefur <zash@zash.se>
parents: 7705
diff changeset
526 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
527
7409
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
528 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
529 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
530 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
531 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
532 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
533 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
534 };
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
535 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
536 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
537 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
538 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
539 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
540 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
541 else
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
542 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
543 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
544 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
545 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
546 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
547
7706
d92e186c2a1c MUC: Include the appropriate status code if nickname is changed during join process
Kim Alvefur <zash@zash.se>
parents: 7705
diff changeset
548 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
549
7409
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
550 -- Check for nick conflicts
7958
47cb54a08336 MUC: Split long line [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7706
diff changeset
551 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
552 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
553 -- 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
554 log("debug", "%s couldn't join due to nick conflict: %s", 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
555 local reply = st.error_reply(stanza, "cancel", "conflict"):up();
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
556 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
557 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
558 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
559 end
7409
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
560
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
561 -- 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
562 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
563 local orig_x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";});
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
564 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
565 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
566 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
567 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
568 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
569 end
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
570 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
571 else
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
572 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
573 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
574 orig_occupant:set_session(real_jid, generated_unavail);
8856
538bb632a2b6 MUC: Use util.jid.resource
Kim Alvefur <zash@zash.se>
parents: 8853
diff changeset
575 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
576 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
577 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
578 -- 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
579 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
580 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
581 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
582 :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
583 :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
584 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
585 end
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
586 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
587 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
588 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
589 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
590 -- 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
591 -- 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
592 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
593 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
594 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
595 -- 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
596 -- 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
597 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
598 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
599 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
600 self:route_stanza(generated_unavail: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
601 dest_nick = nil; -- set dest_nick to nil; so general populance doesn't see it for whole 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
602 end
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
603 end
7667
5523880760b3 MUC: Insert the appropriate status code (210) if the nickname is overridden
Kim Alvefur <zash@zash.se>
parents: 7661
diff changeset
604
7409
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
605 self:save_occupant(orig_occupant);
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
606 self:publicise_occupant_status(orig_occupant, orig_x, dest_nick);
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
607
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
608 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
609 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
610 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
611 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
612 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
613 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
614 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
615 });
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
616 end
3261
fe1c93296abd MUC: Added room:set_hidden(boolean) and room:is_hidden().
Waqas Hussain <waqas20@gmail.com>
parents: 3260
diff changeset
617 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
618
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
619 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
620 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
621 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
622
7427
bf43a08e5a74 MUC: Send participant list and subject on explicit joins (thanks daurnimator)
Kim Alvefur <zash@zash.se>
parents: 7426
diff changeset
623 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
624 -- 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
625 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
626 -- Don't include self
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
627 return occupant:get_presence(real_jid) == nil;
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
628 end)
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
629 end
9023
ce461a67d2cc MUC: Fix to send status code 100 *only* to the joining (fixes #680)
Kim Alvefur <zash@zash.se>
parents: 9022
diff changeset
630 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
631 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
632 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
633 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
634 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
635 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
636 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
637 end
d92e186c2a1c MUC: Include the appropriate status code if nickname is changed during join process
Kim Alvefur <zash@zash.se>
parents: 7705
diff changeset
638 self:publicise_occupant_status(dest_occupant, {base=dest_x,self=self_x});
7409
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
639
9081
ce57c69a20e2 MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents: 9057
diff changeset
640 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
641 -- 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
642 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
643 -- 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
644 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
645 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
646 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
647 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
648 -- 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
649 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
650 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
651 end
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
652
7427
bf43a08e5a74 MUC: Send participant list and subject on explicit joins (thanks daurnimator)
Kim Alvefur <zash@zash.se>
parents: 7426
diff changeset
653 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
654 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
655 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
656 room = self;
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
657 nick = 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
658 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
659 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
660 origin = origin;
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
661 });
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
662 end
9a3ce6da3256 MUC: Split out handling of normal (un)available presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7406
diff changeset
663 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
664 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
665 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
666 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
667 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
668 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
669 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
670 });
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
4119
813adb81d7da MUC: Add option to allow participants to change the subject.
Kim Alvefur <zash@zash.se>
parents: 3989
diff changeset
672 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
673 return true;
4528
875b90d5ce0f muc - implement per channel history limits
Markus Kötter <koetter@rrzn-hiwi.uni-hannover.de>
parents: 4424
diff changeset
674 end
875b90d5ce0f muc - implement per channel history limits
Markus Kötter <koetter@rrzn-hiwi.uni-hannover.de>
parents: 4424
diff changeset
675
6094
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
676 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
677 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
678 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
679 return self:handle_kickable(origin, stanza)
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
680 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
681 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
682 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
683 if type ~= 'visible' and type ~= 'invisible' then -- COMPAT ejabberd can broadcast or forward XEP-0018 presences
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
684 origin.send(st.error_reply(stanza, "modify", "bad-request")); -- FIXME correct error?
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
685 end
5600
1b326a1e4da6 mod_muc: Add getter/setter for 'whois' (fixes traceback)
Matthew Wild <mwild1@gmail.com>
parents: 5580
diff changeset
686 end
6094
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
687 return true;
5600
1b326a1e4da6 mod_muc: Add getter/setter for 'whois' (fixes traceback)
Matthew Wild <mwild1@gmail.com>
parents: 5580
diff changeset
688 end
1b326a1e4da6 mod_muc: Add getter/setter for 'whois' (fixes traceback)
Matthew Wild <mwild1@gmail.com>
parents: 5580
diff changeset
689
6094
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
690 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
691 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
692 local type = stanza.attr.type;
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
693 local id = stanza.attr.id;
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
694 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
695 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
696 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
697 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
698 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
699 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
700 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
701 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
702 local session_jid
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
703 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
704 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
705 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
706 break;
538cdc3d8225 plugins/muc/muc.lib: Move (de)construct_stanza_id into `handle_iq_to_occupant`
daurnimator <quae@daurnimator.com>
parents: 6096
diff changeset
707 end
538cdc3d8225 plugins/muc/muc.lib: Move (de)construct_stanza_id into `handle_iq_to_occupant`
daurnimator <quae@daurnimator.com>
parents: 6096
diff changeset
708 end
538cdc3d8225 plugins/muc/muc.lib: Move (de)construct_stanza_id into `handle_iq_to_occupant`
daurnimator <quae@daurnimator.com>
parents: 6096
diff changeset
709 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
710 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
711 end
6096
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
712 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
713 self:route_stanza(stanza);
6096
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
714 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
715 return true;
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
716 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
717 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
718 if not current_nick then
6094
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
719 origin.send(st.error_reply(stanza, "cancel", "not-acceptable"));
6096
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
720 return true;
6094
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
721 end
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
722 if not occupant then -- recipient not in room
6096
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
723 origin.send(st.error_reply(stanza, "cancel", "item-not-found", "Recipient not in room"));
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
724 return true;
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
725 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
726 do -- construct_stanza_id
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
727 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
728 end
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
729 stanza.attr.from, stanza.attr.to = current_nick, occupant.jid;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
730 log("debug", "%s sent private iq stanza to %s (%s)", from, to, occupant.jid);
6096
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
731 if stanza.tags[1].attr.xmlns == 'vcard-temp' then
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
732 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
733 end
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
734 self:route_stanza(stanza);
6096
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
735 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
736 return true;
5061
186f34d88073 MUC: Fix private IQ and message routing.
Waqas Hussain <waqas20@gmail.com>
parents: 4999
diff changeset
737 end
186f34d88073 MUC: Fix private IQ and message routing.
Waqas Hussain <waqas20@gmail.com>
parents: 4999
diff changeset
738 end
186f34d88073 MUC: Fix private IQ and message routing.
Waqas Hussain <waqas20@gmail.com>
parents: 4999
diff changeset
739
6094
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
740 function room_mt:handle_message_to_occupant(origin, stanza)
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
741 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
742 local current_nick = self:get_occupant_jid(from);
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
743 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
744 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
745 if type ~= "error" then
1778
f4213d84ba8a MUC: Correct routing of vCard requests to bare JID.
Waqas Hussain <waqas20@gmail.com>
parents: 1769
diff changeset
746 origin.send(st.error_reply(stanza, "cancel", "not-acceptable"));
f4213d84ba8a MUC: Correct routing of vCard requests to bare JID.
Waqas Hussain <waqas20@gmail.com>
parents: 1769
diff changeset
747 end
6094
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
748 return true;
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
749 end
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
750 if type == "groupchat" then -- groupchat messages not allowed in PM
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
751 origin.send(st.error_reply(stanza, "modify", "bad-request"));
6094
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
752 return true;
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
753 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
754 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
755 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
756 end
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
757
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
758 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
759 if not o_data then
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
760 origin.send(st.error_reply(stanza, "cancel", "item-not-found", "Recipient not in room"));
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
761 return true;
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
762 end
6096
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
763 log("debug", "%s sent private message stanza to %s (%s)", from, to, o_data.jid);
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
764 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
765 stanza.attr.from = current_nick;
6130
c95d9132592a plugins/muc/muc.lib: Add route_to_occupant function to send a stanza to all occupant sessions
daurnimator <quae@daurnimator.com>
parents: 6129
diff changeset
766 self:route_to_occupant(o_data, stanza)
6180
35388114439f plugins/muc/muc.lib: non-function changes (reordering, semicolons and comments)
daurnimator <quae@daurnimator.com>
parents: 6179
diff changeset
767 -- 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
768 stanza.attr.from = from;
6096
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
769 return true;
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
770 end
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
771
2216
dbbb5ed41365 MUC: Slightly refactored form processing.
Waqas Hussain <waqas20@gmail.com>
parents: 2174
diff changeset
772 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
773 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
774 :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
775 );
dff4a77ee285 MUC: Parse submitted form with util.dataforms
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
776 end
dff4a77ee285 MUC: Parse submitted form with util.dataforms
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
777
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
778 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
779 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
780 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
781 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
782 {
530f7de1d265 MUC: Use util.dataforms to generate forms
Kim Alvefur <zash@zash.se>
parents: 3516
diff changeset
783 name = 'FORM_TYPE',
530f7de1d265 MUC: Use util.dataforms to generate forms
Kim Alvefur <zash@zash.se>
parents: 3516
diff changeset
784 type = 'hidden',
530f7de1d265 MUC: Use util.dataforms to generate forms
Kim Alvefur <zash@zash.se>
parents: 3516
diff changeset
785 value = 'http://jabber.org/protocol/muc#roomconfig'
530f7de1d265 MUC: Use util.dataforms to generate forms
Kim Alvefur <zash@zash.se>
parents: 3516
diff changeset
786 }
3591
dff4a77ee285 MUC: Parse submitted form with util.dataforms
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
787 });
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
788 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
789 end
dbbb5ed41365 MUC: Slightly refactored form processing.
Waqas Hussain <waqas20@gmail.com>
parents: 2174
diff changeset
790
dbbb5ed41365 MUC: Slightly refactored form processing.
Waqas Hussain <waqas20@gmail.com>
parents: 2174
diff changeset
791 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
792 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
793 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
794 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
795 elseif form.attr.type == "submit" then
6990
f476e2497568 MUC: Fire per-field events for the config form, including those with value == nil (no <value/> element in form)
Matthew Wild <mwild1@gmail.com>
parents: 6988
diff changeset
796 local fields, errors, present;
6391
4d334d00c635 plugins/muc/muc.lib: Add instant room support
daurnimator <quae@daurnimator.com>
parents: 6318
diff changeset
797 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
798 fields, present = {}, {};
6391
4d334d00c635 plugins/muc/muc.lib: Add instant room support
daurnimator <quae@daurnimator.com>
parents: 6318
diff changeset
799 else
6990
f476e2497568 MUC: Fire per-field events for the config form, including those with value == nil (no <value/> element in form)
Matthew Wild <mwild1@gmail.com>
parents: 6988
diff changeset
800 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
801 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
802 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
803 return true;
4d334d00c635 plugins/muc/muc.lib: Add instant room support
daurnimator <quae@daurnimator.com>
parents: 6318
diff changeset
804 end
6202
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
805 end
3508
9e4c2b048f9a MUC: Added a 'Description' property (muc#roomconfig_roomdesc)
Kim Alvefur <zash@zash.se>
parents: 3507
diff changeset
806
9052
5017e43ccc39 MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents: 9027
diff changeset
807 local event = {
5017e43ccc39 MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents: 9027
diff changeset
808 room = self;
5017e43ccc39 MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents: 9027
diff changeset
809 origin = origin;
5017e43ccc39 MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents: 9027
diff changeset
810 stanza = stanza;
5017e43ccc39 MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents: 9027
diff changeset
811 fields = fields;
5017e43ccc39 MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents: 9027
diff changeset
812 status_codes = {};
5017e43ccc39 MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents: 9027
diff changeset
813 actor = stanza.attr.from;
5017e43ccc39 MUC: Add 'actor' field in muc-config-submitted event
Matthew Wild <mwild1@gmail.com>
parents: 9027
diff changeset
814 };
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
815 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
816 local new = fields[field];
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
817 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
818 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
819 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
820 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
821 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
822 return true;
6202
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
823 end
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
824 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
825 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
826 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
827 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
828 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
829 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
830
7414
1b62c89014c4 MUC: Separate force-save parameter from save-entire-state flag
Kim Alvefur <zash@zash.se>
parents: 7413
diff changeset
831 self:save(true);
6202
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
832 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
833
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
834 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
835 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
836 :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
837 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
838 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
839 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
840 msg:up();
6215
1dd09dc04945 plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents: 6214
diff changeset
841 self:broadcast_message(msg);
6202
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
842 end
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
843 else
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
844 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
845 end
6202
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
846 return true;
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1753
diff changeset
847 end
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1753
diff changeset
848
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
849 -- Removes everyone from the room
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
850 function room_mt:clear(x)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
851 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
852 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
853 for nick, occupant in self:each_occupant() do -- luacheck: ignore 213
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
854 occupant.role = nil;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
855 self:save_occupant(occupant);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
856 occupants_updated[occupant] = true;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
857 end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
858 for occupant in pairs(occupants_updated) do
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
859 self:publicise_occupant_status(occupant, x);
6431
540f4e33394a muc: Add 'occupant' to muc-occupant-{joined,left,session-new} events (thanks daurnimator/fippo)
Matthew Wild <mwild1@gmail.com>
parents: 6429
diff changeset
860 module:fire_event("muc-occupant-left", { room = self; nick = occupant.nick; occupant = occupant;});
2412
e243b7c81de6 Added notification of configuration changes for MUCs
Rob Hoelz <rob@hoelzro.net>
parents: 2411
diff changeset
861 end
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1753
diff changeset
862 end
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1753
diff changeset
863
2217
838f6d546177 MUC: Added support for the room-destroy owner use case.
Waqas Hussain <waqas20@gmail.com>
parents: 2216
diff changeset
864 function room_mt:destroy(newjid, reason, password)
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
865 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
866 :tag("destroy", {jid=newjid});
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
867 if reason then x:tag("reason"):text(reason):up(); end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
868 if password then x:tag("password"):text(password):up(); end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
869 x:up();
9007
695904638cfa MUC: Flag rooms being destroyed (fixes #887)
Kim Alvefur <zash@zash.se>
parents: 9003
diff changeset
870 self.destroying = reason or true;
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
871 self:clear(x);
9011
ce8e5206aeba MUC: Include destruction reason and other info in destroyed event
Kim Alvefur <zash@zash.se>
parents: 9007
diff changeset
872 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
873 return true;
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1753
diff changeset
874 end
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1753
diff changeset
875
6101
a861dc18e08d plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents: 6100
diff changeset
876 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
877 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
878 return true;
a861dc18e08d plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents: 6100
diff changeset
879 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
880
6101
a861dc18e08d plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents: 6100
diff changeset
881 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
882 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
883 return true;
a861dc18e08d plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents: 6100
diff changeset
884 end
8792
c2b99fa134b3 MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents: 8791
diff changeset
885
6141
bf6de8ef66c2 plugins/muc: Rename admin query hook
daurnimator <quae@daurnimator.com>
parents: 6140
diff changeset
886 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
887 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
888 if not item then
494938dec5d8 MUC: Reject muc:admin query with missing <item> child
Kim Alvefur <zash@zash.se>
parents: 6835
diff changeset
889 origin.send(st.error_reply(stanza, "cancel", "bad-request"));
494938dec5d8 MUC: Reject muc:admin query with missing <item> child
Kim Alvefur <zash@zash.se>
parents: 6835
diff changeset
890 end
6095
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
891 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
892 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
893 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
894 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
895 return true;
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
896 end
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
897 end
9081
ce57c69a20e2 MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents: 9057
diff changeset
898 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
899 -- 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
900 local occupant = self:get_occupant_by_nick(self.jid.."/"..item.attr.nick);
6095
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
901 if occupant then item.attr.jid = occupant.jid; end
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
902 elseif not item.attr.nick and item.attr.jid then
6119
c13f5d6b9b16 plugins/muc/muc.lib: Use `get_occupant_jid` method instead of indexing _jid_nick
daurnimator <quae@daurnimator.com>
parents: 6118
diff changeset
903 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
904 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
905 end
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
906 local actor = stanza.attr.from;
6112
819e00a86239 plugins/muc/muc.lib: Use more modern stanza methods
daurnimator <quae@daurnimator.com>
parents: 6111
diff changeset
907 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
908 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
909 if item.attr.affiliation and item.attr.jid and not item.attr.role then
6181
6baa9a59aa03 plugins/muc/muc.lib: Remove callback parameter from set_role and set_affiliation
daurnimator <quae@daurnimator.com>
parents: 6180
diff changeset
910 success, errtype, err = self:set_affiliation(actor, item.attr.jid, item.attr.affiliation, reason);
6095
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
911 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
912 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
913 else
6181
6baa9a59aa03 plugins/muc/muc.lib: Remove callback parameter from set_role and set_affiliation
daurnimator <quae@daurnimator.com>
parents: 6180
diff changeset
914 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
915 end
7414
1b62c89014c4 MUC: Separate force-save parameter from save-entire-state flag
Kim Alvefur <zash@zash.se>
parents: 7413
diff changeset
916 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
917 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
918 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
919 else
9019bc4c9a5a MUC: Prevent double replies when MUC affiliation/role change requests fail.
Lance Stout <lancestout@gmail.com>
parents: 6827
diff changeset
920 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
921 end
6181
6baa9a59aa03 plugins/muc/muc.lib: Remove callback parameter from set_role and set_affiliation
daurnimator <quae@daurnimator.com>
parents: 6180
diff changeset
922 return true;
6095
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
923 end
8792
c2b99fa134b3 MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents: 8791
diff changeset
924
6141
bf6de8ef66c2 plugins/muc: Rename admin query hook
daurnimator <quae@daurnimator.com>
parents: 6140
diff changeset
925 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
926 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
927 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
928 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
929 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
930 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
931 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
932 if _aff and _aff_rank and not _rol then
14b62ad88d8a plugins/muc/muc.lib: Validate affiliations and roles to admin query get
daurnimator <quae@daurnimator.com>
parents: 6452
diff changeset
933 -- You need to be at least an admin, and be requesting info about your affifiliation or lower
14b62ad88d8a plugins/muc/muc.lib: Validate affiliations and roles to admin query get
daurnimator <quae@daurnimator.com>
parents: 6452
diff changeset
934 -- 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
935 local affiliation_rank = valid_affiliations[affiliation or "none"];
7444
45d28235ebe0 Merge 0.10->trunk
Kim Alvefur <zash@zash.se>
parents: 7427 7443
diff changeset
936 if affiliation_rank >= valid_affiliations.admin and affiliation_rank >= _aff_rank
45d28235ebe0 Merge 0.10->trunk
Kim Alvefur <zash@zash.se>
parents: 7427 7443
diff changeset
937 or self:get_members_only() and self:get_whois() == "anyone" and affiliation_rank >= valid_affiliations.member then
6095
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
938 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
939 for jid in self:each_affiliation(_aff or "none") do
413923bbd1a0 plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents: 6476
diff changeset
940 reply:tag("item", {affiliation = _aff, jid = jid}):up();
1742
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
941 end
6452
e692ea8c09a0 plugins/muc/muc.lib: Add missing :up()
daurnimator <quae@daurnimator.com>
parents: 6451
diff changeset
942 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
943 return true;
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
944 else
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
945 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
946 return true;
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
947 end
6453
14b62ad88d8a plugins/muc/muc.lib: Validate affiliations and roles to admin query get
daurnimator <quae@daurnimator.com>
parents: 6452
diff changeset
948 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
949 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
950 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
951 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
952 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
953 -- 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
954 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
955 if occupant.role == _rol then
8856
538bb632a2b6 MUC: Use util.jid.resource
Kim Alvefur <zash@zash.se>
parents: 8853
diff changeset
956 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
957 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
958 end
2216
dbbb5ed41365 MUC: Slightly refactored form processing.
Waqas Hussain <waqas20@gmail.com>
parents: 2174
diff changeset
959 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
960 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
961 return true;
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
962 else
6095
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
963 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
964 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
965 end
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
966 else
6095
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
967 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
968 return true;
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
969 end
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
970 end
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
971
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
972 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
973 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
974 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
975 return true;
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
976 end
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
977
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
978 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
979 return true;
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
980 end
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
981 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
982 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
983 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
984 return true;
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
985 end
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
986
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
987 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
988 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
989 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
990 return true;
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
991 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
992 local newjid = child.attr.jid;
6112
819e00a86239 plugins/muc/muc.lib: Use more modern stanza methods
daurnimator <quae@daurnimator.com>
parents: 6111
diff changeset
993 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
994 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
995 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
996 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
997 return true;
6202
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
998 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
999 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
1000 else
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
1001 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
1002 return true;
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
1003 end
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
1004 end
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
1005
6093
9a7eaf0a35b6 plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents: 6092
diff changeset
1006 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
1007 local from = stanza.attr.from;
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
1008 local occupant = self:get_occupant_by_real_jid(from);
6429
675aea867574 plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents: 6419
diff changeset
1009 if module:fire_event("muc-occupant-groupchat", {
675aea867574 plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents: 6419
diff changeset
1010 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
1011 }) 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
1012 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
1013 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
1014 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
1015 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
1016 end
9a7eaf0a35b6 plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents: 6092
diff changeset
1017
6429
675aea867574 plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents: 6419
diff changeset
1018 -- Role check
675aea867574 plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents: 6419
diff changeset
1019 module:hook("muc-occupant-groupchat", function(event)
675aea867574 plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents: 6419
diff changeset
1020 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
1021 if role_rank <= valid_roles.none then
675aea867574 plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents: 6419
diff changeset
1022 event.origin.send(st.error_reply(event.stanza, "cancel", "not-acceptable"));
675aea867574 plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents: 6419
diff changeset
1023 return true;
675aea867574 plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents: 6419
diff changeset
1024 elseif role_rank <= valid_roles.visitor then
675aea867574 plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents: 6419
diff changeset
1025 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
1026 return true;
675aea867574 plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents: 6419
diff changeset
1027 end
675aea867574 plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents: 6419
diff changeset
1028 end, 50);
675aea867574 plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents: 6419
diff changeset
1029
6093
9a7eaf0a35b6 plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents: 6092
diff changeset
1030 -- 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
1031 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
1032 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
1033 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
1034 if current_nick then
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
1035 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
1036 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
1037 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
1038 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
1039 end
6100
c78ba94d3261 plugins/muc/muc.lib: Move all kick code into one place
daurnimator <quae@daurnimator.com>
parents: 6099
diff changeset
1040 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
1041 end
9a7eaf0a35b6 plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents: 6092
diff changeset
1042
6195
9f6a003baf2e plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents: 6194
diff changeset
1043 -- 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
1044 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
1045 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
1046 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
1047 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
1048 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
1049 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
1050 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
1051 return true;
25ba4e2b31b3 plugins/muc/muc: Check for mediated invites in a smarter way
daurnimator <quae@daurnimator.com>
parents: 6102
diff changeset
1052 end
6195
9f6a003baf2e plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents: 6194
diff changeset
1053 end);
9f6a003baf2e plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents: 6194
diff changeset
1054
9f6a003baf2e plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents: 6194
diff changeset
1055 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
1056 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
1057 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
1058 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
1059 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
1060 return true;
6229
8aa59b73f801 plugins/muc/muc.lib: Remove reversed conditionals when firing pre- events
daurnimator <quae@daurnimator.com>
parents: 6227
diff changeset
1061 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
1062 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
1063 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
1064 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
1065 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
1066 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
1067 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
1068 :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
1069 :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
1070 :up()
9f6a003baf2e plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents: 6194
diff changeset
1071 :up();
9f6a003baf2e plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents: 6194
diff changeset
1072 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
1073 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
1074 end
9f6a003baf2e plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents: 6194
diff changeset
1075 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
1076 end
9a7eaf0a35b6 plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents: 6092
diff changeset
1077
6194
9b6c2d89f143 plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents: 6193
diff changeset
1078 -- COMPAT: Some older clients expect this
9b6c2d89f143 plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents: 6193
diff changeset
1079 module:hook("muc-invite", function(event)
9b6c2d89f143 plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents: 6193
diff changeset
1080 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
1081 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
1082 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
1083 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
1084 :text(reason or "")
9b6c2d89f143 plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents: 6193
diff changeset
1085 :up();
9b6c2d89f143 plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents: 6193
diff changeset
1086 end);
9b6c2d89f143 plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents: 6193
diff changeset
1087
9b6c2d89f143 plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents: 6193
diff changeset
1088 -- 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
1089 module:hook("muc-invite", function(event)
9b6c2d89f143 plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents: 6193
diff changeset
1090 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
1091 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
1092 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
1093 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
1094 stanza:tag("body")
9056
37e287113a8d MUC: Fix inverted logic ()
Matthew Wild <mwild1@gmail.com>
parents: 9055
diff changeset
1095 :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
1096 :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
1097 end
6194
9b6c2d89f143 plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents: 6193
diff changeset
1098 end);
9b6c2d89f143 plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents: 6193
diff changeset
1099
6123
7f82bbd249fe plugins/muc/muc.lib: Remove `payload` argument from `handle_mediated_*`; extract it from inside.
daurnimator <quae@daurnimator.com>
parents: 6122
diff changeset
1100 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
1101 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
1102 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
1103 if not declinee then
6105
68f53b9a186e plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents: 6104
diff changeset
1104 origin.send(st.error_reply(stanza, "cancel", "jid-malformed"));
68f53b9a186e plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents: 6104
diff changeset
1105 return true;
6229
8aa59b73f801 plugins/muc/muc.lib: Remove reversed conditionals when firing pre- events
daurnimator <quae@daurnimator.com>
parents: 6227
diff changeset
1106 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
1107 return true;
6105
68f53b9a186e plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents: 6104
diff changeset
1108 end
6273
7ef064101994 plugins/muc/muc.lib: Use original decline as template for medated decline
daurnimator <quae@daurnimator.com>
parents: 6272
diff changeset
1109 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
1110 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
1111 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
1112 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
1113 :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
1114 :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
1115 :up()
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
1116 :up();
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
1117 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
1118 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
1119 local occupant
d891fa02e5e5 plugins/muc/muc.lib: Deliver declines to in-room jids correctly
daurnimator <quae@daurnimator.com>
parents: 6274
diff changeset
1120 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
1121 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
1122 end
6196
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
1123 if occupant then
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
1124 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
1125 else
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
1126 self:route_stanza(decline);
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
1127 end
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
1128 end
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
1129 return true;
6105
68f53b9a186e plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents: 6104
diff changeset
1130 end
68f53b9a186e plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents: 6104
diff changeset
1131
6196
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
1132 -- 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
1133 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
1134 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
1135 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
1136 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
1137 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
1138 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
1139 ..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
1140 end
6196
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
1141 end);
6131
8dd0c6145603 plugins/muc/muc.lib: Add decline event for parity with invite
daurnimator <quae@daurnimator.com>
parents: 6130
diff changeset
1142
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 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
1144 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
1145 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
1146 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
1147 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
1148 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
1149 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
1150 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
1151 if x then
25ba4e2b31b3 plugins/muc/muc: Check for mediated invites in a smarter way
daurnimator <quae@daurnimator.com>
parents: 6102
diff changeset
1152 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
1153 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
1154 -- 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
1155 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
1156 return self:handle_mediated_invite(origin, stanza)
6105
68f53b9a186e plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents: 6104
diff changeset
1157 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
1158 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
1159 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
1160 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
1161 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
1162 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
1163
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
1164 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
1165 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
1166 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
1167 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
1168 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
1169 end
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
1170 end
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
1171 end
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
1172
7089
890f4b2cc444 MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents: 7013
diff changeset
1173 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
1174 module:send(stanza);
6111
f8b94903be52 plugins/muc: Provide a reasonable default `route_stanza`
daurnimator <quae@daurnimator.com>
parents: 6108
diff changeset
1175 end
1735
81406277279e MUC: The MUC lib is now metatable based. Cleaned up code, etc.
Waqas Hussain <waqas20@gmail.com>
parents: 1734
diff changeset
1176
1737
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
1177 function room_mt:get_affiliation(jid)
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
1178 local node, host, resource = jid_split(jid);
9081
ce57c69a20e2 MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents: 9057
diff changeset
1179 -- 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
1180 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
1181 local result = self._affiliations[bare];
1737
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
1182 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
1183 return result;
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
1184 end
6186
85f7cd91dc31 plugins/muc/muc.lib: Smarter validation in set_affiliation
daurnimator <quae@daurnimator.com>
parents: 6185
diff changeset
1185
6478
413923bbd1a0 plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents: 6476
diff changeset
1186 -- Iterates over jid, affiliation pairs
413923bbd1a0 plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents: 6476
diff changeset
1187 function room_mt:each_affiliation(with_affiliation)
413923bbd1a0 plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents: 6476
diff changeset
1188 if not with_affiliation then
413923bbd1a0 plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents: 6476
diff changeset
1189 return pairs(self._affiliations);
413923bbd1a0 plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents: 6476
diff changeset
1190 else
413923bbd1a0 plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents: 6476
diff changeset
1191 return function(_affiliations, jid)
413923bbd1a0 plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents: 6476
diff changeset
1192 local affiliation;
413923bbd1a0 plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents: 6476
diff changeset
1193 repeat -- Iterate until we get a match
413923bbd1a0 plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents: 6476
diff changeset
1194 jid, affiliation = next(_affiliations, jid);
413923bbd1a0 plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents: 6476
diff changeset
1195 until jid == nil or affiliation == with_affiliation
413923bbd1a0 plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents: 6476
diff changeset
1196 return jid, affiliation;
413923bbd1a0 plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents: 6476
diff changeset
1197 end, self._affiliations, nil
1742
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
1198 end
6478
413923bbd1a0 plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents: 6476
diff changeset
1199 end
8792
c2b99fa134b3 MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents: 8791
diff changeset
1200
6181
6baa9a59aa03 plugins/muc/muc.lib: Remove callback parameter from set_role and set_affiliation
daurnimator <quae@daurnimator.com>
parents: 6180
diff changeset
1201 function room_mt:set_affiliation(actor, jid, affiliation, reason)
6186
85f7cd91dc31 plugins/muc/muc.lib: Smarter validation in set_affiliation
daurnimator <quae@daurnimator.com>
parents: 6185
diff changeset
1202 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
1203
6476
fb8a9873728b plugins/muc/muc.lib: Kick users from outcast hosts
daurnimator <quae@daurnimator.com>
parents: 6475
diff changeset
1204 local node, host, resource = jid_split(jid);
fb8a9873728b plugins/muc/muc.lib: Kick users from outcast hosts
daurnimator <quae@daurnimator.com>
parents: 6475
diff changeset
1205 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
1206 jid = jid_join(node, host); -- Bare
fb8a9873728b plugins/muc/muc.lib: Kick users from outcast hosts
daurnimator <quae@daurnimator.com>
parents: 6475
diff changeset
1207 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
1208
85f7cd91dc31 plugins/muc/muc.lib: Smarter validation in set_affiliation
daurnimator <quae@daurnimator.com>
parents: 6185
diff changeset
1209 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
1210 return nil, "modify", "not-acceptable";
1742
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
1211 end
6186
85f7cd91dc31 plugins/muc/muc.lib: Smarter validation in set_affiliation
daurnimator <quae@daurnimator.com>
parents: 6185
diff changeset
1212 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
1213
6187
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1214 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
1215 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
1216
6475
3c815a64042b plugins/muc/muc.lib: Fix passing actor along as a boolean (thanks fippo)
daurnimator <quae@daurnimator.com>
parents: 6454
diff changeset
1217 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
1218 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
1219 else
8842
463505cc75d5 MUC: Revert unstable MUC commits since 0.10.1
Matthew Wild <mwild1@gmail.com>
parents: 8839
diff changeset
1220 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
1221 if actor_affiliation == "owner" then
6392
8528d1da461f plugins/muc/muc.lib: Use get_affilation() inside of set_affiliation(), so that the override in mod_muc works
daurnimator <quae@daurnimator.com>
parents: 6391
diff changeset
1222 if jid_bare(actor) == jid then -- self change
6187
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1223 -- need at least one owner
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1224 local is_last = true;
6478
413923bbd1a0 plugins/muc/muc.lib: Add :each_affiliation() iterator
daurnimator <quae@daurnimator.com>
parents: 6476
diff changeset
1225 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
1226 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
1227 end
c2b99fa134b3 MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents: 8791
diff changeset
1228 if is_last then
6187
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1229 return nil, "cancel", "conflict";
8792
c2b99fa134b3 MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents: 8791
diff changeset
1230 end
4357
d6928b78c548 MUC: Allow affiliation change when argument actor==true in room:set_affiliation().
Waqas Hussain <waqas20@gmail.com>
parents: 4326
diff changeset
1231 end
6187
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1232 -- owners can do anything else
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1233 elseif affiliation == "owner" or affiliation == "admin"
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1234 or actor_affiliation ~= "admin"
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1235 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
1236 -- Can't demote owners or other admins
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1237 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
1238 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
1239 end
8792
c2b99fa134b3 MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents: 8791
diff changeset
1240
6187
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1241 -- Set in 'database'
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1242 self._affiliations[jid] = affiliation;
8792
c2b99fa134b3 MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents: 8791
diff changeset
1243
6187
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1244 -- Update roles
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1245 local role = self:get_default_role(affiliation);
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1246 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
1247 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
1248 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
1249 if occupant.bare_jid == jid or (
fb8a9873728b plugins/muc/muc.lib: Kick users from outcast hosts
daurnimator <quae@daurnimator.com>
parents: 6475
diff changeset
1250 -- Outcast can be by host.
fb8a9873728b plugins/muc/muc.lib: Kick users from outcast hosts
daurnimator <quae@daurnimator.com>
parents: 6475
diff changeset
1251 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
1252 ) then
6187
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1253 -- need to publcize in all cases; as affiliation in <item/> has changed.
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1254 occupants_updated[occupant] = occupant.role;
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1255 if occupant.role ~= role and (
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1256 is_downgrade or
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1257 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
1258 ) then
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1259 occupant.role = role;
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1260 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
1261 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
1262 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
1263 end
8792
c2b99fa134b3 MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents: 8791
diff changeset
1264
6187
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1265 -- Tell the room of the new occupant affiliations+roles
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
1266 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
1267 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
1268 if affiliation == "outcast" then
463505cc75d5 MUC: Revert unstable MUC commits since 0.10.1
Matthew Wild <mwild1@gmail.com>
parents: 8839
diff changeset
1269 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
1270 else
463505cc75d5 MUC: Revert unstable MUC commits since 0.10.1
Matthew Wild <mwild1@gmail.com>
parents: 8839
diff changeset
1271 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
1272 end
1742
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
1273 end
6187
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1274 local is_semi_anonymous = self:get_whois() == "moderators";
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1275 for occupant, old_role in pairs(occupants_updated) do
6212
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
1276 self:publicise_occupant_status(occupant, x, nil, actor, reason);
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
1277 if occupant.role == nil then
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
1278 module:fire_event("muc-occupant-left", {room = self; nick = occupant.nick; occupant = occupant;});
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
1279 elseif is_semi_anonymous and
6187
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1280 (old_role == "moderator" and occupant.role ~= "moderator") or
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1281 (old_role ~= "moderator" and occupant.role == "moderator") then -- Has gained or lost moderator status
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1282 -- Send everyone else's presences (as jid visibility has changed)
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1283 for real_jid in occupant:each_session() do
7089
890f4b2cc444 MUC: Add luacheck annotations, remove unused vars, rename conflicting vars etc
Kim Alvefur <zash@zash.se>
parents: 7013
diff changeset
1284 self:send_occupant_list(real_jid, function(occupant_jid, occupant) --luacheck: ignore 212 433
6187
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1285 return occupant.bare_jid ~= jid;
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1286 end);
1742
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
1287 end
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
1288 end
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
1289 end
6187
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
1290
7414
1b62c89014c4 MUC: Separate force-save parameter from save-entire-state flag
Kim Alvefur <zash@zash.se>
parents: 7413
diff changeset
1291 self:save(true);
8792
c2b99fa134b3 MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents: 8791
diff changeset
1292
6393
fff6ca13cb0f plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents: 6392
diff changeset
1293 module:fire_event("muc-set-affiliation", {
fff6ca13cb0f plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents: 6392
diff changeset
1294 room = self;
fff6ca13cb0f plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents: 6392
diff changeset
1295 actor = actor;
fff6ca13cb0f plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents: 6392
diff changeset
1296 jid = jid;
fff6ca13cb0f plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents: 6392
diff changeset
1297 affiliation = affiliation or "none";
fff6ca13cb0f plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents: 6392
diff changeset
1298 reason = reason;
fff6ca13cb0f plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents: 6392
diff changeset
1299 previous_affiliation = target_affiliation;
fff6ca13cb0f plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents: 6392
diff changeset
1300 in_room = next(occupants_updated) ~= nil;
fff6ca13cb0f plugins/muc/muc.lib: Add muc-set-affiliation event
daurnimator <quae@daurnimator.com>
parents: 6392
diff changeset
1301 });
8792
c2b99fa134b3 MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents: 8791
diff changeset
1302
1742
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
1303 return true;
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
1304 end
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
1305
1742
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
1306 function room_mt:get_role(nick)
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
1307 local occupant = self:get_occupant_by_nick(nick);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
1308 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
1309 end
6182
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
1310
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
1311 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
1312 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
1313
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
1314 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
1315 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
1316
6182
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
1317 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
1318 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
1319 end
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
1320 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
1321
6475
3c815a64042b plugins/muc/muc.lib: Fix passing actor along as a boolean (thanks fippo)
daurnimator <quae@daurnimator.com>
parents: 6454
diff changeset
1322 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
1323 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
1324 else
6182
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
1325 -- Can't do anything to other owners or admins
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
1326 local occupant_affiliation = self:get_affiliation(occupant.bare_jid);
6776
4412a2307c89 MUC: Fix logic error
Kim Alvefur <zash@zash.se>
parents: 6769
diff changeset
1327 if occupant_affiliation == "owner" or occupant_affiliation == "admin" then
6182
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
1328 return nil, "cancel", "not-allowed";
8174
260886554512 MUC: Include status code 110 on role change notifications (fixes #765))
Kim Alvefur <zash@zash.se>
parents: 7997
diff changeset
1329 end
6182
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
1330
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
1331 -- If you are trying to give or take moderator role you need to be an owner or admin
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
1332 if occupant.role == "moderator" or role == "moderator" then
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
1333 local actor_affiliation = self:get_affiliation(actor);
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
1334 if actor_affiliation ~= "owner" and actor_affiliation ~= "admin" then
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
1335 return nil, "cancel", "not-allowed";
3279
8b0a4a7d2c6e MUC: Added room:can_set_role().
Waqas Hussain <waqas20@gmail.com>
parents: 3264
diff changeset
1336 end
8b0a4a7d2c6e MUC: Added room:can_set_role().
Waqas Hussain <waqas20@gmail.com>
parents: 3264
diff changeset
1337 end
6182
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
1338
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
1339 -- Need to be in the room and a moderator
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
1340 local actor_occupant = self:get_occupant_by_real_jid(actor);
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
1341 if not actor_occupant or actor_occupant.role ~= "moderator" then
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
1342 return nil, "cancel", "not-allowed";
8792
c2b99fa134b3 MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents: 8791
diff changeset
1343 end
3279
8b0a4a7d2c6e MUC: Added room:can_set_role().
Waqas Hussain <waqas20@gmail.com>
parents: 3264
diff changeset
1344 end
8792
c2b99fa134b3 MUC: Import revised, more comprehensive patch for 8da11142fabf (#345)
Matthew Wild <mwild1@gmail.com>
parents: 8791
diff changeset
1345
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
1346 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
1347 if not role then
8842
463505cc75d5 MUC: Revert unstable MUC commits since 0.10.1
Matthew Wild <mwild1@gmail.com>
parents: 8839
diff changeset
1348 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
1349 end
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
1350 occupant.role = role;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
1351 self:save_occupant(occupant);
6212
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
1352 self:publicise_occupant_status(occupant, x, nil, actor, reason);
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
1353 if role == nil then
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
1354 module:fire_event("muc-occupant-left", {room = self; nick = occupant.nick; occupant = occupant;});
3632
d82189efecc0 MUC: Include the user's current presence contents when broadcasting a role change.
Waqas Hussain <waqas20@gmail.com>
parents: 3631
diff changeset
1355 end
1737
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
1356 return true;
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
1357 end
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
1358
6214
9813c74ce006 plugins/muc: Move `whois` code to seperate file
daurnimator <quae@daurnimator.com>
parents: 6213
diff changeset
1359 local whois = module:require "muc/whois";
9813c74ce006 plugins/muc: Move `whois` code to seperate file
daurnimator <quae@daurnimator.com>
parents: 6213
diff changeset
1360 room_mt.get_whois = whois.get;
9813c74ce006 plugins/muc: Move `whois` code to seperate file
daurnimator <quae@daurnimator.com>
parents: 6213
diff changeset
1361 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
1362
1737
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
1363 local _M = {}; -- module "muc"
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
1364
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
1365 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
1366 return setmetatable({
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
1367 jid = jid;
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
1368 _jid_nick = {};
1739
393abf245322 MUC: Renamed _participants table to _occupants
Waqas Hussain <waqas20@gmail.com>
parents: 1737
diff changeset
1369 _occupants = {};
7362
032fcb7b80a1 MUC: Use config passed to rew_roow()
Kim Alvefur <zash@zash.se>
parents: 7360
diff changeset
1370 _data = config or {};
1737
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
1371 _affiliations = {};
1735
81406277279e MUC: The MUC lib is now metatable based. Cleaned up code, etc.
Waqas Hussain <waqas20@gmail.com>
parents: 1734
diff changeset
1372 }, room_mt);
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
1373 end
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
1374
7488
cdabf8199903 MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents: 7444
diff changeset
1375 local new_format = module:get_option_boolean("new_muc_storage_format", false);
cdabf8199903 MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents: 7444
diff changeset
1376
7369
c5cae59831d7 MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents: 7368
diff changeset
1377 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
1378 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
1379 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
1380 frozen = {
cdabf8199903 MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents: 7444
diff changeset
1381 _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
1382 _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
1383 };
cdabf8199903 MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents: 7444
diff changeset
1384 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
1385 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
1386 end
cdabf8199903 MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents: 7444
diff changeset
1387 else
cdabf8199903 MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents: 7444
diff changeset
1388 frozen = {
cdabf8199903 MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents: 7444
diff changeset
1389 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
1390 _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
1391 _affiliations = self._affiliations;
cdabf8199903 MUC: Hide new MUC room storage format behind an off-by-default option
Kim Alvefur <zash@zash.se>
parents: 7444
diff changeset
1392 };
7368
4e24aff1e4df MUC: Flatten format of serialized rooms
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
1393 end
7369
c5cae59831d7 MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents: 7368
diff changeset
1394 if live then
7415
cbb05b454c13 MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents: 7414
diff changeset
1395 state = {};
7369
c5cae59831d7 MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents: 7368
diff changeset
1396 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
1397 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
1398 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
1399 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
1400 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
1401 }
c5cae59831d7 MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents: 7368
diff changeset
1402 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
1403 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
1404 end
c5cae59831d7 MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents: 7368
diff changeset
1405 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
1406 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
1407 if history and history[1] ~= nil then
7415
cbb05b454c13 MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents: 7414
diff changeset
1408 state._last_message = st.preserialize(history[#history].stanza);
cbb05b454c13 MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents: 7414
diff changeset
1409 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
1410 end
7369
c5cae59831d7 MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents: 7368
diff changeset
1411 end
7415
cbb05b454c13 MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents: 7414
diff changeset
1412 return frozen, state;
7360
7a37fade5380 MUC: Move 'preserialization' step to muc.lib
Kim Alvefur <zash@zash.se>
parents: 7353
diff changeset
1413 end
7a37fade5380 MUC: Move 'preserialization' step to muc.lib
Kim Alvefur <zash@zash.se>
parents: 7353
diff changeset
1414
7415
cbb05b454c13 MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents: 7414
diff changeset
1415 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
1416 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
1417 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
1418
7416
c33a1d6da016 MUC: Restore last message from state, not room config (missing change from cbb05b454c13)
Kim Alvefur <zash@zash.se>
parents: 7415
diff changeset
1419 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
1420 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
1421 { 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
1422 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
1423 };
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
1424 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
1425
7369
c5cae59831d7 MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents: 7368
diff changeset
1426 local occupants = {};
c5cae59831d7 MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents: 7368
diff changeset
1427 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
1428
f50c039d6bb1 MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents: 7488
diff changeset
1429 if frozen.jid and frozen._affiliations then
f50c039d6bb1 MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents: 7488
diff changeset
1430 room._affiliations = frozen._affiliations;
f50c039d6bb1 MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents: 7488
diff changeset
1431 else
f50c039d6bb1 MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents: 7488
diff changeset
1432 for jid, data in pairs(frozen) do
f50c039d6bb1 MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents: 7488
diff changeset
1433 local node, host, resource = jid_split(jid);
f50c039d6bb1 MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents: 7488
diff changeset
1434 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
1435 -- bare jid: affiliation
f50c039d6bb1 MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents: 7488
diff changeset
1436 room._affiliations[jid] = data;
f50c039d6bb1 MUC: Fix compatibility with new and old storage format
Kim Alvefur <zash@zash.se>
parents: 7488
diff changeset
1437 end
7415
cbb05b454c13 MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents: 7414
diff changeset
1438 end
cbb05b454c13 MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents: 7414
diff changeset
1439 end
cbb05b454c13 MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents: 7414
diff changeset
1440 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
1441 local node, host, resource = jid_split(jid);
7368
4e24aff1e4df MUC: Flatten format of serialized rooms
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
1442 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
1443 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
1444 -- 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
1445 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
1446 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
1447 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
1448 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
1449 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
1450 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
1451 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
1452 -- 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
1453 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
1454 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
1455 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
1456 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
1457 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
1458 end
7368
4e24aff1e4df MUC: Flatten format of serialized rooms
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
1459 end
4e24aff1e4df MUC: Flatten format of serialized rooms
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
1460 end
7369
c5cae59831d7 MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents: 7368
diff changeset
1461
c5cae59831d7 MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents: 7368
diff changeset
1462 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
1463 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
1464 end
c5cae59831d7 MUC: Add support for serializing live rooms, including occupants and their presence
Kim Alvefur <zash@zash.se>
parents: 7368
diff changeset
1465
7367
2aef5e8b69e9 MUC: Move room deserialization to muc.lib
Kim Alvefur <zash@zash.se>
parents: 7366
diff changeset
1466 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
1467 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
1468
5063
4bc202a7b351 MUC: Expose room metatable in the MUC lib.
Waqas Hussain <waqas20@gmail.com>
parents: 5061
diff changeset
1469 _M.room_mt = room_mt;
4bc202a7b351 MUC: Expose room metatable in the MUC lib.
Waqas Hussain <waqas20@gmail.com>
parents: 5061
diff changeset
1470
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
1471 return _M;