Mercurial > prosody-hg
comparison plugins/muc/muc.lib.lua @ 6221:f321536afeec
plugins/muc/muc.lib: Move members_only into seperate file
| author | daurnimator <quae@daurnimator.com> |
|---|---|
| date | Fri, 04 Apr 2014 11:20:20 -0400 |
| parents | 4e7d205f49f7 |
| children | 355b29881117 |
comparison
equal
deleted
inserted
replaced
| 6220:4e7d205f49f7 | 6221:f321536afeec |
|---|---|
| 49 module:hook("muc-get-default-role", function(event) | 49 module:hook("muc-get-default-role", function(event) |
| 50 if event.affiliation_rank >= valid_affiliations.admin then | 50 if event.affiliation_rank >= valid_affiliations.admin then |
| 51 return "moderator"; | 51 return "moderator"; |
| 52 elseif event.affiliation_rank >= valid_affiliations.member then | 52 elseif event.affiliation_rank >= valid_affiliations.member then |
| 53 return "participant"; | 53 return "participant"; |
| 54 end | |
| 55 end); | |
| 56 module:hook("muc-get-default-role", function(event) | |
| 57 if not event.affiliation and event.room:get_members_only() then | |
| 58 return false; | |
| 59 end | 54 end |
| 60 end); | 55 end); |
| 61 module:hook("muc-get-default-role", function(event) | 56 module:hook("muc-get-default-role", function(event) |
| 62 if not event.affiliation then | 57 if not event.affiliation then |
| 63 return event.room:get_moderated() and "visitor" or "participant"; | 58 return event.room:get_moderated() and "visitor" or "participant"; |
| 284 end); | 279 end); |
| 285 module:hook("muc-disco#info", function(event) | 280 module:hook("muc-disco#info", function(event) |
| 286 event.reply:tag("feature", {var = event.room:get_moderated() and "muc_moderated" or "muc_unmoderated"}):up(); | 281 event.reply:tag("feature", {var = event.room:get_moderated() and "muc_moderated" or "muc_unmoderated"}):up(); |
| 287 end); | 282 end); |
| 288 module:hook("muc-disco#info", function(event) | 283 module:hook("muc-disco#info", function(event) |
| 289 event.reply:tag("feature", {var = event.room:get_members_only() and "muc_membersonly" or "muc_open"}):up(); | |
| 290 end); | |
| 291 module:hook("muc-disco#info", function(event) | |
| 292 event.reply:tag("feature", {var = event.room:get_persistent() and "muc_persistent" or "muc_temporary"}):up(); | 284 event.reply:tag("feature", {var = event.room:get_persistent() and "muc_persistent" or "muc_temporary"}):up(); |
| 293 end); | 285 end); |
| 294 module:hook("muc-disco#info", function(event) | 286 module:hook("muc-disco#info", function(event) |
| 295 event.reply:tag("feature", {var = event.room:get_hidden() and "muc_hidden" or "muc_public"}):up(); | 287 event.reply:tag("feature", {var = event.room:get_hidden() and "muc_hidden" or "muc_public"}):up(); |
| 296 end); | 288 end); |
| 355 end | 347 end |
| 356 end | 348 end |
| 357 function room_mt:get_moderated() | 349 function room_mt:get_moderated() |
| 358 return self._data.moderated; | 350 return self._data.moderated; |
| 359 end | 351 end |
| 360 function room_mt:set_members_only(members_only) | |
| 361 members_only = members_only and true or nil; | |
| 362 if self._data.members_only ~= members_only then | |
| 363 self._data.members_only = members_only; | |
| 364 if self.save then self:save(true); end | |
| 365 end | |
| 366 end | |
| 367 function room_mt:get_members_only() | |
| 368 return self._data.members_only; | |
| 369 end | |
| 370 function room_mt:set_persistent(persistent) | 352 function room_mt:set_persistent(persistent) |
| 371 persistent = persistent and true or nil; | 353 persistent = persistent and true or nil; |
| 372 if self._data.persistent ~= persistent then | 354 if self._data.persistent ~= persistent then |
| 373 self._data.persistent = persistent; | 355 self._data.persistent = persistent; |
| 374 if self.save then self:save(true); end | 356 if self.save then self:save(true); end |
| 407 -- Give the room creator owner affiliation | 389 -- Give the room creator owner affiliation |
| 408 module:hook("muc-room-pre-create", function(event) | 390 module:hook("muc-room-pre-create", function(event) |
| 409 event.room:set_affiliation(true, jid_bare(event.stanza.attr.from), "owner"); | 391 event.room:set_affiliation(true, jid_bare(event.stanza.attr.from), "owner"); |
| 410 end, -1); | 392 end, -1); |
| 411 | 393 |
| 412 -- registration required for entering members-only room | |
| 413 module:hook("muc-occupant-pre-join", function(event) | |
| 414 local room, stanza = event.room, event.stanza; | |
| 415 local affiliation = room:get_affiliation(stanza.attr.from); | |
| 416 if affiliation == nil and event.room:get_members_only() then | |
| 417 local reply = st.error_reply(stanza, "auth", "registration-required"):up(); | |
| 418 reply.tags[1].attr.code = "407"; | |
| 419 event.origin.send(reply:tag("x", {xmlns = "http://jabber.org/protocol/muc"})); | |
| 420 return true; | |
| 421 end | |
| 422 end, -5); | |
| 423 | 394 |
| 424 -- check if user is banned | 395 -- check if user is banned |
| 425 module:hook("muc-occupant-pre-join", function(event) | 396 module:hook("muc-occupant-pre-join", function(event) |
| 426 local room, stanza = event.room, event.stanza; | 397 local room, stanza = event.room, event.stanza; |
| 427 local affiliation = room:get_affiliation(stanza.attr.from); | 398 local affiliation = room:get_affiliation(stanza.attr.from); |
| 730 type = 'boolean', | 701 type = 'boolean', |
| 731 label = 'Make Room Moderated?', | 702 label = 'Make Room Moderated?', |
| 732 value = event.room:get_moderated() | 703 value = event.room:get_moderated() |
| 733 }); | 704 }); |
| 734 end); | 705 end); |
| 735 module:hook("muc-config-form", function(event) | |
| 736 table.insert(event.form, { | |
| 737 name = 'muc#roomconfig_membersonly', | |
| 738 type = 'boolean', | |
| 739 label = 'Make Room Members-Only?', | |
| 740 value = event.room:get_members_only() | |
| 741 }); | |
| 742 end); | |
| 743 | 706 |
| 744 function room_mt:process_form(origin, stanza) | 707 function room_mt:process_form(origin, stanza) |
| 745 local form = stanza.tags[1]:get_child("x", "jabber:x:data"); | 708 local form = stanza.tags[1]:get_child("x", "jabber:x:data"); |
| 746 if form.attr.type == "cancel" then | 709 if form.attr.type == "cancel" then |
| 747 origin.send(st.reply(stanza)); | 710 origin.send(st.reply(stanza)); |
| 784 module:hook("muc-config-submitted", function(event) | 747 module:hook("muc-config-submitted", function(event) |
| 785 event.update_option("persistent", "muc#roomconfig_persistentroom"); | 748 event.update_option("persistent", "muc#roomconfig_persistentroom"); |
| 786 end); | 749 end); |
| 787 module:hook("muc-config-submitted", function(event) | 750 module:hook("muc-config-submitted", function(event) |
| 788 event.update_option("moderated", "muc#roomconfig_moderatedroom"); | 751 event.update_option("moderated", "muc#roomconfig_moderatedroom"); |
| 789 end); | |
| 790 module:hook("muc-config-submitted", function(event) | |
| 791 event.update_option("members_only", "muc#roomconfig_membersonly"); | |
| 792 end); | 752 end); |
| 793 module:hook("muc-config-submitted", function(event) | 753 module:hook("muc-config-submitted", function(event) |
| 794 event.update_option("public", "muc#roomconfig_publicroom"); | 754 event.update_option("public", "muc#roomconfig_publicroom"); |
| 795 end); | 755 end); |
| 796 module:hook("muc-config-submitted", function(event) | 756 module:hook("muc-config-submitted", function(event) |
| 995 event.origin.send(st.error_reply(stanza, "auth", "forbidden")); | 955 event.origin.send(st.error_reply(stanza, "auth", "forbidden")); |
| 996 return true; | 956 return true; |
| 997 end | 957 end |
| 998 end); | 958 end); |
| 999 | 959 |
| 1000 -- Invitation privileges in members-only rooms SHOULD be restricted to room admins; | |
| 1001 -- if a member without privileges to edit the member list attempts to invite another user | |
| 1002 -- the service SHOULD return a <forbidden/> error to the occupant | |
| 1003 module:hook("muc-pre-invite", function(event) | |
| 1004 local room, stanza = event.room, event.stanza; | |
| 1005 if room:get_members_only() and valid_affiliations[room:get_affiliation(stanza.attr.from) or "none"] < valid_affiliations.admin then | |
| 1006 event.origin.send(st.error_reply(stanza, "auth", "forbidden")); | |
| 1007 return true; | |
| 1008 end | |
| 1009 end); | |
| 1010 | |
| 1011 function room_mt:handle_mediated_invite(origin, stanza) | 960 function room_mt:handle_mediated_invite(origin, stanza) |
| 1012 local payload = stanza:get_child("x", "http://jabber.org/protocol/muc#user"):get_child("invite"); | 961 local payload = stanza:get_child("x", "http://jabber.org/protocol/muc#user"):get_child("invite"); |
| 1013 local invitee = jid_prep(payload.attr.to); | 962 local invitee = jid_prep(payload.attr.to); |
| 1014 if not invitee then | 963 if not invitee then |
| 1015 origin.send(st.error_reply(stanza, "cancel", "jid-malformed")); | 964 origin.send(st.error_reply(stanza, "cancel", "jid-malformed")); |
| 1045 local invite = stanza:get_child("x", "http://jabber.org/protocol/muc#user"):get_child("invite"); | 994 local invite = stanza:get_child("x", "http://jabber.org/protocol/muc#user"):get_child("invite"); |
| 1046 local reason = invite:get_child_text("reason") or ""; | 995 local reason = invite:get_child_text("reason") or ""; |
| 1047 stanza:tag("body") | 996 stanza:tag("body") |
| 1048 :text(invite.attr.from.." invited you to the room "..room.jid..(reason == "" and (" ("..reason..")") or "")) | 997 :text(invite.attr.from.." invited you to the room "..room.jid..(reason == "" and (" ("..reason..")") or "")) |
| 1049 :up(); | 998 :up(); |
| 1050 end); | |
| 1051 | |
| 1052 -- When an invite is sent; add an affiliation for the invitee | |
| 1053 module:hook("muc-invite", function(event) | |
| 1054 local room, stanza = event.room, event.stanza; | |
| 1055 local invitee = stanza.attr.to | |
| 1056 if room:get_members_only() and not room:get_affiliation(invitee) then | |
| 1057 local from = stanza:get_child("x", "http://jabber.org/protocol/muc#user"):get_child("invite").attr.from | |
| 1058 log("debug", "%s invited %s into members only room %s, granting membership", from, invitee, room.jid); | |
| 1059 room:set_affiliation(from, invitee, "member", "Invited by " .. from); -- This might fail; ignore for now | |
| 1060 end | |
| 1061 end); | 999 end); |
| 1062 | 1000 |
| 1063 function room_mt:handle_mediated_decline(origin, stanza) | 1001 function room_mt:handle_mediated_decline(origin, stanza) |
| 1064 local payload = stanza:get_child("x", "http://jabber.org/protocol/muc#user"):get_child("decline"); | 1002 local payload = stanza:get_child("x", "http://jabber.org/protocol/muc#user"):get_child("decline"); |
| 1065 local declinee = jid_prep(payload.attr.to); | 1003 local declinee = jid_prep(payload.attr.to); |
| 1276 | 1214 |
| 1277 local whois = module:require "muc/whois"; | 1215 local whois = module:require "muc/whois"; |
| 1278 room_mt.get_whois = whois.get; | 1216 room_mt.get_whois = whois.get; |
| 1279 room_mt.set_whois = whois.set; | 1217 room_mt.set_whois = whois.set; |
| 1280 | 1218 |
| 1219 local members_only = module:require "muc/members_only"; | |
| 1220 room_mt.get_members_only = members_only.get; | |
| 1221 room_mt.set_members_only = members_only.set; | |
| 1222 | |
| 1281 local history = module:require "muc/history"; | 1223 local history = module:require "muc/history"; |
| 1282 room_mt.send_history = history.send; | 1224 room_mt.send_history = history.send; |
| 1283 room_mt.get_historylength = history.get_length; | 1225 room_mt.get_historylength = history.get_length; |
| 1284 room_mt.set_historylength = history.set_length; | 1226 room_mt.set_historylength = history.set_length; |
| 1285 | 1227 |
