如何获取StateData并在mod_muc_room中替换此值

时间:2013-05-01 12:43:41

标签: erlang ejabberd multiuserchat

我想为ejabberd-2.1.12添加一种可能性,使其在MUC中通过存在而不可见"隐形" (我知道在exabberd的3.x.x版本中这将被弃用, - 我将通过http-bind为网站做这件事。)

所以任务是:发送非定向存在"隐形"并且在每个连接用户的房间都会更改它的StateData。

所以我修改了ejabberd_c2s.erl,当用户更改他的非定向状态时,他发送到mod_muc_room.erl通知

function mod_muc_room.erl:

room_state() ->
 receive
    Msg ->  (any data about user, presence),
 room_state()
end.

所以房间知道用户改变了他的存在并且它应该改变它自己的StateData,但是我如何获得这个值,修改并注入(替换)它到这个房间?

1 个答案:

答案 0 :(得分:0)

mod_muc_room使用gen_fsm behaviour。你可以知道,因为这一行靠近文件的顶部:

-behaviour(gen_fsm).

要接收和处理发送到gen_fsm进程的消息,您不能直接使用receive,而是向handle_info函数添加新子句。

例如,有一个处理{process_user_presence, From}消息的子句。它始于:

handle_info({process_user_presence, From}, normal_state = _StateName, StateData) ->

并最终以类似的方式结束:

{next_state, normal_state, StateData1}

其中StateData1StateData的修改形式。这是你修改房间状态的方法。