Annotate

plugins/muc/mod_muc.lua @ 10303:c434bff22b14

mod_csi_simple: Always remove session filters when disabling CSI Only guard the actual pausing of outgoing data on the method existing. This prevents the filters from lingering in case something happened to the connection. Removing already removed filters should be a safe noop.
author Kim Alvefur <zash@zash.se>
date Sat, 05 Oct 2019 16:55:58 +0200
parent 9647:0f43b901c854
child 10353:7b602e13c3b6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
1 -- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2033
diff changeset
2 -- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2033
diff changeset
3 -- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5692
diff changeset
4 --
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
5 -- This project is MIT/X11 licensed. Please see the
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
6 -- COPYING file in the source package for more information.
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
7 --
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
8
8572
ce1737520943 MUC: Write down which functions are exposed and thus available to other modules
Kim Alvefur <zash@zash.se>
parents: 8387
diff changeset
9 -- Exposed functions:
ce1737520943 MUC: Write down which functions are exposed and thus available to other modules
Kim Alvefur <zash@zash.se>
parents: 8387
diff changeset
10 --
ce1737520943 MUC: Write down which functions are exposed and thus available to other modules
Kim Alvefur <zash@zash.se>
parents: 8387
diff changeset
11 -- create_room(jid) -> room
ce1737520943 MUC: Write down which functions are exposed and thus available to other modules
Kim Alvefur <zash@zash.se>
parents: 8387
diff changeset
12 -- track_room(room)
ce1737520943 MUC: Write down which functions are exposed and thus available to other modules
Kim Alvefur <zash@zash.se>
parents: 8387
diff changeset
13 -- delete_room(room)
ce1737520943 MUC: Write down which functions are exposed and thus available to other modules
Kim Alvefur <zash@zash.se>
parents: 8387
diff changeset
14 -- forget_room(room)
ce1737520943 MUC: Write down which functions are exposed and thus available to other modules
Kim Alvefur <zash@zash.se>
parents: 8387
diff changeset
15 -- get_room_from_jid(jid) -> room
9050
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9049
diff changeset
16 -- each_room(live_only) -> () -> room [DEPRECATED]
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9049
diff changeset
17 -- all_rooms() -> room
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9049
diff changeset
18 -- live_rooms() -> room
8572
ce1737520943 MUC: Write down which functions are exposed and thus available to other modules
Kim Alvefur <zash@zash.se>
parents: 8387
diff changeset
19 -- shutdown_component()
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
20
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
21 if module:get_host_type() ~= "component" then
7359
a5a080c12c96 Update every link to the documentation to use HTTPS
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7350
diff changeset
22 error("MUC should be loaded as a component, please see https://prosody.im/doc/components", 0);
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
23 end
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
24
5064
7a1eb302c562 MUC: Give host and server admins "owner" affiliation in all rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 5062
diff changeset
25 local muclib = module:require "muc";
6234
cc8a6ca2d7c5 plugins/muc/mod_muc: Move affiliation monkey patch into own scope
daurnimator <quae@daurnimator.com>
parents: 6222
diff changeset
26 room_mt = muclib.room_mt; -- Yes, global.
8879
4dee8c439afc MUC: Expose method for creating a bare room object
Kim Alvefur <zash@zash.se>
parents: 8877
diff changeset
27 new_room = muclib.new_room;
6769
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
28
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
29 local name = module:require "muc/name";
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
30 room_mt.get_name = name.get;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
31 room_mt.set_name = name.set;
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
32
6769
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
33 local description = module:require "muc/description";
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
34 room_mt.get_description = description.get;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
35 room_mt.set_description = description.set;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
36
8833
9c90cd2fc4c3 MUC: Add support for setting a room language (closes #1149)
Kim Alvefur <zash@zash.se>
parents: 8818
diff changeset
37 local language = module:require "muc/language";
9c90cd2fc4c3 MUC: Add support for setting a room language (closes #1149)
Kim Alvefur <zash@zash.se>
parents: 8818
diff changeset
38 room_mt.get_language = language.get;
9c90cd2fc4c3 MUC: Add support for setting a room language (closes #1149)
Kim Alvefur <zash@zash.se>
parents: 8818
diff changeset
39 room_mt.set_language = language.set;
9c90cd2fc4c3 MUC: Add support for setting a room language (closes #1149)
Kim Alvefur <zash@zash.se>
parents: 8818
diff changeset
40
6769
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
41 local hidden = module:require "muc/hidden";
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
42 room_mt.get_hidden = hidden.get;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
43 room_mt.set_hidden = hidden.set;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
44 function room_mt:get_public()
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
45 return not self:get_hidden();
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
46 end
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
47 function room_mt:set_public(public)
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
48 return self:set_hidden(not public);
3575
bc3dfc00da5d MUC: Allow restricting room creation to local JIDs (thanks thomas.mangin).
Waqas Hussain <waqas20@gmail.com>
parents: 3560
diff changeset
49 end
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
50
6769
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
51 local password = module:require "muc/password";
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
52 room_mt.get_password = password.get;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
53 room_mt.set_password = password.set;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
54
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
55 local members_only = module:require "muc/members_only";
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
56 room_mt.get_members_only = members_only.get;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
57 room_mt.set_members_only = members_only.set;
8976
92f0876b9230 MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents: 8944
diff changeset
58 room_mt.get_allow_member_invites = members_only.get_allow_member_invites;
92f0876b9230 MUC: Add config option to allow members to invite other members to the room (previously only owners/admins could do this)
Matthew Wild <mwild1@gmail.com>
parents: 8944
diff changeset
59 room_mt.set_allow_member_invites = members_only.set_allow_member_invites;
6769
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
60
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
61 local moderated = module:require "muc/moderated";
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
62 room_mt.get_moderated = moderated.get;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
63 room_mt.set_moderated = moderated.set;
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: 5807
diff changeset
64
8865
2a8bbfcb6868 MUC: Move voice request into its own lib
Kim Alvefur <zash@zash.se>
parents: 8843
diff changeset
65 local request = module:require "muc/request";
2a8bbfcb6868 MUC: Move voice request into its own lib
Kim Alvefur <zash@zash.se>
parents: 8843
diff changeset
66 room_mt.handle_role_request = request.handle_request;
2a8bbfcb6868 MUC: Move voice request into its own lib
Kim Alvefur <zash@zash.se>
parents: 8843
diff changeset
67
6769
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
68 local persistent = module:require "muc/persistent";
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
69 room_mt.get_persistent = persistent.get;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
70 room_mt.set_persistent = persistent.set;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
71
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
72 local subject = module:require "muc/subject";
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
73 room_mt.get_changesubject = subject.get_changesubject;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
74 room_mt.set_changesubject = subject.set_changesubject;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
75 room_mt.get_subject = subject.get;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
76 room_mt.set_subject = subject.set;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
77 room_mt.send_subject = subject.send;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
78
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
79 local history = module:require "muc/history";
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
80 room_mt.send_history = history.send;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
81 room_mt.get_historylength = history.get_length;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
82 room_mt.set_historylength = history.set_length;
4caef6d53304 plugins/muc: Move loading of optional muc libraries from muc.lib.lua to mod_muc
daurnimator <quae@daurnimator.com>
parents: 6745
diff changeset
83
9240
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents: 9237
diff changeset
84 local register = module:require "muc/register";
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents: 9237
diff changeset
85 room_mt.get_registered_nick = register.get_registered_nick;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents: 9237
diff changeset
86 room_mt.get_registered_jid = register.get_registered_jid;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents: 9237
diff changeset
87 room_mt.handle_register_iq = register.handle_register_iq;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents: 9237
diff changeset
88
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
89 local jid_split = require "util.jid".split;
2033
38d32c154cec MUC: Added config option 'restrict_room_creation' to allow restricting room creation to admins.
Waqas Hussain <waqas20@gmail.com>
parents: 2028
diff changeset
90 local jid_bare = require "util.jid".bare;
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
91 local st = require "util.stanza";
7370
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
92 local cache = require "util.cache";
2033
38d32c154cec MUC: Added config option 'restrict_room_creation' to allow restricting room creation to admins.
Waqas Hussain <waqas20@gmail.com>
parents: 2028
diff changeset
93 local um_is_admin = require "core.usermanager".is_admin;
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: 3262
diff changeset
94
9035
173c0e16e704 MUC: Add sections in room config form
Matthew Wild <mwild1@gmail.com>
parents: 9019
diff changeset
95 module:require "muc/config_form_sections";
173c0e16e704 MUC: Add sections in room config form
Matthew Wild <mwild1@gmail.com>
parents: 9019
diff changeset
96
5691
18a115beeebe mod_muc: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5659
diff changeset
97 module:depends("disco");
6235
d433db49e353 plugins/muc/mod_muc: Use get_option_string instead of get_option and checking
daurnimator <quae@daurnimator.com>
parents: 6234
diff changeset
98 module:add_identity("conference", "text", module:get_option_string("name", "Prosody Chatrooms"));
5691
18a115beeebe mod_muc: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5659
diff changeset
99 module:add_feature("http://jabber.org/protocol/muc");
6091
3a1c39b31497 plugins/muc/mod_muc: Move Xep-0307 MUC unique to seperate file
daurnimator <quae@daurnimator.com>
parents: 6000
diff changeset
100 module:depends "muc_unique"
6206
f937bb5c83c3 plugins/muc: Move locking to seperate module
daurnimator <quae@daurnimator.com>
parents: 6205
diff changeset
101 module:require "muc/lock";
5691
18a115beeebe mod_muc: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5659
diff changeset
102
2033
38d32c154cec MUC: Added config option 'restrict_room_creation' to allow restricting room creation to admins.
Waqas Hussain <waqas20@gmail.com>
parents: 2028
diff changeset
103 local function is_admin(jid)
3388
02e668d64e05 MUC: No need to call is_admin twice now, global admins are admins on hosts
Matthew Wild <mwild1@gmail.com>
parents: 3330
diff changeset
104 return um_is_admin(jid, module.host);
2033
38d32c154cec MUC: Added config option 'restrict_room_creation' to allow restricting room creation to admins.
Waqas Hussain <waqas20@gmail.com>
parents: 2028
diff changeset
105 end
38d32c154cec MUC: Added config option 'restrict_room_creation' to allow restricting room creation to admins.
Waqas Hussain <waqas20@gmail.com>
parents: 2028
diff changeset
106
6234
cc8a6ca2d7c5 plugins/muc/mod_muc: Move affiliation monkey patch into own scope
daurnimator <quae@daurnimator.com>
parents: 6222
diff changeset
107 do -- Monkey patch to make server admins room owners
cc8a6ca2d7c5 plugins/muc/mod_muc: Move affiliation monkey patch into own scope
daurnimator <quae@daurnimator.com>
parents: 6222
diff changeset
108 local _get_affiliation = room_mt.get_affiliation;
cc8a6ca2d7c5 plugins/muc/mod_muc: Move affiliation monkey patch into own scope
daurnimator <quae@daurnimator.com>
parents: 6222
diff changeset
109 function room_mt:get_affiliation(jid)
cc8a6ca2d7c5 plugins/muc/mod_muc: Move affiliation monkey patch into own scope
daurnimator <quae@daurnimator.com>
parents: 6222
diff changeset
110 if is_admin(jid) then return "owner"; end
cc8a6ca2d7c5 plugins/muc/mod_muc: Move affiliation monkey patch into own scope
daurnimator <quae@daurnimator.com>
parents: 6222
diff changeset
111 return _get_affiliation(self, jid);
cc8a6ca2d7c5 plugins/muc/mod_muc: Move affiliation monkey patch into own scope
daurnimator <quae@daurnimator.com>
parents: 6222
diff changeset
112 end
cc8a6ca2d7c5 plugins/muc/mod_muc: Move affiliation monkey patch into own scope
daurnimator <quae@daurnimator.com>
parents: 6222
diff changeset
113
cc8a6ca2d7c5 plugins/muc/mod_muc: Move affiliation monkey patch into own scope
daurnimator <quae@daurnimator.com>
parents: 6222
diff changeset
114 local _set_affiliation = room_mt.set_affiliation;
9237
b86c2e135797 MUC: Add support for storing additional data with MUC affiliations
Matthew Wild <mwild1@gmail.com>
parents: 9221
diff changeset
115 function room_mt:set_affiliation(actor, jid, affiliation, reason, data)
6745
6728ad041761 Merge 0.10->trunk
Kim Alvefur <zash@zash.se>
parents: 6479 6744
diff changeset
116 if affiliation ~= "owner" and is_admin(jid) then return nil, "modify", "not-acceptable"; end
9237
b86c2e135797 MUC: Add support for storing additional data with MUC affiliations
Matthew Wild <mwild1@gmail.com>
parents: 9221
diff changeset
117 return _set_affiliation(self, actor, jid, affiliation, reason, data);
6234
cc8a6ca2d7c5 plugins/muc/mod_muc: Move affiliation monkey patch into own scope
daurnimator <quae@daurnimator.com>
parents: 6222
diff changeset
118 end
5064
7a1eb302c562 MUC: Give host and server admins "owner" affiliation in all rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 5062
diff changeset
119 end
7a1eb302c562 MUC: Give host and server admins "owner" affiliation in all rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 5062
diff changeset
120
6333
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
121 local persistent_rooms_storage = module:open_store("persistent");
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
122 local persistent_rooms = module:open_store("persistent", "map");
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
123 local room_configs = module:open_store("config");
7415
cbb05b454c13 MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents: 7414
diff changeset
124 local room_state = module:open_store("state");
6333
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
125
7371
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
126 local room_items_cache = {};
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
127
7414
1b62c89014c4 MUC: Separate force-save parameter from save-entire-state flag
Kim Alvefur <zash@zash.se>
parents: 7411
diff changeset
128 local function room_save(room, forced, savestate)
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
129 local node = jid_split(room.jid);
6333
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
130 local is_persistent = persistent.get(room);
7371
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
131 room_items_cache[room.jid] = room:get_public() and room:get_name() or nil;
7414
1b62c89014c4 MUC: Separate force-save parameter from save-entire-state flag
Kim Alvefur <zash@zash.se>
parents: 7411
diff changeset
132 if is_persistent or savestate then
7370
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
133 persistent_rooms:set(nil, room.jid, true);
7415
cbb05b454c13 MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents: 7414
diff changeset
134 local data, state = room:freeze(savestate);
cbb05b454c13 MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents: 7414
diff changeset
135 room_state:set(node, state);
7370
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
136 return room_configs:set(node, data);
7414
1b62c89014c4 MUC: Separate force-save parameter from save-entire-state flag
Kim Alvefur <zash@zash.se>
parents: 7411
diff changeset
137 elseif forced then
7370
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
138 persistent_rooms:set(nil, room.jid, nil);
7415
cbb05b454c13 MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents: 7414
diff changeset
139 room_state:set(node, nil);
7370
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
140 return room_configs:set(node, nil);
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
141 end
6742
6efeb801d62f Backed out changeset bea3862b6bde in favor of a different approach
Kim Alvefur <zash@zash.se>
parents: 6741
diff changeset
142 end
5064
7a1eb302c562 MUC: Give host and server admins "owner" affiliation in all rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 5062
diff changeset
143
8818
c96c00dc424b MUC: Add support for an optional hard limit on number of rooms (fixes #766)
Kim Alvefur <zash@zash.se>
parents: 8707
diff changeset
144 local max_rooms = module:get_option_number("muc_max_rooms");
c96c00dc424b MUC: Add support for an optional hard limit on number of rooms (fixes #766)
Kim Alvefur <zash@zash.se>
parents: 8707
diff changeset
145 local max_live_rooms = module:get_option_number("muc_room_cache_size", 100);
c96c00dc424b MUC: Add support for an optional hard limit on number of rooms (fixes #766)
Kim Alvefur <zash@zash.se>
parents: 8707
diff changeset
146
8926
89f6b2a2bec3 MUC: Measure cache hits and misses
Kim Alvefur <zash@zash.se>
parents: 8925
diff changeset
147 local room_hit = module:measure("room_hit", "rate");
89f6b2a2bec3 MUC: Measure cache hits and misses
Kim Alvefur <zash@zash.se>
parents: 8925
diff changeset
148 local room_miss = module:measure("room_miss", "rate")
8925
d367aeb9c50f MUC: Rename eviction hit rate measure
Kim Alvefur <zash@zash.se>
parents: 8879
diff changeset
149 local room_eviction = module:measure("room_eviction", "rate");
8818
c96c00dc424b MUC: Add support for an optional hard limit on number of rooms (fixes #766)
Kim Alvefur <zash@zash.se>
parents: 8707
diff changeset
150 local rooms = cache.new(max_rooms or max_live_rooms, function (jid, room)
c96c00dc424b MUC: Add support for an optional hard limit on number of rooms (fixes #766)
Kim Alvefur <zash@zash.se>
parents: 8707
diff changeset
151 if max_rooms then
9191
5192adc5c47f MUC: Pass missing argument to log message
Kim Alvefur <zash@zash.se>
parents: 9093
diff changeset
152 module:log("info", "Room limit of %d reached, no new rooms allowed", max_rooms);
8818
c96c00dc424b MUC: Add support for an optional hard limit on number of rooms (fixes #766)
Kim Alvefur <zash@zash.se>
parents: 8707
diff changeset
153 return false;
c96c00dc424b MUC: Add support for an optional hard limit on number of rooms (fixes #766)
Kim Alvefur <zash@zash.se>
parents: 8707
diff changeset
154 end
8385
43d50a957463 MUC: Tweak debug log message
Kim Alvefur <zash@zash.se>
parents: 8180
diff changeset
155 module:log("debug", "Evicting room %s", jid);
8925
d367aeb9c50f MUC: Rename eviction hit rate measure
Kim Alvefur <zash@zash.se>
parents: 8879
diff changeset
156 room_eviction();
8387
7d61431e1aa6 MUC: Cache names of public rooms on eviction
Kim Alvefur <zash@zash.se>
parents: 8386
diff changeset
157 room_items_cache[room.jid] = room:get_public() and room:get_name() or nil;
8657
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8656
diff changeset
158 local ok, err = room_save(room, nil, true); -- Force to disk
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8656
diff changeset
159 if not ok then
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8656
diff changeset
160 module:log("error", "Failed to swap inactive room %s to disk: %s", jid, err);
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8656
diff changeset
161 return false;
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
162 end
7370
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
163 end);
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
164
6333
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
165 -- Automatically destroy empty non-persistent rooms
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
166 module:hook("muc-occupant-left",function(event)
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
167 local room = event.room
9007
695904638cfa MUC: Flag rooms being destroyed (fixes #887)
Kim Alvefur <zash@zash.se>
parents: 8977
diff changeset
168 if room.destroying then return end
6333
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
169 if not room:has_occupant() and not persistent.get(room) then -- empty, non-persistent room
9010
3c5ddd53fe50 MUC: Log a debug message when a non-persistent room becomes empty and is destroyed
Kim Alvefur <zash@zash.se>
parents: 9007
diff changeset
170 module:log("debug", "%q empty, destroying", room.jid);
6333
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
171 module:fire_event("muc-room-destroyed", { room = room });
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
172 end
7417
4c8ee8175f5e MUC: Lower priority of hook so plugins hooks run before
Kim Alvefur <zash@zash.se>
parents: 7415
diff changeset
173 end, -1);
6333
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
174
6244
dfaacf042cfe plugins/muc/mod_muc: Remove attempt_room_creation and create_room function. Instead have a 'track_room' function called from the end of the pre-create hook, and just create an un-tracked room object when we get a presence
daurnimator <quae@daurnimator.com>
parents: 6243
diff changeset
175 function track_room(room)
8657
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8656
diff changeset
176 if rooms:set(room.jid, room) then
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8656
diff changeset
177 -- When room is created, over-ride 'save' method
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8656
diff changeset
178 room.save = room_save;
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8656
diff changeset
179 return room;
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8656
diff changeset
180 end
9078
9e339197c724 mod_muc: Add comment
Matthew Wild <mwild1@gmail.com>
parents: 9051
diff changeset
181 -- Resource limit reached
8657
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8656
diff changeset
182 return false;
5210
862a6fae05e7 MUC: Expose create_room(jid).
Waqas Hussain <waqas20@gmail.com>
parents: 5195
diff changeset
183 end
862a6fae05e7 MUC: Expose create_room(jid).
Waqas Hussain <waqas20@gmail.com>
parents: 5195
diff changeset
184
8661
7fc0784491ef MUC: Override methods on broken rooms to return internal-server-error instead
Kim Alvefur <zash@zash.se>
parents: 8660
diff changeset
185 local function handle_broken_room(room, origin, stanza)
7fc0784491ef MUC: Override methods on broken rooms to return internal-server-error instead
Kim Alvefur <zash@zash.se>
parents: 8660
diff changeset
186 module:log("debug", "Returning error from broken room %s", room.jid);
7fc0784491ef MUC: Override methods on broken rooms to return internal-server-error instead
Kim Alvefur <zash@zash.se>
parents: 8660
diff changeset
187 origin.send(st.error_reply(stanza, "wait", "internal-server-error"));
7fc0784491ef MUC: Override methods on broken rooms to return internal-server-error instead
Kim Alvefur <zash@zash.se>
parents: 8660
diff changeset
188 return true;
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
189 end
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
190
6333
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
191 local function restore_room(jid)
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
192 local node = jid_split(jid);
8656
0e84814a7ece MUC: Produce an untracked, locked room on failure to read room from storage (#1091)
Kim Alvefur <zash@zash.se>
parents: 8572
diff changeset
193 local data, err = room_configs:get(node);
4924
d8b9fe5900a2 MUC: Handle missing persistent room data.
Waqas Hussain <waqas20@gmail.com>
parents: 4528
diff changeset
194 if data then
8178
9f2a5fc9e4a5 MUC: Log debug message when restoring a room from storage
Kim Alvefur <zash@zash.se>
parents: 8026
diff changeset
195 module:log("debug", "Restoring room %s from storage", jid);
9079
c040c358d6c0 mod_muc: Fire event when room is (and about to be) restored
Matthew Wild <mwild1@gmail.com>
parents: 9078
diff changeset
196 if module:fire_event("muc-room-pre-restore", { jid = jid, data = data }) == false then
c040c358d6c0 mod_muc: Fire event when room is (and about to be) restored
Matthew Wild <mwild1@gmail.com>
parents: 9078
diff changeset
197 return false;
c040c358d6c0 mod_muc: Fire event when room is (and about to be) restored
Matthew Wild <mwild1@gmail.com>
parents: 9078
diff changeset
198 end
8659
4006755c1097 MUC: Log failure to load room state
Kim Alvefur <zash@zash.se>
parents: 8658
diff changeset
199 local state, s_err = room_state:get(node);
4006755c1097 MUC: Log failure to load room state
Kim Alvefur <zash@zash.se>
parents: 8658
diff changeset
200 if not state and s_err then
4006755c1097 MUC: Log failure to load room state
Kim Alvefur <zash@zash.se>
parents: 8658
diff changeset
201 module:log("debug", "Could not restore state of room %s: %s", jid, s_err);
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: 5807
diff changeset
202 end
7415
cbb05b454c13 MUC: Separate config from live state
Kim Alvefur <zash@zash.se>
parents: 7414
diff changeset
203 local room = muclib.restore_room(data, state);
9013
a54bcc76cd22 MUC: Remove room state on successful restoration from disk
Kim Alvefur <zash@zash.se>
parents: 9012
diff changeset
204 if track_room(room) then
a54bcc76cd22 MUC: Remove room state on successful restoration from disk
Kim Alvefur <zash@zash.se>
parents: 9012
diff changeset
205 room_state:set(node, nil);
9079
c040c358d6c0 mod_muc: Fire event when room is (and about to be) restored
Matthew Wild <mwild1@gmail.com>
parents: 9078
diff changeset
206 module:fire_event("muc-room-restored", { jid = jid, room = room });
9013
a54bcc76cd22 MUC: Remove room state on successful restoration from disk
Kim Alvefur <zash@zash.se>
parents: 9012
diff changeset
207 return room;
a54bcc76cd22 MUC: Remove room state on successful restoration from disk
Kim Alvefur <zash@zash.se>
parents: 9012
diff changeset
208 else
a54bcc76cd22 MUC: Remove room state on successful restoration from disk
Kim Alvefur <zash@zash.se>
parents: 9012
diff changeset
209 return false;
a54bcc76cd22 MUC: Remove room state on successful restoration from disk
Kim Alvefur <zash@zash.se>
parents: 9012
diff changeset
210 end
8656
0e84814a7ece MUC: Produce an untracked, locked room on failure to read room from storage (#1091)
Kim Alvefur <zash@zash.se>
parents: 8572
diff changeset
211 elseif err then
0e84814a7ece MUC: Produce an untracked, locked room on failure to read room from storage (#1091)
Kim Alvefur <zash@zash.se>
parents: 8572
diff changeset
212 module:log("error", "Error restoring room %s from storage: %s", jid, err);
0e84814a7ece MUC: Produce an untracked, locked room on failure to read room from storage (#1091)
Kim Alvefur <zash@zash.se>
parents: 8572
diff changeset
213 local room = muclib.new_room(jid, { locked = math.huge });
8661
7fc0784491ef MUC: Override methods on broken rooms to return internal-server-error instead
Kim Alvefur <zash@zash.se>
parents: 8660
diff changeset
214 room.handle_normal_presence = handle_broken_room;
7fc0784491ef MUC: Override methods on broken rooms to return internal-server-error instead
Kim Alvefur <zash@zash.se>
parents: 8660
diff changeset
215 room.handle_first_presence = handle_broken_room;
8656
0e84814a7ece MUC: Produce an untracked, locked room on failure to read room from storage (#1091)
Kim Alvefur <zash@zash.se>
parents: 8572
diff changeset
216 return room;
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: 5807
diff changeset
217 end
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
218 end
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
219
9051
68386f7b9fc9 MUC: Add some comments clarifying methods
Matthew Wild <mwild1@gmail.com>
parents: 9050
diff changeset
220 -- Removes a room from memory, without saving it (save first if required)
6348
bffc885dc378 mod_muc: Fix tracebacks (thanks nick1)
Kim Alvefur <zash@zash.se>
parents: 6334
diff changeset
221 function forget_room(room)
7536
3f8520b59677 MUC: Pass room JID instead of room itself to logger, fixes traceback (thanks damencho)
Kim Alvefur <zash@zash.se>
parents: 7417
diff changeset
222 module:log("debug", "Forgetting %s", room.jid);
7370
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
223 rooms.save = nil;
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
224 rooms:set(room.jid, nil);
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
225 end
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
226
9051
68386f7b9fc9 MUC: Add some comments clarifying methods
Matthew Wild <mwild1@gmail.com>
parents: 9050
diff changeset
227 -- Removes a room from the database (may remain in memory)
7370
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
228 function delete_room(room)
7650
4c2407422f71 Logging error if MUC room cache is full
Sam Whited <sam@samwhited.com>
parents: 7641
diff changeset
229 module:log("debug", "Deleting %s", room.jid);
7370
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
230 room_configs:set(jid_split(room.jid), nil);
9012
295faf1522f9 MUC: Purge saved room state when deleting a room
Kim Alvefur <zash@zash.se>
parents: 9010
diff changeset
231 room_state:set(jid_split(room.jid), nil);
7370
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
232 persistent_rooms:set(nil, room.jid, nil);
7371
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
233 room_items_cache[room.jid] = nil;
7370
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
234 end
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
235
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
236 function module.unload()
9050
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9049
diff changeset
237 for room in live_rooms() do
7414
1b62c89014c4 MUC: Separate force-save parameter from save-entire-state flag
Kim Alvefur <zash@zash.se>
parents: 7411
diff changeset
238 room:save(nil, true);
7370
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
239 forget_room(room);
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: 5807
diff changeset
240 end
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
241 end
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
242
6109
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
243 function get_room_from_jid(room_jid)
7370
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
244 local room = rooms:get(room_jid);
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
245 if room then
8926
89f6b2a2bec3 MUC: Measure cache hits and misses
Kim Alvefur <zash@zash.se>
parents: 8925
diff changeset
246 room_hit();
7370
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
247 rooms:set(room_jid, room); -- bump to top;
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
248 return room;
6333
93b8438fe761 plugins/muc/mod_muc: Use map store for room persistence
daurnimator <quae@daurnimator.com>
parents: 6332
diff changeset
249 end
8926
89f6b2a2bec3 MUC: Measure cache hits and misses
Kim Alvefur <zash@zash.se>
parents: 8925
diff changeset
250 room_miss();
7370
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
251 return restore_room(room_jid);
6109
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
252 end
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
253
9626
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
254 local function set_room_defaults(room, lang)
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
255 room:set_public(module:get_option_boolean("muc_room_default_public", false));
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
256 room:set_persistent(module:get_option_boolean("muc_room_default_persistent", room:get_persistent()));
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
257 room:set_members_only(module:get_option_boolean("muc_room_default_members_only", room:get_members_only()));
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
258 room:set_allow_member_invites(module:get_option_boolean("muc_room_default_allow_member_invites",
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
259 room:get_allow_member_invites()));
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
260 room:set_moderated(module:get_option_boolean("muc_room_default_moderated", room:get_moderated()));
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
261 room:set_whois(module:get_option_boolean("muc_room_default_public_jids",
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
262 room:get_whois() == "anyone") and "anyone" or "moderators");
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
263 room:set_changesubject(module:get_option_boolean("muc_room_default_change_subject", room:get_changesubject()));
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
264 room:set_historylength(module:get_option_number("muc_room_default_history_length", room:get_historylength()));
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
265 room:set_language(lang or module:get_option_string("muc_room_default_language"));
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
266 end
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
267
8875
be3230b42f12 MUC: Allow passing config to public create_room API
Kim Alvefur <zash@zash.se>
parents: 8870
diff changeset
268 function create_room(room_jid, config)
7641
5eef792bb2e1 MUC: Restore modern version of public create_room() function removed in dfaacf042cfe
Kim Alvefur <zash@zash.se>
parents: 7536
diff changeset
269 local exists = get_room_from_jid(room_jid);
5eef792bb2e1 MUC: Restore modern version of public create_room() function removed in dfaacf042cfe
Kim Alvefur <zash@zash.se>
parents: 7536
diff changeset
270 if exists then
5eef792bb2e1 MUC: Restore modern version of public create_room() function removed in dfaacf042cfe
Kim Alvefur <zash@zash.se>
parents: 7536
diff changeset
271 return nil, "room-exists";
5eef792bb2e1 MUC: Restore modern version of public create_room() function removed in dfaacf042cfe
Kim Alvefur <zash@zash.se>
parents: 7536
diff changeset
272 end
8875
be3230b42f12 MUC: Allow passing config to public create_room API
Kim Alvefur <zash@zash.se>
parents: 8870
diff changeset
273 local room = muclib.new_room(room_jid, config);
9626
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
274 if not config then
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
275 set_room_defaults(room);
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
276 end
7641
5eef792bb2e1 MUC: Restore modern version of public create_room() function removed in dfaacf042cfe
Kim Alvefur <zash@zash.se>
parents: 7536
diff changeset
277 module:fire_event("muc-room-created", {
5eef792bb2e1 MUC: Restore modern version of public create_room() function removed in dfaacf042cfe
Kim Alvefur <zash@zash.se>
parents: 7536
diff changeset
278 room = room;
5eef792bb2e1 MUC: Restore modern version of public create_room() function removed in dfaacf042cfe
Kim Alvefur <zash@zash.se>
parents: 7536
diff changeset
279 });
8877
9182398c64b9 MUC: Track rooms created via internal public API
Kim Alvefur <zash@zash.se>
parents: 8875
diff changeset
280 return track_room(room);
5210
862a6fae05e7 MUC: Expose create_room(jid).
Waqas Hussain <waqas20@gmail.com>
parents: 5195
diff changeset
281 end
862a6fae05e7 MUC: Expose create_room(jid).
Waqas Hussain <waqas20@gmail.com>
parents: 5195
diff changeset
282
9050
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9049
diff changeset
283 function all_rooms()
7370
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
284 return coroutine.wrap(function ()
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
285 local seen = {}; -- Don't iterate over persistent rooms twice
9050
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9049
diff changeset
286 for room in live_rooms() do
7370
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
287 coroutine.yield(room);
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
288 seen[room.jid] = true;
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
289 end
8662
a4e63b037a2a MUC: Catch and log error in case of storage failure in iterator over rooms
Kim Alvefur <zash@zash.se>
parents: 8661
diff changeset
290 local all_persistent_rooms, err = persistent_rooms_storage:get(nil);
a4e63b037a2a MUC: Catch and log error in case of storage failure in iterator over rooms
Kim Alvefur <zash@zash.se>
parents: 8661
diff changeset
291 if not all_persistent_rooms then
a4e63b037a2a MUC: Catch and log error in case of storage failure in iterator over rooms
Kim Alvefur <zash@zash.se>
parents: 8661
diff changeset
292 if err then
a4e63b037a2a MUC: Catch and log error in case of storage failure in iterator over rooms
Kim Alvefur <zash@zash.se>
parents: 8661
diff changeset
293 module:log("error", "Error loading list of persistent rooms, only rooms live in memory were iterated over");
a4e63b037a2a MUC: Catch and log error in case of storage failure in iterator over rooms
Kim Alvefur <zash@zash.se>
parents: 8661
diff changeset
294 module:log("debug", "%s", debug.traceback(err));
a4e63b037a2a MUC: Catch and log error in case of storage failure in iterator over rooms
Kim Alvefur <zash@zash.se>
parents: 8661
diff changeset
295 end
a4e63b037a2a MUC: Catch and log error in case of storage failure in iterator over rooms
Kim Alvefur <zash@zash.se>
parents: 8661
diff changeset
296 return nil;
a4e63b037a2a MUC: Catch and log error in case of storage failure in iterator over rooms
Kim Alvefur <zash@zash.se>
parents: 8661
diff changeset
297 end
a4e63b037a2a MUC: Catch and log error in case of storage failure in iterator over rooms
Kim Alvefur <zash@zash.se>
parents: 8661
diff changeset
298 for room_jid in pairs(all_persistent_rooms) do
7403
d6e6e21057f0 MUC: Correctly iterate over suspended rooms while excluding live rooms
Kim Alvefur <zash@zash.se>
parents: 7372
diff changeset
299 if not seen[room_jid] then
6479
d016437e01bf plugins/muc/mod_muc: Add 'local_only' flag to mod_muc, so rooms don't get restored on shutdown
daurnimator <quae@daurnimator.com>
parents: 6372
diff changeset
300 local room = restore_room(room_jid);
8657
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8656
diff changeset
301 if room then
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8656
diff changeset
302 coroutine.yield(room);
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8656
diff changeset
303 else
6479
d016437e01bf plugins/muc/mod_muc: Add 'local_only' flag to mod_muc, so rooms don't get restored on shutdown
daurnimator <quae@daurnimator.com>
parents: 6372
diff changeset
304 module:log("error", "Missing data for room '%s', omitting from iteration", room_jid);
d016437e01bf plugins/muc/mod_muc: Add 'local_only' flag to mod_muc, so rooms don't get restored on shutdown
daurnimator <quae@daurnimator.com>
parents: 6372
diff changeset
305 end
6238
b2b523d21891 plugins/muc/mod_muc: Move room persistence to own block
daurnimator <quae@daurnimator.com>
parents: 6237
diff changeset
306 end
b2b523d21891 plugins/muc/mod_muc: Move room persistence to own block
daurnimator <quae@daurnimator.com>
parents: 6237
diff changeset
307 end
7370
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
308 end);
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
309 end
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
310
9050
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9049
diff changeset
311 function live_rooms()
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9049
diff changeset
312 return rooms:values();
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9049
diff changeset
313 end
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9049
diff changeset
314
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9049
diff changeset
315 function each_room(live_only)
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9049
diff changeset
316 if live_only then
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9049
diff changeset
317 return live_rooms();
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9049
diff changeset
318 end
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9049
diff changeset
319 return all_rooms();
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9049
diff changeset
320 end
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9049
diff changeset
321
5691
18a115beeebe mod_muc: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5659
diff changeset
322 module:hook("host-disco-items", function(event)
18a115beeebe mod_muc: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5659
diff changeset
323 local reply = event.reply;
18a115beeebe mod_muc: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5659
diff changeset
324 module:log("debug", "host-disco-items called");
7371
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
325 if next(room_items_cache) ~= nil then
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
326 for jid, room_name in pairs(room_items_cache) do
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
327 reply:tag("item", { jid = jid, name = room_name }):up();
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
328 end
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
329 else
9050
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9049
diff changeset
330 for room in all_rooms() do
7371
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
331 if not room:get_hidden() then
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
332 local jid, room_name = room.jid, room:get_name();
7404
57ca4dcd91a7 MUC: Use correct room name variable, fixes traceback (thanks mathieui)
Kim Alvefur <zash@zash.se>
parents: 7403
diff changeset
333 room_items_cache[jid] = room_name;
7371
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
334 reply:tag("item", { jid = jid, name = room_name }):up();
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
335 end
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
336 end
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
337 end
5691
18a115beeebe mod_muc: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5659
diff changeset
338 end);
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
339
8867
c601c834bf01 MUC: Add support for setting MUC room defaults from the config file
Kim Alvefur <zash@zash.se>
parents: 8865
diff changeset
340 module:hook("muc-room-pre-create", function (event)
9626
4d3ab7153153 MUC: Use defaults from config in create_room() if no config provided
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
341 set_room_defaults(event.room, event.stanza.attr["xml:lang"]);
8867
c601c834bf01 MUC: Add support for setting MUC room defaults from the config file
Kim Alvefur <zash@zash.se>
parents: 8865
diff changeset
342 end, 1);
c601c834bf01 MUC: Add support for setting MUC room defaults from the config file
Kim Alvefur <zash@zash.se>
parents: 8865
diff changeset
343
8660
3b54f8472b51 MUC: Return error if unable to keep track of room due to storage failure
Kim Alvefur <zash@zash.se>
parents: 8659
diff changeset
344 module:hook("muc-room-pre-create", function(event)
4370
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
345 local origin, stanza = event.origin, event.stanza;
8660
3b54f8472b51 MUC: Return error if unable to keep track of room due to storage failure
Kim Alvefur <zash@zash.se>
parents: 8659
diff changeset
346 if not track_room(event.room) then
3b54f8472b51 MUC: Return error if unable to keep track of room due to storage failure
Kim Alvefur <zash@zash.se>
parents: 8659
diff changeset
347 origin.send(st.error_reply(stanza, "wait", "resource-constraint"));
3b54f8472b51 MUC: Return error if unable to keep track of room due to storage failure
Kim Alvefur <zash@zash.se>
parents: 8659
diff changeset
348 return true;
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
349 end
6244
dfaacf042cfe plugins/muc/mod_muc: Remove attempt_room_creation and create_room function. Instead have a 'track_room' function called from the end of the pre-create hook, and just create an un-tracked room object when we get a presence
daurnimator <quae@daurnimator.com>
parents: 6243
diff changeset
350 end, -1000);
dfaacf042cfe plugins/muc/mod_muc: Remove attempt_room_creation and create_room function. Instead have a 'track_room' function called from the end of the pre-create hook, and just create an un-tracked room object when we get a presence
daurnimator <quae@daurnimator.com>
parents: 6243
diff changeset
351
6109
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
352 module:hook("muc-room-destroyed",function(event)
7370
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
353 local room = event.room;
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
354 forget_room(room);
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
355 delete_room(room);
0ebc7ff1fff5 MUC: Switch to util.cache for storing rooms, store rooms to disk on eviction
Kim Alvefur <zash@zash.se>
parents: 7367
diff changeset
356 end);
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
357
9015
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
358 if module:get_option_boolean("muc_tombstones", true) then
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
359
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
360 local ttl = module:get_option_number("muc_tombstone_expiry", 86400 * 31);
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
361
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
362 module:hook("muc-room-destroyed",function(event)
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
363 local room = event.room;
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
364 if not room:get_persistent() then return end
9093
04a284c5b88b MUC: Allow destruction of tombstones (eg via telnet or adhoc command)
Kim Alvefur <zash@zash.se>
parents: 9081
diff changeset
365 if room._data.destroyed then
04a284c5b88b MUC: Allow destruction of tombstones (eg via telnet or adhoc command)
Kim Alvefur <zash@zash.se>
parents: 9081
diff changeset
366 return -- Allow destruction of tombstone
04a284c5b88b MUC: Allow destruction of tombstones (eg via telnet or adhoc command)
Kim Alvefur <zash@zash.se>
parents: 9081
diff changeset
367 end
9015
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
368
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
369 local tombstone = new_room(room.jid, {
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
370 locked = os.time() + ttl;
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
371 destroyed = true;
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
372 reason = event.reason;
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
373 newjid = event.newjid;
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
374 -- password?
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
375 });
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
376 tombstone.save = room_save;
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
377 tombstone:set_persistent(true);
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
378 tombstone:set_hidden(true);
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
379 tombstone:save(true);
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
380 return true;
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
381 end, -10);
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
382 end
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
383
6243
b7c95e9c13de plugins/muc/mod_muc: Move `restrict_room_creation` into own area. now uses pre-create hook
daurnimator <quae@daurnimator.com>
parents: 6241
diff changeset
384 do
b7c95e9c13de plugins/muc/mod_muc: Move `restrict_room_creation` into own area. now uses pre-create hook
daurnimator <quae@daurnimator.com>
parents: 6241
diff changeset
385 local restrict_room_creation = module:get_option("restrict_room_creation");
b7c95e9c13de plugins/muc/mod_muc: Move `restrict_room_creation` into own area. now uses pre-create hook
daurnimator <quae@daurnimator.com>
parents: 6241
diff changeset
386 if restrict_room_creation == true then
b7c95e9c13de plugins/muc/mod_muc: Move `restrict_room_creation` into own area. now uses pre-create hook
daurnimator <quae@daurnimator.com>
parents: 6241
diff changeset
387 restrict_room_creation = "admin";
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
388 end
6243
b7c95e9c13de plugins/muc/mod_muc: Move `restrict_room_creation` into own area. now uses pre-create hook
daurnimator <quae@daurnimator.com>
parents: 6241
diff changeset
389 if restrict_room_creation then
b7c95e9c13de plugins/muc/mod_muc: Move `restrict_room_creation` into own area. now uses pre-create hook
daurnimator <quae@daurnimator.com>
parents: 6241
diff changeset
390 local host_suffix = module.host:gsub("^[^%.]+%.", "");
b7c95e9c13de plugins/muc/mod_muc: Move `restrict_room_creation` into own area. now uses pre-create hook
daurnimator <quae@daurnimator.com>
parents: 6241
diff changeset
391 module:hook("muc-room-pre-create", function(event)
6328
93fb28851d9e mod_muc: Fix use of undefined global. Fixes #431.
Matthew Wild <mwild1@gmail.com>
parents: 6276
diff changeset
392 local origin, stanza = event.origin, event.stanza;
93fb28851d9e mod_muc: Fix use of undefined global. Fixes #431.
Matthew Wild <mwild1@gmail.com>
parents: 6276
diff changeset
393 local user_jid = stanza.attr.from;
6243
b7c95e9c13de plugins/muc/mod_muc: Move `restrict_room_creation` into own area. now uses pre-create hook
daurnimator <quae@daurnimator.com>
parents: 6241
diff changeset
394 if not is_admin(user_jid) and not (
b7c95e9c13de plugins/muc/mod_muc: Move `restrict_room_creation` into own area. now uses pre-create hook
daurnimator <quae@daurnimator.com>
parents: 6241
diff changeset
395 restrict_room_creation == "local" and
b7c95e9c13de plugins/muc/mod_muc: Move `restrict_room_creation` into own area. now uses pre-create hook
daurnimator <quae@daurnimator.com>
parents: 6241
diff changeset
396 select(2, jid_split(user_jid)) == host_suffix
b7c95e9c13de plugins/muc/mod_muc: Move `restrict_room_creation` into own area. now uses pre-create hook
daurnimator <quae@daurnimator.com>
parents: 6241
diff changeset
397 ) then
8180
67a9ff352271 MUC: Include a human-readable message when denying room creation because of restrict_room_creation
Kim Alvefur <zash@zash.se>
parents: 8179
diff changeset
398 origin.send(st.error_reply(stanza, "cancel", "not-allowed", "Room creation is restricted"));
6243
b7c95e9c13de plugins/muc/mod_muc: Move `restrict_room_creation` into own area. now uses pre-create hook
daurnimator <quae@daurnimator.com>
parents: 6241
diff changeset
399 return true;
8705
1d66f66a13c9 MUC: Don't reply to errors with more errors (fixes #1122)
Kim Alvefur <zash@zash.se>
parents: 8704
diff changeset
400 end
6243
b7c95e9c13de plugins/muc/mod_muc: Move `restrict_room_creation` into own area. now uses pre-create hook
daurnimator <quae@daurnimator.com>
parents: 6241
diff changeset
401 end);
4370
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
402 end
1780
668ce0a2050d MUC: Added a send() method to the component. Fixes issues with local mod_vcard.
Waqas Hussain <waqas20@gmail.com>
parents: 1767
diff changeset
403 end
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
404
6109
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
405 for event_name, method in pairs {
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
406 -- Normal room interactions
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
407 ["iq-get/bare/http://jabber.org/protocol/disco#info:query"] = "handle_disco_info_get_query" ;
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
408 ["iq-get/bare/http://jabber.org/protocol/disco#items:query"] = "handle_disco_items_get_query" ;
6141
bf6de8ef66c2 plugins/muc: Rename admin query hook
daurnimator <quae@daurnimator.com>
parents: 6129
diff changeset
409 ["iq-set/bare/http://jabber.org/protocol/muc#admin:query"] = "handle_admin_query_set_command" ;
bf6de8ef66c2 plugins/muc: Rename admin query hook
daurnimator <quae@daurnimator.com>
parents: 6129
diff changeset
410 ["iq-get/bare/http://jabber.org/protocol/muc#admin:query"] = "handle_admin_query_get_command" ;
6109
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
411 ["iq-set/bare/http://jabber.org/protocol/muc#owner:query"] = "handle_owner_query_set_to_room" ;
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
412 ["iq-get/bare/http://jabber.org/protocol/muc#owner:query"] = "handle_owner_query_get_to_room" ;
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
413 ["message/bare"] = "handle_message_to_room" ;
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
414 ["presence/bare"] = "handle_presence_to_room" ;
9240
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents: 9237
diff changeset
415 ["iq/bare/jabber:iq:register:query"] = "handle_register_iq";
6109
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
416 -- Host room
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
417 ["iq-get/host/http://jabber.org/protocol/disco#info:query"] = "handle_disco_info_get_query" ;
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
418 ["iq-get/host/http://jabber.org/protocol/disco#items:query"] = "handle_disco_items_get_query" ;
6141
bf6de8ef66c2 plugins/muc: Rename admin query hook
daurnimator <quae@daurnimator.com>
parents: 6129
diff changeset
419 ["iq-set/host/http://jabber.org/protocol/muc#admin:query"] = "handle_admin_query_set_command" ;
bf6de8ef66c2 plugins/muc: Rename admin query hook
daurnimator <quae@daurnimator.com>
parents: 6129
diff changeset
420 ["iq-get/host/http://jabber.org/protocol/muc#admin:query"] = "handle_admin_query_get_command" ;
6109
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
421 ["iq-set/host/http://jabber.org/protocol/muc#owner:query"] = "handle_owner_query_set_to_room" ;
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
422 ["iq-get/host/http://jabber.org/protocol/muc#owner:query"] = "handle_owner_query_get_to_room" ;
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
423 ["message/host"] = "handle_message_to_room" ;
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
424 ["presence/host"] = "handle_presence_to_room" ;
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
425 -- Direct to occupant (normal rooms and host room)
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
426 ["presence/full"] = "handle_presence_to_occupant" ;
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
427 ["iq/full"] = "handle_iq_to_occupant" ;
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
428 ["message/full"] = "handle_message_to_occupant" ;
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
429 } do
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
430 module:hook(event_name, function (event)
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
431 local origin, stanza = event.origin, event.stanza;
6244
dfaacf042cfe plugins/muc/mod_muc: Remove attempt_room_creation and create_room function. Instead have a 'track_room' function called from the end of the pre-create hook, and just create an un-tracked room object when we get a presence
daurnimator <quae@daurnimator.com>
parents: 6243
diff changeset
432 local room_jid = jid_bare(stanza.attr.to);
dfaacf042cfe plugins/muc/mod_muc: Remove attempt_room_creation and create_room function. Instead have a 'track_room' function called from the end of the pre-create hook, and just create an un-tracked room object when we get a presence
daurnimator <quae@daurnimator.com>
parents: 6243
diff changeset
433 local room = get_room_from_jid(room_jid);
9015
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
434
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
435 if room and room._data.destroyed then
9081
ce57c69a20e2 MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents: 9079
diff changeset
436 if room._data.locked < os.time()
ce57c69a20e2 MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents: 9079
diff changeset
437 or (is_admin(stanza.attr.from) and stanza.name == "presence" and stanza.attr.type == nil) then
9048
c58be87e62d0 MUC: Return 'gone' error for destroyed rooms in other cases than attempted join
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
438 -- Allow the room to be recreated by admin or after time has passed
c58be87e62d0 MUC: Return 'gone' error for destroyed rooms in other cases than attempted join
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
439 delete_room(room);
c58be87e62d0 MUC: Return 'gone' error for destroyed rooms in other cases than attempted join
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
440 room = nil;
c58be87e62d0 MUC: Return 'gone' error for destroyed rooms in other cases than attempted join
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
441 else
c58be87e62d0 MUC: Return 'gone' error for destroyed rooms in other cases than attempted join
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
442 if stanza.attr.type ~= "error" then
9018
73320e33762d MUC: Send an 'gone' error instead of unavailable + <destroyed>
Kim Alvefur <zash@zash.se>
parents: 9016
diff changeset
443 local reply = st.error_reply(stanza, "cancel", "gone", room._data.reason)
9019
d780c10709c1 MUC: Include redirect in 'gone' error for destroyed rooms
Kim Alvefur <zash@zash.se>
parents: 9018
diff changeset
444 if room._data.newjid then
d780c10709c1 MUC: Include redirect in 'gone' error for destroyed rooms
Kim Alvefur <zash@zash.se>
parents: 9018
diff changeset
445 local uri = "xmpp:"..room._data.newjid.."?join";
d780c10709c1 MUC: Include redirect in 'gone' error for destroyed rooms
Kim Alvefur <zash@zash.se>
parents: 9018
diff changeset
446 reply:get_child("error"):child_with_name("gone"):text(uri);
d780c10709c1 MUC: Include redirect in 'gone' error for destroyed rooms
Kim Alvefur <zash@zash.se>
parents: 9018
diff changeset
447 end
9015
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
448 event.origin.send(reply);
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
449 end
9048
c58be87e62d0 MUC: Return 'gone' error for destroyed rooms in other cases than attempted join
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
450 return true;
9015
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
451 end
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
452 end
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
453
6109
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
454 if room == nil then
6244
dfaacf042cfe plugins/muc/mod_muc: Remove attempt_room_creation and create_room function. Instead have a 'track_room' function called from the end of the pre-create hook, and just create an un-tracked room object when we get a presence
daurnimator <quae@daurnimator.com>
parents: 6243
diff changeset
455 -- Watch presence to create rooms
9647
0f43b901c854 MUC: Move check for explicit room join earlier in room creation flow
Kim Alvefur <zash@zash.se>
parents: 9626
diff changeset
456 if stanza.attr.type == nil and stanza.name == "presence" and stanza:get_child("x", "http://jabber.org/protocol/muc") then
6244
dfaacf042cfe plugins/muc/mod_muc: Remove attempt_room_creation and create_room function. Instead have a 'track_room' function called from the end of the pre-create hook, and just create an un-tracked room object when we get a presence
daurnimator <quae@daurnimator.com>
parents: 6243
diff changeset
457 room = muclib.new_room(room_jid);
7410
45f543c82893 MUC: Split out handling of the room-creating presence into its own method
Kim Alvefur <zash@zash.se>
parents: 7404
diff changeset
458 return room:handle_first_presence(origin, stanza);
7246
80923a1a8fe1 MUC: Don't reply to error stanzas with more error stanzas (thanks woffs)
Kim Alvefur <zash@zash.se>
parents: 7086
diff changeset
459 elseif stanza.attr.type ~= "error" then
8179
c5fa7fe3fd79 MUC: Return item-not-found for eg messages to non-existant rooms (changed in 566aba0482b6 for unknown reason)
Kim Alvefur <zash@zash.se>
parents: 8178
diff changeset
460 origin.send(st.error_reply(stanza, "cancel", "item-not-found"));
6244
dfaacf042cfe plugins/muc/mod_muc: Remove attempt_room_creation and create_room function. Instead have a 'track_room' function called from the end of the pre-create hook, and just create an un-tracked room object when we get a presence
daurnimator <quae@daurnimator.com>
parents: 6243
diff changeset
461 return true;
7246
80923a1a8fe1 MUC: Don't reply to error stanzas with more error stanzas (thanks woffs)
Kim Alvefur <zash@zash.se>
parents: 7086
diff changeset
462 else
80923a1a8fe1 MUC: Don't reply to error stanzas with more error stanzas (thanks woffs)
Kim Alvefur <zash@zash.se>
parents: 7086
diff changeset
463 return;
6244
dfaacf042cfe plugins/muc/mod_muc: Remove attempt_room_creation and create_room function. Instead have a 'track_room' function called from the end of the pre-create hook, and just create an un-tracked room object when we get a presence
daurnimator <quae@daurnimator.com>
parents: 6243
diff changeset
464 end
9221
6dc1aeefa876 MUC: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 9192
diff changeset
465 elseif room == false then -- Error loading room
6dc1aeefa876 MUC: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 9192
diff changeset
466 origin.send(st.error_reply(stanza, "wait", "resource-constraint"));
6dc1aeefa876 MUC: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 9192
diff changeset
467 return true;
5058
433cc9a4c7e9 MUC: Return <item-not-found/> on message and iq to non-existent rooms (thanks Maranda).
Waqas Hussain <waqas20@gmail.com>
parents: 5016
diff changeset
468 end
6109
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
469 return room[method](room, origin, stanza);
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
470 end, -2)
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
471 end
5062
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
472
6241
6b4ff34dc8ea plugins/muc/mod_muc: Use module:shared instead of save/restore
daurnimator <quae@daurnimator.com>
parents: 6240
diff changeset
473 function shutdown_component()
9050
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9049
diff changeset
474 for room in live_rooms() do
7414
1b62c89014c4 MUC: Separate force-save parameter from save-entire-state flag
Kim Alvefur <zash@zash.se>
parents: 7411
diff changeset
475 room:save(nil, true);
5062
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
476 end
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
477 end
7694
bffbea1187ca MUC: Run component shutdown after mod_c2s has closed its sessions (prevents ghosts)
Kim Alvefur <zash@zash.se>
parents: 7650
diff changeset
478 module:hook_global("server-stopping", shutdown_component, -300);
5692
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
479
6247
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
480 do -- Ad-hoc commands
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
481 module:depends "adhoc";
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
482 local t_concat = table.concat;
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
483 local adhoc_new = module:require "adhoc".new;
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
484 local adhoc_initial = require "util.adhoc".new_initial_data_form;
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
485 local array = require "util.array";
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
486 local dataforms_new = require "util.dataforms".new;
5692
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
487
6247
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
488 local destroy_rooms_layout = dataforms_new {
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
489 title = "Destroy rooms";
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
490 instructions = "Select the rooms to destroy";
5692
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
491
6247
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
492 { name = "FORM_TYPE", type = "hidden", value = "http://prosody.im/protocol/muc#destroy" };
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
493 { name = "rooms", type = "list-multi", required = true, label = "Rooms to destroy:"};
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
494 };
5692
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
495
6247
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
496 local destroy_rooms_handler = adhoc_initial(destroy_rooms_layout, function()
9050
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9049
diff changeset
497 return { rooms = array.collect(all_rooms()):pluck("jid"):sort(); };
6247
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
498 end, function(fields, errors)
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
499 if errors then
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
500 local errmsg = {};
7086
6cc7c9da29ed MUC: Rename variables to please luacheck
Kim Alvefur <zash@zash.se>
parents: 6800
diff changeset
501 for field, err in pairs(errors) do
6cc7c9da29ed MUC: Rename variables to please luacheck
Kim Alvefur <zash@zash.se>
parents: 6800
diff changeset
502 errmsg[#errmsg + 1] = field .. ": " .. err;
6247
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
503 end
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
504 return { status = "completed", error = { message = t_concat(errmsg, "\n") } };
5692
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
505 end
6247
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
506 for _, room in ipairs(fields.rooms) do
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
507 get_room_from_jid(room):destroy();
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
508 end
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
509 return { status = "completed", info = "The following rooms were destroyed:\n"..t_concat(fields.rooms, "\n") };
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
510 end);
9081
ce57c69a20e2 MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents: 9079
diff changeset
511 local destroy_rooms_desc = adhoc_new("Destroy Rooms",
ce57c69a20e2 MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents: 9079
diff changeset
512 "http://prosody.im/protocol/muc#destroy", destroy_rooms_handler, "admin");
5692
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
513
6247
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
514 module:provides("adhoc", destroy_rooms_desc);
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
515 end