-module(ephraim_conv). -behaviour(gen_server). -export([start_link/4]). -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). -export([received_message/4, send_message/3]). -record(conv_state, { event_manager :: pid(), connection :: pid(), roster :: pid(), my_jid :: binary(), jid :: binary() }). -spec start_link(pid(), pid(), pid(), binary()) -> ok. start_link(EventManager, Conn, Roster, JID) -> gen_event:notify(EventManager, {view_update, {conversation, JID, new}}), {jid,MyJID} = ephraim_config:get(jid), gen_server:start_link(?MODULE, #conv_state{event_manager=EventManager,connection=Conn,roster=Roster,my_jid=list_to_binary(MyJID),jid=JID}, []). init(State) -> process_flag(trap_exit, true), io:format("Starting conversation ~p with ~p~n", [self(), State#conv_state.jid]), {ok, State}. received_message(Conv, From, Type, Body) -> gen_server:cast(Conv, {received_message, From, Type, Body}). send_message(Conv, Type, Body) -> gen_server:cast(Conv, {send_message, Type, Body}). handle_call(_Msg, _From, State) -> {noreply, State}. update_view(State, From, Type, Body) -> Alias = ephraim_roster:get_alias(State#conv_state.roster, From), gen_event:notify(State#conv_state.event_manager, {view_update, {conversation, State#conv_state.jid, {message, Alias, Type, Body}}}). handle_cast({received_message, From, Type, Body}, State) -> update_view(State, From, Type, Body), {noreply, State}; handle_cast({send_message, Type, Body}, State) -> Packet = exmpp_message:normal(Body), Packet2 = exmpp_message:set_type(Packet, Type), Packet3 = exmpp_xml:set_attribute(Packet2, to, State#conv_state.jid), ephraim_conn:send_packet(State#conv_state.connection, Packet3), update_view(State, State#conv_state.my_jid, Type, Body), {noreply, State}; handle_cast(_Msg, State) -> {noreply, State}. handle_info(_Msg, State) -> {ok, State}. terminate(_Reason, State) -> io:format("Stopping conversation ~p with ~p~n", [self(), State#conv_state.jid]), ok. code_change(_OldVersion, State, _Extra) -> {ok, State}.