如何获取 StateData 并在 mod_muc_room 中替换此值
Posted
技术标签:
【中文标题】如何获取 StateData 并在 mod_muc_room 中替换此值【英文标题】:how can I get StateData and replace this value in 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.
所以房间知道用户改变了他的存在,它应该改变它自己的状态数据,但我怎样才能得到这个值,修改和注入(替换)到这个房间?
【问题讨论】:
【参考方案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
其中StateData1
是StateData
的修改形式。这就是您修改房间状态的方式。
【讨论】:
谢谢你,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 声望,所以我不能投票给你的答案,但我会的! ;)以上是关于如何获取 StateData 并在 mod_muc_room 中替换此值的主要内容,如果未能解决你的问题,请参考以下文章
如何从 cmd 获取变量并在 vbscript 中显示 - Vbscript
如何订阅“日志事件”并在 ThunderCore 上获取通知?