我正在尝试使用PID和JID找到一种提取bosh会话(ejabberd)的SID的方法,以便我可以在ejabberd_sm:unset_presence
中使用它,我已经到处搜索但找不到办法它
基本上,我已经使用Ejabberd和Strophe构建了一个聊天系统,我想要实现的是当用户在一个页面上按下离线按钮时,与该JID相关联的所有会话都需要离线,我已经通过使用引出了PID ejabberd_sm:get_session_pid
但无法找到解决SID的方法。我也试过了SID ! Disconnect
,但这完全断开了我不想要的用户。
如果有人做过这种工作,请帮助我,也欢迎其他实施此类工作的想法。
由于
答案 0 :(得分:0)
我做了一些挖掘,这是交易。您从ejabberd_sm:get_session_pid
返回的值是该用户会话的ejabberd_c2s
进程。但ejabberd_c2s
完全没有意识到BOSH。您真正需要的是用户的BOSH会话ID,该ID由模块ejabberd_http_bind
维护。
最好的我可以告诉我们没有“好的”方法从ejabberd_c2s
中获取这些信息。我最终做了这样的事情:
St = sys:get_status(Pid),
State = lists:nth(3, lists:nth(5, element(4, St))),
SocketState = element(2, State),
BindPid = element(2, element(3, SocketState)),
现在,所有在一天结束时给你的是ejabberd_http_bind
进程的PID。你可以再次重复整个肮脏的生意,但在这里我建议作弊:
MS = ets:fun2ms(fun(#http_bind{pid=BP, id=Id}) when BP == BindPid -> Id end),
mnesia:dirty_select(http_bind, MS).
正如你所看到的,这是非常丑陋的。更好的方法是修改ejabberd_c2s
以接受将返回套接字信息的新类型sync_event
,同样修改ejabberd_http_bind
以接受类似的事件返回SID。当然,这两个都将包含在内部进行相关gen_fsm
调用的公共函数中。
所有这一切,我不确定BOSH SID对你有什么好处。特别是,我不确定“离线”和“断开连接”之间的区别是什么。但无论如何,这就是你获取信息的方式。