Ejabberd定制模块编译错误

问题描述 投票:1回答:1

我试图将开放的Ejabberd模块(mod_offline_http_post)(适用于以前的版本)调整为当前版本(20.04)的时间为2天。例如,某些部分现在很重要,例如mod_options和mod_depends都需要导出。它们不是模块源代码的一部分。我加了我仍然遇到标题中提到的错误。

。ejabberd-modules / sources / mod_offline_http_post / src / mod_offline_http_post.erl

%% name of module must match file name
%% Update: [email protected]
-module(mod_offline_http_post).
-author("[email protected]").

-behaviour(gen_mod).

-export([start/2, stop/1, depends/2, mod_options/1, create_message/1, create_message/3]).

%% Required by ?INFO_MSG macros
-include("logger.hrl").

-include("scram.hrl").
-include("xmpp.hrl").

start(_Host, _Opt) ->
  ?INFO_MSG("mod_offline_http_post loading", []),
  inets:start(),
  ?INFO_MSG("HTTP client started", []),
  ejabberd_hooks:add(offline_message_hook, _Host, ?MODULE, create_message, 1).

stop (_Host) ->
  ?INFO_MSG("stopping mod_offline_http_post", []),
  ejabberd_hooks:delete(offline_message_hook, _Host, ?MODULE, create_message, 1).

depends(_Host, _Opts) ->
  [].

mod_options(_Host) ->
  [].

create_message({Action, Packet} = Acc) when (Packet#message.type == chat) and (Packet#message.body /= []) ->
        [{text, _, Body}] = Packet#message.body,
        post_offline_message(Packet#message.from, Packet#message.to, Body, Packet#message.id),
  Acc;

create_message(Acc) ->
  Acc.

create_message(_From, _To, Packet) when (Packet#message.type == chat) and (Packet#message.body /= []) ->
  Body = fxml:get_path_s(Packet, [{elem, list_to_binary("body")}, cdata]),
  MessageId = fxml:get_tag_attr_s(list_to_binary("id"), Packet),
  post_offline_message(_From, _To, Body, MessageId),
  ok.

post_offline_message(From, To, Body, MessageId) ->
  ?INFO_MSG("Posting From ~p To ~p Body ~p ID ~p~n",[From, To, Body, MessageId]),
  Token = gen_mod:get_module_opt(To#jid.lserver, ?MODULE, auth_token, fun(S) -> iolist_to_binary(S) end, list_to_binary("")),
  PostUrl = gen_mod:get_module_opt(To#jid.lserver, ?MODULE, post_url, fun(S) -> iolist_to_binary(S) end, list_to_binary("")),
  ToUser = To#jid.luser,
  FromUser = From#jid.luser,
  Vhost = To#jid.lserver,
  case gen_mod:get_module_opt(To#jid.lserver, ?MODULE, confidential, false) of
    true -> Data = string:join(["to=", binary_to_list(ToUser), "&from=", binary_to_list(FromUser), "&vhost=", binary_to_list(Vhost), "&messageId=", binary_to_list(MessageId)], "");
    false -> Data = string:join(["to=", binary_to_list(ToUser), "&from=", binary_to_list(FromUser), "&vhost=", binary_to_list(Vhost), "&body=", binary_to_list(Body), "&messageId=", binary_to_list(MessageId)], "")
  end,
  Request = {binary_to_list(PostUrl), [{"Authorization", binary_to_list(Token)}], "application/x-www-form-urlencoded", Data},
  httpc:request(post, Request,[],[]),
  ?INFO_MSG("post request sent", []).

。ejabberd-modules / sources / mod_offline_http_post / conf / mod_offline_http_post.yml

modules:
  mod_offline_http_post:
    auth_token: "secret"
    post_url: "http://SERVER_IP_ADDRESS/end_of_url"
    confidential: false
    
### Local Variables:
### mode: yaml
### End:
### vim: set filetype=yaml tabstop=8

如果需要,我可以提供更多详细信息。

谢谢您的帮助。我希望这不会是整整2天的奋斗... = /

erlang xmpp ejabberd ejabberd-module ejabberd-hooks
1个回答
0
投票

看起来您首先需要获得mod_offline_http_post选项并检测结果类型,结果可能是proplist,当您获得选项mod_offline_http_post时,您将可以获取auth_token选项,例如:

Data = gen_mod:get_module_opt(To#jid.lserver, ?MODULE, mod_offline_http_post),
Token = proplists:get_value(Data, auth_token).
© www.soinside.com 2019 - 2024. All rights reserved.