如何在Ejabberd上开发自定义功能? [英] How to develop custom functions on top of Ejabberd?

查看:223
本文介绍了如何在Ejabberd上开发自定义功能?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个实时聊天应用程序。搜索了一段时间后,我发现Ejabberd和Erlang是一个很好的选择。



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



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



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

解决方案

您可以编写与ejabberd中的事件挂钩的自定义模块。 p>

以下是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,用户,服务器) - > 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(用户,服务器) - > ok
resend_offline_messages_hook(Acc,User,Server) - > [路由]
resend_subscription_requests_hook(Acc,用户,服务器) - > [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(用户,服务器,资源,状态) - > 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 ,


$ b $ / code
$ b

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


I'm developing a real time chat app. After searching around for a while, I found Ejabberd and Erlang is a good option.

The question is the Ejabberd is not providing all the functions I need. I need some custom features such as location based matching and anonymous login.

So how to development custom functions on top of Ejabberd? write modules for it? or develop another standalone server app (web or other kind of server app) to interact with it?

update: another concern is the way we add custom functions/features should be scalable.

解决方案

You can write your custom modules which hook up to events in ejabberd.

Here is a list of events of 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

Here is a tutorial on how to create a module for ejabberd: http://happy.cat/blog/XMPP-Bots-ejabberd-mod-motion-2010-02-01-10-00.html

Basically write some module and register/add your module in ejabberd.cfg config file like so (e.g. "mod_motion"):

 {modules,

 [

  %% ....

  {mod_motion,  []},

  %% ....

 ]}

An example which I developed can be found here: https://github.com/Mingism/ejabberd-stanza-ack

这篇关于如何在Ejabberd上开发自定义功能?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