plugins/muc/occupant.lib.lua
author daurnimator <quae@daurnimator.com>
Tue, 16 Sep 2014 17:11:29 -0400
changeset 6422 84b332eacde9
parent 6271 006b0e0f0de2
child 7089 6cc7c9da29ed
permissions -rw-r--r--
plugins/muc/muc.lib: Fix iq results coming from the real jid, not the in-room jid (thanks Lance)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
     1
local next = next;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
     2
local pairs = pairs;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
     3
local setmetatable = setmetatable;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
     4
local st = require "util.stanza";
6271
006b0e0f0de2 plugins/muc: Move 'x' filtering from occupant to util
daurnimator <quae@daurnimator.com>
parents: 6251
diff changeset
     5
local util = module:require "muc/util";
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
     6
6271
006b0e0f0de2 plugins/muc: Move 'x' filtering from occupant to util
daurnimator <quae@daurnimator.com>
parents: 6251
diff changeset
     7
local function get_filtered_presence(stanza)
006b0e0f0de2 plugins/muc: Move 'x' filtering from occupant to util
daurnimator <quae@daurnimator.com>
parents: 6251
diff changeset
     8
	return util.filter_muc_x(st.clone(stanza));
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
     9
end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    10
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    11
local occupant_mt = {};
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    12
occupant_mt.__index = occupant_mt;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    13
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    14
local function new_occupant(bare_real_jid, nick)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    15
	return setmetatable({
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    16
		bare_jid = bare_real_jid;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    17
		nick = nick; -- in-room jid
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    18
		sessions = {}; -- hash from real_jid to presence stanzas. stanzas should not be modified
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    19
		role = nil;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    20
		jid = nil; -- Primary session
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    21
	}, occupant_mt);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    22
end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    23
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    24
-- Deep copy an occupant
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    25
local function copy_occupant(occupant)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    26
	local sessions = {};
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    27
	for full_jid, presence_stanza in pairs(occupant.sessions) do
6210
e9d62fff82a8 plugins/muc/occupant.lib: Don't allow an unavailable session to be the primary jid
daurnimator <quae@daurnimator.com>
parents: 6179
diff changeset
    28
		-- Don't keep unavailable presences, as they'll accumulate; unless they're the primary session
e9d62fff82a8 plugins/muc/occupant.lib: Don't allow an unavailable session to be the primary jid
daurnimator <quae@daurnimator.com>
parents: 6179
diff changeset
    29
		if presence_stanza.attr.type ~= "unavailable" or full_jid == occupant.jid then
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    30
			sessions[full_jid] = presence_stanza;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    31
		end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    32
	end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    33
	return setmetatable({
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    34
		bare_jid = occupant.bare_jid;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    35
		nick = occupant.nick;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    36
		sessions = sessions;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    37
		role = occupant.role;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    38
		jid = occupant.jid;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    39
	}, occupant_mt);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    40
end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    41
6210
e9d62fff82a8 plugins/muc/occupant.lib: Don't allow an unavailable session to be the primary jid
daurnimator <quae@daurnimator.com>
parents: 6179
diff changeset
    42
-- finds another session to be the primary (there might not be one)
e9d62fff82a8 plugins/muc/occupant.lib: Don't allow an unavailable session to be the primary jid
daurnimator <quae@daurnimator.com>
parents: 6179
diff changeset
    43
function occupant_mt:choose_new_primary()
e9d62fff82a8 plugins/muc/occupant.lib: Don't allow an unavailable session to be the primary jid
daurnimator <quae@daurnimator.com>
parents: 6179
diff changeset
    44
	for jid, pr in self:each_session() do
6251
41a5e5205fd9 plugins/muc/occupant: Check for type == nil rather than type ~= unavailable
daurnimator <quae@daurnimator.com>
parents: 6210
diff changeset
    45
		if pr.attr.type == nil then
6210
e9d62fff82a8 plugins/muc/occupant.lib: Don't allow an unavailable session to be the primary jid
daurnimator <quae@daurnimator.com>
parents: 6179
diff changeset
    46
			return jid;
e9d62fff82a8 plugins/muc/occupant.lib: Don't allow an unavailable session to be the primary jid
daurnimator <quae@daurnimator.com>
parents: 6179
diff changeset
    47
		end
e9d62fff82a8 plugins/muc/occupant.lib: Don't allow an unavailable session to be the primary jid
daurnimator <quae@daurnimator.com>
parents: 6179
diff changeset
    48
	end
e9d62fff82a8 plugins/muc/occupant.lib: Don't allow an unavailable session to be the primary jid
daurnimator <quae@daurnimator.com>
parents: 6179
diff changeset
    49
	return nil;
e9d62fff82a8 plugins/muc/occupant.lib: Don't allow an unavailable session to be the primary jid
daurnimator <quae@daurnimator.com>
parents: 6179
diff changeset
    50
end
e9d62fff82a8 plugins/muc/occupant.lib: Don't allow an unavailable session to be the primary jid
daurnimator <quae@daurnimator.com>
parents: 6179
diff changeset
    51
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    52
function occupant_mt:set_session(real_jid, presence_stanza, replace_primary)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    53
	local pr = get_filtered_presence(presence_stanza);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    54
	pr.attr.from = self.nick;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    55
	pr.attr.to = real_jid;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    56
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    57
	self.sessions[real_jid] = pr;
6210
e9d62fff82a8 plugins/muc/occupant.lib: Don't allow an unavailable session to be the primary jid
daurnimator <quae@daurnimator.com>
parents: 6179
diff changeset
    58
	if replace_primary then
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    59
		self.jid = real_jid;
6210
e9d62fff82a8 plugins/muc/occupant.lib: Don't allow an unavailable session to be the primary jid
daurnimator <quae@daurnimator.com>
parents: 6179
diff changeset
    60
	elseif self.jid == nil or (pr.attr.type == "unavailable" and self.jid == real_jid) then
e9d62fff82a8 plugins/muc/occupant.lib: Don't allow an unavailable session to be the primary jid
daurnimator <quae@daurnimator.com>
parents: 6179
diff changeset
    61
		-- Only leave an unavailable presence as primary when there are no other options
e9d62fff82a8 plugins/muc/occupant.lib: Don't allow an unavailable session to be the primary jid
daurnimator <quae@daurnimator.com>
parents: 6179
diff changeset
    62
		self.jid = self:choose_new_primary() or real_jid;
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    63
	end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    64
end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    65
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    66
function occupant_mt:remove_session(real_jid)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    67
	-- Delete original session
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    68
	self.sessions[real_jid] = nil;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    69
	if self.jid == real_jid then
6210
e9d62fff82a8 plugins/muc/occupant.lib: Don't allow an unavailable session to be the primary jid
daurnimator <quae@daurnimator.com>
parents: 6179
diff changeset
    70
		self.jid = self:choose_new_primary();
6179
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    71
	end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    72
end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    73
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    74
function occupant_mt:each_session()
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    75
	return pairs(self.sessions)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    76
end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    77
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    78
function occupant_mt:get_presence(real_jid)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    79
	return self.sessions[real_jid or self.jid]
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    80
end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    81
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    82
return {
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    83
	new = new_occupant;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    84
	copy = copy_occupant;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    85
	mt = occupant_mt;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
    86
}