Annotate

plugins/muc/mod_muc.lua @ 9382:31a2be28729c

net.server_epoll: Protect from errors in get{peer,sock}name
author Kim Alvefur <zash@zash.se>
date Wed, 26 Sep 2018 13:52:10 +0200
parent 9240:f9a83aca4421
child 9626:4d3ab7153153
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
8875
be3230b42f12 MUC: Allow passing config to public create_room API
Kim Alvefur <zash@zash.se>
parents: 8870
diff changeset
254 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
255 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
256 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
257 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
258 end
8875
be3230b42f12 MUC: Allow passing config to public create_room API
Kim Alvefur <zash@zash.se>
parents: 8870
diff changeset
259 local room = muclib.new_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
260 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
261 room = room;
5eef792bb2e1 MUC: Restore modern version of public create_room() function removed in dfaacf042cfe
Kim Alvefur <zash@zash.se>
parents: 7536
diff changeset
262 });
8877
9182398c64b9 MUC: Track rooms created via internal public API
Kim Alvefur <zash@zash.se>
parents: 8875
diff changeset
263 return track_room(room);
5210
862a6fae05e7 MUC: Expose create_room(jid).
Waqas Hussain <waqas20@gmail.com>
parents: 5195
diff changeset
264 end
862a6fae05e7 MUC: Expose create_room(jid).
Waqas Hussain <waqas20@gmail.com>
parents: 5195
diff changeset
265
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
266 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
267 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
268 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
269 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
270 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
271 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
272 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
273 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
274 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
275 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
276 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
277 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
278 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
279 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
280 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
281 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
282 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
283 local room = restore_room(room_jid);
8657
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8656
diff changeset
284 if room then
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8656
diff changeset
285 coroutine.yield(room);
a804f2e75f10 MUC: Prevent room eviction on storage failure
Kim Alvefur <zash@zash.se>
parents: 8656
diff changeset
286 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
287 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
288 end
6238
b2b523d21891 plugins/muc/mod_muc: Move room persistence to own block
daurnimator <quae@daurnimator.com>
parents: 6237
diff changeset
289 end
b2b523d21891 plugins/muc/mod_muc: Move room persistence to own block
daurnimator <quae@daurnimator.com>
parents: 6237
diff changeset
290 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
291 end);
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
292 end
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
293
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
294 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
295 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
296 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
297
f5c43e829d93 MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
Matthew Wild <mwild1@gmail.com>
parents: 9049
diff changeset
298 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
299 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
300 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
301 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
302 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
303 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
304
5691
18a115beeebe mod_muc: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5659
diff changeset
305 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
306 local reply = event.reply;
18a115beeebe mod_muc: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5659
diff changeset
307 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
308 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
309 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
310 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
311 end
d5ba0dec0c95 MUC: Cache public rooms and their names to speed up disco#items
Kim Alvefur <zash@zash.se>
parents: 7370
diff changeset
312 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
313 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
314 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
315 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
316 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
317 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
318 end
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
319 end
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
320 end
5691
18a115beeebe mod_muc: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5659
diff changeset
321 end);
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
322
8867
c601c834bf01 MUC: Add support for setting MUC room defaults from the config file
Kim Alvefur <zash@zash.se>
parents: 8865
diff changeset
323 module:hook("muc-room-pre-create", function (event)
c601c834bf01 MUC: Add support for setting MUC room defaults from the config file
Kim Alvefur <zash@zash.se>
parents: 8865
diff changeset
324 local room = event.room;
8870
dd0291aa3393 MUC: Fix Ooo (thanks pep.)
Kim Alvefur <zash@zash.se>
parents: 8869
diff changeset
325 room:set_public(module:get_option_boolean("muc_room_default_public", false));
dd0291aa3393 MUC: Fix Ooo (thanks pep.)
Kim Alvefur <zash@zash.se>
parents: 8869
diff changeset
326 room:set_persistent(module:get_option_boolean("muc_room_default_persistent", room:get_persistent()));
dd0291aa3393 MUC: Fix Ooo (thanks pep.)
Kim Alvefur <zash@zash.se>
parents: 8869
diff changeset
327 room:set_members_only(module:get_option_boolean("muc_room_default_members_only", room:get_members_only()));
9081
ce57c69a20e2 MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents: 9079
diff changeset
328 room:set_allow_member_invites(module:get_option_boolean("muc_room_default_allow_member_invites",
ce57c69a20e2 MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents: 9079
diff changeset
329 room:get_allow_member_invites()));
8870
dd0291aa3393 MUC: Fix Ooo (thanks pep.)
Kim Alvefur <zash@zash.se>
parents: 8869
diff changeset
330 room:set_moderated(module:get_option_boolean("muc_room_default_moderated", room:get_moderated()));
9081
ce57c69a20e2 MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents: 9079
diff changeset
331 room:set_whois(module:get_option_boolean("muc_room_default_public_jids",
ce57c69a20e2 MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents: 9079
diff changeset
332 room:get_whois() == "anyone") and "anyone" or "moderators");
8870
dd0291aa3393 MUC: Fix Ooo (thanks pep.)
Kim Alvefur <zash@zash.se>
parents: 8869
diff changeset
333 room:set_changesubject(module:get_option_boolean("muc_room_default_change_subject", room:get_changesubject()));
8867
c601c834bf01 MUC: Add support for setting MUC room defaults from the config file
Kim Alvefur <zash@zash.se>
parents: 8865
diff changeset
334 room:set_historylength(module:get_option_number("muc_room_default_history_length", room:get_historylength()));
8868
b9e56f46916e MUC: Use xml:lang from stanza that creates a room as default for language
Kim Alvefur <zash@zash.se>
parents: 8867
diff changeset
335 room:set_language(event.stanza.attr["xml:lang"] or module:get_option_string("muc_room_default_language"));
8867
c601c834bf01 MUC: Add support for setting MUC room defaults from the config file
Kim Alvefur <zash@zash.se>
parents: 8865
diff changeset
336 end, 1);
c601c834bf01 MUC: Add support for setting MUC room defaults from the config file
Kim Alvefur <zash@zash.se>
parents: 8865
diff changeset
337
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
338 module:hook("muc-room-pre-create", function(event)
4370
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
339 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
340 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
341 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
342 return true;
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
343 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
344 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
345
6109
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
346 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
347 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
348 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
349 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
350 end);
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
351
9015
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
352 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
353
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
354 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
355
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
356 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
357 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
358 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
359 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
360 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
361 end
9015
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
362
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
363 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
364 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
365 destroyed = true;
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
366 reason = event.reason;
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
367 newjid = event.newjid;
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
368 -- password?
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
369 });
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
370 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
371 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
372 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
373 tombstone:save(true);
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
374 return true;
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
375 end, -10);
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
376 end
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
377
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
378 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
379 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
380 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
381 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
382 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
383 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
384 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
385 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
386 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
387 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
388 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
389 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
390 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
391 ) 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
392 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
393 return true;
8705
1d66f66a13c9 MUC: Don't reply to errors with more errors (fixes #1122)
Kim Alvefur <zash@zash.se>
parents: 8704
diff changeset
394 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
395 end);
4370
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
396 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
397 end
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
398
6109
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
399 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
400 -- Normal room interactions
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
401 ["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
402 ["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
403 ["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
404 ["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
405 ["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
406 ["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
407 ["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
408 ["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
409 ["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
410 -- Host room
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
411 ["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
412 ["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
413 ["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
414 ["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
415 ["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
416 ["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
417 ["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
418 ["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
419 -- 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
420 ["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
421 ["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
422 ["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
423 } do
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
424 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
425 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
426 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
427 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
428
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
429 if room and room._data.destroyed then
9081
ce57c69a20e2 MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents: 9079
diff changeset
430 if room._data.locked < os.time()
ce57c69a20e2 MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents: 9079
diff changeset
431 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
432 -- 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
433 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
434 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
435 else
c58be87e62d0 MUC: Return 'gone' error for destroyed rooms in other cases than attempted join
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
436 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
437 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
438 if room._data.newjid then
d780c10709c1 MUC: Include redirect in 'gone' error for destroyed rooms
Kim Alvefur <zash@zash.se>
parents: 9018
diff changeset
439 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
440 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
441 end
9015
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
442 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
443 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
444 return true;
9015
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
445 end
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
446 end
dc606dc89f44 MUC: Add support for storing a tombstone for destroyed rooms (#1182)
Kim Alvefur <zash@zash.se>
parents: 9013
diff changeset
447
6109
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
448 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
449 -- Watch presence to create rooms
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
450 if stanza.attr.type == nil and stanza.name == "presence" then
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
451 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
452 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
453 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
454 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
455 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
456 else
80923a1a8fe1 MUC: Don't reply to error stanzas with more error stanzas (thanks woffs)
Kim Alvefur <zash@zash.se>
parents: 7086
diff changeset
457 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
458 end
9221
6dc1aeefa876 MUC: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 9192
diff changeset
459 elseif room == false then -- Error loading room
6dc1aeefa876 MUC: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 9192
diff changeset
460 origin.send(st.error_reply(stanza, "wait", "resource-constraint"));
6dc1aeefa876 MUC: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 9192
diff changeset
461 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
462 end
6109
566aba0482b6 plugins/muc/mod_muc: Refactor to use new methods available
daurnimator <quae@daurnimator.com>
parents: 6091
diff changeset
463 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
464 end, -2)
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
465 end
5062
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
466
6241
6b4ff34dc8ea plugins/muc/mod_muc: Use module:shared instead of save/restore
daurnimator <quae@daurnimator.com>
parents: 6240
diff changeset
467 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
468 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
469 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
470 end
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
471 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
472 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
473
6247
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
474 do -- Ad-hoc commands
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
475 module:depends "adhoc";
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
476 local t_concat = table.concat;
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
477 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
478 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
479 local array = require "util.array";
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
480 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
481
6247
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
482 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
483 title = "Destroy rooms";
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
484 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
485
6247
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
486 { 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
487 { 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
488 };
5692
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
489
6247
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
490 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
491 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
492 end, function(fields, errors)
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
493 if errors then
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
494 local errmsg = {};
7086
6cc7c9da29ed MUC: Rename variables to please luacheck
Kim Alvefur <zash@zash.se>
parents: 6800
diff changeset
495 for field, err in pairs(errors) do
6cc7c9da29ed MUC: Rename variables to please luacheck
Kim Alvefur <zash@zash.se>
parents: 6800
diff changeset
496 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
497 end
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
498 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
499 end
6247
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
500 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
501 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
502 end
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
503 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
504 end);
9081
ce57c69a20e2 MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents: 9079
diff changeset
505 local destroy_rooms_desc = adhoc_new("Destroy Rooms",
ce57c69a20e2 MUC: Split long lines [luacheck strict]
Kim Alvefur <zash@zash.se>
parents: 9079
diff changeset
506 "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
507
6247
851647eb6657 plugins/muc/mod_muc: Place adhoc section into own scope
daurnimator <quae@daurnimator.com>
parents: 6246
diff changeset
508 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
509 end