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