Software /
code /
prosody
Comparison
plugins/muc/lock.lib.lua @ 6206:f937bb5c83c3
plugins/muc: Move locking to seperate module
author | daurnimator <quae@daurnimator.com> |
---|---|
date | Wed, 02 Apr 2014 15:48:25 -0400 |
child | 6207:a5928fdeaf97 |
comparison
equal
deleted
inserted
replaced
6205:49dd381666f3 | 6206:f937bb5c83c3 |
---|---|
1 -- Prosody IM | |
2 -- Copyright (C) 2008-2010 Matthew Wild | |
3 -- Copyright (C) 2008-2010 Waqas Hussain | |
4 -- Copyright (C) 2014 Daurnimator | |
5 -- | |
6 -- This project is MIT/X11 licensed. Please see the | |
7 -- COPYING file in the source package for more information. | |
8 -- | |
9 | |
10 local lock_rooms = module:get_option_boolean("muc_room_locking", false); | |
11 local lock_room_timeout = module:get_option_number("muc_room_lock_timeout", 300); | |
12 | |
13 local function lock(room) | |
14 module:fire_event("muc-room-locked", {room = room;}); | |
15 room.locked = true; | |
16 end | |
17 local function unlock(room) | |
18 module:fire_event("muc-room-unlocked", {room = room;}); | |
19 room.locked = nil; | |
20 end | |
21 local function is_locked(room) | |
22 return not not room.locked; | |
23 end | |
24 | |
25 if lock_rooms then | |
26 module:hook("muc-room-created", function(event) | |
27 local room = event.room; | |
28 lock(room); | |
29 if lock_room_timeout and lock_room_timeout > 0 then | |
30 module:add_timer(lock_room_timeout, function () | |
31 if is_locked(room) then | |
32 room:destroy(); -- Not unlocked in time | |
33 end | |
34 end); | |
35 end | |
36 end); | |
37 end | |
38 | |
39 -- Older groupchat protocol doesn't lock | |
40 module:hook("muc-room-pre-create", function(event) | |
41 if is_locked(event.room) and not event.stanza:get_child("x", "http://jabber.org/protocol/muc") then | |
42 unlock(event.room); | |
43 end | |
44 end, 10); | |
45 | |
46 -- Don't let users into room while it is locked | |
47 module:hook("muc-occupant-pre-join", function(event) | |
48 if is_locked(event.room) then -- Deny entry | |
49 event.origin.send(st.error_reply(event.stanza, "cancel", "item-not-found")); | |
50 return true; | |
51 end | |
52 end, -30); | |
53 | |
54 -- When config is submitted; unlock the room | |
55 module:hook("muc-config-submitted", function(event) | |
56 if is_locked(event.room) then | |
57 unlock(event.room); | |
58 end | |
59 end, -1); | |
60 | |
61 return { | |
62 lock = lock; | |
63 unlock = unlock; | |
64 is_locked = is_locked; | |
65 }; |