plugins/muc/muc.lib.lua
author daurnimator <quae@daurnimator.com>
Thu, 03 Apr 2014 18:10:16 -0400
changeset 6219 a90159cfa530
parent 6218 bf11910bad5a
child 6220 4e7d205f49f7
permissions -rw-r--r--
plugins/muc/muc.lib: Fix getting a list of occupants by role (it was sending presences instead of items inside an iq)
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;
fd6ab269ecc2 MUC: A little modification to improve code analysis.
Waqas Hussain <waqas20@gmail.com>
parents: 3280
diff changeset
    11
local pairs, ipairs = pairs, ipairs;
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;
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    20
local st = require "util.stanza";
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    21
local log = require "util.logger".init("mod_muc");
1778
f4213d84ba8a MUC: Correct routing of vCard requests to bare JID.
Waqas Hussain <waqas20@gmail.com>
parents: 1769
diff changeset
    22
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
    23
local md5 = require "util.hashes".md5;
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    24
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    25
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
    26
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
    27
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
    28
local valid_roles, valid_affiliations = muc_util.valid_roles, muc_util.valid_affiliations;
2527
3fe3dbb27b6f MUC: Have get_error_condition() use the new stanza:get_error() (muc.lib.lua 11 lines shorter \o/)
Matthew Wild <mwild1@gmail.com>
parents: 2504
diff changeset
    29
1735
81406277279e MUC: The MUC lib is now metatable based. Cleaned up code, etc.
Waqas Hussain <waqas20@gmail.com>
parents: 1734
diff changeset
    30
local room_mt = {};
1737
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
    31
room_mt.__index = room_mt;
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
    32
5519
06e188268df1 MUC: add __tostring on room metatable
Matthew Wild <mwild1@gmail.com>
parents: 5397
diff changeset
    33
function room_mt:__tostring()
06e188268df1 MUC: add __tostring on room metatable
Matthew Wild <mwild1@gmail.com>
parents: 5397
diff changeset
    34
	return "MUC room ("..self.jid..")";
06e188268df1 MUC: add __tostring on room metatable
Matthew Wild <mwild1@gmail.com>
parents: 5397
diff changeset
    35
end
06e188268df1 MUC: add __tostring on room metatable
Matthew Wild <mwild1@gmail.com>
parents: 5397
diff changeset
    36
6119
c13f5d6b9b16 plugins/muc/muc.lib: Use `get_occupant_jid` method instead of indexing _jid_nick
daurnimator <quae@daurnimator.com>
parents: 6118
diff changeset
    37
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
    38
	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
    39
end
c13f5d6b9b16 plugins/muc/muc.lib: Use `get_occupant_jid` method instead of indexing _jid_nick
daurnimator <quae@daurnimator.com>
parents: 6118
diff changeset
    40
1737
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
    41
function room_mt:get_default_role(affiliation)
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
    42
	if affiliation == "owner" or affiliation == "admin" then
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
    43
		return "moderator";
3251
f2f9fe088f6e MUC: Updated room:get_default_role() to assign unaffiliated occupants a "visitor" role in moderated rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 3250
diff changeset
    44
	elseif affiliation == "member" then
1737
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
    45
		return "participant";
3251
f2f9fe088f6e MUC: Updated room:get_default_role() to assign unaffiliated occupants a "visitor" role in moderated rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 3250
diff changeset
    46
	elseif not affiliation then
5580
db5d1a350cc7 mod_muc: Refactor config form handling, and allow for clients to submit incomplete forms. Fixes #246
Matthew Wild <mwild1@gmail.com>
parents: 5577
diff changeset
    47
		if not self:get_members_only() then
db5d1a350cc7 mod_muc: Refactor config form handling, and allow for clients to submit incomplete forms. Fixes #246
Matthew Wild <mwild1@gmail.com>
parents: 5577
diff changeset
    48
			return self:get_moderated() and "visitor" or "participant";
3255
6bffb5c63131 MUC: Updated room:get_default_role() to not assign unaffiliated occupants a role in members-only rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 3254
diff changeset
    49
		end
1737
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
    50
	end
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
    51
end
1735
81406277279e MUC: The MUC lib is now metatable based. Cleaned up code, etc.
Waqas Hussain <waqas20@gmail.com>
parents: 1734
diff changeset
    52
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    53
--- Occupant functions
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    54
function room_mt:new_occupant(bare_real_jid, nick)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    55
	local occupant = occupant_lib.new(bare_real_jid, nick);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    56
	local affiliation = self:get_affiliation(bare_real_jid);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    57
	occupant.role = self:get_default_role(affiliation);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    58
	return occupant;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    59
end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    60
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    61
function room_mt:get_occupant_by_nick(nick)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    62
	local occupant = self._occupants[nick];
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    63
	if occupant == nil then return nil end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    64
	return occupant_lib.copy(occupant);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    65
end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    66
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    67
do
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    68
	local function next_copied_occupant(occupants, occupant_jid)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    69
		local next_occupant_jid, raw_occupant = next(occupants, occupant_jid);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    70
		if next_occupant_jid == nil then return nil end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    71
		return next_occupant_jid, occupant_lib.copy(raw_occupant);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    72
	end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    73
	function room_mt:each_occupant(read_only)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    74
		return next_copied_occupant, self._occupants, nil;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    75
	end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    76
end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    77
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    78
function room_mt:get_occupant_by_real_jid(real_jid)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    79
	local occupant_jid = self:get_occupant_jid(real_jid);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    80
	if occupant_jid == nil then return nil end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    81
	return self:get_occupant_by_nick(occupant_jid);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    82
end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    83
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    84
function room_mt:save_occupant(occupant)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    85
	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
    86
	local id = occupant.nick
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    87
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    88
	-- Need to maintain _jid_nick secondary index
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    89
	local old_occupant = self._occupants[id];
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    90
	if old_occupant then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    91
		for real_jid in pairs(old_occupant.sessions) do
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    92
			self._jid_nick[real_jid] = nil;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    93
		end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    94
	end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    95
	if occupant.role ~= nil and next(occupant.sessions) then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    96
		for real_jid, presence in occupant:each_session() do
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    97
			self._jid_nick[real_jid] = occupant.nick;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    98
		end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
    99
	else
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   100
		occupant = nil
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   101
	end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   102
	self._occupants[id] = occupant
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   103
end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   104
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   105
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
   106
	local to = stanza.attr.to;
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   107
	for jid, pr in occupant:each_session() do
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   108
		if pr.attr.type ~= "unavailable" then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   109
			stanza.attr.to = jid;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   110
			self:route_stanza(stanza);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   111
		end
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
   112
	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
   113
	stanza.attr.to = to;
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
   114
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
   115
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   116
-- actor is the attribute table
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   117
local function add_item(x, affiliation, role, jid, nick, actor, reason)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   118
	x:tag("item", {affiliation = affiliation; role = role; jid = jid; nick = nick;})
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   119
	if actor then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   120
		x:tag("actor", actor):up()
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   121
	end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   122
	if reason then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   123
		x:tag("reason"):text(reason):up()
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   124
	end
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   125
	x:up();
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   126
	return x
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   127
end
6213
95bddf0142f4 plugins/muc/muc.lib: Remember to coerce nil role to "none"
daurnimator <quae@daurnimator.com>
parents: 6212
diff changeset
   128
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   129
-- actor is (real) jid
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   130
function room_mt:build_item_list(occupant, x, is_anonymous, nick, actor, reason)
6213
95bddf0142f4 plugins/muc/muc.lib: Remember to coerce nil role to "none"
daurnimator <quae@daurnimator.com>
parents: 6212
diff changeset
   131
	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
   132
	local role = occupant.role or "none";
6183
a8e777a19816 plugins/muc/muc.lib: Fix sending occupant jid instead of real jid in <item/> actor
daurnimator <quae@daurnimator.com>
parents: 6182
diff changeset
   133
	local actor_attr;
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   134
	if actor then
6183
a8e777a19816 plugins/muc/muc.lib: Fix sending occupant jid instead of real jid in <item/> actor
daurnimator <quae@daurnimator.com>
parents: 6182
diff changeset
   135
		actor_attr = {nick = select(3,jid_split(self:get_occupant_jid(actor)))};
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   136
	end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   137
	if is_anonymous then
6183
a8e777a19816 plugins/muc/muc.lib: Fix sending occupant jid instead of real jid in <item/> actor
daurnimator <quae@daurnimator.com>
parents: 6182
diff changeset
   138
		add_item(x, affiliation, role, nil, nick, actor_attr, reason);
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   139
	else
6183
a8e777a19816 plugins/muc/muc.lib: Fix sending occupant jid instead of real jid in <item/> actor
daurnimator <quae@daurnimator.com>
parents: 6182
diff changeset
   140
		if actor_attr then
a8e777a19816 plugins/muc/muc.lib: Fix sending occupant jid instead of real jid in <item/> actor
daurnimator <quae@daurnimator.com>
parents: 6182
diff changeset
   141
			actor_attr.jid = actor;
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   142
		end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   143
		for real_jid, session in occupant:each_session() do
6183
a8e777a19816 plugins/muc/muc.lib: Fix sending occupant jid instead of real jid in <item/> actor
daurnimator <quae@daurnimator.com>
parents: 6182
diff changeset
   144
			add_item(x, affiliation, role, real_jid, nick, actor_attr, reason);
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   145
		end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   146
	end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   147
	return x
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   148
end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   149
6215
1dd09dc04945 plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents: 6214
diff changeset
   150
function room_mt:broadcast_message(stanza)
1dd09dc04945 plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents: 6214
diff changeset
   151
	module:fire_event("muc-broadcast-message", {room = self, stanza = stanza});
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
   152
	self:broadcast(stanza);
6137
7db24f237a83 plugins/muc/muc.lib: Add muc-broadcast-message event. Use it for saving to history
daurnimator <quae@daurnimator.com>
parents: 6136
diff changeset
   153
end
7db24f237a83 plugins/muc/muc.lib: Add muc-broadcast-message event. Use it for saving to history
daurnimator <quae@daurnimator.com>
parents: 6136
diff changeset
   154
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
   155
-- Broadcast a stanza to all occupants in the room.
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   156
-- 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
   157
function room_mt:broadcast(stanza, cond_func)
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   158
	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
   159
		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
   160
			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
   161
		end
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
   162
	end
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
   163
end
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   164
6211
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   165
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
   166
	if whois == "anyone" then
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   167
		return true;
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   168
	elseif whois == "moderators" then
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   169
		return valid_roles[occupant.role or "none"] >= valid_roles.moderator;
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   170
	end
6211
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   171
end
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   172
6211
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   173
local function get_base_presence(occupant)
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   174
	if occupant.role ~= nil then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   175
		-- Try to use main jid's presence
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   176
		local pr = occupant:get_presence();
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   177
		if pr ~= nil then
6211
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   178
			return st.clone(pr);
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   179
		end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   180
	end
6211
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   181
	return st.presence {from = occupant.nick; type = "unavailable";};
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   182
end
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   183
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   184
-- Broadcasts an occupant's presence to the whole room
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   185
-- Takes the x element that goes into the stanzas
6212
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   186
function room_mt:publicise_occupant_status(occupant, base_x, nick, actor, reason)
6211
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   187
	-- Build real jid and (optionally) occupant jid template presences
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   188
	local function get_presence(is_anonymous)
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   189
		local x = st.clone(base_x);
6212
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   190
		self:build_item_list(occupant, x, is_anonymous, nick, actor, reason);
6211
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   191
		return get_base_presence(occupant):add_child(x), x;
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   192
	end
6211
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   193
	local full_p, full_x = get_presence(false);
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   194
	local anon_p, anon_x;
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   195
	local function get_anon_p()
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   196
		if anon_p == nil then
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   197
			anon_p, anon_x = get_presence(true);
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   198
		end
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   199
		return anon_p, anon_x;
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   200
	end
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   201
6211
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   202
	local whois = self:get_whois();
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   203
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   204
	-- General populance
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   205
	for nick, n_occupant in self:each_occupant() do
