Software /
code /
prosody
Comparison
plugins/muc/muc.lib.lua @ 6224:2a9aff163545
plugins/muc: Move subject code to seperate module
author | daurnimator <quae@daurnimator.com> |
---|---|
date | Wed, 16 Apr 2014 13:54:51 -0400 |
parent | 6223:2a7ce69844ca |
child | 6225:12537f1c1fec |
comparison
equal
deleted
inserted
replaced
6223:2a7ce69844ca | 6224:2a9aff163545 |
---|---|
294 reply:tag("item", {jid = room_jid, name = room_jid:match("/(.*)")}):up(); | 294 reply:tag("item", {jid = room_jid, name = room_jid:match("/(.*)")}):up(); |
295 end | 295 end |
296 return reply; | 296 return reply; |
297 end | 297 end |
298 | 298 |
299 function room_mt:get_subject() | |
300 return self._data.subject_from, self._data.subject; | |
301 end | |
302 local function create_subject_message(from, subject) | |
303 return st.message({from = from; type = "groupchat"}) | |
304 :tag('subject'):text(subject):up(); | |
305 end | |
306 function room_mt:send_subject(to) | |
307 local msg = create_subject_message(self:get_subject()); | |
308 msg.attr.to = to; | |
309 self:route_stanza(msg); | |
310 end | |
311 function room_mt:set_subject(current_nick, subject) | |
312 if subject == "" then subject = nil; end | |
313 self._data['subject'] = subject; | |
314 self._data['subject_from'] = current_nick; | |
315 if self.save then self:save(); end | |
316 local msg = create_subject_message(current_nick, subject); | |
317 self:broadcast_message(msg); | |
318 return true; | |
319 end | |
320 | |
321 function room_mt:handle_kickable(origin, stanza) | 299 function room_mt:handle_kickable(origin, stanza) |
322 local real_jid = stanza.attr.from; | 300 local real_jid = stanza.attr.from; |
323 local occupant = self:get_occupant_by_real_jid(real_jid); | 301 local occupant = self:get_occupant_by_real_jid(real_jid); |
324 if occupant == nil then return nil; end | 302 if occupant == nil then return nil; end |
325 local type, condition, text = stanza:get_error(); | 303 local type, condition, text = stanza:get_error(); |
360 return not self:get_hidden(); | 338 return not self:get_hidden(); |
361 end | 339 end |
362 function room_mt:set_public(public) | 340 function room_mt:set_public(public) |
363 return self:set_hidden(not public); | 341 return self:set_hidden(not public); |
364 end | 342 end |
365 function room_mt:set_changesubject(changesubject) | |
366 changesubject = changesubject and true or nil; | |
367 if self._data.changesubject ~= changesubject then | |
368 self._data.changesubject = changesubject; | |
369 if self.save then self:save(true); end | |
370 end | |
371 end | |
372 function room_mt:get_changesubject() | |
373 return self._data.changesubject; | |
374 end | |
375 | 343 |
376 -- Give the room creator owner affiliation | 344 -- Give the room creator owner affiliation |
377 module:hook("muc-room-pre-create", function(event) | 345 module:hook("muc-room-pre-create", function(event) |
378 event.room:set_affiliation(true, jid_bare(event.stanza.attr.from), "owner"); | 346 event.room:set_affiliation(true, jid_bare(event.stanza.attr.from), "owner"); |
379 end, -1); | 347 end, -1); |
397 event.room:send_occupant_list(real_jid, function(nick, occupant) | 365 event.room:send_occupant_list(real_jid, function(nick, occupant) |
398 -- Don't include self | 366 -- Don't include self |
399 return occupant:get_presence(real_jid) == nil; | 367 return occupant:get_presence(real_jid) == nil; |
400 end); | 368 end); |
401 end, 80); | 369 end, 80); |
402 | |
403 -- Send subject to joining user | |
404 module:hook("muc-occupant-joined", function(event) | |
405 event.room:send_subject(event.stanza.attr.from); | |
406 end, 20); | |
407 | 370 |
408 function room_mt:handle_presence_to_occupant(origin, stanza) | 371 function room_mt:handle_presence_to_occupant(origin, stanza) |
409 local type = stanza.attr.type; | 372 local type = stanza.attr.type; |
410 if type == "error" then -- error, kick em out! | 373 if type == "error" then -- error, kick em out! |
411 return self:handle_kickable(origin, stanza) | 374 return self:handle_kickable(origin, stanza) |
666 value = not event.room:get_hidden() | 629 value = not event.room:get_hidden() |
667 }); | 630 }); |
668 end); | 631 end); |
669 module:hook("muc-config-form", function(event) | 632 module:hook("muc-config-form", function(event) |
670 table.insert(event.form, { | 633 table.insert(event.form, { |
671 name = 'muc#roomconfig_changesubject', | |
672 type = 'boolean', | |
673 label = 'Allow Occupants to Change Subject?', | |
674 value = event.room:get_changesubject() | |
675 }); | |
676 end); | |
677 module:hook("muc-config-form", function(event) | |
678 table.insert(event.form, { | |
679 name = 'muc#roomconfig_moderatedroom', | 634 name = 'muc#roomconfig_moderatedroom', |
680 type = 'boolean', | 635 type = 'boolean', |
681 label = 'Make Room Moderated?', | 636 label = 'Make Room Moderated?', |
682 value = event.room:get_moderated() | 637 value = event.room:get_moderated() |
683 }); | 638 }); |
726 module:hook("muc-config-submitted", function(event) | 681 module:hook("muc-config-submitted", function(event) |
727 event.update_option("moderated", "muc#roomconfig_moderatedroom"); | 682 event.update_option("moderated", "muc#roomconfig_moderatedroom"); |
728 end); | 683 end); |
729 module:hook("muc-config-submitted", function(event) | 684 module:hook("muc-config-submitted", function(event) |
730 event.update_option("public", "muc#roomconfig_publicroom"); | 685 event.update_option("public", "muc#roomconfig_publicroom"); |
731 end); | |
732 module:hook("muc-config-submitted", function(event) | |
733 event.update_option("changesubject", "muc#roomconfig_changesubject"); | |
734 end); | 686 end); |
735 | 687 |
736 -- Removes everyone from the room | 688 -- Removes everyone from the room |
737 function room_mt:clear(x) | 689 function room_mt:clear(x) |
738 x = x or st.stanza("x", {xmlns='http://jabber.org/protocol/muc#user'}); | 690 x = x or st.stanza("x", {xmlns='http://jabber.org/protocol/muc#user'}); |
875 else | 827 else |
876 origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); | 828 origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); |
877 return true; | 829 return true; |
878 end | 830 end |
879 end | 831 end |
880 | |
881 module:hook("muc-subject-change", function(event) | |
882 local room, stanza = event.room, event.stanza; | |
883 local occupant = room:get_occupant_by_real_jid(stanza.attr.from); | |
884 if occupant.role == "moderator" or | |
885 ( occupant.role == "participant" and room:get_changesubject() ) then -- and participant | |
886 local subject = stanza:get_child_text("subject"); | |
887 room:set_subject(occupant.nick, subject); | |
888 else | |
889 event.origin.send(st.error_reply(stanza, "auth", "forbidden")); | |
890 end | |
891 return true; | |
892 end); | |
893 | 832 |
894 function room_mt:handle_groupchat_to_room(origin, stanza) | 833 function room_mt:handle_groupchat_to_room(origin, stanza) |
895 -- Prosody has made the decision that messages with <subject/> are exclusively subject changes | 834 -- Prosody has made the decision that messages with <subject/> are exclusively subject changes |
896 -- e.g. body will be ignored; even if the subject change was not allowed | 835 -- e.g. body will be ignored; even if the subject change was not allowed |
897 if stanza:get_child("subject") then | 836 if stanza:get_child("subject") then |
1202 | 1141 |
1203 local persistent = module:require "muc/persistent"; | 1142 local persistent = module:require "muc/persistent"; |
1204 room_mt.get_persistent = persistent.get; | 1143 room_mt.get_persistent = persistent.get; |
1205 room_mt.set_persistent = persistent.set; | 1144 room_mt.set_persistent = persistent.set; |
1206 | 1145 |
1146 local subject = module:require "muc/subject"; | |
1147 room_mt.get_changesubject = subject.get_changesubject; | |
1148 room_mt.set_changesubject = subject.set_changesubject; | |
1149 room_mt.get_subject = subject.get; | |
1150 room_mt.set_subject = subject.set; | |
1151 room_mt.send_subject = subject.send; | |
1152 | |
1207 local history = module:require "muc/history"; | 1153 local history = module:require "muc/history"; |
1208 room_mt.send_history = history.send; | 1154 room_mt.send_history = history.send; |
1209 room_mt.get_historylength = history.get_length; | 1155 room_mt.get_historylength = history.get_length; |
1210 room_mt.set_historylength = history.set_length; | 1156 room_mt.set_historylength = history.set_length; |
1211 | 1157 |