Annotate

plugins/muc/mod_muc.lua @ 5877:615a0774e4cc

util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
author Waqas Hussain <waqas20@gmail.com>
date Wed, 30 Oct 2013 17:44:42 -0400
parent 5808:026367992a0f
child 5939:56d81af64fc5
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
5807
d7212bd61b60 mod_muc: Import util.array
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
9 local array = require "util.array";
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
10
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
11 if module:get_host_type() ~= "component" then
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
12 error("MUC should be loaded as a component, please see http://prosody.im/doc/components", 0);
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
13 end
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
14
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
15 local muc_host = module:get_host();
2028
4f33100195a0 MUC: Added 'name' config option, for specifying the component's name in disco responses.
Waqas Hussain <waqas20@gmail.com>
parents: 1781
diff changeset
16 local muc_name = module:get_option("name");
4f33100195a0 MUC: Added 'name' config option, for specifying the component's name in disco responses.
Waqas Hussain <waqas20@gmail.com>
parents: 1781
diff changeset
17 if type(muc_name) ~= "string" then muc_name = "Prosody Chatrooms"; end
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
18 local restrict_room_creation = module:get_option("restrict_room_creation");
3575
bc3dfc00da5d MUC: Allow restricting room creation to local JIDs (thanks thomas.mangin).
Waqas Hussain <waqas20@gmail.com>
parents: 3560
diff changeset
19 if restrict_room_creation then
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5692
diff changeset
20 if restrict_room_creation == true then
3575
bc3dfc00da5d MUC: Allow restricting room creation to local JIDs (thanks thomas.mangin).
Waqas Hussain <waqas20@gmail.com>
parents: 3560
diff changeset
21 restrict_room_creation = "admin";
bc3dfc00da5d MUC: Allow restricting room creation to local JIDs (thanks thomas.mangin).
Waqas Hussain <waqas20@gmail.com>
parents: 3560
diff changeset
22 elseif restrict_room_creation ~= "admin" and restrict_room_creation ~= "local" then
bc3dfc00da5d MUC: Allow restricting room creation to local JIDs (thanks thomas.mangin).
Waqas Hussain <waqas20@gmail.com>
parents: 3560
diff changeset
23 restrict_room_creation = nil;
bc3dfc00da5d MUC: Allow restricting room creation to local JIDs (thanks thomas.mangin).
Waqas Hussain <waqas20@gmail.com>
parents: 3560
diff changeset
24 end
bc3dfc00da5d MUC: Allow restricting room creation to local JIDs (thanks thomas.mangin).
Waqas Hussain <waqas20@gmail.com>
parents: 3560
diff changeset
25 end
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
26 local lock_rooms = module:get_option_boolean("muc_room_locking", false);
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
27 local lock_room_timeout = module:get_option_number("muc_room_lock_timeout", 300);
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
28
5064
7a1eb302c562 MUC: Give host and server admins "owner" affiliation in all rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 5062
diff changeset
29 local muclib = module:require "muc";
7a1eb302c562 MUC: Give host and server admins "owner" affiliation in all rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 5062
diff changeset
30 local muc_new_room = muclib.new_room;
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
31 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
32 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
33 local st = require "util.stanza";
1741
2919f3b985fc MUC: Added support for generating unique room names
Waqas Hussain <waqas20@gmail.com>
parents: 1738
diff changeset
34 local uuid_gen = require "util.uuid".generate;
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
35 local um_is_admin = require "core.usermanager".is_admin;
5376
ba9be0be4bbb MUC: Access prosody.hosts instead of the old global hosts
Kim Alvefur <zash@zash.se>
parents: 5335
diff changeset
36 local hosts = prosody.hosts;
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
37
3576
8d8ce17b83ca MUC: Expose the rooms table as a global 'rooms'.
Waqas Hussain <waqas20@gmail.com>
parents: 3575
diff changeset
38 rooms = {};
8d8ce17b83ca MUC: Expose the rooms table as a global 'rooms'.
Waqas Hussain <waqas20@gmail.com>
parents: 3575
diff changeset
39 local rooms = rooms;
5500
eeea0eb2602a mod_auth_internal_hashed, mod_auth_internal_plain, mod_privacy, mod_private, mod_register, mod_vcard, mod_muc: Use module:open_store()
Kim Alvefur <zash@zash.se>
parents: 5376
diff changeset
40 local persistent_rooms_storage = module:open_store("persistent");
eeea0eb2602a mod_auth_internal_hashed, mod_auth_internal_plain, mod_privacy, mod_private, mod_register, mod_vcard, mod_muc: Use module:open_store()
Kim Alvefur <zash@zash.se>
parents: 5376
diff changeset
41 local persistent_rooms = persistent_rooms_storage:get() or {};
eeea0eb2602a mod_auth_internal_hashed, mod_auth_internal_plain, mod_privacy, mod_private, mod_register, mod_vcard, mod_muc: Use module:open_store()
Kim Alvefur <zash@zash.se>
parents: 5376
diff changeset
42 local room_configs = module:open_store("config");
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
43
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
44 -- Configurable options
5195
ce5d7538ac48 muc: Make max_history_messages simply a service-wide config option, and don't store it per-room (rooms still have their own history_message, but this is a global limit)
Matthew Wild <mwild1@gmail.com>
parents: 5074
diff changeset
45 muclib.set_max_history_length(module:get_option_number("max_history_messages"));
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
46
5691
18a115beeebe mod_muc: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5659
diff changeset
47 module:depends("disco");
18a115beeebe mod_muc: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5659
diff changeset
48 module:add_identity("conference", "text", muc_name);
18a115beeebe mod_muc: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5659
diff changeset
49 module:add_feature("http://jabber.org/protocol/muc");
18a115beeebe mod_muc: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5659
diff changeset
50
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
51 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
52 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
53 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
54
5064
7a1eb302c562 MUC: Give host and server admins "owner" affiliation in all rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 5062
diff changeset
55 local _set_affiliation = muc_new_room.room_mt.set_affiliation;
7a1eb302c562 MUC: Give host and server admins "owner" affiliation in all rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 5062
diff changeset
56 local _get_affiliation = muc_new_room.room_mt.get_affiliation;
7a1eb302c562 MUC: Give host and server admins "owner" affiliation in all rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 5062
diff changeset
57 function muclib.room_mt:get_affiliation(jid)
7a1eb302c562 MUC: Give host and server admins "owner" affiliation in all rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 5062
diff changeset
58 if is_admin(jid) then return "owner"; end
7a1eb302c562 MUC: Give host and server admins "owner" affiliation in all rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 5062
diff changeset
59 return _get_affiliation(self, jid);
7a1eb302c562 MUC: Give host and server admins "owner" affiliation in all rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 5062
diff changeset
60 end
7a1eb302c562 MUC: Give host and server admins "owner" affiliation in all rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 5062
diff changeset
61 function muclib.room_mt:set_affiliation(actor, jid, affiliation, callback, reason)
5074
a87afeea8b48 mod_muc: Fix syntax error (thanks Florob)
Matthew Wild <mwild1@gmail.com>
parents: 5064
diff changeset
62 if is_admin(jid) then return nil, "modify", "not-acceptable"; end
5064
7a1eb302c562 MUC: Give host and server admins "owner" affiliation in all rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 5062
diff changeset
63 return _set_affiliation(self, actor, jid, affiliation, callback, reason);
7a1eb302c562 MUC: Give host and server admins "owner" affiliation in all rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 5062
diff changeset
64 end
7a1eb302c562 MUC: Give host and server admins "owner" affiliation in all rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 5062
diff changeset
65
5015
f19b38bfa015 mod_muc: Use module:send() instead of core_*_stanza()
Kim Alvefur <zash@zash.se>
parents: 4924
diff changeset
66 local function room_route_stanza(room, stanza) module:send(stanza); end
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
67 local function room_save(room, forced)
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
68 local node = jid_split(room.jid);
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
69 persistent_rooms[room.jid] = room._data.persistent;
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
70 if room._data.persistent then
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
71 local history = room._data.history;
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
72 room._data.history = nil;
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
73 local data = {
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
74 jid = room.jid;
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
75 _data = room._data;
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
76 _affiliations = room._affiliations;
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
77 };
5500
eeea0eb2602a mod_auth_internal_hashed, mod_auth_internal_plain, mod_privacy, mod_private, mod_register, mod_vcard, mod_muc: Use module:open_store()
Kim Alvefur <zash@zash.se>
parents: 5376
diff changeset
78 room_configs:set(node, data);
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
79 room._data.history = history;
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
80 elseif forced then
5500
eeea0eb2602a mod_auth_internal_hashed, mod_auth_internal_plain, mod_privacy, mod_private, mod_register, mod_vcard, mod_muc: Use module:open_store()
Kim Alvefur <zash@zash.se>
parents: 5376
diff changeset
81 room_configs:set(node, nil);
4260
403aba5e49d5 mod_muc: Remove room from memory when it is made non-persistent and is empty
Matthew Wild <mwild1@gmail.com>
parents: 3675
diff changeset
82 if not next(room._occupants) then -- Room empty
403aba5e49d5 mod_muc: Remove room from memory when it is made non-persistent and is empty
Matthew Wild <mwild1@gmail.com>
parents: 3675
diff changeset
83 rooms[room.jid] = nil;
403aba5e49d5 mod_muc: Remove room from memory when it is made non-persistent and is empty
Matthew Wild <mwild1@gmail.com>
parents: 3675
diff changeset
84 end
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
85 end
5500
eeea0eb2602a mod_auth_internal_hashed, mod_auth_internal_plain, mod_privacy, mod_private, mod_register, mod_vcard, mod_muc: Use module:open_store()
Kim Alvefur <zash@zash.se>
parents: 5376
diff changeset
86 if forced then persistent_rooms_storage:set(nil, persistent_rooms); end
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
87 end
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
88
5210
862a6fae05e7 MUC: Expose create_room(jid).
Waqas Hussain <waqas20@gmail.com>
parents: 5195
diff changeset
89 function create_room(jid)
862a6fae05e7 MUC: Expose create_room(jid).
Waqas Hussain <waqas20@gmail.com>
parents: 5195
diff changeset
90 local room = muc_new_room(jid);
862a6fae05e7 MUC: Expose create_room(jid).
Waqas Hussain <waqas20@gmail.com>
parents: 5195
diff changeset
91 room.route_stanza = room_route_stanza;
862a6fae05e7 MUC: Expose create_room(jid).
Waqas Hussain <waqas20@gmail.com>
parents: 5195
diff changeset
92 room.save = room_save;
862a6fae05e7 MUC: Expose create_room(jid).
Waqas Hussain <waqas20@gmail.com>
parents: 5195
diff changeset
93 rooms[jid] = 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
94 if lock_rooms then
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
95 room.locked = true;
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
96 if lock_room_timeout and lock_room_timeout > 0 then
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
97 module:add_timer(lock_room_timeout, function ()
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
98 if room.locked then
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
99 room:destroy(); -- Not unlocked in time
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
100 end
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
101 end);
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
102 end
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
103 end
5577
8b09b0d068d4 mod_muc: Fire muc-room-created and muc-room-destroyed events (thanks nik)
Matthew Wild <mwild1@gmail.com>
parents: 5500
diff changeset
104 module:fire_event("muc-room-created", { room = room });
5210
862a6fae05e7 MUC: Expose create_room(jid).
Waqas Hussain <waqas20@gmail.com>
parents: 5195
diff changeset
105 return room;
862a6fae05e7 MUC: Expose create_room(jid).
Waqas Hussain <waqas20@gmail.com>
parents: 5195
diff changeset
106 end
862a6fae05e7 MUC: Expose create_room(jid).
Waqas Hussain <waqas20@gmail.com>
parents: 5195
diff changeset
107
4924
d8b9fe5900a2 MUC: Handle missing persistent room data.
Waqas Hussain <waqas20@gmail.com>
parents: 4528
diff changeset
108 local persistent_errors = false;
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
109 for jid in pairs(persistent_rooms) do
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
110 local node = jid_split(jid);
5500
eeea0eb2602a mod_auth_internal_hashed, mod_auth_internal_plain, mod_privacy, mod_private, mod_register, mod_vcard, mod_muc: Use module:open_store()
Kim Alvefur <zash@zash.se>
parents: 5376
diff changeset
111 local data = room_configs:get(node);
4924
d8b9fe5900a2 MUC: Handle missing persistent room data.
Waqas Hussain <waqas20@gmail.com>
parents: 4528
diff changeset
112 if data then
5210
862a6fae05e7 MUC: Expose create_room(jid).
Waqas Hussain <waqas20@gmail.com>
parents: 5195
diff changeset
113 local room = create_room(jid);
4924
d8b9fe5900a2 MUC: Handle missing persistent room data.
Waqas Hussain <waqas20@gmail.com>
parents: 4528
diff changeset
114 room._data = data._data;
d8b9fe5900a2 MUC: Handle missing persistent room data.
Waqas Hussain <waqas20@gmail.com>
parents: 4528
diff changeset
115 room._affiliations = data._affiliations;
d8b9fe5900a2 MUC: Handle missing persistent room data.
Waqas Hussain <waqas20@gmail.com>
parents: 4528
diff changeset
116 else -- missing room data
d8b9fe5900a2 MUC: Handle missing persistent room data.
Waqas Hussain <waqas20@gmail.com>
parents: 4528
diff changeset
117 persistent_rooms[jid] = nil;
d8b9fe5900a2 MUC: Handle missing persistent room data.
Waqas Hussain <waqas20@gmail.com>
parents: 4528
diff changeset
118 module:log("error", "Missing data for room '%s', removing from persistent room list", jid);
d8b9fe5900a2 MUC: Handle missing persistent room data.
Waqas Hussain <waqas20@gmail.com>
parents: 4528
diff changeset
119 persistent_errors = true;
d8b9fe5900a2 MUC: Handle missing persistent room data.
Waqas Hussain <waqas20@gmail.com>
parents: 4528
diff changeset
120 end
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
121 end
5500
eeea0eb2602a mod_auth_internal_hashed, mod_auth_internal_plain, mod_privacy, mod_private, mod_register, mod_vcard, mod_muc: Use module:open_store()
Kim Alvefur <zash@zash.se>
parents: 5376
diff changeset
122 if persistent_errors then persistent_rooms_storage:set(nil, persistent_rooms); end
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
123
5195
ce5d7538ac48 muc: Make max_history_messages simply a service-wide config option, and don't store it per-room (rooms still have their own history_message, but this is a global limit)
Matthew Wild <mwild1@gmail.com>
parents: 5074
diff changeset
124 local host_room = muc_new_room(muc_host);
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
125 host_room.route_stanza = room_route_stanza;
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
126 host_room.save = room_save;
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
127
5691
18a115beeebe mod_muc: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5659
diff changeset
128 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
129 local reply = event.reply;
18a115beeebe mod_muc: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5659
diff changeset
130 module:log("debug", "host-disco-items called");
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
131 for jid, room in pairs(rooms) do
5580
db5d1a350cc7 mod_muc: Refactor config form handling, and allow for clients to submit incomplete forms. Fixes #246
Matthew Wild <mwild1@gmail.com>
parents: 5577
diff changeset
132 if not room:get_hidden() then
3510
711eb5bf94b4 MUC: Make the room node be the default room name (thanks Zash).
Waqas Hussain <waqas20@gmail.com>
parents: 3388
diff changeset
133 reply:tag("item", {jid=jid, name=room:get_name()}):up();
1754
67b66eec9777 MUC: Added support for room configuration forms, persistence and hidden rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1748
diff changeset
134 end
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
135 end
5691
18a115beeebe mod_muc: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5659
diff changeset
136 end);
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
137
4370
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
138 local function handle_to_domain(event)
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
139 local origin, stanza = event.origin, event.stanza;
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
140 local type = stanza.attr.type;
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
141 if type == "error" or type == "result" then return; end
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
142 if stanza.name == "iq" and type == "get" then
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
143 local xmlns = stanza.tags[1].attr.xmlns;
5335
bb81c13d2c6f MUC: Always return <service-unavailable/> when a node is present in service discovery requests.
Waqas Hussain <waqas20@gmail.com>
parents: 5210
diff changeset
144 local node = stanza.tags[1].attr.node;
5691
18a115beeebe mod_muc: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5659
diff changeset
145 if xmlns == "http://jabber.org/protocol/muc#unique" then
1741
2919f3b985fc MUC: Added support for generating unique room names
Waqas Hussain <waqas20@gmail.com>
parents: 1738
diff changeset
146 origin.send(st.reply(stanza):tag("unique", {xmlns = xmlns}):text(uuid_gen())); -- FIXME Random UUIDs can theoretically have collisions
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
147 else
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
148 origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); -- TODO disco/etc
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
149 end
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
150 else
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
151 host_room:handle_stanza(origin, stanza);
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
152 --origin.send(st.error_reply(stanza, "cancel", "service-unavailable", "The muc server doesn't deal with messages and presence directed at it"));
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
153 end
4370
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
154 return true;
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
155 end
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
156
3560
fb49b63e3fe2 MUC: Use events for hooking stanzas instead of the component stanza handler.
Waqas Hussain <waqas20@gmail.com>
parents: 3510
diff changeset
157 function stanza_handler(event)
fb49b63e3fe2 MUC: Use events for hooking stanzas instead of the component stanza handler.
Waqas Hussain <waqas20@gmail.com>
parents: 3510
diff changeset
158 local origin, stanza = event.origin, event.stanza;
4370
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
159 local bare = jid_bare(stanza.attr.to);
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
160 local room = rooms[bare];
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
161 if not room then
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
162 if stanza.name ~= "presence" then
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
163 origin.send(st.error_reply(stanza, "cancel", "item-not-found"));
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
164 return true;
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
165 end
4370
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
166 if not(restrict_room_creation) or
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
167 (restrict_room_creation == "admin" and is_admin(stanza.attr.from)) or
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
168 (restrict_room_creation == "local" and select(2, jid_split(stanza.attr.from)) == module.host:gsub("^[^%.]+%.", "")) then
5210
862a6fae05e7 MUC: Expose create_room(jid).
Waqas Hussain <waqas20@gmail.com>
parents: 5195
diff changeset
169 room = create_room(bare);
4370
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
170 end
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
171 end
4370
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
172 if room then
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
173 room:handle_stanza(origin, stanza);
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
174 if not next(room._occupants) and not persistent_rooms[room.jid] then -- empty, non-persistent room
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
175 rooms[bare] = nil; -- discard room
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
176 end
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
177 else
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
178 origin.send(st.error_reply(stanza, "cancel", "not-allowed"));
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
179 end
3589
1792610e169e MUC: Return true from the stanza handler to suppress error responses.
Waqas Hussain <waqas20@gmail.com>
parents: 3577
diff changeset
180 return true;
3560
fb49b63e3fe2 MUC: Use events for hooking stanzas instead of the component stanza handler.
Waqas Hussain <waqas20@gmail.com>
parents: 3510
diff changeset
181 end
3675
cd3a1ae596b4 MUC: Give stanza handlers a negative priority, to allow mod_iq to process them first.
Waqas Hussain <waqas20@gmail.com>
parents: 3628
diff changeset
182 module:hook("iq/bare", stanza_handler, -1);
cd3a1ae596b4 MUC: Give stanza handlers a negative priority, to allow mod_iq to process them first.
Waqas Hussain <waqas20@gmail.com>
parents: 3628
diff changeset
183 module:hook("message/bare", stanza_handler, -1);
cd3a1ae596b4 MUC: Give stanza handlers a negative priority, to allow mod_iq to process them first.
Waqas Hussain <waqas20@gmail.com>
parents: 3628
diff changeset
184 module:hook("presence/bare", stanza_handler, -1);
cd3a1ae596b4 MUC: Give stanza handlers a negative priority, to allow mod_iq to process them first.
Waqas Hussain <waqas20@gmail.com>
parents: 3628
diff changeset
185 module:hook("iq/full", stanza_handler, -1);
cd3a1ae596b4 MUC: Give stanza handlers a negative priority, to allow mod_iq to process them first.
Waqas Hussain <waqas20@gmail.com>
parents: 3628
diff changeset
186 module:hook("message/full", stanza_handler, -1);
cd3a1ae596b4 MUC: Give stanza handlers a negative priority, to allow mod_iq to process them first.
Waqas Hussain <waqas20@gmail.com>
parents: 3628
diff changeset
187 module:hook("presence/full", stanza_handler, -1);
4370
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
188 module:hook("iq/host", handle_to_domain, -1);
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
189 module:hook("message/host", handle_to_domain, -1);
be14f96290a4 MUC: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 4260
diff changeset
190 module:hook("presence/host", handle_to_domain, -1);
3560
fb49b63e3fe2 MUC: Use events for hooking stanzas instead of the component stanza handler.
Waqas Hussain <waqas20@gmail.com>
parents: 3510
diff changeset
191
3604
3e89f0509967 prosody: Removed all references to componentmanager from Prosody, except the main componentmanager file.
Waqas Hussain <waqas20@gmail.com>
parents: 3589
diff changeset
192 hosts[module.host].send = function(stanza) -- FIXME do a generic fix
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
193 if stanza.attr.type == "result" or stanza.attr.type == "error" then
5015
f19b38bfa015 mod_muc: Use module:send() instead of core_*_stanza()
Kim Alvefur <zash@zash.se>
parents: 4924
diff changeset
194 module:send(stanza);
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
195 else error("component.send only supports result and error stanzas at the moment"); end
668ce0a2050d MUC: Added a send() method to the component. Fixes issues with local mod_vcard.
Waqas Hussain <waqas20@gmail.com>
parents: 1767
diff changeset
196 end
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
197
5016
56a0b13a3d42 mod_muc: Remove unused variable and pull hosts into a local
Kim Alvefur <zash@zash.se>
parents: 5015
diff changeset
198 hosts[module:get_host()].muc = { rooms = rooms };
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
199
5062
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
200 local saved = false;
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
201 module.save = function()
5062
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
202 saved = true;
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
203 return {rooms = rooms};
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
204 end
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
205 module.restore = function(data)
1748
f4c50c75af6f MUC: Fixed stanza routing for reloaded rooms.
Waqas Hussain <waqas20@gmail.com>
parents: 1747
diff changeset
206 for jid, oldroom in pairs(data.rooms or {}) do
5210
862a6fae05e7 MUC: Expose create_room(jid).
Waqas Hussain <waqas20@gmail.com>
parents: 5195
diff changeset
207 local room = create_room(jid);
1747
28e5f6b535a8 MUC: Added support for reloading MUC library code.
Waqas Hussain <waqas20@gmail.com>
parents: 1741
diff changeset
208 room._jid_nick = oldroom._jid_nick;
28e5f6b535a8 MUC: Added support for reloading MUC library code.
Waqas Hussain <waqas20@gmail.com>
parents: 1741
diff changeset
209 room._occupants = oldroom._occupants;
28e5f6b535a8 MUC: Added support for reloading MUC library code.
Waqas Hussain <waqas20@gmail.com>
parents: 1741
diff changeset
210 room._data = oldroom._data;
28e5f6b535a8 MUC: Added support for reloading MUC library code.
Waqas Hussain <waqas20@gmail.com>
parents: 1741
diff changeset
211 room._affiliations = oldroom._affiliations;
28e5f6b535a8 MUC: Added support for reloading MUC library code.
Waqas Hussain <waqas20@gmail.com>
parents: 1741
diff changeset
212 end
5016
56a0b13a3d42 mod_muc: Remove unused variable and pull hosts into a local
Kim Alvefur <zash@zash.se>
parents: 5015
diff changeset
213 hosts[module:get_host()].muc = { rooms = rooms };
1738
ee4a7151ed07 MUC: New basic mod_muc based on the new MUC library
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
214 end
5062
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
215
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
216 function shutdown_room(room, stanza)
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
217 for nick, occupant in pairs(room._occupants) do
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
218 stanza.attr.from = nick;
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
219 for jid in pairs(occupant.sessions) do
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
220 stanza.attr.to = jid;
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
221 room:_route_stanza(stanza);
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
222 room._jid_nick[jid] = nil;
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
223 end
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
224 room._occupants[nick] = nil;
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
225 end
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
226 end
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
227 function shutdown_component()
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
228 if not saved then
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
229 local stanza = st.presence({type = "unavailable"})
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
230 :tag("x", {xmlns = "http://jabber.org/protocol/muc#user"})
5659
9f9de8078164 mod_muc: Include status code 332 on service shutdown (thanks mathieui)
Matthew Wild <mwild1@gmail.com>
parents: 5580
diff changeset
231 :tag("item", { affiliation='none', role='none' }):up()
9f9de8078164 mod_muc: Include status code 332 on service shutdown (thanks mathieui)
Matthew Wild <mwild1@gmail.com>
parents: 5580
diff changeset
232 :tag("status", { code = "332"}):up();
5062
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
233 for roomjid, room in pairs(rooms) do
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
234 shutdown_room(room, stanza);
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
235 end
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
236 shutdown_room(host_room, stanza);
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
237 end
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
238 end
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
239 module.unload = shutdown_component;
88e198d65905 MUC: Send unavailable presence when the component or server is shutting down.
Waqas Hussain <waqas20@gmail.com>
parents: 5058
diff changeset
240 module:hook_global("server-stopping", shutdown_component);
5692
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
241
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
242 -- Ad-hoc commands
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
243 module:depends("adhoc")
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
244 local t_concat = table.concat;
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
245 local keys = require "util.iterators".keys;
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
246 local adhoc_new = module:require "adhoc".new;
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
247 local adhoc_initial = require "util.adhoc".new_initial_data_form;
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
248 local dataforms_new = require "util.dataforms".new;
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
249
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
250 local destroy_rooms_layout = dataforms_new {
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
251 title = "Destroy rooms";
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
252 instructions = "Select the rooms to destroy";
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
253
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
254 { name = "FORM_TYPE", type = "hidden", value = "http://prosody.im/protocol/muc#destroy" };
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
255 { name = "rooms", type = "list-multi", required = true, label = "Rooms to destroy:"};
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
256 };
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
257
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
258 local destroy_rooms_handler = adhoc_initial(destroy_rooms_layout, function()
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
259 return { rooms = array.collect(keys(rooms)):sort() };
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
260 end, function(fields, errors)
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
261 if errors then
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
262 local errmsg = {};
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
263 for name, err in pairs(errors) do
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
264 errmsg[#errmsg + 1] = name .. ": " .. err;
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
265 end
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
266 return { status = "completed", error = { message = t_concat(errmsg, "\n") } };
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
267 end
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
268 for _, room in ipairs(fields.rooms) do
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
269 rooms[room]:destroy();
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
270 rooms[room] = nil;
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
271 end
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
272 return { status = "completed", info = "The following rooms were destroyed:\n"..t_concat(fields.rooms, "\n") };
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
273 end);
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
274 local destroy_rooms_desc = adhoc_new("Destroy Rooms", "http://prosody.im/protocol/muc#destroy", destroy_rooms_handler, "admin");
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
275
24e7e58155d8 mod_muc: Add Ad-Hoc command to destroy MUC rooms
Florian Zeitz <florob@babelmonkeys.de>
parents: 5691
diff changeset
276 module:provides("adhoc", destroy_rooms_desc);