Skip to content

Instantly share code, notes, and snippets.

@luigi
Created December 3, 2011 18:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save luigi/1427819 to your computer and use it in GitHub Desktop.
Save luigi/1427819 to your computer and use it in GitHub Desktop.
-module(chat_client).
-compile(export_all).
register_nickname(Nickname) ->
message_router:register_nick(Nickname, fun(Msg) -> chat_client:print_message(Nickname, Msg) end).
unregister_nickname(Nickname) ->
message_router:unregister_nick(Nickname).
send_message(Addressee, MessageBody) ->
message_router:send_chat_message(Addressee, MessageBody).
print_message(Who, MessageBody) ->
io:format("~p received: ~p~n", [Who, MessageBody]).
start_router() ->
message_router:start().
-module(message_router).
-define(SERVER, message_router).
-compile(export_all).
start() ->
Pid = spawn(message_router, route_messages, [dict:new()]),
erlang:register(?SERVER, Pid).
stop() ->
?SERVER ! shutdown.
send_chat_message(Addressee, MessageBody) ->
?SERVER ! {send_chat_msg, Addressee, MessageBody}.
register_nick(ClientName, PrintFun) ->
?SERVER ! {register_nick, ClientName, PrintFun}.
unregister_nick(ClientName) ->
?SERVER ! {unregister_nick, ClientName}.
route_messages(Clients) ->
receive
{send_chat_msg, ClientName, MessageBody} ->
?SERVER ! {recv_chat_msg, ClientName, MessageBody},
route_messages(Clients);
{recv_chat_msg, ClientName, MessageBody} ->
case dict:find(ClientName, Clients) of
{ok, PrintFun} ->
PrintFun(MessageBody);
error ->
io:format("Unknown client~n")
end,
route_messages(Clients);
{register_nick, ClientName, PrintFun} ->
route_messages(dict:store(ClientName, PrintFun, Clients));
{unregister_nick, ClientName} ->
route_messages(dict:erase(ClientName, Clients));
shutdown ->
io:format("Shutting down~n");
Oops ->
io:format("Warning! Received: ~p~n", [Oops]),
route_messages(Clients)
end.
@tsnow
Copy link

tsnow commented Dec 3, 2011

https://gist.github.com/1427880#file_test.erlsh If you're curious what i was using for testing the the shell.

@luigi
Copy link
Author

luigi commented Dec 3, 2011

Thanks.

@tsnow
Copy link

tsnow commented Dec 3, 2011

I just posted my v3 code, as well, and merged it (biasing towards your whitespace for as long as I could).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment