%%% This is the server process of the messenger service -module(mess_server). -export([server_start/0, server/0]). -include("mess_interface.hrl"). server() -> process_flag(trap_exit, true), server([]). %%% the user list has the format [{ClientPid1, Name1},{ClientPid2,Name2},...] server(User_List) -> io:format("User list = ~p~n", [User_List]), receive #logon{client_pid = From, username = Name} -> New_User_List = server_logon(From, Name, User_List), server(New_User_List); {'EXIT', From, _} -> New_User_List = server_logoff(From, User_List), server(New_User_List); #message{client_pid = From, to_name = ToName, message = Message} -> server_transfer(From, ToName, Message, User_List), server(User_List) end. %%% Start the server server_start() -> register(messenger, spawn(?MODULE, server, [])). %%% Server adds a new user to the user list server_logon(From, Name, User_List) -> %% check if logged on anyone else case lists:keymember(Name, 2, User_List) of true -> From ! #abort_client{message = user_exists_at_other_node}, User_List; false -> From ! #server_reply{message = logged_on}, link(From), [{From, Name} | User_List] % add user to the list end. %%% Server deletes a user from the user list server_logoff(From, User_List) -> lists:keydelete(From, 1, User_List). %%% Server transfers a message between user server_transfer(From, To, Message, User_List) -> %% check that the user is logged on and who he is case lists:keysearch(From, 1, User_List) of false -> From ! #abort_client{message = you_are_not_logged_on}; {value, {_, Name}} -> server_transfer(From, Name, To, Message, User_List) end. %%% If the user exists, send the message server_transfer(From, Name, To, Message, User_List) -> case lists:keysearch(To, 2, User_List) of false -> From ! #server_reply{message = receiver_not_found}; {value, {ToPid, To}} -> ToPid ! #message_from{from_name = Name, message = Message}, From ! #server_reply{message = sent} end.