Merge branch 'jonte_rewrite'

Conflicts:
	erlang_js
This commit is contained in:
Jonatan Pålsson 2011-02-24 13:40:54 +01:00
commit f6bb2328a1
13 changed files with 1081 additions and 46 deletions

View file

@ -50,6 +50,7 @@ respawn_table(_Token) ->
%% @doc Removes a player from coordinator.
remove_player(_From, _Player) ->
%gen_server:cast(ggs_coordinator, {remove_player, Player}).
ggs_logger:not_implemented().
%% gen_server callbacks
@ -84,8 +85,12 @@ handle_call({create_table, {force, TableID}}, From, State) ->
handle_call(_Message, _From, State) ->
{noreply, State}.
handle_cast({stop, _Reason}, _State) ->
{stop, normal, state};
handle_cast({stop, _Reason}, State) ->
{stop, normal, State};
%% @TODO: Implement me
%handle_cast({remove_player, Player}) ->
% {noreply, State#co_state{
handle_cast(_Message, State) ->
{noreply, State}.

View file

@ -33,9 +33,28 @@ user_command(GameVM, Player, Command, Args) ->
loop(Table) ->
receive
{define, _SourceCode} ->
io:format("GameVM_e can't define functions, sorry!~n"),
loop(Table);
{user_command, _User, Command, _Args, _From, _Ref} ->
io:format("GameVM received a message~n"),
ggs_table:notify_all_players(Table, Command),
{user_command, Player, Command, Args, _From, _Ref} ->
erlang:display(Command),
do_stuff(Command, Args, Player, Table),
loop(Table)
end.
do_stuff(Command, Args, Player, Table) ->
case Command of
"greet" ->
ggs_player:notify(Player, server, "Hello there!\n");
"chat" ->
ggs_table:notify_all_players(Table, Args ++ "\n");
"uname" ->
Uname = os:cmd("uname -a"),
ggs_player:notify(Player, server, Uname);
"lusers" ->
{ok, Players} = ggs_table:get_player_list(Table),
ggs_player:notify(Player, server,io_lib:format("~p\n",[Players]));
"nick" ->
io:format("Changing nickname of ~p to ~p.", [Player, Args]);
_Other ->
ggs_player:notify(Player, server, "I don't know that command..\n")
end.

View file

@ -26,10 +26,12 @@ start_link(Socket) ->
TableStatus = ggs_coordinator:join_table(1337),
case TableStatus of
{ok, Table} ->
notify(self(), self(), Token),
loop(#pl_state{socket = Socket, token = Token, table = Table});
{error, no_such_table} ->
ggs_coordinator:create_table({force, 1337}),
{ok, Table} = ggs_coordinator:join_table(1337),
notify(self(), self(), Token),
loop(#pl_state{socket = Socket, token = Token, table = Table})
end.
@ -54,13 +56,28 @@ stop(_Player,_Table) ->
%% Internals
loop(#pl_state{token = Token, socket = Socket, table = Table} = State) ->
loop(#pl_state{token = _Token, socket = Socket, table = Table} = State) ->
receive
{tcp, Socket, Data} -> % Just echo for now..
io:format("Notifying table..~n"),
ggs_table:notify_game(Table, Token, Data),
io:format("Parsing via protocol module..~n"),
Parsed = ggs_protocol:parse(Data),
self() ! Parsed,
loop(State);
{notify, _From, Message} ->
gen_tcp:send(Socket, Message),
loop(State)
loop(State);
% Below are messages generated by the parser
{game_cmd,Cmd, _Headers, Data} ->
ggs_table:notify(Table, self(), {game, Cmd, Data}),
loop(State);
{srv_cmd,"define", _Headers, Data} ->
ggs_table:notify(Table, self(), {server, define, Data}),
loop(State);
{tcp_closed, _Socket} ->
io:format("Client disconnected, but THIS IS NOT SUPPORTED YET!~n"),
loop(State);
Other ->
io:format("Got UNKNOWN message: "),
erlang:display(Other),
io:format("~n")
end.

61
src/ggs_protocol.erl Normal file
View file

@ -0,0 +1,61 @@
-module(ggs_protocol).
-export([parse/1, getToken/1]).
%% API Functions
parse(Data) ->
Parsed = do_parse(Data, []),
prettify(Parsed).
getToken(Parsed) ->
case lists:keyfind(token, 1, Parsed) of
{_, Value} ->
Value;
false ->
false
end.
%% Internal helpers
do_parse(Data, ParsedMessage) ->
NewLinePos = string:chr(Data, $\n),
Line = string:substr(Data, 1, NewLinePos-1),
Tokens = re:split(Line, ": ", [{return, list}]),
case handle(Tokens) of
{Command, more} ->
do_parse(string:substr(Data, NewLinePos+1), ParsedMessage ++ [Command]);
{separator, data_next} ->
{_, Value} = lists:keyfind(content_len, 1, ParsedMessage),
{ContentLength, []} = string:to_integer(Value),
{data, ArgumentData} = handle_data(string:substr(Data, NewLinePos+1), ContentLength),
{ParsedMessage, ArgumentData}
end.
handle([[]]) ->
{separator, data_next};
handle(["Server-Command", Param]) ->
{{srv_cmd, Param}, more};
handle(["Game-Command", Param]) ->
{{game_cmd, Param}, more};
handle(["Content-Length", Param]) ->
{{content_len, Param}, more};
handle(["Token", Param]) ->
{{token, Param}, more};
handle(["Content-Type", Param]) ->
{{content_type, Param}, more}.
handle_data(Data, Length) ->
{data, string:substr(Data,1,Length)}.
prettify({Args, Data}) ->
case lists:keyfind(srv_cmd, 1, Args) of
{_, Value} ->
{srv_cmd, Value, Args, Data};
_Other ->
case lists:keyfind(game_cmd, 1, Args) of
{_, Value} ->
{game_cmd, Value, Args, Data};
_ ->
ok
end
end.

View file

@ -5,7 +5,8 @@
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
terminate/2, code_change/3, notify_all_players/2, notify_game/3,
get_player_list/1]).
-record(state, { players, game_vm } ).
@ -39,6 +40,10 @@ add_player(Table, Player) ->
remove_player(Table, Player) ->
call(Table, {remove_player, Player}).
%% @doc Get a list of all player processes attached to this table
get_player_list(Table) ->
gen_server:call(Table, get_player_list).
% @doc stops the table process
stop(Table) ->
gen_server:cast(Table, stop).
@ -51,6 +56,8 @@ notify_all_players(Table, Message) ->
gen_server:cast(Table, {notify_all_players, Message}).
notify_game(Table, From, Message) ->
erlang:display(Table),
io:format("~n"),
gen_server:cast(Table, {notify_game, Message, From}).
%% ----------------------------------------------------------------------
@ -79,15 +86,14 @@ handle_call(Msg, _From, State) ->
%% @private
handle_cast({notify, Player, Message}, #state { game_vm = GameVM } = State) ->
case Message of
{server, define, Args} ->
ggs_gamevm_e:define(GameVM, Args);
{game, Command, Args} ->
ggs_gamevm_e:user_command(GameVM, Player, Command, Args)
{server, define, Args} ->
ggs_gamevm_e:define(GameVM, Args);
{game, Command, Args} ->
ggs_gamevm_e:user_command(GameVM, Player, Command, Args)
end,
{noreply, State};
handle_cast({notify_game, Message, From}, #state { game_vm = GameVM } = State) ->
io:format("notify_game message received~n"),
ggs_gamevm_e:user_command(GameVM, From, Message, ""),
{noreply, State};