6211
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   206
		if nick ~= occupant.nick then
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   207
			local pr;
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   208
			if can_see_real_jids(whois, occupant) or occupant.bare_jid == n_occupant.bare_jid then
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   209
				pr = full_p;
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   210
			else
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   211
				pr = get_anon_p();
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   212
			end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   213
			self:route_to_occupant(n_occupant, pr);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   214
		end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   215
	end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   216
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   217
	-- Presences for occupant itself
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   218
	full_x:tag("status", {code = "110";}):up();
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   219
	if occupant.role == nil then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   220
		-- They get an unavailable
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   221
		self:route_to_occupant(occupant, full_p);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   222
	else
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   223
		-- use their own presences as templates
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   224
		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
   225
			pr = st.clone(pr);
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   226
			pr.attr.to = full_jid;
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   227
			-- You can always see your own full jids
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   228
			pr:add_child(full_x);
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   229
			self:route_stanza(pr);
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   230
		end
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
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   233
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   234
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
   235
	local to_bare = jid_bare(to);
d4a8840e72f9 plugins/muc/muc.lib: Fix anonymous check in `send_occupant_list`
daurnimator <quae@daurnimator.com>
parents: 6184
diff changeset
   236
	local is_anonymous = true;
6211
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   237
	local whois = self:get_whois();
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   238
	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
   239
		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
   240
		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
   241
			local occupant = self:get_occupant_by_real_jid(to);
6211
a4d26656df04 plugins/muc/muc.lib: Clean up whois handling
daurnimator <quae@daurnimator.com>
parents: 6209
diff changeset
   242
			if not occupant or can_see_real_jids(whois, occupant) then
6185
d4a8840e72f9 plugins/muc/muc.lib: Fix anonymous check in `send_occupant_list`
daurnimator <quae@daurnimator.com>
parents: 6184
diff changeset
   243
				is_anonymous = false;
d4a8840e72f9 plugins/muc/muc.lib: Fix anonymous check in `send_occupant_list`
daurnimator <quae@daurnimator.com>
parents: 6184
diff changeset
   244
			end
d4a8840e72f9 plugins/muc/muc.lib: Fix anonymous check in `send_occupant_list`
daurnimator <quae@daurnimator.com>
parents: 6184
diff changeset
   245
		end
d4a8840e72f9 plugins/muc/muc.lib: Fix anonymous check in `send_occupant_list`
daurnimator <quae@daurnimator.com>
parents: 6184
diff changeset
   246
	end
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   247
	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
   248
		if filter == nil or filter(occupant_jid, occupant) then
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   249
			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
   250
			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
   251
			local pres = st.clone(occupant:get_presence());
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   252
			pres.attr.to = to;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   253
			pres:add_child(x);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   254
			self:route_stanza(pres);
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   255
		end
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   256
	end
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   257
end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5681
diff changeset
   258
2503
bb6b0bd7f2cf MUC: Converted some local functions into methods.
Waqas Hussain <waqas20@gmail.com>
parents: 2416
diff changeset
   259
function room_mt:get_disco_info(stanza)
6200
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
   260
	local reply = st.reply(stanza):query("http://jabber.org/protocol/disco#info");
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
   261
	local form = dataform.new {
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
   262
		{ name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/muc#roominfo" };
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
   263
	};
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
   264
	module:fire_event("muc-disco#info", {room = self; reply = reply; form = form;});
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
   265
	reply:add_child(form:form(nil, "result"));
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
   266
	return reply;
1756
b2291156a9c2 MUC: Added service discovery replies for rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1755
diff changeset
   267
end
6200
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
   268
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
   269
	event.reply:tag("feature", {var = "http://jabber.org/protocol/muc"}):up();
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
   270
end);
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
   271
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
   272
	event.reply:tag("feature", {var = event.room:get_moderated() and "muc_moderated" or "muc_unmoderated"}):up();
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
   273
end);
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
   274
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
   275
	event.reply:tag("feature", {var = event.room:get_members_only() and "muc_membersonly" or "muc_open"}):up();
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
   276
end);
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
   277
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
   278
	event.reply:tag("feature", {var = event.room:get_persistent() and "muc_persistent" or "muc_temporary"}):up();
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
   279
end);
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
   280
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
   281
	event.reply:tag("feature", {var = event.room:get_hidden() and "muc_hidden" or "muc_public"}):up();
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
   282
end);
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
   283
module:hook("muc-disco#info", function(event)
6217
657c707d9229 plugins/muc/muc.lib: Use util.iterators to count occupants
daurnimator <quae@daurnimator.com>
parents: 6216
diff changeset
   284
	local count = 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
   285
	table.insert(event.form, { name = "muc#roominfo_occupants", label = "Number of occupants", value = tostring(count) });
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
   286
end);
57bc52f67564 plugins/muc/muc.lib: Split up get_disco_info into events
daurnimator <quae@daurnimator.com>
parents: 6199
diff changeset
   287
2503
bb6b0bd7f2cf MUC: Converted some local functions into methods.
Waqas Hussain <waqas20@gmail.com>
parents: 2416
diff changeset
   288
function room_mt:get_disco_items(stanza)
2035
b8c3dbf76a2e MUC: List occupants in a room's disco#items response.
Waqas Hussain <waqas20@gmail.com>
parents: 2008
diff changeset
   289
	local reply = st.reply(stanza):query("http://jabber.org/protocol/disco#items");
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   290
	for room_jid in self:each_occupant() do
2035
b8c3dbf76a2e MUC: List occupants in a room's disco#items response.
Waqas Hussain <waqas20@gmail.com>
parents: 2008
diff changeset
   291
		reply:tag("item", {jid = room_jid, name = room_jid:match("/(.*)")}):up();
b8c3dbf76a2e MUC: List occupants in a room's disco#items response.
Waqas Hussain <waqas20@gmail.com>
parents: 2008
diff changeset
   292
	end
b8c3dbf76a2e MUC: List occupants in a room's disco#items response.
Waqas Hussain <waqas20@gmail.com>
parents: 2008
diff changeset
   293
	return reply;
1756
b2291156a9c2 MUC: Added service discovery replies for rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1755
diff changeset
   294
end
6139
544f75256883 plugins/muc/muc.lib: Extra utility functions around subjects
daurnimator <quae@daurnimator.com>
parents: 6138
diff changeset
   295
544f75256883 plugins/muc/muc.lib: Extra utility functions around subjects
daurnimator <quae@daurnimator.com>
parents: 6138
diff changeset
   296
function room_mt:get_subject()
544f75256883 plugins/muc/muc.lib: Extra utility functions around subjects
daurnimator <quae@daurnimator.com>
parents: 6138
diff changeset
   297
	return self._data['subject'], self._data['subject_from']
544f75256883 plugins/muc/muc.lib: Extra utility functions around subjects
daurnimator <quae@daurnimator.com>
parents: 6138
diff changeset
   298
end
6191
5956f4e69ab2 plugins/muc/muc.lib: Subjects get sent even if empty.
daurnimator <quae@daurnimator.com>
parents: 6190
diff changeset
   299
local function create_subject_message(from, subject)
5956f4e69ab2 plugins/muc/muc.lib: Subjects get sent even if empty.
daurnimator <quae@daurnimator.com>
parents: 6190
diff changeset
   300
	return st.message({from = from; type = "groupchat"})
6139
544f75256883 plugins/muc/muc.lib: Extra utility functions around subjects
daurnimator <quae@daurnimator.com>
parents: 6138
diff changeset
   301
		:tag('subject'):text(subject):up();
544f75256883 plugins/muc/muc.lib: Extra utility functions around subjects
daurnimator <quae@daurnimator.com>
parents: 6138
diff changeset
   302
end
544f75256883 plugins/muc/muc.lib: Extra utility functions around subjects
daurnimator <quae@daurnimator.com>
parents: 6138
diff changeset
   303
function room_mt:send_subject(to)
6191
5956f4e69ab2 plugins/muc/muc.lib: Subjects get sent even if empty.
daurnimator <quae@daurnimator.com>
parents: 6190
diff changeset
   304
	local msg = create_subject_message(self:get_subject());
5956f4e69ab2 plugins/muc/muc.lib: Subjects get sent even if empty.
daurnimator <quae@daurnimator.com>
parents: 6190
diff changeset
   305
	msg.attr.to = to;
5956f4e69ab2 plugins/muc/muc.lib: Subjects get sent even if empty.
daurnimator <quae@daurnimator.com>
parents: 6190
diff changeset
   306
	self:route_stanza(msg);
6139
544f75256883 plugins/muc/muc.lib: Extra utility functions around subjects
daurnimator <quae@daurnimator.com>
parents: 6138
diff changeset
   307
end
1735
81406277279e MUC: The MUC lib is now metatable based. Cleaned up code, etc.
Waqas Hussain <waqas20@gmail.com>
parents: 1734
diff changeset
   308
function room_mt:set_subject(current_nick, subject)
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   309
	if subject == "" then subject = nil; end
1735
81406277279e MUC: The MUC lib is now metatable based. Cleaned up code, etc.
Waqas Hussain <waqas20@gmail.com>
parents: 1734
diff changeset
   310
	self._data['subject'] = subject;
3393
5b8de0731c4d MUC: Store the nick (full room JID) which set the subject, and send subject to occupants from that JID.
Waqas Hussain <waqas20@gmail.com>
parents: 3361
diff changeset
   311
	self._data['subject_from'] = current_nick;
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1753
diff changeset
   312
	if self.save then self:save(); end
6191
5956f4e69ab2 plugins/muc/muc.lib: Subjects get sent even if empty.
daurnimator <quae@daurnimator.com>
parents: 6190
diff changeset
   313
	local msg = create_subject_message(current_nick, subject);
6215
1dd09dc04945 plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents: 6214
diff changeset
   314
	self:broadcast_message(msg);
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   315
	return true;
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   316
end
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   317
6100
c78ba94d3261 plugins/muc/muc.lib: Move all kick code into one place
daurnimator <quae@daurnimator.com>
parents: 6099
diff changeset
   318
function room_mt:handle_kickable(origin, stanza)
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   319
	local real_jid = stanza.attr.from;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   320
	local occupant = self:get_occupant_by_real_jid(real_jid);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   321
	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
   322
	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
   323
	local error_message = "Kicked: "..(condition and condition:gsub("%-", " ") or "presence error");
2529
7968e8b3ecf9 MUC: Fixes and refactoring for the previous commit to work in all cases, text of error stanzas is now broadcast
Matthew Wild <mwild1@gmail.com>
parents: 2528
diff changeset
   324
	if text then
7968e8b3ecf9 MUC: Fixes and refactoring for the previous commit to work in all cases, text of error stanzas is now broadcast
Matthew Wild <mwild1@gmail.com>
parents: 2528
diff changeset
   325
		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
   326
	end
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   327
	occupant:set_session(real_jid, st.presence({type="unavailable"})
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   328
		:tag('status'):text(error_message));
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   329
	self:save_occupant(occupant);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   330
	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
   331
		:tag("status", {code = "307"})
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   332
	self:publicise_occupant_status(occupant, x);
6100
c78ba94d3261 plugins/muc/muc.lib: Move all kick code into one place
daurnimator <quae@daurnimator.com>
parents: 6099
diff changeset
   333
	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
   334
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
   335
3250
38402e874b45 MUC: Added room:set_moderated(boolean) and room:is_moderated().
Waqas Hussain <waqas20@gmail.com>
parents: 3249
diff changeset
   336
function room_mt:set_moderated(moderated)
38402e874b45 MUC: Added room:set_moderated(boolean) and room:is_moderated().
Waqas Hussain <waqas20@gmail.com>
parents: 3249
diff changeset
   337
	moderated = moderated and true or nil;
