Annotate

plugins/muc/occupant.lib.lua @ 6179:e488a90195bc

plugins/muc: Massive refactor We now have occupant objects; you grab them, modify them, save them. New presence handling code. Modify all presence sending to go via new functions.
author daurnimator <quae@daurnimator.com>
date Thu, 27 Mar 2014 19:16:13 -0400
child 6210:e9d62fff82a8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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";
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
5
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
6 local get_filtered_presence do
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
7 local presence_filters = {
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
8 ["http://jabber.org/protocol/muc"] = true;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
9 ["http://jabber.org/protocol/muc#user"] = true;
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 function presence_filter(tag)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
12 if presence_filters[tag.attr.xmlns] then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
13 return nil;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
14 end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
15 return tag;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
16 end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
17 function get_filtered_presence(stanza)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
18 return st.clone(stanza):maptags(presence_filter);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
19 end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
20 end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
21
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
22 local occupant_mt = {};
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
23 occupant_mt.__index = occupant_mt;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
24
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
25 local function new_occupant(bare_real_jid, nick)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
26 return setmetatable({
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
27 bare_jid = bare_real_jid;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
28 nick = nick; -- in-room jid
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
29 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
30 role = nil;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
31 jid = nil; -- Primary session
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
32 }, occupant_mt);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
33 end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
34
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
35 -- Deep copy an occupant
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
36 local function copy_occupant(occupant)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
37 local sessions = {};
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
38 for full_jid, presence_stanza in pairs(occupant.sessions) do
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
39 if presence_stanza.attr.type ~= "unavailable" then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
40 sessions[full_jid] = presence_stanza;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
41 end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
42 end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
43 return setmetatable({
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
44 bare_jid = occupant.bare_jid;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
45 nick = occupant.nick;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
46 sessions = sessions;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
47 role = occupant.role;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
48 jid = occupant.jid;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
49 }, occupant_mt);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
50 end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
51
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;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
58 if replace_primary or self.jid == nil then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
59 self.jid = real_jid;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
60 end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
61 end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
62
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
63 function occupant_mt:remove_session(real_jid)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
64 -- Delete original session
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
65 local presence_stanza = self.sessions[real_jid];
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
66 self.sessions[real_jid] = nil;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
67 if self.jid == real_jid then
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
68 -- find another session to be the primary (might be nil)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
69 self.jid = next(self.sessions);
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
70 end
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
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
73 function occupant_mt:each_session()
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
74 return pairs(self.sessions)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
75 end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
76
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
77 function occupant_mt:get_presence(real_jid)
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
78 return self.sessions[real_jid or self.jid]
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
79 end
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
80
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
81 return {
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
82 new = new_occupant;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
83 copy = copy_occupant;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
84 mt = occupant_mt;
e488a90195bc plugins/muc: Massive refactor
daurnimator <quae@daurnimator.com>
parents:
diff changeset
85 }