How to develop custom functions on top of Ejabberd?

I am developing a real-time chat application. Searched for a while, I found Ejabberd and Erlang - a good option.

The question is that Ejabberd does not provide all the functions I need. I need some custom features like location based matching and anonymous login.

So how to create custom functions on top of Ejabberd? write modules for this? or develop another stand-alone server application (web application or other server application) to interact with it?

update: another issue is how we add custom functions / functions that should be scalable.

+8
erlang xmpp ejabberd
source share
2 answers

You can write your own custom modules that connect to events in ejabberd.

Here is a list of ejabberd events:

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

In principle, write some module and register / add your module to the ejabberd.cfg configuration file, for example, like this (for example, "mod_motion"):

  {modules, [ %% .... {mod_motion, []}, %% .... ]} 

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

+5
source share

Here is a good example of how to implement a module based on the presence of Ejabberd.

http://metajack.im/2008/08/28/writing-ejabberd-modules-presence-storms/

Some highlights:

Connect your event

In this example, the author selects a presence binding on Ejabberd

 start(Host, _Opts) -> ejabberd_hooks:add(set_presence_hook, Host, ?MODULE, on_presence, 50), ok. 

ejabberd_hooks:add format:

 ejabberd_hooks:add(Hook, Host, Module, Function, Priority) 

Therefore, you just need to implement Function (4th argument) as follows:

 on_presence(_User, _Server, _Resource, _Packet) -> none. 

Full list of all hooks: https://www.process-one.net/en/wiki/ejabberd_events_and_hooks/

Analysis Parameters

If you want your modules to be scalable, you will need to define some variables so that you can easily change it.

You can use gen_mod:get_module_opt(Host, Module, Opt, Default) to get the parameters in ejabberd.cfg

For example, if you have a configuration, look like this:

 {mod_sunshine, [{count, 20}, {interval, 60}]} 

You can get count by:

 gen_mod:get_module_opt(Server, ?MODULE, count, 10) 
+3
source share

All Articles