38402e874b45 MUC: Added room:set_moderated(boolean) and room:is_moderated().
Waqas Hussain <waqas20@gmail.com>
parents: 3249
diff changeset
   338
	if self._data.moderated ~= moderated then
3252
22062c50eabe MUC: Added a 'Make Room Moderated?' field to the room config dialog.
Waqas Hussain <waqas20@gmail.com>
parents: 3251
diff changeset
   339
		self._data.moderated = moderated;
3250
38402e874b45 MUC: Added room:set_moderated(boolean) and room:is_moderated().
Waqas Hussain <waqas20@gmail.com>
parents: 3249
diff changeset
   340
		if self.save then self:save(true); end
38402e874b45 MUC: Added room:set_moderated(boolean) and room:is_moderated().
Waqas Hussain <waqas20@gmail.com>
parents: 3249
diff changeset
   341
	end
38402e874b45 MUC: Added room:set_moderated(boolean) and room:is_moderated().
Waqas Hussain <waqas20@gmail.com>
parents: 3249
diff changeset
   342
end
5580
db5d1a350cc7 mod_muc: Refactor config form handling, and allow for clients to submit incomplete forms. Fixes #246
Matthew Wild <mwild1@gmail.com>
parents: 5577
diff changeset
   343
function room_mt:get_moderated()
3250
38402e874b45 MUC: Added room:set_moderated(boolean) and room:is_moderated().
Waqas Hussain <waqas20@gmail.com>
parents: 3249
diff changeset
   344
	return self._data.moderated;
38402e874b45 MUC: Added room:set_moderated(boolean) and room:is_moderated().
Waqas Hussain <waqas20@gmail.com>
parents: 3249
diff changeset
   345
end
3254
a01c6411fdfb MUC: Added room:set_members_only(boolean) and room:is_members_only().
Waqas Hussain <waqas20@gmail.com>
parents: 3253
diff changeset
   346
function room_mt:set_members_only(members_only)
a01c6411fdfb MUC: Added room:set_members_only(boolean) and room:is_members_only().
Waqas Hussain <waqas20@gmail.com>
parents: 3253
diff changeset
   347
	members_only = members_only and true or nil;
a01c6411fdfb MUC: Added room:set_members_only(boolean) and room:is_members_only().
Waqas Hussain <waqas20@gmail.com>
parents: 3253
diff changeset
   348
	if self._data.members_only ~= members_only then
a01c6411fdfb MUC: Added room:set_members_only(boolean) and room:is_members_only().
Waqas Hussain <waqas20@gmail.com>
parents: 3253
diff changeset
   349
		self._data.members_only = members_only;
a01c6411fdfb MUC: Added room:set_members_only(boolean) and room:is_members_only().
Waqas Hussain <waqas20@gmail.com>
parents: 3253
diff changeset
   350
		if self.save then self:save(true); end
a01c6411fdfb MUC: Added room:set_members_only(boolean) and room:is_members_only().
Waqas Hussain <waqas20@gmail.com>
parents: 3253
diff changeset
   351
	end
a01c6411fdfb MUC: Added room:set_members_only(boolean) and room:is_members_only().
Waqas Hussain <waqas20@gmail.com>
parents: 3253
diff changeset
   352
end
5580
db5d1a350cc7 mod_muc: Refactor config form handling, and allow for clients to submit incomplete forms. Fixes #246
Matthew Wild <mwild1@gmail.com>
parents: 5577
diff changeset
   353
function room_mt:get_members_only()
3254
a01c6411fdfb MUC: Added room:set_members_only(boolean) and room:is_members_only().
Waqas Hussain <waqas20@gmail.com>
parents: 3253
diff changeset
   354
	return self._data.members_only;
a01c6411fdfb MUC: Added room:set_members_only(boolean) and room:is_members_only().
Waqas Hussain <waqas20@gmail.com>
parents: 3253
diff changeset
   355
end
3258
bc07564bec6d MUC: Added room:set_persistent(boolean) and room:is_persistent().
Waqas Hussain <waqas20@gmail.com>
parents: 3257
diff changeset
   356
function room_mt:set_persistent(persistent)
bc07564bec6d MUC: Added room:set_persistent(boolean) and room:is_persistent().
Waqas Hussain <waqas20@gmail.com>
parents: 3257
diff changeset
   357
	persistent = persistent and true or nil;
bc07564bec6d MUC: Added room:set_persistent(boolean) and room:is_persistent().
Waqas Hussain <waqas20@gmail.com>
parents: 3257
diff changeset
   358
	if self._data.persistent ~= persistent then
bc07564bec6d MUC: Added room:set_persistent(boolean) and room:is_persistent().
Waqas Hussain <waqas20@gmail.com>
parents: 3257
diff changeset
   359
		self._data.persistent = persistent;
bc07564bec6d MUC: Added room:set_persistent(boolean) and room:is_persistent().
Waqas Hussain <waqas20@gmail.com>
parents: 3257
diff changeset
   360
		if self.save then self:save(true); end
bc07564bec6d MUC: Added room:set_persistent(boolean) and room:is_persistent().
Waqas Hussain <waqas20@gmail.com>
parents: 3257
diff changeset
   361
	end
bc07564bec6d MUC: Added room:set_persistent(boolean) and room:is_persistent().
Waqas Hussain <waqas20@gmail.com>
parents: 3257
diff changeset
   362
end
5580
db5d1a350cc7 mod_muc: Refactor config form handling, and allow for clients to submit incomplete forms. Fixes #246
Matthew Wild <mwild1@gmail.com>
parents: 5577
diff changeset
   363
function room_mt:get_persistent()
3258
bc07564bec6d MUC: Added room:set_persistent(boolean) and room:is_persistent().
Waqas Hussain <waqas20@gmail.com>
parents: 3257
diff changeset
   364
	return self._data.persistent;
bc07564bec6d MUC: Added room:set_persistent(boolean) and room:is_persistent().
Waqas Hussain <waqas20@gmail.com>
parents: 3257
diff changeset
   365
end
3261
fe1c93296abd MUC: Added room:set_hidden(boolean) and room:is_hidden().
Waqas Hussain <waqas20@gmail.com>
parents: 3260
diff changeset
   366
function room_mt:set_hidden(hidden)
fe1c93296abd MUC: Added room:set_hidden(boolean) and room:is_hidden().
Waqas Hussain <waqas20@gmail.com>
parents: 3260
diff changeset
   367
	hidden = hidden and true or nil;
fe1c93296abd MUC: Added room:set_hidden(boolean) and room:is_hidden().
Waqas Hussain <waqas20@gmail.com>
parents: 3260
diff changeset
   368
	if self._data.hidden ~= hidden then
fe1c93296abd MUC: Added room:set_hidden(boolean) and room:is_hidden().
Waqas Hussain <waqas20@gmail.com>
parents: 3260
diff changeset
   369
		self._data.hidden = hidden;
fe1c93296abd MUC: Added room:set_hidden(boolean) and room:is_hidden().
Waqas Hussain <waqas20@gmail.com>
parents: 3260
diff changeset
   370
		if self.save then self:save(true); end
fe1c93296abd MUC: Added room:set_hidden(boolean) and room:is_hidden().
Waqas Hussain <waqas20@gmail.com>
parents: 3260
diff changeset
   371
	end
fe1c93296abd MUC: Added room:set_hidden(boolean) and room:is_hidden().
Waqas Hussain <waqas20@gmail.com>
parents: 3260
diff changeset
   372
end
5580
db5d1a350cc7 mod_muc: Refactor config form handling, and allow for clients to submit incomplete forms. Fixes #246
Matthew Wild <mwild1@gmail.com>
parents: 5577
diff changeset
   373
function room_mt:get_hidden()
3261
fe1c93296abd MUC: Added room:set_hidden(boolean) and room:is_hidden().
Waqas Hussain <waqas20@gmail.com>
parents: 3260
diff changeset
   374
	return self._data.hidden;
fe1c93296abd MUC: Added room:set_hidden(boolean) and room:is_hidden().
Waqas Hussain <waqas20@gmail.com>
parents: 3260
diff changeset
   375
end
5580
db5d1a350cc7 mod_muc: Refactor config form handling, and allow for clients to submit incomplete forms. Fixes #246
Matthew Wild <mwild1@gmail.com>
parents: 5577
diff changeset
   376
function room_mt:get_public()
db5d1a350cc7 mod_muc: Refactor config form handling, and allow for clients to submit incomplete forms. Fixes #246
Matthew Wild <mwild1@gmail.com>
parents: 5577
diff changeset
   377
	return not self:get_hidden();
db5d1a350cc7 mod_muc: Refactor config form handling, and allow for clients to submit incomplete forms. Fixes #246
Matthew Wild <mwild1@gmail.com>
parents: 5577
diff changeset
   378
end
db5d1a350cc7 mod_muc: Refactor config form handling, and allow for clients to submit incomplete forms. Fixes #246
Matthew Wild <mwild1@gmail.com>
parents: 5577
diff changeset
   379
function room_mt:set_public(public)
db5d1a350cc7 mod_muc: Refactor config form handling, and allow for clients to submit incomplete forms. Fixes #246
Matthew Wild <mwild1@gmail.com>
parents: 5577
diff changeset
   380
	return self:set_hidden(not public);
db5d1a350cc7 mod_muc: Refactor config form handling, and allow for clients to submit incomplete forms. Fixes #246
Matthew Wild <mwild1@gmail.com>
parents: 5577
diff changeset
   381
end
4119
813adb81d7da MUC: Add option to allow participants to change the subject.
Kim Alvefur <zash@zash.se>
parents: 3989
diff changeset
   382
function room_mt:set_changesubject(changesubject)
813adb81d7da MUC: Add option to allow participants to change the subject.
Kim Alvefur <zash@zash.se>
parents: 3989
diff changeset
   383
	changesubject = changesubject and true or nil;
813adb81d7da MUC: Add option to allow participants to change the subject.
Kim Alvefur <zash@zash.se>
parents: 3989
diff changeset
   384
	if self._data.changesubject ~= changesubject then
813adb81d7da MUC: Add option to allow participants to change the subject.
Kim Alvefur <zash@zash.se>
parents: 3989
diff changeset
   385
		self._data.changesubject = changesubject;
813adb81d7da MUC: Add option to allow participants to change the subject.
Kim Alvefur <zash@zash.se>
parents: 3989
diff changeset
   386
		if self.save then self:save(true); end
813adb81d7da MUC: Add option to allow participants to change the subject.
Kim Alvefur <zash@zash.se>
parents: 3989
diff changeset
   387
	end
813adb81d7da MUC: Add option to allow participants to change the subject.
Kim Alvefur <zash@zash.se>
parents: 3989
diff changeset
   388
end
813adb81d7da MUC: Add option to allow participants to change the subject.
Kim Alvefur <zash@zash.se>
parents: 3989
diff changeset
   389
function room_mt:get_changesubject()
813adb81d7da MUC: Add option to allow participants to change the subject.
Kim Alvefur <zash@zash.se>
parents: 3989
diff changeset
   390
	return self._data.changesubject;
813adb81d7da MUC: Add option to allow participants to change the subject.
Kim Alvefur <zash@zash.se>
parents: 3989
diff changeset
   391
end
4528
875b90d5ce0f muc - implement per channel history limits
Markus Kötter <koetter@rrzn-hiwi.uni-hannover.de>
parents: 4419
diff changeset
   392
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   393
-- Give the room creator owner affiliation
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   394
module:hook("muc-room-pre-create", function(event)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   395
	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
   396
end, -1);
6094
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   397
6135
6b061f8c6e11 plugins/muc/muc.lib: Add muc-occupant-prejoin events; Use it for banned, members-only, password, nick-conflict and lock checks
daurnimator <quae@daurnimator.com>
parents: 6134
diff changeset
   398
