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