Annotate

plugins/muc/muc.lib.lua @ 6217:657c707d9229

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