-- registration required for entering members-only room
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
   399
module:hook("muc-occupant-pre-join", function(event)
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   400
	local room, stanza = event.room, event.stanza;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   401
	local affiliation = room:get_affiliation(stanza.attr.from);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   402
	if affiliation == nil and event.room:get_members_only() then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   403
		local reply = st.error_reply(stanza, "auth", "registration-required"):up();
6094
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   404
		reply.tags[1].attr.code = "407";
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
   405
		event.origin.send(reply:tag("x", {xmlns = "http://jabber.org/protocol/muc"}));
6094
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   406
		return true;
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   407
	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
   408
end, -5);
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
   409
6180
35388114439f plugins/muc/muc.lib: non-function changes (reordering, semicolons and comments)
daurnimator <quae@daurnimator.com>
parents: 6179
diff changeset
   410
-- 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
   411
module:hook("muc-occupant-pre-join", function(event)
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   412
	local room, stanza = event.room, event.stanza;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   413
	local affiliation = room:get_affiliation(stanza.attr.from);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   414
	if affiliation == "outcast" then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   415
		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
   416
		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
   417
		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
   418
		return true;
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
   419
	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
   420
end, -10);
6094
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   421
6215
1dd09dc04945 plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents: 6214
diff changeset
   422
-- Send occupant list to newly joined user
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   423
module:hook("muc-occupant-joined", function(event)
6215
1dd09dc04945 plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents: 6214
diff changeset
   424
	local real_jid = event.stanza.attr.from;
1dd09dc04945 plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents: 6214
diff changeset
   425
	event.room:send_occupant_list(real_jid, function(nick, occupant)
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   426
		-- Don't include self
6192
f97aa1f4b1f1 plugins/muc/muc.lib: Use occupant methods where possible
daurnimator <quae@daurnimator.com>
parents: 6191
diff changeset
   427
		return occupant:get_presence(real_jid) == nil;
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   428
	end);
6215
1dd09dc04945 plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents: 6214
diff changeset
   429
end, 80);
1dd09dc04945 plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents: 6214
diff changeset
   430
1dd09dc04945 plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents: 6214
diff changeset
   431
-- Send subject to joining user
1dd09dc04945 plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents: 6214
diff changeset
   432
module:hook("muc-occupant-joined", function(event)
1dd09dc04945 plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents: 6214
diff changeset
   433
	event.room:send_subject(event.stanza.attr.from);
1dd09dc04945 plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents: 6214
diff changeset
   434
end, 20);
6094
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   435
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   436
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
   437
	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
   438
	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
   439
		return self:handle_kickable(origin, stanza)
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   440
	elseif type == nil or type == "unavailable" then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   441
		local real_jid = stanza.attr.from;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   442
		local bare_jid = jid_bare(real_jid);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   443
		local orig_occupant, dest_occupant;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   444
		local is_new_room = next(self._affiliations) == nil;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   445
		if is_new_room then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   446
			if type == "unavailable" then return true; end -- Unavailable from someone not in the room
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   447
			if module:fire_event("muc-room-pre-create", {
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   448
					room = self;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   449
					origin = origin;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   450
					stanza = stanza;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   451
				}) then return true; end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   452
		else
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   453
			orig_occupant = self:get_occupant_by_real_jid(real_jid);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   454
			if type == "unavailable" and orig_occupant == nil then return true; end -- Unavailable from someone not in the room
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   455
		end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   456
		local is_first_dest_session;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   457
		if type == "unavailable" then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   458
			-- dest_occupant = nil
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   459
		elseif orig_occupant and orig_occupant.nick == stanza.attr.to then -- Just a presence update
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   460
			log("debug", "presence update for %s from session %s", orig_occupant.nick, real_jid);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   461
			dest_occupant = orig_occupant;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   462
		else
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   463
			local dest_jid = stanza.attr.to;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   464
			dest_occupant = self:get_occupant_by_nick(dest_jid);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   465
			if dest_occupant == nil then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   466
				log("debug", "no occupant found for %s; creating new occupant object for %s", dest_jid, real_jid);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   467
				is_first_dest_session = true;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   468
				dest_occupant = self:new_occupant(bare_jid, dest_jid);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   469
			else
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   470
				is_first_dest_session = false;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   471
			end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   472
		end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   473
		local is_last_orig_session;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   474
		if orig_occupant ~= nil then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   475
			-- Is there are least 2 sessions?
6192
f97aa1f4b1f1 plugins/muc/muc.lib: Use occupant methods where possible
daurnimator <quae@daurnimator.com>
parents: 6191
diff changeset
   476
			local iter, ob, last = orig_occupant:each_session();
f97aa1f4b1f1 plugins/muc/muc.lib: Use occupant methods where possible
daurnimator <quae@daurnimator.com>
parents: 6191
diff changeset
   477
			is_last_orig_session = iter(ob, iter(ob, last)) == nil;
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   478
		end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   479
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   480
		local event, event_name = {
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   481
			room = self;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   482
			origin = origin;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   483
			stanza = stanza;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   484
			is_first_session = is_first_dest_session;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   485
			is_last_session = is_last_orig_session;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   486
		};
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   487
		if orig_occupant == nil then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   488
			event_name = "muc-occupant-pre-join";
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   489
			event.is_new_room = is_new_room;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   490
		elseif dest_occupant == nil then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   491
			event_name = "muc-occupant-pre-leave";
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   492
		else
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   493
			event_name = "muc-occupant-pre-change";
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   494
		end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   495
		if module:fire_event(event_name, event) then return true; end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   496
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   497
		-- Check for nick conflicts
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   498
		if dest_occupant ~= nil and not is_first_dest_session and bare_jid ~= jid_bare(dest_occupant.bare_jid) then -- new nick or has different bare real jid
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   499
			log("debug", "%s couldn't join due to nick conflict: %s", real_jid, dest_occupant.nick);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   500
			local reply = st.error_reply(stanza, "cancel", "conflict"):up();
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   501
			reply.tags[1].attr.code = "409";
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   502
			origin.send(reply:tag("x", {xmlns = "http://jabber.org/protocol/muc"}));
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   503
			return true;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   504
		end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   505
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   506
		-- Send presence stanza about original occupant
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   507
		if orig_occupant ~= nil and orig_occupant ~= dest_occupant then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   508
			local orig_x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";});
6212
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   509
			local dest_nick;
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   510
			if dest_occupant == nil then -- Session is leaving
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   511
				log("debug", "session %s is leaving occupant %s", real_jid, orig_occupant.nick);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   512
				orig_occupant:set_session(real_jid, stanza);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   513
			else
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   514
				log("debug", "session %s is changing from occupant %s to %s", real_jid, orig_occupant.nick, dest_occupant.nick);
6212
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   515
				local generated_unavail = st.presence {from = orig_occupant.nick, to = real_jid, type = "unavailable"};
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   516
				orig_occupant:set_session(real_jid, generated_unavail);
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   517
				dest_nick = select(3, jid_split(dest_occupant.nick));
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   518
				if not is_first_dest_session then -- User is swapping into another pre-existing session
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   519
					log("debug", "session %s is swapping into multisession %s, showing it leave.", real_jid, dest_occupant.nick);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   520
					-- Show the other session leaving
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   521
					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
   522
						:tag("status"):text("you are joining pre-existing session " .. dest_nick):up();
6212
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   523
					add_item(x, self:get_affiliation(bare_jid), "none");
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   524
					local pr = st.presence{from = dest_occupant.nick, to = real_jid, type = "unavailable"}
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   525
						:add_child(x);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   526
					self:route_stanza(pr);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   527
				end
6212
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   528
				if is_first_dest_session and is_last_orig_session then -- Normal nick change
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   529
					log("debug", "no sessions in %s left; publically marking as nick change", orig_occupant.nick);
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   530
					orig_x:tag("status", {code = "303";}):up();
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   531
				else -- The session itself always needs to see a nick change
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   532
					-- don't want to get our old nick's available presence,
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   533
					-- so remove our session from there, and manually generate an unavailable
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   534
					orig_occupant:remove_session(real_jid);
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   535
					log("debug", "generating nick change for %s", real_jid);
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   536
					local x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";});
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   537
					-- self:build_item_list(orig_occupant, x, false, dest_nick); -- COMPAT: clients get confused if they see other items besides their own
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   538
					add_item(x, self:get_affiliation(bare_jid), orig_occupant.role, real_jid, dest_nick);
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   539
					x:tag("status", {code = "303";}):up();
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   540
					x:tag("status", {code = "110";}):up();
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   541
					self:route_stanza(generated_unavail:add_child(x));
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   542
					dest_nick = nil; -- set dest_nick to nil; so general populance doesn't see it for whole orig_occupant
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   543
				end
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   544
			end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   545
			self:save_occupant(orig_occupant);
6212
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
   546
			self:publicise_occupant_status(orig_occupant, orig_x, dest_nick);
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   547
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   548
			if is_last_orig_session then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   549
				module:fire_event("muc-occupant-left", {room = self; nick = orig_occupant.nick;});
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   550
			end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   551
		end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   552
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   553
		if dest_occupant ~= nil then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   554
			dest_occupant:set_session(real_jid, stanza);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   555
			local dest_x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";});
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   556
			if is_new_room then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   557
				dest_x:tag("status", {code = "201"}):up();
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   558
			end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   559
			if orig_occupant == nil and self:get_whois() == "anyone" then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   560
				dest_x:tag("status", {code = "100"}):up();
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   561
			end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   562
			self:save_occupant(dest_occupant);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   563
			self:publicise_occupant_status(dest_occupant, dest_x);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   564
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   565
			if orig_occupant ~= nil and orig_occupant ~= dest_occupant and not is_last_orig_session then -- If user is swapping and wasn't last original session
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   566
				log("debug", "session %s split nicks; showing %s rejoining", real_jid, orig_occupant.nick);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   567
				-- Show the original nick joining again
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   568
				local pr = st.clone(orig_occupant:get_presence());
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   569
				pr.attr.to = real_jid;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   570
				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
   571
				self:build_item_list(orig_occupant, x, false);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   572
				-- TODO: new status code to inform client this was the multi-session it left?
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   573
				pr:add_child(x);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   574
				self:route_stanza(pr);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   575
			end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   576
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   577
			if orig_occupant == nil and is_first_dest_session then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   578
				module:fire_event("muc-occupant-joined", {room = self; nick = dest_occupant.nick; stanza = stanza;});
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   579
			end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   580
		end
6094
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   581
	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
   582
		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
   583
			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
   584
		end
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   585
	end
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   586
	return true;
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   587
end
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   588
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   589
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
   590
	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
   591
	local type = stanza.attr.type;
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
   592
	local id = stanza.attr.id;
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   593
	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
   594
	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
   595
		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
   596
			if not occupant 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
   597
			local from_jid, id, to_jid_hash = (base64.decode(stanza.attr.id) or ""):match("^(.+)%z(.*)%z(.+)$");
538cdc3d8225 plugins/muc/muc.lib: Move (de)construct_stanza_id into `handle_iq_to_occupant`
daurnimator <quae@daurnimator.com>
parents: 6096
diff changeset
   598
			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
   599
			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
   600
			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
   601
			local session_jid
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   602
			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
   603
				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
   604
					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
   605
					break;
538cdc3d8225 plugins/muc/muc.lib: Move (de)construct_stanza_id into `handle_iq_to_occupant`
daurnimator <quae@daurnimator.com>
parents: 6096
diff changeset
   606
				end
538cdc3d8225 plugins/muc/muc.lib: Move (de)construct_stanza_id into `handle_iq_to_occupant`
daurnimator <quae@daurnimator.com>
parents: 6096
diff changeset
   607
			end
