2013-05-01 45 views
0

我想添加一个可能性ejabberd-2.1.12在MUC中通过存在“不可见”隐形(我知道在3.xx版本的ejabberd中这将被弃用, - 我会通过http-bind为网站做到这一点)。我怎样才能得到StateData,并在mod_muc_room中取代这个值

所以任务是:发送非定向存在“隐形”,并在每个房间中的用户连接改变它的状态数据。

所以我修改ejabberd_c2s.erl当用户改变其非定向的存在,他发送到mod_muc_room.erl通知

功能mod_muc_room.erl:

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

使房间知道用户改变了他它应该改变它自己的StateData,但我怎么能得到这个值,修改并注入(替换)到这个房间?

回答

0

mod_muc_room使用gen_fsm behaviour。你可以告诉,因为这条线是接近文件的顶部:

-behaviour(gen_fsm). 

接收和处理发送到你不会直接使用receive一个gen_fsm进程会的消息,而是增加一个新的条款,该handle_info功能。

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

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

并最终像结束:

{next_state, normal_state, StateData1} 

其中StateData1StateData改进形式。这是你如何修改房间的状态。

+0

谢谢legoscia,您的回答,但我注册了新的工艺与mod_muc_room.erl每个房间的名字,知道进程的名称是唯一的,就像房间名称: 全球:REGISTER_NAME(室,产卵(乐趣() - > room_state()在ejabberd_c2s.erl完)) 我送例如这样的数据:Pid_receiver =全球:whereis_name( “example_room_name”),Pid_receiver {USER_NAME,无形} ,并获得{USER_NAME,无形}在mod_muc_room! .erl 如何使用handle_info将数据从ejabberd_c2s.erl发送到mod_muc_room.erl {user_invisible,User_name}如何使用handle_info? – DeMiRioN 2013-05-02 15:31:30

+0

不知道做什么的最好方法是,但是'mod_muc'调用mnesia:dirty_read(muc_online_room,{Room,Host})',它应该返回一个记录'[R]'的列表,您可以从中用'Pid = R#muc_online_room.pid'得到pid。然后你可以用'Pid! {User_name,invisible}'并在'handle_info'中处理。 (从[这里](https://github.com/processone/ejabberd/blob/v2.1.12/src/mod_muc/mod_muc.erl#L545-L581))示例) – legoscia 2013-05-03 14:52:21

+0

谢谢,legoscia,这太糟糕了,但我使用mysql并没有意识到这一点,所以我会试着做这样的事情:gen_fsm开始之后的每个房间:start_link/3返回{ok,Pid}并且这个Pid的空间我将通过房间的名称保存/更新到MySQL数据库,并知道我必须发送数据。并且我有一个问题:在ejabberd_c2s.erl中的StateData与mod_muc_room.erl中的StateData不同,您是否认为我将{User_name,invisible}发送给PID并在handle_info({process_user_presence,From},normal_state = _StateName ,StateData)获取该房间的当前状态数据? – DeMiRioN 2013-05-03 16:29:47