Вы должны реализовать собственный модуль ejabberd и использовать muc_process_iq hook. Когда кто-то пытается отозвать право собственности, он отправляет строфу IQ на MU C, вы можете поймать его с помощью вышеуказанного крючка. Функция обратного вызова вашего хука должна быть примерно такой:
my_callback(IQ, MUCState) ->
% check if it's for granting/revoking ownership
% ...
NewIQ. % or atom 'ignore'
Но у вас нет jid создателя в MUCState
, потому что в XMPP это не имеет значения! Собственно взлом есть. Для каждой принадлежности можно указать собственную причину, которая представляет собой просто текст внутри тега <reason>...</reason>
. Вы можете узнать о причинах принадлежности владельцев в MUCState
. Создатель комнаты (первый владелец) не имеет оснований для своей принадлежности. Поэтому, когда кто-то предоставляет право собственности, вы можете поместить что-то в поле «причина» (вам нужно сделать это в области действия пользователя, например, user_send_packet
hook) и позволить MU C обработать это, а когда кто-то аннулирует право собственности, проверьте, является ли целевой владелец указана причина или нет в вышеуказанной функции. Также существует более продвинутый и стандартный подход к этому. Вы можете изменить MU C состояние конфигурации и добавить создатель jid и некоторые изменения в mod_muc_room.erl
. Таким образом, у вас может быть jid создателя в MUCState
в приведенной выше функции.