538cdc3d8225 plugins/muc/muc.lib: Move (de)construct_stanza_id into `handle_iq_to_occupant`
daurnimator <quae@daurnimator.com>
parents: 6096
diff changeset
   608
			if session_jid == nil 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
   609
			stanza.attr.from, stanza.attr.to, stanza.attr.id = from_jid, session_jid, id;
6097
538cdc3d8225 plugins/muc/muc.lib: Move (de)construct_stanza_id into `handle_iq_to_occupant`
daurnimator <quae@daurnimator.com>
parents: 6096
diff changeset
   610
		end
6096
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
   611
		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
   612
		self:route_stanza(stanza);
6096
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
   613
		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
   614
		return true;
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
   615
	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
   616
		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
   617
		if not current_nick then
6094
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   618
			origin.send(st.error_reply(stanza, "cancel", "not-acceptable"));
6096
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
   619
			return true;
6094
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   620
		end
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   621
		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
   622
			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
   623
			return true;
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
   624
		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
   625
		do -- construct_stanza_id
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   626
			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
   627
		end
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   628
		stanza.attr.from, stanza.attr.to = current_nick, occupant.jid;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   629
		log("debug", "%s sent private iq stanza to %s (%s)", from, to, occupant.jid);
6096
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
   630
		if stanza.tags[1].attr.xmlns == 'vcard-temp' then
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
   631
			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
   632
		end
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   633
		self:route_stanza(stanza);
6096
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
   634
		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
   635
		return true;
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   636
	end
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   637
end
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   638
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   639
function room_mt:handle_message_to_occupant(origin, stanza)
6096
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
   640
	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
   641
	local current_nick = self:get_occupant_jid(from);
6094
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   642
	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
   643
	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
   644
		if type ~= "error" then
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   645
			origin.send(st.error_reply(stanza, "cancel", "not-acceptable"));
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   646
		end
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   647
		return true;
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   648
	end
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   649
	if type == "groupchat" then -- groupchat messages not allowed in PM
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   650
		origin.send(st.error_reply(stanza, "modify", "bad-request"));
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   651
		return true;
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   652
	elseif type == "error" and is_kickable_error(stanza) then
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   653
		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
   654
		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
   655
	end
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
   656
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   657
	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
   658
	if not o_data then
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
   659
		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
   660
		return true;
6094
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   661
	end
6096
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
   662
	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
   663
	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
   664
	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
   665
	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
   666
	-- 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
   667
	stanza.attr.from = from;
6096
84f9123637d4 plugins/muc/muc.lib: Refactor _to_occupant handlers
daurnimator <quae@daurnimator.com>
parents: 6095
diff changeset
   668
	return true;
6094
db2faeb151b6 plugins/muc/muc.lib: Factor `handle_to_occupant` out into many functions
daurnimator <quae@daurnimator.com>
parents: 6093
diff changeset
   669
end
5061
186f34d88073 MUC: Fix private IQ and message routing.
Waqas Hussain <waqas20@gmail.com>
parents: 4999
diff changeset
   670
2216
dbbb5ed41365 MUC: Slightly refactored form processing.
Waqas Hussain <waqas20@gmail.com>
parents: 2174
diff changeset
   671
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
   672
	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
   673
		: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
   674
	);
dff4a77ee285 MUC: Parse submitted form with util.dataforms
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
   675
end
dff4a77ee285 MUC: Parse submitted form with util.dataforms
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
   676
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
   677
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
   678
	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
   679
		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
   680
		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
   681
		{
530f7de1d265 MUC: Use util.dataforms to generate forms
Kim Alvefur <zash@zash.se>
parents: 3516
diff changeset
   682
			name = 'FORM_TYPE',
530f7de1d265 MUC: Use util.dataforms to generate forms
Kim Alvefur <zash@zash.se>
parents: 3516
diff changeset
   683
			type = 'hidden',
530f7de1d265 MUC: Use util.dataforms to generate forms
Kim Alvefur <zash@zash.se>
parents: 3516
diff changeset
   684
			value = 'http://jabber.org/protocol/muc#roomconfig'
530f7de1d265 MUC: Use util.dataforms to generate forms
Kim Alvefur <zash@zash.se>
parents: 3516
diff changeset
   685
		}
3591
dff4a77ee285 MUC: Parse submitted form with util.dataforms
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
   686
	});
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
   687
	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
   688
end
6201
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   689
module:hook("muc-config-form", function(event)
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   690
	table.insert(event.form, {
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   691
		name = 'muc#roomconfig_persistentroom',
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   692
		type = 'boolean',
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   693
		label = 'Make Room Persistent?',
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   694
		value = event.room:get_persistent()
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   695
	});
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   696
end);
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   697
module:hook("muc-config-form", function(event)
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   698
	table.insert(event.form, {
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   699
		name = 'muc#roomconfig_publicroom',
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   700
		type = 'boolean',
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   701
		label = 'Make Room Publicly Searchable?',
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   702
		value = not event.room:get_hidden()
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   703
	});
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   704
end);
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   705
module:hook("muc-config-form", function(event)
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   706
	table.insert(event.form, {
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   707
		name = 'muc#roomconfig_changesubject',
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   708
		type = 'boolean',
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   709
		label = 'Allow Occupants to Change Subject?',
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   710
		value = event.room:get_changesubject()
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   711
	});
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   712
end);
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   713
module:hook("muc-config-form", function(event)
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   714
	table.insert(event.form, {
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   715
		name = 'muc#roomconfig_moderatedroom',
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   716
		type = 'boolean',
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   717
		label = 'Make Room Moderated?',
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   718
		value = event.room:get_moderated()
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   719
	});
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   720
end);
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   721
module:hook("muc-config-form", function(event)
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   722
	table.insert(event.form, {
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   723
		name = 'muc#roomconfig_membersonly',
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   724
		type = 'boolean',
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   725
		label = 'Make Room Members-Only?',
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   726
		value = event.room:get_members_only()
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   727
	});
b9e8f5268c97 plugins/muc/muc.lib: Move default config layout into hooks
daurnimator <quae@daurnimator.com>
parents: 6200
diff changeset
   728
end);
2216
dbbb5ed41365 MUC: Slightly refactored form processing.
Waqas Hussain <waqas20@gmail.com>
parents: 2174
diff changeset
   729
dbbb5ed41365 MUC: Slightly refactored form processing.
Waqas Hussain <waqas20@gmail.com>
parents: 2174
diff changeset
   730
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
   731
	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
   732
	if form.attr.type == "cancel" then
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   733
		origin.send(st.reply(stanza));
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   734
	elseif form.attr.type == "submit" then
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   735
		local fields = self:get_form_layout(stanza.attr.from):data(form);
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   736
		if fields.FORM_TYPE ~= "http://jabber.org/protocol/muc#roomconfig" then
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   737
			origin.send(st.error_reply(stanza, "cancel", "bad-request", "Form is not of type room configuration"));
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   738
			return true;
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   739
		end
3591
dff4a77ee285 MUC: Parse submitted form with util.dataforms
Kim Alvefur <zash@zash.se>
parents: 3590
diff changeset
   740
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
   741
		local event = {room = self; origin = origin; stanza = stanza; fields = fields; status_codes = {};};
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
   742
		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
   743
			local new = fields[field];
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   744
			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
   745
			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
   746
			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
   747
			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
   748
			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
   749
			return true;
6202
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   750
		end
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   751
		module:fire_event("muc-config-submitted", event);
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   752
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   753
		if self.save then self:save(true); end
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   754
		origin.send(st.reply(stanza));
4119
813adb81d7da MUC: Add option to allow participants to change the subject.
Kim Alvefur <zash@zash.se>
parents: 3989
diff changeset
   755
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
   756
		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
   757
			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
   758
				: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
   759
			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
   760
				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
   761
			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
   762
			msg:up();
6215
1dd09dc04945 plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents: 6214
diff changeset
   763
			self:broadcast_message(msg);
6202
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   764
		end
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   765
	else
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   766
		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
   767
	end
6202
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   768
	return true;
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1753
diff changeset
   769
end
6202
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   770
module:hook("muc-config-submitted", function(event)
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   771
	event.update_option("persistent", "muc#roomconfig_persistentroom");
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   772
end);
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   773
module:hook("muc-config-submitted", function(event)
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   774
	event.update_option("moderated", "muc#roomconfig_moderatedroom");
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   775
end);
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   776
module:hook("muc-config-submitted", function(event)
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   777
	event.update_option("members_only", "muc#roomconfig_membersonly");
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   778
end);
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   779
module:hook("muc-config-submitted", function(event)
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   780
	event.update_option("public", "muc#roomconfig_publicroom");
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   781
end);
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   782
module:hook("muc-config-submitted", function(event)
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   783
	event.update_option("changesubject", "muc#roomconfig_changesubject");
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   784
end);
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1753
diff changeset
   785
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   786
-- Removes everyone from the room
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   787
function room_mt:clear(x)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   788
	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
   789
	local occupants_updated = {};
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   790
	for nick, occupant in self:each_occupant() do
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   791
		occupant.role = nil;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   792
		self:save_occupant(occupant);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   793
		occupants_updated[occupant] = true;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   794
	end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   795
	for occupant in pairs(occupants_updated) do
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   796
		self:publicise_occupant_status(occupant, x);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   797
		module:fire_event("muc-occupant-left", { room = self; nick = occupant.nick; });
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   798
	end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   799
end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   800
2217
838f6d546177 MUC: Added support for the room-destroy owner use case.
Waqas Hussain <waqas20@gmail.com>
parents: 2216
diff changeset
   801
function room_mt:destroy(newjid, reason, password)
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   802
	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
   803
		:tag("item", { affiliation='none', role='none' }):up()
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   804
		:tag("destroy", {jid=newjid});
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   805
	if reason then x:tag("reason"):text(reason):up(); end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   806
	if password then x:tag("password"):text(password):up(); end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   807
	x:up();
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   808
	self:clear(x);
3259
a5b9209efb23 MUC: Replaced direct access of room's internal persistence state with :set_persistent(boolean) and :is_persistent() in various functions.
Waqas Hussain <waqas20@gmail.com>
parents: 3258
diff changeset
   809
	self:set_persistent(false);
5577
8b09b0d068d4 mod_muc: Fire muc-room-created and muc-room-destroyed events (thanks nik)
Matthew Wild <mwild1@gmail.com>
parents: 5542
diff changeset
   810
	module:fire_event("muc-room-destroyed", { room = self });
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1753
diff changeset
   811
end
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1753
diff changeset
   812
6101
a861dc18e08d plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents: 6100
diff changeset
   813
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
   814
	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
   815
	return true;
a861dc18e08d plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents: 6100
diff changeset
   816
end
a861dc18e08d plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents: 6100
diff changeset
   817
a861dc18e08d plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents: 6100
diff changeset
   818
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
   819
	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
   820
	return true;
a861dc18e08d plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents: 6100
diff changeset
   821
end
a861dc18e08d plugins/muc/muc.lib: Add disco iq handlers with compatible argument signature
daurnimator <quae@daurnimator.com>
parents: 6100
diff changeset
   822
6141
bf6de8ef66c2 plugins/muc: Rename admin query hook
daurnimator <quae@daurnimator.com>
parents: 6140
diff changeset
   823
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
   824
	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
   825
	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
   826
		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
   827
		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
   828
			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
   829
			return true;
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   830
		end
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   831
	end
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   832
	if not item.attr.jid and item.attr.nick then -- 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
   833
		local occupant = self:get_occupant_by_nick(self.jid.."/"..item.attr.nick);
6095
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   834
		if occupant then item.attr.jid = occupant.jid; end
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   835
	elseif not item.attr.nick and item.attr.jid then
6119
c13f5d6b9b16 plugins/muc/muc.lib: Use `get_occupant_jid` method instead of indexing _jid_nick
daurnimator <quae@daurnimator.com>
parents: 6118
diff changeset
   836
		local nick = self:get_occupant_jid(item.attr.jid);
