【问题标题】:how can I get StateData and replace this value in mod_muc_room如何获取 StateData 并在 mod_muc_room 中替换此值
【发布时间】:2013-05-01 12:43:41
【问题描述】:

我想通过存在“不可见”为 ejabberd-2.1.12 添加一种在 MUC 中不可见的可能性(我知道在 3.x.x 版本的 ejabberd 中,这将被弃用,-我将通过 http 为站点执行此操作-绑定)。

所以任务是:发送“不可见”的非定向存在,并在每个连接的房间用户中更改它的 StateData。

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

函数 mod_muc_room.erl :

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

所以房间知道用户改变了他的存在,它应该改变它自己的状态数据,但我怎样才能得到这个值,修改和注入(替换)到这个房间?

【问题讨论】:

    标签: erlang ejabberd multiuserchat


    【解决方案1】:

    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 的修改形式。这就是您修改房间状态的方式。

    【讨论】:

    • 谢谢你,legoscia,你的回答,但我在 mod_muc_room.erl 中用每个房间的名称注册了新进程,并且知道进程的名称是唯一的,就像房间的名称:global:register_name(Room , spawn(fun() -> room_state() end)) 在 ejabberd_c2s.erl 我发送例如这样的数据: Pid_receiver=global:whereis_name("example_room_name"), Pid_receiver!{User_name, invisible} 并得到 {User_name, invisible}在 mod_muc_room.erl 如果我像你说的那样使用 handle_info,我应该如何以及在哪里将数据从 ejabberd_c2s.erl 发送到 mod_muc_room.erl {user_invisible, User_name}?
    • 不确定最好的方法是什么,但mod_muc 调用mnesia:dirty_read(muc_online_room, {Room, Host}),它应该返回一个记录列表[R],您可以从中获取带有@987654335 的pid @。然后您可以使用Pid ! {User_name, invisible} 发送消息并在handle_info 中处理它。 (示例来自here
    • 谢谢,legoscia,太糟糕了,但我使用 mysql 并没有意识到这一点,所以我会尝试做这样的事情:在 gen_fsm:start_link/3 开始后的每个房间返回 {好的,Pid} 和这个房间的 Pid 我将按房间的名称保存/更新到 mysql-database 并知道我必须在哪里发送数据。我有一个问题:legoscia,ejabberd_c2s.erl 中的 StateData 与 mod_muc_room.erl 中的 StateData 不同,你认为我将 {User_name, invisible} 发送到 PID 和 handle_info({process_user_presence, From}, normal_state = _StateName , StateData) 获取该房间的当前 StateData?
    • legoscia,我做了所有我描述并发送到 pid gen_fsm 数据并在那里打印结果:handle_info({user_invisible, From}, normal_state = _StateName, StateData) -> file:write_file("/home /demirion/myfile", io_lib:fwrite("user invisible: StateData =~p\n,", [StateData]),[append]), {next_state, normal_state, StateData}; StateData 具有连接房间的真实当前 StateData 并连接了所有其他用户,-谢谢,我的问题解决了!我还没有 15 声望,所以我不能投票给你的答案,但我会的! ;)
    猜你喜欢
    • 2014-10-30
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    相关资源
    最近更新 更多