【发布时间】:2018-11-13 22:28:10
【问题描述】:
如果用户被禁止使用 muc(通过 xep-0045)并订阅了(通过 mucsub),则该 muc 房间仍然可以使用 pubsub 事件。如果订阅了 muc 房间的用户被禁止进入该 muc 房间,并且在一段时间后用户取消订阅该房间,同时所有者决定将隶属关系从 outcast 设置为 none(删除禁令)服务器回复昵称 x 不存在于房间中。这是因为用户退订了房间。
我修改了 mod_muc_room.erl 中的代码
在 process_item_change/3 case 子句中添加了这部分代码
{JID, affiliation, outcast, Reason} ->
LBareJID = jid:tolower(jid:remove_resource(JID)),
case ?DICT:find(LBareJID, SD#state.subscribers) of
{ok, #subscriber{nick = Nick}} ->
Nicks = ?DICT:erase(Nick, SD#state.subscriber_nicks),
Subscribers = ?DICT:erase(LBareJID, SD#state.subscribers),
NewSD = SD#state{subscribers = Subscribers,
subscriber_nicks = Nicks},
store_room(NewSD, [{del_subscription, LBareJID}]),
send_subscriptions_change_notifications(JID, Nick, unsubscribe, NewSD);
_ ->
NewSD = SD,
ok
end,
它删除了用户订阅,但是当所有者想要删除禁令时,正如我所说,服务器回复“房间中不存在昵称”
【问题讨论】: