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