-module(ephraim_conn). -include_lib("exmpp/include/exmpp_client.hrl"). -include_lib("exmpp/include/exmpp_xml.hrl"). -behaviour(gen_server). -export([start_link/1]). -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). -export([send_packet/2]). -record(conn_state, { event_manager :: pid(), session :: any() }). start_link(EventManager) -> gen_server:start_link(?MODULE, EventManager, []). %-spec init() -> ok. init(EventManager) -> process_flag(trap_exit, true), Session = exmpp_session:start(), {jid, JID} = ephraim_config:get(jid), {password, Password} = ephraim_config:get(password), {server, Server, Port} = ephraim_config:get(server), exmpp_session:auth_basic_digest(Session, exmpp_jid:parse(JID), Password), io:format("Connecting...~n"), exmpp_session:connect_TCP(Session, Server, Port), io:format("Connected.~n"), session(Session), {ok, #conn_state{event_manager=EventManager,session=Session}}. -spec session(any()) -> ok. session(Session) -> io:format("Logging in...~n"), exmpp_session:login(Session), io:format("Getting profile...~n"), exmpp_session:send_packet(Session, exmpp_iq:get('jabber:client', #xmlel{ns='vcard-temp',name='vCard'})), io:format("Getting roster...~n"), exmpp_session:send_packet(Session, exmpp_client_roster:get_roster("foo")), io:format("Setting presence...~n"), exmpp_session:send_packet(Session, exmpp_presence:set_status(exmpp_presence:available(), "Foo/Test\\Bar")), io:format("Ok.~n"). send_packet(Connection, Packet) -> gen_server:cast(Connection, {send_packet, Packet}). handle_call(_Msg, _From, State) -> {noreply, State}. handle_cast({send_packet, Packet}, State) -> exmpp_session:send_packet(State#conn_state.session, Packet), {noreply, State}. handle_info(Msg = #received_packet{}, State) -> gen_event:notify(State#conn_state.event_manager, {received_packet,Msg}), {noreply, State}; handle_info(Msg, State) -> io:format("ephraim_conn: ~p~n", [Msg]), {noreply, State}. terminate(_Reason, State) -> io:format("Disconnecting...~n"), exmpp_session:stop(State#conn_state.session). code_change(_OldVersion, State, _Extra) -> {ok, State}.