6095
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   837
		if nick then item.attr.nick = select(3, jid_split(nick)); end
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   838
	end
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   839
	local actor = stanza.attr.from;
6112
819e00a86239 plugins/muc/muc.lib: Use more modern stanza methods
daurnimator <quae@daurnimator.com>
parents: 6111
diff changeset
   840
	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
   841
	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
   842
	if item.attr.affiliation and item.attr.jid and not item.attr.role then
6181
6baa9a59aa03 plugins/muc/muc.lib: Remove callback parameter from set_role and set_affiliation
daurnimator <quae@daurnimator.com>
parents: 6180
diff changeset
   843
		success, errtype, err = self:set_affiliation(actor, item.attr.jid, item.attr.affiliation, reason);
6095
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   844
	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
   845
		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
   846
	else
6181
6baa9a59aa03 plugins/muc/muc.lib: Remove callback parameter from set_role and set_affiliation
daurnimator <quae@daurnimator.com>
parents: 6180
diff changeset
   847
		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
   848
	end
6181
6baa9a59aa03 plugins/muc/muc.lib: Remove callback parameter from set_role and set_affiliation
daurnimator <quae@daurnimator.com>
parents: 6180
diff changeset
   849
	if not success then origin.send(st.error_reply(stanza, errtype, err)); end
6baa9a59aa03 plugins/muc/muc.lib: Remove callback parameter from set_role and set_affiliation
daurnimator <quae@daurnimator.com>
parents: 6180
diff changeset
   850
	origin.send(st.reply(stanza));
6baa9a59aa03 plugins/muc/muc.lib: Remove callback parameter from set_role and set_affiliation
daurnimator <quae@daurnimator.com>
parents: 6180
diff changeset
   851
	return true;
6095
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   852
end
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   853
6141
bf6de8ef66c2 plugins/muc: Rename admin query hook
daurnimator <quae@daurnimator.com>
parents: 6140
diff changeset
   854
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
   855
	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
   856
	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
   857
	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
   858
	local _aff = item.attr.affiliation;
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   859
	local _rol = item.attr.role;
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   860
	if _aff and not _rol then
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   861
		if affiliation == "owner" or (affiliation == "admin" and _aff ~= "owner" and _aff ~= "admin") then
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   862
			local reply = st.reply(stanza):query("http://jabber.org/protocol/muc#admin");
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   863
			for jid, affiliation in pairs(self._affiliations) do
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   864
				if affiliation == _aff then
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   865
					reply:tag("item", {affiliation = _aff, jid = jid}):up();
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   866
				end
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   867
			end
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   868
			origin.send(reply);
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   869
			return true;
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   870
		else
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   871
			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
   872
			return true;
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   873
		end
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   874
	elseif _rol 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
   875
		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
   876
		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
   877
			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
   878
			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
   879
			-- 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
   880
			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
   881
				if occupant.role == _rol then
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
   882
					local nick = select(3,jid_split(occupant_jid));
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
   883
					self:build_item_list(occupant, reply, false, nick);
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
   884
				end
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
   885
			end
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
   886
			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
   887
			return true;
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   888
		else
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   889
			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
   890
			return true;
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   891
		end
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   892
	else
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   893
		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
   894
		return true;
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   895
	end
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   896
end
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   897
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   898
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
   899
	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
   900
		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
   901
		return true;
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   902
	end
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   903
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   904
	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
   905
	return true;
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   906
end
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   907
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
   908
	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
   909
		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
   910
		return true;
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   911
	end
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   912
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   913
	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
   914
	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
   915
		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
   916
		return true;
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   917
	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
   918
		local newjid = child.attr.jid;
6112
819e00a86239 plugins/muc/muc.lib: Use more modern stanza methods
daurnimator <quae@daurnimator.com>
parents: 6111
diff changeset
   919
		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
   920
		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
   921
		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
   922
		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
   923
		return true;
6202
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   924
	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
   925
		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
   926
	else
6202
64ed7f538f81 plugins/muc/muc.lib: Refactor out process_form into hooks
daurnimator <quae@daurnimator.com>
parents: 6201
diff changeset
   927
		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
   928
		return true;
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   929
	end
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   930
end
7900ebc544ce plugins/muc/muc.lib: Split out the room iq handler into functions
daurnimator <quae@daurnimator.com>
parents: 6094
diff changeset
   931
6093
9a7eaf0a35b6 plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents: 6092
diff changeset
   932
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
   933
	local from = stanza.attr.from;
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   934
	local occupant = self:get_occupant_by_real_jid(from);
6093
9a7eaf0a35b6 plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents: 6092
diff changeset
   935
	if not occupant then -- not in room
9a7eaf0a35b6 plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents: 6092
diff changeset
   936
		origin.send(st.error_reply(stanza, "cancel", "not-acceptable"));
6098
1d7e5d091980 plugins/muc/muc.lib: Add some missing return values
daurnimator <quae@daurnimator.com>
parents: 6097
diff changeset
   937
		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
   938
	elseif occupant.role == "visitor" then
9a7eaf0a35b6 plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents: 6092
diff changeset
   939
		origin.send(st.error_reply(stanza, "auth", "forbidden"));
6098
1d7e5d091980 plugins/muc/muc.lib: Add some missing return values
daurnimator <quae@daurnimator.com>
parents: 6097
diff changeset
   940
		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
   941
	else
5613
f3166adab512 mod_muc: Remove unused variable
Matthew Wild <mwild1@gmail.com>
parents: 5612
diff changeset
   942
		local from = stanza.attr.from;
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   943
		stanza.attr.from = occupant.nick;
6093
9a7eaf0a35b6 plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents: 6092
diff changeset
   944
		local subject = stanza:get_child_text("subject");
9a7eaf0a35b6 plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents: 6092
diff changeset
   945
		if subject then
9a7eaf0a35b6 plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents: 6092
diff changeset
   946
			if occupant.role == "moderator" or
6118
aae3d6daa50d plugins/muc/muc.lib: Fetch config via accessors instead of using `_data`
daurnimator <quae@daurnimator.com>
parents: 6117
diff changeset
   947
				( self:get_changesubject() and occupant.role == "participant" ) then -- and participant
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
   948
				self:set_subject(occupant.nick, subject);
6093
9a7eaf0a35b6 plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents: 6092
diff changeset
   949
			else
9a7eaf0a35b6 plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents: 6092
diff changeset
   950
				stanza.attr.from = from;
9a7eaf0a35b6 plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents: 6092
diff changeset
   951
				origin.send(st.error_reply(stanza, "auth", "forbidden"));
9a7eaf0a35b6 plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents: 6092
diff changeset
   952
			end
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   953
		else
6215
1dd09dc04945 plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents: 6214
diff changeset
   954
			self:broadcast_message(stanza);
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   955
		end
6093
9a7eaf0a35b6 plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents: 6092
diff changeset
   956
		stanza.attr.from = from;
6098
1d7e5d091980 plugins/muc/muc.lib: Add some missing return values
daurnimator <quae@daurnimator.com>
parents: 6097
diff changeset
   957
		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
   958
	end
9a7eaf0a35b6 plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents: 6092
diff changeset
   959
end
9a7eaf0a35b6 plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents: 6092
diff changeset
   960
9a7eaf0a35b6 plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents: 6092
diff changeset
   961
-- 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
   962
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
   963
	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
   964
	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
   965
	if current_nick then
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   966
		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
   967
		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
   968
		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
   969
		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
   970
	end
6100
c78ba94d3261 plugins/muc/muc.lib: Move all kick code into one place
daurnimator <quae@daurnimator.com>
parents: 6099
diff changeset
   971
	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
   972
end
9a7eaf0a35b6 plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents: 6092
diff changeset
   973
6195
9f6a003baf2e plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents: 6194
diff changeset
   974
-- 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
   975
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
   976
	local room, stanza = event.room, event.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
   977
	local _from, _to = stanza.attr.from, stanza.attr.to;
6195
9f6a003baf2e plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents: 6194
diff changeset
   978
	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
   979
	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
   980
	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
   981
		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
   982
		return true;
25ba4e2b31b3 plugins/muc/muc: Check for mediated invites in a smarter way
daurnimator <quae@daurnimator.com>
parents: 6102
diff changeset
   983
	end
6195
9f6a003baf2e plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents: 6194
diff changeset
   984
end);
9f6a003baf2e plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents: 6194
diff changeset
   985
6198
8936b9fbedfd plugins/muc/muc.lib: restrict invitations in members only rooms to admins
daurnimator <quae@daurnimator.com>
parents: 6197
diff changeset
   986
-- Invitation privileges in members-only rooms SHOULD be restricted to room admins;
8936b9fbedfd plugins/muc/muc.lib: restrict invitations in members only rooms to admins
daurnimator <quae@daurnimator.com>
parents: 6197
diff changeset
   987
-- if a member without privileges to edit the member list attempts to invite another user
8936b9fbedfd plugins/muc/muc.lib: restrict invitations in members only rooms to admins
daurnimator <quae@daurnimator.com>
parents: 6197
diff changeset
   988
-- the service SHOULD return a <forbidden/> error to the occupant
8936b9fbedfd plugins/muc/muc.lib: restrict invitations in members only rooms to admins
daurnimator <quae@daurnimator.com>
parents: 6197
diff changeset
   989
module:hook("muc-pre-invite", function(event)
8936b9fbedfd plugins/muc/muc.lib: restrict invitations in members only rooms to admins
daurnimator <quae@daurnimator.com>
parents: 6197
diff changeset
   990
	local room, stanza = event.room, event.stanza;
8936b9fbedfd plugins/muc/muc.lib: restrict invitations in members only rooms to admins
daurnimator <quae@daurnimator.com>
parents: 6197
diff changeset
   991
	if room:get_members_only() and valid_affiliations[room:get_affiliation(stanza.attr.from) or "none"] < valid_affiliations.admin then
8936b9fbedfd plugins/muc/muc.lib: restrict invitations in members only rooms to admins
daurnimator <quae@daurnimator.com>
parents: 6197
diff changeset
   992
		event.origin.send(st.error_reply(stanza, "auth", "forbidden"));
8936b9fbedfd plugins/muc/muc.lib: restrict invitations in members only rooms to admins
daurnimator <quae@daurnimator.com>
parents: 6197
diff changeset
   993
		return true;
8936b9fbedfd plugins/muc/muc.lib: restrict invitations in members only rooms to admins
daurnimator <quae@daurnimator.com>
parents: 6197
diff changeset
   994
	end
8936b9fbedfd plugins/muc/muc.lib: restrict invitations in members only rooms to admins
daurnimator <quae@daurnimator.com>
parents: 6197
diff changeset
   995
end);
8936b9fbedfd plugins/muc/muc.lib: restrict invitations in members only rooms to admins
daurnimator <quae@daurnimator.com>
parents: 6197
diff changeset
   996
6195
9f6a003baf2e plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents: 6194
diff changeset
   997
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
   998
	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
   999
	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
  1000
	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
  1001
		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
  1002
		return true;
6195
9f6a003baf2e plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents: 6194
diff changeset
  1003
	elseif not module:fire_event("muc-pre-invite", {room = self, origin = origin, stanza = stanza}) then
9f6a003baf2e plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents: 6194
diff changeset
  1004
		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
  1005
	end
6195
9f6a003baf2e plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents: 6194
diff changeset
  1006
	local invite = st.message({from = self.jid, to = invitee, id = stanza.attr.id})
9f6a003baf2e plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents: 6194
diff changeset
  1007
		:tag('x', {xmlns='http://jabber.org/protocol/muc#user'})
9f6a003baf2e plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents: 6194
diff changeset
  1008
			: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
  1009
				: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
  1010
			:up()
