1
votes

Lately I have been woorking with ejabberd and internal module development.

I would like to have an internal module developed using gen_mod + gen_server behaviours. My module has an ejabberd hook which is based on this one: http://metajack.im/2008/08/28/writing-ejabberd-modules-presence-storms

My start_link function is like:

start_link(Host, Opts) ->
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
gen_server:start_link({local, Proc}, ?MODULE, [Host, Opts], []).

Where ?PROCNAME is:

-define(PROCNAME, ejabberd_mod_mine)

So in my localhost it is registered as ejabberd_mod_mine_localhost

As you see in the tutorial I linked, they use an hook in order to parse the presence stanza directly, but what if I want to compare the From value with a value I saved in the gen_server state? I thought of using a gen_server cast passing the packet to it, but the problem is that the function hook runs in a different process and therefore I cannot use:

gen_server:cast(self(), {filter, Packet})

and I can just use:

gen_server:cast(ejabberd_mod_mine_localhost, {filter, Packet})

But should I hardcode the name of the process? What if the host name is different? Should I register my gen_server using just its module name?

1

1 Answers

2
votes

A common pattern is to use the domain of either the sender or the receiving user (depending on what you are trying to do). For example mod_offline (that store packets on DB when the destination user is offline) uses the destination JID to discover on which domain it have to run, something like:

gen_mod:get_module_proc(To#jid.lserver, ?PROCNAME)