Mercurial > prosody-hg
comparison plugins/muc/muc.lib.lua @ 1737:31c3eb5797c7
MUC: Initial support for roles and affiliations
| author | Waqas Hussain <waqas20@gmail.com> |
|---|---|
| date | Mon, 07 Sep 2009 20:13:40 +0500 |
| parents | 98f833669d7f |
| children | 393abf245322 |
comparison
equal
deleted
inserted
replaced
| 1736:98f833669d7f | 1737:31c3eb5797c7 |
|---|---|
| 91 end -- TODO allow non-private rooms]] | 91 end -- TODO allow non-private rooms]] |
| 92 | 92 |
| 93 -- | 93 -- |
| 94 | 94 |
| 95 local room_mt = {}; | 95 local room_mt = {}; |
| 96 room_mt.__index = room_mt; | |
| 97 | |
| 98 function room_mt:get_default_role(affiliation) | |
| 99 if affiliation == "owner" or affiliation == "admin" then | |
| 100 return "moderator"; | |
| 101 elseif affiliation == "member" or not affiliation then | |
| 102 return "participant"; | |
| 103 end | |
| 104 end | |
| 96 | 105 |
| 97 function room_mt:broadcast_presence(stanza, code, nick) | 106 function room_mt:broadcast_presence(stanza, code, nick) |
| 98 stanza = get_filtered_presence(stanza); | 107 stanza = get_filtered_presence(stanza); |
| 99 local data = self._participants[stanza.attr.from]; | 108 local data = self._participants[stanza.attr.from]; |
| 100 stanza:tag("x", {xmlns='http://jabber.org/protocol/muc#user'}) | 109 stanza:tag("x", {xmlns='http://jabber.org/protocol/muc#user'}) |
| 251 local data; | 260 local data; |
| 252 -- if not rooms:get(room) and not rooms_info:get(room) then -- new room | 261 -- if not rooms:get(room) and not rooms_info:get(room) then -- new room |
| 253 -- rooms_info:set(room, 'name', (jid_split(room))); | 262 -- rooms_info:set(room, 'name', (jid_split(room))); |
| 254 -- data = {affiliation='owner', role='moderator', jid=from, sessions={[from]=get_filtered_presence(stanza)}}; | 263 -- data = {affiliation='owner', role='moderator', jid=from, sessions={[from]=get_filtered_presence(stanza)}}; |
| 255 -- end | 264 -- end |
| 265 if not next(self._affiliations) then -- new room, no owners | |
| 266 self._affiliations[jid_bare(from)] = "owner"; | |
| 267 end | |
| 256 if not data then -- new occupant | 268 if not data then -- new occupant |
| 257 data = {affiliation='none', role='participant', jid=from, sessions={[from]=get_filtered_presence(stanza)}}; | 269 local affiliation = self:get_affiliation(from); |
| 270 data = {affiliation=affiliation, role=self:get_default_role(affiliation), jid=from, sessions={[from]=get_filtered_presence(stanza)}}; | |
| 258 end | 271 end |
| 259 self._participants[to] = data; | 272 self._participants[to] = data; |
| 260 self._jid_nick[from] = to; | 273 self._jid_nick[from] = to; |
| 261 self:send_occupant_list(from); | 274 self:send_occupant_list(from); |
| 262 pr.attr.from = to; | 275 pr.attr.from = to; |
| 350 end | 363 end |
| 351 end | 364 end |
| 352 | 365 |
| 353 function room_mt:route_stanza(stanza) end -- Replace with a routing function, e.g., function(room, stanza) core_route_stanza(origin, stanza); end | 366 function room_mt:route_stanza(stanza) end -- Replace with a routing function, e.g., function(room, stanza) core_route_stanza(origin, stanza); end |
| 354 | 367 |
| 355 module "muc" | 368 function room_mt:get_affiliation(jid) |
| 356 | 369 local node, host, resource = jid_split(jid); |
| 357 function new_room(jid) | 370 local bare = node and node.."@"..host or host; |
| 371 local result = self._affiliations[bare]; -- Affiliations are granted, revoked, and maintained based on the user's bare JID. | |
| 372 if not result and self._affiliations[host] == "outcast" then result = "outcast"; end -- host banned | |
| 373 return result; | |
| 374 end | |
| 375 | |
| 376 function room_mt:set_affiliation(jid, affiliation) | |
| 377 local node, host, resource = jid_split(jid); | |
| 378 local bare = node and node.."@"..host or host; | |
| 379 if affiliation == "none" then affiliation = nil; end | |
| 380 if affiliation and affiliation ~= "outcast" and affiliation ~= "owner" and affiliation ~= "admin" and affiliation ~= "member" then return false; end | |
| 381 self._affiliations[bare] = affiliation; | |
| 382 -- TODO set roles based on new affiliation | |
| 383 return true; | |
| 384 end | |
| 385 | |
| 386 local _M = {}; -- module "muc" | |
| 387 | |
| 388 function _M:new_room(jid) | |
| 358 return setmetatable({ | 389 return setmetatable({ |
| 359 jid = jid; | 390 jid = jid; |
| 360 _jid_nick = {}; | 391 _jid_nick = {}; |
| 361 _participants = {}; | 392 _participants = {}; |
| 362 _data = {}; | 393 _data = {}; |
| 394 _affiliations = {}; | |
| 363 }, room_mt); | 395 }, room_mt); |
| 364 end | 396 end |
| 365 | 397 |
| 366 return _M; | 398 return _M; |
| 367 | 399 |
