2014-03-05 4 views
8

Ich entwickle eine Echtzeit-Chat-App. Nachdem ich eine Weile herumgesucht habe, fand ich Ejabberd und Erlang eine gute Option.Wie entwickelt man benutzerdefinierte Funktionen auf Ejabberd?

Die Frage ist, das Ejabberd bietet nicht alle Funktionen, die ich brauche. Ich brauche einige benutzerdefinierte Funktionen wie Location Based Matching und anonyme Anmeldung.

So, wie benutzerdefinierte Funktionen auf Ejabberd zu entwickeln? Schreibmodule dafür? oder entwickeln Sie eine andere eigenständige Server-App (Web oder eine andere Art von Server-App), um damit zu interagieren?

Update: Ein weiteres Problem ist die Art und Weise, wie wir benutzerdefinierte Funktionen/Features hinzufügen sollten skalierbar sein.

+0

Ejabberd ist gut für Chat und Echtzeit-Benachrichtigung. Andere von Ihnen erwähnte Funktionen können jedoch einfacher in einem anderen Standardserver implementiert werden. –

+0

@KeewonSeo Ja, du hast Recht. Aber wie kommuniziert der Standardserver mit dem Ejabberd-Server? – Mingming

+1

Für die Interaktion zwischen Standalone-Server (Standard ist Typo ...) und Ejabberd können Sie benutzerdefinierte Module aufschreiben, wie andere Antworten vorgeschlagen. Ich habe vergessen, es zu erwähnen. –

Antwort

5

Sie können Ihre eigenen Module schreiben, die Ereignisse in ejabberd verbinden. Hier

ist eine Liste von Ereignissen von 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

Hier ist eine Anleitung, wie man ein Modul für ejabberd erstellen: http://happy.cat/blog/XMPP-Bots-ejabberd-mod-motion-2010-02-01-10-00.html

Grundsätzlich schreiben etwas Modul und registriere/füge dein Modul in der ejabberd.cfg Konfigurationsdatei so hinzu (zB "mod_motio n "):

{modules, 

[ 

    %% .... 

    {mod_motion, []}, 

    %% .... 

]} 

Ein Beispiel, das ich gefunden werden hier entwickelt wurden, können: https://github.com/Mingism/ejabberd-stanza-ack

3

Hier ist ein gutes Beispiel dafür, wie eine Präsenz-basierten Modul von ejabberd zu implementieren.

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

Einige Highlights:

Haken Ihre Veranstaltung

In diesem Beispiel Autor Präsenz auf ejabberd

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

das Format ejabberd_hooks:add ist einzuhaken wählen:

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

So müssen Sie nur das Function (4. Argument) wie folgt umzusetzen:

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

Die vollständige Liste aller Haken: https://www.process-one.net/en/wiki/ejabberd_events_and_hooks/

Parsing Optionen

Wenn Sie gemacht möchten Ihre Module skalierbar, müssen Sie einige Variablen definieren, damit Sie sie leicht ändern können.

können Sie gen_mod:get_module_opt(Host, Module, Opt, Default) verwenden Optionen in Ihrem ejabberd.cfg

Zum Beispiel zu bekommen, wenn Sie eine Konfiguration aussehen wie dieses:

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

Sie können das bekommen count von:

gen_mod:get_module_opt(Server, ?MODULE, count, 10)