9f6a003baf2e plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents: 6194
diff changeset
  1011
		:up();
9f6a003baf2e plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents: 6194
diff changeset
  1012
	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
  1013
		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
  1014
	end
9f6a003baf2e plugins/muc/muc.lib: Add pre-invite event. Move role check to it
daurnimator <quae@daurnimator.com>
parents: 6194
diff changeset
  1015
	return true;
6093
9a7eaf0a35b6 plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents: 6092
diff changeset
  1016
end
9a7eaf0a35b6 plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents: 6092
diff changeset
  1017
6194
9b6c2d89f143 plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents: 6193
diff changeset
  1018
-- COMPAT: Some older clients expect this
9b6c2d89f143 plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents: 6193
diff changeset
  1019
module:hook("muc-invite", function(event)
9b6c2d89f143 plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents: 6193
diff changeset
  1020
	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
  1021
	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
  1022
	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
  1023
	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
  1024
		:text(reason or "")
9b6c2d89f143 plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents: 6193
diff changeset
  1025
	:up();
9b6c2d89f143 plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents: 6193
diff changeset
  1026
end);
9b6c2d89f143 plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents: 6193
diff changeset
  1027
9b6c2d89f143 plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents: 6193
diff changeset
  1028
-- 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
  1029
module:hook("muc-invite", function(event)
9b6c2d89f143 plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents: 6193
diff changeset
  1030
	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
  1031
	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
  1032
	local reason = invite:get_child_text("reason") or "";
9b6c2d89f143 plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents: 6193
diff changeset
  1033
	stanza:tag("body")
9b6c2d89f143 plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents: 6193
diff changeset
  1034
		:text(invite.attr.from.." invited you to the room "..room.jid..(reason == "" and (" ("..reason..")") or ""))
9b6c2d89f143 plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents: 6193
diff changeset
  1035
	:up();
9b6c2d89f143 plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents: 6193
diff changeset
  1036
end);
9b6c2d89f143 plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents: 6193
diff changeset
  1037
6214
9813c74ce006 plugins/muc: Move `whois` code to seperate file
daurnimator <quae@daurnimator.com>
parents: 6213
diff changeset
  1038
-- When an invite is sent; add an affiliation for the invitee
6194
9b6c2d89f143 plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents: 6193
diff changeset
  1039
module:hook("muc-invite", function(event)
9b6c2d89f143 plugins/muc/muc.lib: Tidy up muc-invite event.
daurnimator <quae@daurnimator.com>
parents: 6193
diff changeset
  1040
	local room, stanza = event.room, event.stanza;
6121
74bbcef3978e plugins/muc/muc.lib: Add muc-invite-prepared event; Use it for granting affiliations in members only rooms
daurnimator <quae@daurnimator.com>
parents: 6120
diff changeset
  1041
	local invitee = stanza.attr.to
74bbcef3978e plugins/muc/muc.lib: Add muc-invite-prepared event; Use it for granting affiliations in members only rooms
daurnimator <quae@daurnimator.com>
parents: 6120
diff changeset
  1042
	if room:get_members_only() and not room:get_affiliation(invitee) then
74bbcef3978e plugins/muc/muc.lib: Add muc-invite-prepared event; Use it for granting affiliations in members only rooms
daurnimator <quae@daurnimator.com>
parents: 6120
diff changeset
  1043
		local from = stanza:get_child("x", "http://jabber.org/protocol/muc#user"):get_child("invite").attr.from
74bbcef3978e plugins/muc/muc.lib: Add muc-invite-prepared event; Use it for granting affiliations in members only rooms
daurnimator <quae@daurnimator.com>
parents: 6120
diff changeset
  1044
		log("debug", "%s invited %s into members only room %s, granting membership", from, invitee, room.jid);
6197
1ee4d8953544 plugins/muc/muc.lib: Don't try and get occupant jids for annotating invite affiliation changes
daurnimator <quae@daurnimator.com>
parents: 6196
diff changeset
  1045
		room:set_affiliation(from, invitee, "member", "Invited by " .. from); -- This might fail; ignore for now
6121
74bbcef3978e plugins/muc/muc.lib: Add muc-invite-prepared event; Use it for granting affiliations in members only rooms
daurnimator <quae@daurnimator.com>
parents: 6120
diff changeset
  1046
	end
6180
35388114439f plugins/muc/muc.lib: non-function changes (reordering, semicolons and comments)
daurnimator <quae@daurnimator.com>
parents: 6179
diff changeset
  1047
end);
6121
74bbcef3978e plugins/muc/muc.lib: Add muc-invite-prepared event; Use it for granting affiliations in members only rooms
daurnimator <quae@daurnimator.com>
parents: 6120
diff changeset
  1048
6123
7f82bbd249fe plugins/muc/muc.lib: Remove `payload` argument from `handle_mediated_*`; extract it from inside.
daurnimator <quae@daurnimator.com>
parents: 6122
diff changeset
  1049
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
  1050
	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
  1051
	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
  1052
	if not declinee then
6105
68f53b9a186e plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents: 6104
diff changeset
  1053
		origin.send(st.error_reply(stanza, "cancel", "jid-malformed"));
68f53b9a186e plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents: 6104
diff changeset
  1054
		return true;
6196
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
  1055
	elseif not module:fire_event("muc-pre-decline", {room = self, origin = origin, stanza = stanza}) then
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
  1056
		return true;
6105
68f53b9a186e plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents: 6104
diff changeset
  1057
	end
6196
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
  1058
	local decline = st.message({from = self.jid, to = declinee, id = stanza.attr.id})
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
  1059
		:tag("x", {xmlns = "http://jabber.org/protocol/muc#user"})
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
  1060
			: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
  1061
				: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
  1062
			:up()
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
  1063
		:up();
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
  1064
	if not module:fire_event("muc-decline", {room = self, stanza = decline, origin = origin, incoming = stanza}) then
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
  1065
		local occupant = self:get_occupant_by_real_jid(decline.attr.to);
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
  1066
		if occupant then
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
  1067
			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
  1068
		else
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
  1069
			self:route_stanza(decline);
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
  1070
		end
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
  1071
	end
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
  1072
	return true;
6105
68f53b9a186e plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents: 6104
diff changeset
  1073
end
68f53b9a186e plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents: 6104
diff changeset
  1074
6196
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
  1075
-- 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
  1076
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
  1077
	local room, stanza = event.room, event.stanza;
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
  1078
	local decline = stanza:get_child("x", "http://jabber.org/protocol/muc#user"):get_child("decline");
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
  1079
	local reason = decline:get_child_text("reason") or "";
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
  1080
	stanza:tag("body")
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
  1081
		:text(decline.attr.from.." declined your invite to the room "..room.jid..(reason == "" and (" ("..reason..")") or ""))
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
  1082
	:up();
e73bb1568d87 plugins/muc/muc.lib: Update declines to be more like invites
daurnimator <quae@daurnimator.com>
parents: 6195
diff changeset
  1083
end);
6131
8dd0c6145603 plugins/muc/muc.lib: Add decline event for parity with invite
daurnimator <quae@daurnimator.com>
parents: 6130
diff changeset
  1084
6093
9a7eaf0a35b6 plugins/muc/muc.lib: Split up `handle_to_room` into smaller handlers (thanks sysko)
daurnimator <quae@daurnimator.com>
parents: 6092
diff changeset
  1085
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
  1086
	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
  1087
	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
  1088
		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
  1089
	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
  1090
		return self:handle_kickable(origin, stanza)
6103
25ba4e2b31b3 plugins/muc/muc: Check for mediated invites in a smarter way
daurnimator <quae@daurnimator.com>
parents: 6102
diff changeset
  1091
	elseif type == nil then
25ba4e2b31b3 plugins/muc/muc: Check for mediated invites in a smarter way
daurnimator <quae@daurnimator.com>
parents: 6102
diff changeset
  1092
		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
  1093
		if x then
25ba4e2b31b3 plugins/muc/muc: Check for mediated invites in a smarter way
daurnimator <quae@daurnimator.com>
parents: 6102
diff changeset
  1094
			local payload = x.tags[1];
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
  1095
			if payload == nil then
260a18062cb2 plugins/muc/muc: Rename `handle_invite_to_room` to `handle_mediated_invite`; clean up logic
daurnimator <quae@daurnimator.com>
parents: 6103
diff changeset
  1096
				-- 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
  1097
			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
  1098
				return self:handle_mediated_invite(origin, stanza)
6105
68f53b9a186e plugins/muc/muc: Support mediated declines
daurnimator <quae@daurnimator.com>
parents: 6104
diff changeset
  1099
			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
  1100
				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
  1101
			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
  1102
			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
  1103
			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
  1104
		end
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
  1105
	end
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
  1106
end
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
  1107
6111
f8b94903be52 plugins/muc: Provide a reasonable default `route_stanza`
daurnimator <quae@daurnimator.com>
parents: 6108
diff changeset
  1108
function room_mt:route_stanza(stanza)
6180
35388114439f plugins/muc/muc.lib: non-function changes (reordering, semicolons and comments)
daurnimator <quae@daurnimator.com>
parents: 6179
diff changeset
  1109
	module:send(stanza);
6111
f8b94903be52 plugins/muc: Provide a reasonable default `route_stanza`
daurnimator <quae@daurnimator.com>
parents: 6108
diff changeset
  1110
end
1735
81406277279e MUC: The MUC lib is now metatable based. Cleaned up code, etc.
Waqas Hussain <waqas20@gmail.com>
parents: 1734
diff changeset
  1111
1737
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
  1112
function room_mt:get_affiliation(jid)
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
  1113
	local node, host, resource = jid_split(jid);
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
  1114
	local bare = node and node.."@"..host or host;
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
  1115
	local result = self._affiliations[bare]; -- Affiliations are granted, revoked, and maintained based on the user's bare JID.
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
  1116
	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
  1117
	return result;
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
  1118
end
6186
85f7cd91dc31 plugins/muc/muc.lib: Smarter validation in set_affiliation
daurnimator <quae@daurnimator.com>
parents: 6185
diff changeset
  1119
6181
6baa9a59aa03 plugins/muc/muc.lib: Remove callback parameter from set_role and set_affiliation
daurnimator <quae@daurnimator.com>
parents: 6180
diff changeset
  1120
function room_mt:set_affiliation(actor, jid, affiliation, reason)
6186
85f7cd91dc31 plugins/muc/muc.lib: Smarter validation in set_affiliation
daurnimator <quae@daurnimator.com>
parents: 6185
diff changeset
  1121
	if not actor then return nil, "modify", "not-acceptable"; end;
85f7cd91dc31 plugins/muc/muc.lib: Smarter validation in set_affiliation
daurnimator <quae@daurnimator.com>
parents: 6185
diff changeset
  1122
1742
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
  1123
	jid = jid_bare(jid);
6186
85f7cd91dc31 plugins/muc/muc.lib: Smarter validation in set_affiliation
daurnimator <quae@daurnimator.com>
parents: 6185
diff changeset
  1124
85f7cd91dc31 plugins/muc/muc.lib: Smarter validation in set_affiliation
daurnimator <quae@daurnimator.com>
parents: 6185
diff changeset
  1125
	if valid_affiliations[affiliation or "none"] == nil then
1742
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
  1126
		return nil, "modify", "not-acceptable";
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
  1127
	end
6186
85f7cd91dc31 plugins/muc/muc.lib: Smarter validation in set_affiliation
daurnimator <quae@daurnimator.com>
parents: 6185
diff changeset
  1128
	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
  1129
6187
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1130
	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
  1131
	local is_downgrade = valid_affiliations[target_affiliation or "none"] > valid_affiliations[affiliation or "none"];
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1132
4357
d6928b78c548 MUC: Allow affiliation change when argument actor==true in room:set_affiliation().
Waqas Hussain <waqas20@gmail.com>
parents: 4326
diff changeset
  1133
	if actor ~= true then
