Software /
code /
prosody
Comparison
plugins/muc/muc.lib.lua @ 6214:9813c74ce006
plugins/muc: Move `whois` code to seperate file
author | daurnimator <quae@daurnimator.com> |
---|---|
date | Thu, 03 Apr 2014 14:24:27 -0400 |
parent | 6213:95bddf0142f4 |
child | 6215:1dd09dc04945 |
comparison
equal
deleted
inserted
replaced
6213:95bddf0142f4 | 6214:9813c74ce006 |
---|---|
419 end); | 419 end); |
420 module:hook("muc-disco#info", function(event) | 420 module:hook("muc-disco#info", function(event) |
421 event.reply:tag("feature", {var = event.room:get_hidden() and "muc_hidden" or "muc_public"}):up(); | 421 event.reply:tag("feature", {var = event.room:get_hidden() and "muc_hidden" or "muc_public"}):up(); |
422 end); | 422 end); |
423 module:hook("muc-disco#info", function(event) | 423 module:hook("muc-disco#info", function(event) |
424 event.reply:tag("feature", {var = event.room:get_whois() ~= "anyone" and "muc_semianonymous" or "muc_nonanonymous"}):up(); | |
425 end); | |
426 module:hook("muc-disco#info", function(event) | |
427 local count = 0; for _ in event.room:each_occupant() do count = count + 1; end | 424 local count = 0; for _ in event.room:each_occupant() do count = count + 1; end |
428 table.insert(event.form, { name = "muc#roominfo_occupants", label = "Number of occupants", value = tostring(count) }); | 425 table.insert(event.form, { name = "muc#roominfo_occupants", label = "Number of occupants", value = tostring(count) }); |
429 end); | 426 end); |
430 | 427 |
431 function room_mt:get_disco_items(stanza) | 428 function room_mt:get_disco_items(stanza) |
539 length = math.min(tonumber(length) or default_history_length, max_history_length or math.huge); | 536 length = math.min(tonumber(length) or default_history_length, max_history_length or math.huge); |
540 if length == default_history_length then | 537 if length == default_history_length then |
541 length = nil; | 538 length = nil; |
542 end | 539 end |
543 self._data.history_length = length; | 540 self._data.history_length = length; |
544 end | |
545 | |
546 | |
547 local valid_whois = { moderators = true, anyone = true }; | |
548 | |
549 function room_mt:set_whois(whois) | |
550 if valid_whois[whois] and self._data.whois ~= whois then | |
551 self._data.whois = whois; | |
552 if self.save then self:save(true); end | |
553 end | |
554 end | |
555 | |
556 function room_mt:get_whois() | |
557 return self._data.whois; | |
558 end | 541 end |
559 | 542 |
560 -- Give the room creator owner affiliation | 543 -- Give the room creator owner affiliation |
561 module:hook("muc-room-pre-create", function(event) | 544 module:hook("muc-room-pre-create", function(event) |
562 event.room:set_affiliation(true, jid_bare(event.stanza.attr.from), "owner"); | 545 event.room:set_affiliation(true, jid_bare(event.stanza.attr.from), "owner"); |
871 label = 'Allow Occupants to Change Subject?', | 854 label = 'Allow Occupants to Change Subject?', |
872 value = event.room:get_changesubject() | 855 value = event.room:get_changesubject() |
873 }); | 856 }); |
874 end); | 857 end); |
875 module:hook("muc-config-form", function(event) | 858 module:hook("muc-config-form", function(event) |
876 local whois = event.room:get_whois(); | |
877 table.insert(event.form, { | |
878 name = 'muc#roomconfig_whois', | |
879 type = 'list-single', | |
880 label = 'Who May Discover Real JIDs?', | |
881 value = { | |
882 { value = 'moderators', label = 'Moderators Only', default = whois == 'moderators' }, | |
883 { value = 'anyone', label = 'Anyone', default = whois == 'anyone' } | |
884 } | |
885 }); | |
886 end); | |
887 module:hook("muc-config-form", function(event) | |
888 table.insert(event.form, { | 859 table.insert(event.form, { |
889 name = 'muc#roomconfig_moderatedroom', | 860 name = 'muc#roomconfig_moderatedroom', |
890 type = 'boolean', | 861 type = 'boolean', |
891 label = 'Make Room Moderated?', | 862 label = 'Make Room Moderated?', |
892 value = event.room:get_moderated() | 863 value = event.room:get_moderated() |
964 module:hook("muc-config-submitted", function(event) | 935 module:hook("muc-config-submitted", function(event) |
965 event.update_option("changesubject", "muc#roomconfig_changesubject"); | 936 event.update_option("changesubject", "muc#roomconfig_changesubject"); |
966 end); | 937 end); |
967 module:hook("muc-config-submitted", function(event) | 938 module:hook("muc-config-submitted", function(event) |
968 event.update_option("historylength", "muc#roomconfig_historylength"); | 939 event.update_option("historylength", "muc#roomconfig_historylength"); |
969 end); | |
970 module:hook("muc-config-submitted", function(event) | |
971 if event.update_option("whois", "muc#roomconfig_whois", valid_whois) then | |
972 local code = (event.room:get_whois() == 'moderators') and "173" or "172"; | |
973 event.status_codes[code] = true; | |
974 end | |
975 end); | 940 end); |
976 | 941 |
977 -- Removes everyone from the room | 942 -- Removes everyone from the room |
978 function room_mt:clear(x) | 943 function room_mt:clear(x) |
979 x = x or st.stanza("x", {xmlns='http://jabber.org/protocol/muc#user'}); | 944 x = x or st.stanza("x", {xmlns='http://jabber.org/protocol/muc#user'}); |
1216 stanza:tag("body") | 1181 stanza:tag("body") |
1217 :text(invite.attr.from.." invited you to the room "..room.jid..(reason == "" and (" ("..reason..")") or "")) | 1182 :text(invite.attr.from.." invited you to the room "..room.jid..(reason == "" and (" ("..reason..")") or "")) |
1218 :up(); | 1183 :up(); |
1219 end); | 1184 end); |
1220 | 1185 |
1221 -- Mask 'from' jid as occupant jid if room is anonymous | 1186 -- When an invite is sent; add an affiliation for the invitee |
1222 module:hook("muc-invite", function(event) | 1187 module:hook("muc-invite", function(event) |
1223 local room, stanza = event.room, event.stanza; | 1188 local room, stanza = event.room, event.stanza; |
1224 if room:get_whois() == "moderators" and room:get_default_role(room:get_affiliation(stanza.attr.to)) ~= "moderator" then | |
1225 local invite = stanza:get_child("x", "http://jabber.org/protocol/muc#user"):get_child("invite"); | |
1226 local occupant_jid = room:get_occupant_jid(invite.attr.from); | |
1227 if occupant_jid ~= nil then -- FIXME: This will expose real jid if inviter is not in room | |
1228 invite.attr.from = occupant_jid; | |
1229 end | |
1230 end | |
1231 end, 50); | |
1232 | |
1233 -- When an invite is sent; add an affiliation for the invitee | |
1234 module:hook("muc-invite", function(event) | |
1235 local room, stanza = event.room, event.stanza | |
1236 local invitee = stanza.attr.to | 1189 local invitee = stanza.attr.to |
1237 if room:get_members_only() and not room:get_affiliation(invitee) then | 1190 if room:get_members_only() and not room:get_affiliation(invitee) then |
1238 local from = stanza:get_child("x", "http://jabber.org/protocol/muc#user"):get_child("invite").attr.from | 1191 local from = stanza:get_child("x", "http://jabber.org/protocol/muc#user"):get_child("invite").attr.from |
1239 log("debug", "%s invited %s into members only room %s, granting membership", from, invitee, room.jid); | 1192 log("debug", "%s invited %s into members only room %s, granting membership", from, invitee, room.jid); |
1240 room:set_affiliation(from, invitee, "member", "Invited by " .. from); -- This might fail; ignore for now | 1193 room:set_affiliation(from, invitee, "member", "Invited by " .. from); -- This might fail; ignore for now |
1453 | 1406 |
1454 local password = module:require "muc/password"; | 1407 local password = module:require "muc/password"; |
1455 room_mt.get_password = password.get; | 1408 room_mt.get_password = password.get; |
1456 room_mt.set_password = password.set; | 1409 room_mt.set_password = password.set; |
1457 | 1410 |
1411 local whois = module:require "muc/whois"; | |
1412 room_mt.get_whois = whois.get; | |
1413 room_mt.set_whois = whois.set; | |
1414 | |
1458 local _M = {}; -- module "muc" | 1415 local _M = {}; -- module "muc" |
1459 | 1416 |
1460 function _M.new_room(jid, config) | 1417 function _M.new_room(jid, config) |
1461 return setmetatable({ | 1418 return setmetatable({ |
1462 jid = jid; | 1419 jid = jid; |
1463 _jid_nick = {}; | 1420 _jid_nick = {}; |
1464 _occupants = {}; | 1421 _occupants = {}; |
1465 _data = { | 1422 _data = { |
1466 whois = 'moderators'; | |
1467 history_length = math.min((config and config.history_length) | 1423 history_length = math.min((config and config.history_length) |
1468 or default_history_length, max_history_length); | 1424 or default_history_length, max_history_length); |
1469 }; | 1425 }; |
1470 _affiliations = {}; | 1426 _affiliations = {}; |
1471 }, room_mt); | 1427 }, room_mt); |