author | Matthew Wild <mwild1@gmail.com> |
Fri, 13 Jul 2018 15:47:08 +0100 | |
changeset 9038 | 173c0e16e704 |
parent 9037 | 1c709e3d2e5e |
child 9688 | b2d6b79c9513 |
child 11132 | c3eefb517b7b |
permissions | -rw-r--r-- |
6224
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
1 |
-- Prosody IM |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
2 |
-- Copyright (C) 2008-2010 Matthew Wild |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
3 |
-- Copyright (C) 2008-2010 Waqas Hussain |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
4 |
-- Copyright (C) 2014 Daurnimator |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
5 |
-- |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
6 |
-- This project is MIT/X11 licensed. Please see the |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
7 |
-- COPYING file in the source package for more information. |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
8 |
-- |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
9 |
|
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
10 |
local st = require "util.stanza"; |
8932
415b2e9d8ba8
MUC: Record timestamp of subject changes and stamp delay tag later
Kim Alvefur <zash@zash.se>
parents:
8931
diff
changeset
|
11 |
local dt = require "util.datetime"; |
6224
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
12 |
|
6432
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
13 |
local muc_util = module:require "muc/util"; |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
14 |
local valid_roles = muc_util.valid_roles; |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
15 |
|
8933
2e45b1b47918
Backed out changeset d41f8ce67c8e
Kim Alvefur <zash@zash.se>
parents:
8932
diff
changeset
|
16 |
local function create_subject_message(from, subject) |
6224
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
17 |
return st.message({from = from; type = "groupchat"}) |
8609
b6b1f0f9b381
MUC: Use empty string if no subject provided (thanks pep+)
Matthew Wild <mwild1@gmail.com>
parents:
7404
diff
changeset
|
18 |
:tag("subject"):text(subject or ""):up(); |
6224
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
19 |
end |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
20 |
|
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
21 |
local function get_changesubject(room) |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
22 |
return room._data.changesubject; |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
23 |
end |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
24 |
|
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
25 |
local function set_changesubject(room, changesubject) |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
26 |
changesubject = changesubject and true or nil; |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
27 |
if get_changesubject(room) == changesubject then return false; end |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
28 |
room._data.changesubject = changesubject; |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
29 |
return true; |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
30 |
end |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
31 |
|
8851
402d8febfa43
MUC: Advertise in whether participants are allowed to change the subject (#1155)
Kim Alvefur <zash@zash.se>
parents:
8609
diff
changeset
|
32 |
module:hook("muc-disco#info", function (event) |
402d8febfa43
MUC: Advertise in whether participants are allowed to change the subject (#1155)
Kim Alvefur <zash@zash.se>
parents:
8609
diff
changeset
|
33 |
table.insert(event.form, { |
402d8febfa43
MUC: Advertise in whether participants are allowed to change the subject (#1155)
Kim Alvefur <zash@zash.se>
parents:
8609
diff
changeset
|
34 |
name = "muc#roominfo_changesubject"; |
402d8febfa43
MUC: Advertise in whether participants are allowed to change the subject (#1155)
Kim Alvefur <zash@zash.se>
parents:
8609
diff
changeset
|
35 |
type = "boolean"; |
402d8febfa43
MUC: Advertise in whether participants are allowed to change the subject (#1155)
Kim Alvefur <zash@zash.se>
parents:
8609
diff
changeset
|
36 |
}); |
402d8febfa43
MUC: Advertise in whether participants are allowed to change the subject (#1155)
Kim Alvefur <zash@zash.se>
parents:
8609
diff
changeset
|
37 |
event.formdata["muc#roominfo_changesubject"] = get_changesubject(event.room); |
402d8febfa43
MUC: Advertise in whether participants are allowed to change the subject (#1155)
Kim Alvefur <zash@zash.se>
parents:
8609
diff
changeset
|
38 |
end); |
402d8febfa43
MUC: Advertise in whether participants are allowed to change the subject (#1155)
Kim Alvefur <zash@zash.se>
parents:
8609
diff
changeset
|
39 |
|
6224
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
40 |
module:hook("muc-config-form", function(event) |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
41 |
table.insert(event.form, { |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
42 |
name = "muc#roomconfig_changesubject"; |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
43 |
type = "boolean"; |
9037
1c709e3d2e5e
MUC: Improve labels of all config form items
Matthew Wild <mwild1@gmail.com>
parents:
8933
diff
changeset
|
44 |
label = "Allow anyone to set the room's subject"; |
1c709e3d2e5e
MUC: Improve labels of all config form items
Matthew Wild <mwild1@gmail.com>
parents:
8933
diff
changeset
|
45 |
desc = "Choose whether anyone, or only moderators, may set the room's subject"; |
6224
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
46 |
value = get_changesubject(event.room); |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
47 |
}); |
9038
173c0e16e704
MUC: Add sections in room config form
Matthew Wild <mwild1@gmail.com>
parents:
9037
diff
changeset
|
48 |
end, 80-1); |
6224
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
49 |
|
6994
84e01dbb739e
MUC: Update all config form handlers to take advantage of the new per-option events
Matthew Wild <mwild1@gmail.com>
parents:
6432
diff
changeset
|
50 |
module:hook("muc-config-submitted/muc#roomconfig_changesubject", function(event) |
84e01dbb739e
MUC: Update all config form handlers to take advantage of the new per-option events
Matthew Wild <mwild1@gmail.com>
parents:
6432
diff
changeset
|
51 |
if set_changesubject(event.room, event.value) then |
6224
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
52 |
event.status_codes["104"] = true; |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
53 |
end |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
54 |
end); |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
55 |
|
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
56 |
local function get_subject(room) |
6228
4968d18e2c1e
plugins/muc/subject.lib: If subject is not set by an occupant, it should come from room jid itself
daurnimator <quae@daurnimator.com>
parents:
6224
diff
changeset
|
57 |
-- a <message/> stanza from the room JID (or from the occupant JID of the entity that set the subject) |
8933
2e45b1b47918
Backed out changeset d41f8ce67c8e
Kim Alvefur <zash@zash.se>
parents:
8932
diff
changeset
|
58 |
return room._data.subject_from or room.jid, room._data.subject; |
6224
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
59 |
end |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
60 |
|
8932
415b2e9d8ba8
MUC: Record timestamp of subject changes and stamp delay tag later
Kim Alvefur <zash@zash.se>
parents:
8931
diff
changeset
|
61 |
local function send_subject(room, to, time) |
6224
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
62 |
local msg = create_subject_message(get_subject(room)); |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
63 |
msg.attr.to = to; |
8932
415b2e9d8ba8
MUC: Record timestamp of subject changes and stamp delay tag later
Kim Alvefur <zash@zash.se>
parents:
8931
diff
changeset
|
64 |
if time then |
415b2e9d8ba8
MUC: Record timestamp of subject changes and stamp delay tag later
Kim Alvefur <zash@zash.se>
parents:
8931
diff
changeset
|
65 |
msg:tag("delay", { |
415b2e9d8ba8
MUC: Record timestamp of subject changes and stamp delay tag later
Kim Alvefur <zash@zash.se>
parents:
8931
diff
changeset
|
66 |
xmlns = "urn:xmpp:delay", |
415b2e9d8ba8
MUC: Record timestamp of subject changes and stamp delay tag later
Kim Alvefur <zash@zash.se>
parents:
8931
diff
changeset
|
67 |
from = room.jid, |
415b2e9d8ba8
MUC: Record timestamp of subject changes and stamp delay tag later
Kim Alvefur <zash@zash.se>
parents:
8931
diff
changeset
|
68 |
stamp = dt.datetime(time); |
415b2e9d8ba8
MUC: Record timestamp of subject changes and stamp delay tag later
Kim Alvefur <zash@zash.se>
parents:
8931
diff
changeset
|
69 |
}):up(); |
415b2e9d8ba8
MUC: Record timestamp of subject changes and stamp delay tag later
Kim Alvefur <zash@zash.se>
parents:
8931
diff
changeset
|
70 |
end |
6224
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
71 |
room:route_stanza(msg); |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
72 |
end |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
73 |
|
8933
2e45b1b47918
Backed out changeset d41f8ce67c8e
Kim Alvefur <zash@zash.se>
parents:
8932
diff
changeset
|
74 |
local function set_subject(room, from, subject) |
6224
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
75 |
if subject == "" then subject = nil; end |
8933
2e45b1b47918
Backed out changeset d41f8ce67c8e
Kim Alvefur <zash@zash.se>
parents:
8932
diff
changeset
|
76 |
local old_from, old_subject = get_subject(room); |
6224
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
77 |
if old_subject == subject and old_from == from then return false; end |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
78 |
room._data.subject_from = from; |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
79 |
room._data.subject = subject; |
8932
415b2e9d8ba8
MUC: Record timestamp of subject changes and stamp delay tag later
Kim Alvefur <zash@zash.se>
parents:
8931
diff
changeset
|
80 |
room._data.subject_time = os.time(); |
8933
2e45b1b47918
Backed out changeset d41f8ce67c8e
Kim Alvefur <zash@zash.se>
parents:
8932
diff
changeset
|
81 |
local msg = create_subject_message(from, subject); |
6224
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
82 |
room:broadcast_message(msg); |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
83 |
return true; |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
84 |
end |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
85 |
|
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
86 |
-- Send subject to joining user |
6277
f2c9c36979b3
plugins/muc: Fix use of incorrect event on occupant join
daurnimator <quae@daurnimator.com>
parents:
6228
diff
changeset
|
87 |
module:hook("muc-occupant-session-new", function(event) |
8932
415b2e9d8ba8
MUC: Record timestamp of subject changes and stamp delay tag later
Kim Alvefur <zash@zash.se>
parents:
8931
diff
changeset
|
88 |
send_subject(event.room, event.stanza.attr.from, event.room._data.subject_time); |
6224
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
89 |
end, 20); |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
90 |
|
6432
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
91 |
-- Prosody has made the decision that messages with <subject/> are exclusively subject changes |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
92 |
-- e.g. body will be ignored; even if the subject change was not allowed |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
93 |
module:hook("muc-occupant-groupchat", function(event) |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
94 |
local stanza = event.stanza; |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
95 |
local subject = stanza:get_child("subject"); |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
96 |
if subject then |
7368
2d502878b784
MUC/subject: Fix reference to room for save call (self, not room)
Kim Alvefur <zash@zash.se>
parents:
7360
diff
changeset
|
97 |
local room = event.room; |
6432
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
98 |
local occupant = event.occupant; |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
99 |
-- Role check for subject changes |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
100 |
local role_rank = valid_roles[occupant and occupant.role or "none"]; |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
101 |
if role_rank >= valid_roles.moderator or |
7368
2d502878b784
MUC/subject: Fix reference to room for save call (self, not room)
Kim Alvefur <zash@zash.se>
parents:
7360
diff
changeset
|
102 |
( role_rank >= valid_roles.participant and get_changesubject(room) ) then -- and participant |
8933
2e45b1b47918
Backed out changeset d41f8ce67c8e
Kim Alvefur <zash@zash.se>
parents:
8932
diff
changeset
|
103 |
set_subject(room, occupant.nick, subject:get_text()); |
7360
d69521003e91
MUC: Save room after subject is changed
Kim Alvefur <zash@zash.se>
parents:
7356
diff
changeset
|
104 |
room:save(); |
6432
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
105 |
return true; |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
106 |
else |
8853
26f1a49fa9c0
MUC: Include a human-readable error message when not allowed to change subject
Kim Alvefur <zash@zash.se>
parents:
8852
diff
changeset
|
107 |
event.origin.send(st.error_reply(stanza, "auth", "forbidden", "You are not allowed to change the subject")); |
6432
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
108 |
return true; |
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
109 |
end |
6224
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
110 |
end |
6432
675aea867574
plugins/muc: Add muc-occupant-groupchat event
daurnimator <quae@daurnimator.com>
parents:
6277
diff
changeset
|
111 |
end, 20); |
6224
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
112 |
|
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
113 |
return { |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
114 |
get_changesubject = get_changesubject; |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
115 |
set_changesubject = set_changesubject; |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
116 |
get = get_subject; |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
117 |
set = set_subject; |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
118 |
send = send_subject; |
2a9aff163545
plugins/muc: Move subject code to seperate module
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
119 |
}; |