6187
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1134
		local actor_bare = jid_bare(actor);
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1135
		local actor_affiliation = self._affiliations[actor_bare];
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1136
		if actor_affiliation == "owner" then
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1137
			if actor_bare == jid then -- self change
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1138
				-- need at least one owner
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1139
				local is_last = true;
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1140
				for j, aff in pairs(self._affiliations) do if j ~= jid and aff == "owner" then is_last = false; break; end end
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1141
				if is_last then
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1142
					return nil, "cancel", "conflict";
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1143
				end
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1144
			end
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1145
			-- owners can do anything else
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1146
		elseif affiliation == "owner" or affiliation == "admin"
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1147
			or actor_affiliation ~= "admin"
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1148
			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
  1149
			-- Can't demote owners or other admins
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1150
			return nil, "cancel", "not-allowed";
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
  1151
		end
6187
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1152
	end
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1153
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1154
	-- Set in 'database'
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1155
	self._affiliations[jid] = affiliation;
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1156
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1157
	-- Update roles
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1158
	local role = self:get_default_role(affiliation);
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1159
	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
  1160
	local occupants_updated = {}; -- Filled with old roles
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1161
	for nick, occupant in self:each_occupant() do
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1162
		if occupant.bare_jid == jid then
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1163
			-- need to publcize in all cases; as affiliation in <item/> has changed.
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1164
			occupants_updated[occupant] = occupant.role;
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1165
			if occupant.role ~= role and (
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1166
				is_downgrade or
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1167
				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
  1168
			) then
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1169
				occupant.role = role;
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1170
				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
  1171
			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
  1172
		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
  1173
	end
6187
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1174
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1175
	-- Tell the room of the new occupant affiliations+roles
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
  1176
	local x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user"});
1742
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
  1177
	if not role then -- getting kicked
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
  1178
		if affiliation == "outcast" then
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
  1179
			x:tag("status", {code="301"}):up(); -- banned
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
  1180
		else
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
  1181
			x:tag("status", {code="321"}):up(); -- affiliation change
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
  1182
		end
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
  1183
	end
6187
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1184
	local is_semi_anonymous = self:get_whois() == "moderators";
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1185
	for occupant, old_role in pairs(occupants_updated) do
6212
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
  1186
		self:publicise_occupant_status(occupant, x, nil, actor, reason);
6187
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1187
		if is_semi_anonymous and
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1188
			(old_role == "moderator" and occupant.role ~= "moderator") or
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1189
			(old_role ~= "moderator" and occupant.role == "moderator") then -- Has gained or lost moderator status
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1190
			-- Send everyone else's presences (as jid visibility has changed)
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1191
			for real_jid in occupant:each_session() do
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1192
				self:send_occupant_list(real_jid, function(occupant_jid, occupant)
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1193
					return occupant.bare_jid ~= jid;
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1194
				end);
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1195
			end
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1196
		end
1742
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
  1197
	end
6187
c0b4b5d41e55 plugins/muc/muc.lib: Improve set affiliation logic;
daurnimator <quae@daurnimator.com>
parents: 6186
diff changeset
  1198
1755
1614e8e62ad5 MUC: Fixed an undefined global access.
Waqas Hussain <waqas20@gmail.com>
parents: 1754
diff changeset
  1199
	if self.save then self:save(); end
1742
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
  1200
	return true;
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
  1201
end
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
  1202
1742
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
  1203
function room_mt:get_role(nick)
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
  1204
	local occupant = self:get_occupant_by_nick(nick);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
  1205
	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
  1206
end
6182
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
  1207
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
  1208
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
  1209
	if not actor then return nil, "modify", "not-acceptable"; end
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
  1210
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
  1211
	local occupant = self:get_occupant_by_nick(occupant_jid);
6182
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
  1212
	if not occupant then return nil, "modify", "not-acceptable"; end
5542
329ebdfb39a2 MUC: Allow actor == true to set roles (like affiliations)
Matthew Wild <mwild1@gmail.com>
parents: 5541
diff changeset
  1213
6182
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
  1214
	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
  1215
		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
  1216
	end
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
  1217
	role = role ~= "none" and role or nil; -- coerces `role == false` to `nil`
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
  1218
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
  1219
	if actor ~= true then
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
  1220
		-- Can't do anything to other owners or admins
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
  1221
		local occupant_affiliation = self:get_affiliation(occupant.bare_jid);
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
  1222
		if occupant_affiliation == "owner" and occupant_affiliation == "admin" then
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
  1223
			return nil, "cancel", "not-allowed";
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
  1224
		end
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
  1225
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
  1226
		-- If you are trying to give or take moderator role you need to be an owner or admin
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
  1227
		if occupant.role == "moderator" or role == "moderator" then
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
  1228
			local actor_affiliation = self:get_affiliation(actor);
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
  1229
			if actor_affiliation ~= "owner" and actor_affiliation ~= "admin" then
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
  1230
				return nil, "cancel", "not-allowed";
3279
8b0a4a7d2c6e MUC: Added room:can_set_role().
Waqas Hussain <waqas20@gmail.com>
parents: 3264
diff changeset
  1231
			end
8b0a4a7d2c6e MUC: Added room:can_set_role().
Waqas Hussain <waqas20@gmail.com>
parents: 3264
diff changeset
  1232
		end
6182
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
  1233
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
  1234
		-- Need to be in the room and a moderator
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
  1235
		local actor_occupant = self:get_occupant_by_real_jid(actor);
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
  1236
		if not actor_occupant or actor_occupant.role ~= "moderator" then
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
  1237
			return nil, "cancel", "not-allowed";
dbf0b09664cd plugins/muc/muc.lib: Clean up :set_role. Removes :can_set_role
daurnimator <quae@daurnimator.com>
parents: 6181
diff changeset
  1238
		end
3279
8b0a4a7d2c6e MUC: Added room:can_set_role().
Waqas Hussain <waqas20@gmail.com>
parents: 3264
diff changeset
  1239
	end
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
  1240
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
  1241
	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
  1242
	if not role then
3632
d82189efecc0 MUC: Include the user's current presence contents when broadcasting a role change.
Waqas Hussain <waqas20@gmail.com>
parents: 3631
diff changeset
  1243
		x:tag("status", {code = "307"}):up();
1742
1483a62d69bb MUC: Owners can now modify roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1740
diff changeset
  1244
	end
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
  1245
	occupant.role = role;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents: 6143
diff changeset
  1246
	self:save_occupant(occupant);
6212
b82523f92b06 plugins/muc/muc.lib: Refactor of change-nick presence handling
daurnimator <quae@daurnimator.com>
parents: 6211
diff changeset
  1247
	self:publicise_occupant_status(occupant, x, nil, actor, reason);
1737
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
  1248
	return true;
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
  1249
end
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
  1250
6209
cc00e78e6a31 plugins/muc: Move name functions to seperate module
daurnimator <quae@daurnimator.com>
parents: 6208
diff changeset
  1251
local name = module:require "muc/name";
cc00e78e6a31 plugins/muc: Move name functions to seperate module
daurnimator <quae@daurnimator.com>
parents: 6208
diff changeset
  1252
room_mt.get_name = name.get;
cc00e78e6a31 plugins/muc: Move name functions to seperate module
daurnimator <quae@daurnimator.com>
parents: 6208
diff changeset
  1253
room_mt.set_name = name.set;
cc00e78e6a31 plugins/muc: Move name functions to seperate module
daurnimator <quae@daurnimator.com>
parents: 6208
diff changeset
  1254
6204
c3254827698d plugins/muc/muc.lib: Move description functions out to own file
daurnimator <quae@daurnimator.com>
parents: 6203
diff changeset
  1255
local description = module:require "muc/description";
c3254827698d plugins/muc/muc.lib: Move description functions out to own file
daurnimator <quae@daurnimator.com>
parents: 6203
diff changeset
  1256
room_mt.get_description = description.get;
c3254827698d plugins/muc/muc.lib: Move description functions out to own file
daurnimator <quae@daurnimator.com>
parents: 6203
diff changeset
  1257
room_mt.set_description = description.set;
c3254827698d plugins/muc/muc.lib: Move description functions out to own file
daurnimator <quae@daurnimator.com>
parents: 6203
diff changeset
  1258
6208
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents: 6206
diff changeset
  1259
local password = module:require "muc/password";
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents: 6206
diff changeset
  1260
room_mt.get_password = password.get;
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents: 6206
diff changeset
  1261
room_mt.set_password = password.set;
d724289a5226 plugins/muc: Move password functions to seperate module
daurnimator <quae@daurnimator.com>
parents: 6206
diff changeset
  1262
6214
9813c74ce006 plugins/muc: Move `whois` code to seperate file
daurnimator <quae@daurnimator.com>
parents: 6213
diff changeset
  1263
local whois = module:require "muc/whois";
9813c74ce006 plugins/muc: Move `whois` code to seperate file
daurnimator <quae@daurnimator.com>
parents: 6213
diff changeset
  1264
room_mt.get_whois = whois.get;
9813c74ce006 plugins/muc: Move `whois` code to seperate file
daurnimator <quae@daurnimator.com>
parents: 6213
diff changeset
  1265
room_mt.set_whois = whois.set;
9813c74ce006 plugins/muc: Move `whois` code to seperate file
daurnimator <quae@daurnimator.com>
parents: 6213
diff changeset
  1266
6215
1dd09dc04945 plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents: 6214
diff changeset
  1267
local history = module:require "muc/history";
1dd09dc04945 plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents: 6214
diff changeset
  1268
room_mt.send_history = history.send;
1dd09dc04945 plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents: 6214
diff changeset
  1269
room_mt.get_historylength = history.get_length;
1dd09dc04945 plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents: 6214
diff changeset
  1270
room_mt.set_historylength = history.set_length;
1dd09dc04945 plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents: 6214
diff changeset
  1271
1737
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
  1272
local _M = {}; -- module "muc"
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
  1273
6215
1dd09dc04945 plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents: 6214
diff changeset
  1274
_M.set_max_history_length = history.set_max_length;
1dd09dc04945 plugins/muc: Move history to an external module
daurnimator <quae@daurnimator.com>
parents: 6214
diff changeset
  1275
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
  1276
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
  1277
	return setmetatable({
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
  1278
		jid = jid;
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
  1279
		_jid_nick = {};
1739
393abf245322 MUC: Renamed _participants table to _occupants
Waqas Hussain <waqas20@gmail.com>
parents: 1737
diff changeset
  1280
		_occupants = {};
2411
c2b6c55201af Add support for non-anonymous MUC rooms
Rob Hoelz <rob@hoelzro.net>
parents: 2217
diff changeset
  1281
		_data = {
c2b6c55201af Add support for non-anonymous MUC rooms
Rob Hoelz <rob@hoelzro.net>
parents: 2217
diff changeset
  1282
		};
1737
31c3eb5797c7 MUC: Initial support for roles and affiliations
Waqas Hussain <waqas20@gmail.com>
parents: 1736
diff changeset
  1283
		_affiliations = {};
1735
81406277279e MUC: The MUC lib is now metatable based. Cleaned up code, etc.
Waqas Hussain <waqas20@gmail.com>
parents: 1734
diff changeset
  1284
	}, room_mt);
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
  1285
end
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
  1286
5063
4bc202a7b351 MUC: Expose room metatable in the MUC lib.
Waqas Hussain <waqas20@gmail.com>
parents: 5061
diff changeset
  1287
_M.room_mt = room_mt;
4bc202a7b351 MUC: Expose room metatable in the MUC lib.
Waqas Hussain <waqas20@gmail.com>
parents: 5061
diff changeset
  1288
1734
34ac9ba0aad6 MUC: Added initial MUC lib
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
  1289
return _M;