ejabberd:连接到服务器时获取用户(版本和操作系统)

时间:2016-05-25 07:58:47

标签: erlang xmpp ejabberd erl

我正在尝试读取用户os @{ Html.RenderAction("Menu", new { userName = Model.UserName }); ,当他们连接时我正在使用ejabberd 2.1.x,但没有向我显示。

我正在做的是:

"Windows XP, Windows 7, Linux .... etc"

它返回所有用户的数据,如(状态,资源,大写...等)其他(版本,操作系统,客户名称)有没有办法做到这一点?

我相信有这样做的事情(muc chat)有很多机器人这样做,如果我输入:

-module(mod_test).

-behaviour(gen_mod).

%% gen_mod callbacks
-export([start/2, stop/1]).

%% hook handlers
-export([user_send_packet/3, filter_packet/1]).

-include("ejabberd.hrl").
-include("jlib.hrl").

-define(PROCNAME, ejabberd_mod_filter).

start(Host, _Opts) ->
    ejabberd_hooks:add(user_send_packet, Host, ?MODULE, user_send_packet, 75),
    ejabberd_hooks:add(filter_packet, global, ?MODULE, filter_packet, 75),
    ok.

stop(Host) ->
    ejabberd_hooks:delete(filter_packet, global, ?MODULE, filter_packet, 75),
    ejabberd_hooks:delete(user_send_packet, Host, ?MODULE, user_send_packet, 75),
    ok.

user_send_packet(_From, _To, _Packet) ->
    ok.

filter_packet({From, To, Packet}) ->
    io:format("~p", [Packet]),
filter_packet(Arg) ->
    Arg.

使用此消息返回给我:

version some_user

但我不知道他们是怎么做到的。

1 个答案:

答案 0 :(得分:2)

您可以通过向客户端发送“软件版本”请求来获取此信息,如XEP-0092中所述。这是ejabberd通常不会做的事情,因此您可能必须自己编写用于跟踪响应的代码。 (基本思想是服务器发送带有特定ID的请求,然后需要检查具有相同ID的响应,并考虑超时和错误。)