Skip to content

Commit 9c002bf

Browse files
committed
Some fixes
Asteroid: Update deps to cowboy 1.0.0 Chat example: Clean message textarea after send Add `send_to_all` and `userinfo_by_session` helpers Store user information in client list as record `userinfo`
1 parent 66d76fe commit 9c002bf

File tree

3 files changed

+52
-41
lines changed

3 files changed

+52
-41
lines changed

examples/chat/priv/index.html

+1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
'uuid': 'send_message',
4646
'arguments': [session_ref,
4747
$('#message').val()]};
48+
$('#message').val('');
4849
bullet.send(JSON.stringify(data));
4950
});
5051

examples/chat/src/asteroid_chat_handler.erl

+50-40
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@
33
-behaviour(asteroid_handler).
44
-behaviour(gen_server).
55

6-
%% API
7-
-export([start_link/0]).
6+
%%public API
7+
-export([start_link/0,
8+
login/1,
9+
send_message/1]).
10+
11+
%% asteroid_handler callbacks
812
-export([handle/2, is_periodical/1]).
9-
-export([login/1, send_message/1]).
1013

1114
%% gen_server callbacks
1215
-export([init/1,
@@ -16,12 +19,9 @@
1619
terminate/2,
1720
code_change/3]).
1821

19-
-record(state, {clients}).
20-
2122

22-
%%%===================================================================
23-
%%% public API
24-
%%%===================================================================
23+
-record(state, {clients}).
24+
-record(userinfo, {name, session, pid}).
2525

2626
start_link() ->
2727
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
@@ -61,45 +61,38 @@ init([]) ->
6161

6262
handle_call({login, Username}, {Pid, _Ref}, State) ->
6363
SessionRef = erlang:list_to_binary(erlang:ref_to_list(make_ref())),
64-
Clients = State#state.clients ++ [{Username, SessionRef, Pid}],
65-
Mesage = erlang:iolist_to_binary([<<"User ">>, Username, <<" login">>]),
66-
self() ! {message, Mesage},
64+
Clients = State#state.clients ++ [#userinfo{name=Username,
65+
session=SessionRef,
66+
pid=Pid}],
67+
send_to_all(<<"CHAT SERVER">>,
68+
erlang:iolist_to_binary([<<"User ">>,
69+
Username,
70+
<<" login">>]),
71+
Clients),
6772
{reply, {session_ref, SessionRef}, State#state{clients=Clients}};
68-
6973
handle_call({logout, SessionRef}, _From, State) ->
70-
Clients = lists:filter(fun({Username, UserSessionRef, _UserPid}) ->
71-
case SessionRef =/= UserSessionRef of
72-
true -> true;
73-
false -> Message = erlang:iolist_to_binary([<<"User ">>, Username, <<" logout">>]),
74-
self() ! {message, Message},
75-
false
76-
end
77-
end,
78-
State#state.clients),
74+
{ok, User} = userinfo_by_session(SessionRef, State#state.clients),
75+
Clients = State#state.clients -- [User],
76+
send_to_all(<<"CHAT SERVER">>,
77+
erlang:iolist_to_binary([<<"User ">>,
78+
User#userinfo.name,
79+
<<" logout">>]),
80+
Clients),
7981
{reply, ok, State#state{clients=Clients}};
80-
handle_call({message, ClientSessionRef, ClientMessage}, _From, State) ->
81-
case lists:filter(
82-
fun({_Username, UserSessionRef, _UserPid}) -> UserSessionRef =:= ClientSessionRef end,
83-
State#state.clients) of
84-
[{ClientUsername, _SessionRef, _Pid}] ->
85-
lists:foreach(fun({_Username, _UserSesionRef, UserPid}) ->
86-
UserPid ! {message, jsx:encode([{<<"username">>, ClientUsername},
87-
{<<"message">>, ClientMessage}])}
88-
end,
89-
State#state.clients),
90-
{reply, ok, State};
91-
_ -> {reply, error, State}
92-
end.
82+
handle_call({message, SessionRef, Message}, _From, State) ->
83+
case userinfo_by_session(SessionRef, State#state.clients) of
84+
{ok, User} -> send_to_all(User#userinfo.name,
85+
Message,
86+
State#state.clients),
87+
{reply, ok, State};
88+
{error, _ErrorInfo} ->
89+
{reply, error, State}
90+
end.
9391

9492
handle_cast(_Msg, State) ->
9593
{noreply, State}.
9694

97-
handle_info({message, MessageText}, State) ->
98-
lists:foreach(fun({_Username, _SessionRef, UserPid}) ->
99-
UserPid ! {message, jsx:encode([{<<"username">>, <<"CHAT SERVER">>},
100-
{<<"message">>, MessageText}])}
101-
end,
102-
State#state.clients),
95+
handle_info(_Info, State) ->
10396
{noreply, State}.
10497

10598
terminate(_Reason, _State) ->
@@ -111,3 +104,20 @@ code_change(_OldVsn, State, _Extra) ->
111104
%%%===================================================================
112105
%%% Internal functions
113106
%%%===================================================================
107+
send_to_all(UserName, MessageText, Clients) ->
108+
lists:foreach(fun(User) ->
109+
User#userinfo.pid ! {message,
110+
jsx:encode([{<<"username">>, UserName},
111+
{<<"message">>, MessageText}])}
112+
end,
113+
Clients).
114+
115+
userinfo_by_session(SessionRef, Clients) ->
116+
case lists:filter(
117+
fun(User) ->
118+
User#userinfo.session =:= SessionRef
119+
end,
120+
Clients) of
121+
[User] -> {ok, User};
122+
[] -> {error, not_found}
123+
end.

rebar.config

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{deps_dir, ["deps"]}.
22
{deps, [
33
{bullet, ".*", {git, "https://github.com/extend/bullet.git", {branch, "master"}}},
4-
{cowboy, ".*", {git, "https://github.com/extend/cowboy.git", {tag, "0.9.0"}}},
4+
{cowboy, ".*", {git, "https://github.com/extend/cowboy.git", {tag, "1.0.0"}}},
55
{eredis, ".*", {git, "https://github.com/wooga/eredis.git", {branch, "master"}}},
66
{jsx, ".*", {git, "https://github.com/talentdeficit/jsx.git", {branch, "master"}}},
77
{celery, ".*", {git, "https://github.com/ir4y/celery_erlang_client.git", {branch, "master"}}}

0 commit comments

Comments
 (0)