erlang - 如何在Ejabberd之上开发自定义功能?

标签 erlang xmpp ejabberd

我正在开发一个实时聊天应用程序。经过一番搜索,我发现 Ejabberd 和 Erlang 是一个不错的选择。

问题是 Ejabberd 没有提供我需要的所有功能。我需要一些自定义功能,例如基于位置的匹配和匿名登录。

那么如何在Ejabberd之上开发自定义功能呢?为其编写模块?或者开发另一个独立的服务器应用程序(Web 或其他类型的服务器应用程序)来与之交互?

更新:另一个问题是我们添加自定义功能/特性的方式应该是可扩展的。

最佳答案

您可以编写与 ejabberd 中的事件 Hook 的自定义模块。

以下是 ejabberd 的事件列表:

adhoc_local_items(Acc, From, To, Lang) -> Adhoc
adhoc_sm_items(Acc, From, To, Lang) -> Adhoc
c2s_stream_features(Acc)
c2s_unauthenticated_iq(Acc, Server, IQ) -> Packet
disco_local_features(Acc, From, To, Node, Lang) -> Adhoc
disco_local_identity(Acc, From, To, Node, Lang) -> Adhoc
disco_local_items(Acc, From, To, Node, Lang) -> Adhoc
disco_sm_features(Acc, From, To, Node, Lang) -> Adhoc
disco_sm_identity(Acc, From, To, Node, Lang) -> Adhoc
disco_sm_items(Acc, From, To, Node, Lang) -> Adhoc
ejabberd_ctl_process(Args) -> CtlStatus
filter_packet({From, To, Packet}) -> {From, To, Packet}
local_send_to_resource_hook(From, To, Packet) -> ok
offline_message_hook(From, To, Packet) -> ok
privacy_check_packet(Acc, User, Server, PrivacyList, {From, To, Packet}, Dir) -> Auth
privacy_get_user_list(Acc, User, Server) -> PrivacyList
privacy_iq_get(Acc, From, To, IQ, ActiveList) -> {result, Packet} | {error, Error}
privacy_iq_set(Acc, From, To, IQ) -> {result, Packet} | {error, Error}
privacy_updated_list(Acc, OldPrivacyList, NewPrivacyList) -> PrivacyList
pubsub_publish_item(Host, Node, From, To, ItemId, Payload) -> ok
remove_user(User, Server) -> ok
resend_offline_messages_hook(Acc, User, Server) -> [Route]
resend_subscription_requests_hook(Acc, User, Server) -> [Packet]
roster_get(Acc, {User, Server}) -> [RosterItem]
roster_get_jid_info(Acc, User, Server, JID) -> {Subscription, Groups}
roster_get_subscription_lists(Acc, User, Server) -> {[FromSubscription],[ToSubscription]}
roster_in_subscription(Acc, User, Server, JID, SubscriptionType, Reason) -> bool()
roster_out_subscription(Acc, User, Server, JID, SubscriptionType, Reason) -> bool()
roster_process_item(RosterItem, Server) -> RosterItem
sm_register_connection_hook(SID, JID, Info) -> ok
sm_remove_connection_hook(SID, JID, Info) -> ok
unset_presence_hook(User, Server, Resource, Status) -> void()
user_available_hook(JID) -> ok
user_receive_packet(JID, From, To, Packet) -> ok
user_send_packet(From, To, Packet) -> ok

<强> http://www.ejabberd.im/Events+and+hooks

这是有关如何为 ejabberd 创建模块的教程: <强> http://happy.cat/blog/XMPP-Bots-ejabberd-mod-motion-2010-02-01-10-00.html

基本上编写一些模块并在 ejabberd.cfg 配置文件中注册/添加模块,如下所示(例如“mod_motion”):

 {modules,

 [

  %% ....

  {mod_motion,  []},

  %% ....

 ]}

我开发的示例可以在这里找到: https://github.com/Mingism/ejabberd-stanza-ack

关于erlang - 如何在Ejabberd之上开发自定义功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22193106/

相关文章:

ios - 如何使用 xmppframework 创建一个新的聊天组?

erlang - 将路径添加到 Erlang 搜索路径?

Erlang 元组到字符串

iOS XMPPFramework - 房间/聊天消息历史记录

使用 XMPP 的 Android 视频聊天

ios - XEP-0055 错误 400 错误请求?

streaming - 如何使用 ejabberd 进行视频通话?

erlang - 通过脚本启动主管的问题 - Erlang

erlang - 为什么我的脚本会使解释器崩溃?

java - 如何在 java 中使用 Smack XMPP 库处理 TLS 证书