Software / code / prosody
Comparison
plugins/muc/muc.lib.lua @ 6478:413923bbd1a0
plugins/muc/muc.lib: Add :each_affiliation() iterator
| author | daurnimator <quae@daurnimator.com> |
|---|---|
| date | Wed, 15 Oct 2014 17:08:19 -0400 |
| parent | 6476:fb8a9873728b |
| child | 6512:ad159be9e9d7 |
comparison
equal
deleted
inserted
replaced
| 6477:29f979f554d3 | 6478:413923bbd1a0 |
|---|---|
| 744 -- You need to be at least an admin, and be requesting info about your affifiliation or lower | 744 -- You need to be at least an admin, and be requesting info about your affifiliation or lower |
| 745 -- e.g. an admin can't ask for a list of owners | 745 -- e.g. an admin can't ask for a list of owners |
| 746 local affiliation_rank = valid_affiliations[affiliation]; | 746 local affiliation_rank = valid_affiliations[affiliation]; |
| 747 if affiliation_rank >= valid_affiliations.admin and affiliation_rank >= _aff_rank then | 747 if affiliation_rank >= valid_affiliations.admin and affiliation_rank >= _aff_rank then |
| 748 local reply = st.reply(stanza):query("http://jabber.org/protocol/muc#admin"); | 748 local reply = st.reply(stanza):query("http://jabber.org/protocol/muc#admin"); |
| 749 for jid, affiliation in pairs(self._affiliations) do | 749 for jid in self:each_affiliation(_aff or "none") do |
| 750 if affiliation == _aff then | 750 reply:tag("item", {affiliation = _aff, jid = jid}):up(); |
| 751 reply:tag("item", {affiliation = _aff, jid = jid}):up(); | |
| 752 end | |
| 753 end | 751 end |
| 754 origin.send(reply:up()); | 752 origin.send(reply:up()); |
| 755 return true; | 753 return true; |
| 756 else | 754 else |
| 757 origin.send(st.error_reply(stanza, "auth", "forbidden")); | 755 origin.send(st.error_reply(stanza, "auth", "forbidden")); |
| 986 local result = self._affiliations[bare]; -- Affiliations are granted, revoked, and maintained based on the user's bare JID. | 984 local result = self._affiliations[bare]; -- Affiliations are granted, revoked, and maintained based on the user's bare JID. |
| 987 if not result and self._affiliations[host] == "outcast" then result = "outcast"; end -- host banned | 985 if not result and self._affiliations[host] == "outcast" then result = "outcast"; end -- host banned |
| 988 return result; | 986 return result; |
| 989 end | 987 end |
| 990 | 988 |
| 989 -- Iterates over jid, affiliation pairs | |
| 990 function room_mt:each_affiliation(with_affiliation) | |
| 991 if not with_affiliation then | |
| 992 return pairs(self._affiliations); | |
| 993 else | |
| 994 return function(_affiliations, jid) | |
| 995 local affiliation; | |
| 996 repeat -- Iterate until we get a match | |
| 997 jid, affiliation = next(_affiliations, jid); | |
| 998 until jid == nil or affiliation == with_affiliation | |
| 999 return jid, affiliation; | |
| 1000 end, self._affiliations, nil | |
| 1001 end | |
| 1002 end | |
| 1003 | |
| 991 function room_mt:set_affiliation(actor, jid, affiliation, reason) | 1004 function room_mt:set_affiliation(actor, jid, affiliation, reason) |
| 992 if not actor then return nil, "modify", "not-acceptable"; end; | 1005 if not actor then return nil, "modify", "not-acceptable"; end; |
| 993 | 1006 |
| 994 local node, host, resource = jid_split(jid); | 1007 local node, host, resource = jid_split(jid); |
| 995 if not host then return nil, "modify", "not-acceptable"; end | 1008 if not host then return nil, "modify", "not-acceptable"; end |
| 1010 local actor_affiliation = self:get_affiliation(actor); | 1023 local actor_affiliation = self:get_affiliation(actor); |
| 1011 if actor_affiliation == "owner" then | 1024 if actor_affiliation == "owner" then |
| 1012 if jid_bare(actor) == jid then -- self change | 1025 if jid_bare(actor) == jid then -- self change |
| 1013 -- need at least one owner | 1026 -- need at least one owner |
| 1014 local is_last = true; | 1027 local is_last = true; |
| 1015 for j, aff in pairs(self._affiliations) do if j ~= jid and aff == "owner" then is_last = false; break; end end | 1028 for j in self:each_affiliation("owner") do |
| 1029 if j ~= jid then is_last = false; break; end | |
| 1030 end | |
| 1016 if is_last then | 1031 if is_last then |
| 1017 return nil, "cancel", "conflict"; | 1032 return nil, "cancel", "conflict"; |
| 1018 end | 1033 end |
| 1019 end | 1034 end |
| 1020 -- owners can do anything else | 1035 -- owners can do anything else |