Browse Source

add player_stats, remove api_utils

Maxim Sokhatsky 11 years ago
parent
commit
4832f94ef2

+ 1 - 1
Makefile

@@ -1,6 +1,6 @@
 RELEASE := kakaranet
 COOKIE  := node_runner
-APPS    := kernel stdlib sasl gproc cowboy cowlib ranch erlydtl n2o face db server
+APPS    := kernel stdlib sasl gproc cowboy cowlib ranch erlydtl n2o face db sync server
 VER     := 1.0.0
 VM      := rels/web/files/vm.args
 SYS     := rels/web/files/sys.config

+ 48 - 26
apps/face/src/index.erl

@@ -4,7 +4,7 @@
 -include_lib("n2o/include/wf.hrl").
 -include("../../server/include/requests.hrl").
 -include("../../server/include/settings.hrl").
--jsmacro([take/2,attach/1,join/1,discard/3]).
+-jsmacro([take/2,attach/1,join/1,discard/3,player_info/2]).
 
 join(Game) ->
     ws:send(bert:encodebuf(bert:tuple(
@@ -19,7 +19,8 @@ attach(Token) ->
 take(GameId,Place) ->
     ws:send(bert:encodebuf(bert:tuple(
         bert:atom('client'),
-        bert:tuple(bert:atom("game_action"),GameId, bert:atom("okey_take"),[{pile,Place}])))).
+        bert:tuple(bert:atom("game_action"),GameId,
+            bert:atom("okey_take"),[{pile,Place}])))).
 
 discard(GameId, Color, Value) ->
     ws:send(bert:encodebuf(bert:tuple(
@@ -30,28 +31,38 @@ discard(GameId, Color, Value) ->
             bert:atom("okey_discard"),
             [{tile, bert:tuple(bert:atom("OkeyPiece"), Color, Value)}])))).
 
+player_info(User,GameModule) ->
+    ws:send(bert:encodebuf(bert:tuple(
+        bert:atom('client'),
+        bert:tuple(bert:atom("get_player_stats"),bert:binary(User),bert:atom(GameModule))))).
+
 redraw_tiles([{Tile, _}| _ ] = TilesList) ->
-    wf:update(dddiscard, [#dropdown{id = dddiscard, postback = combo, value = Tile, source = [dddiscard], options = [#option{label = CVBin, value = CVBin} || {CVBin, _} <- TilesList]}]).
+    wf:update(discard_combo,
+        [#dropdown{id = discard_combo, postback = combo,
+        value = Tile, source = [discard_combo],
+        options = [#option{label = CVBin, value = CVBin} || {CVBin, _} <- TilesList]}]).
 
 main() -> #dtl{file="index", bindings=[{title,<<"N2O">>},{body,body()}]}.
 
 body() ->
     [ #panel{ id=history },
 
-      #label{ id = player1, body = "Player 1", style = "color=black;"}, #label{ id = player2, body = "Player 2", style = "color=black;"},
-      #label{ id = player3, body = "Player 3", style = "color=black;"}, #label{ id = player4, body = "Player 4", style = "color=black;"},
+      #label{ id = player1, body = "Player 1", style = "color=black;"},
+      #label{ id = player2, body = "Player 2", style = "color=black;"},
+      #label{ id = player3, body = "Player 3", style = "color=black;"},
+      #label{ id = player4, body = "Player 4", style = "color=black;"},
       #br{},
       #button{ id = attach, body = <<"Attach">>, postback = attach},
       #button{ id = join, body = <<"Join">>, postback = join},
-      #dropdown{ id=ddtake, value="0", postback=combo, source=[ddtake],
+      #dropdown{ id= take_combo, value="0",
                  options = 
                      [
                       #option { label= <<"0">>, value= <<"0">> },
                       #option { label= <<"1">>, value= <<"1">> }
                      ]
                },
-      #button{ id = take, body = <<"Take">>, postback = take, source = [ddtake]},
-      #dropdown{ id=dddiscard, value="2", postback=combo, source=[dddiscard], 
+      #button{ id=take, body = <<"Take">>, postback = take, source=[take_combo]},
+      #dropdown{ id=discard_combo, value="2", postback=combo, source=[discard_combo], 
                  options = 
                      [
                       #option { label= <<"Option 1">>, value= <<"1">> },
@@ -59,7 +70,8 @@ body() ->
                       #option { label= <<"Option 3">>, value= <<"3">> }
                      ]
                },
-      #button{ id = discard, body = <<"Discard">>, postback = discard, source=[dddiscard]}
+      #button{ id = discard, body = <<"Discard">>, postback = discard, source=[discard_combo]},
+      #button{ id = player_info, body = <<"PlayerInfo">>, postback = player_info}
     ].
 
 event(terminate) -> wf:info("terminate");
@@ -70,20 +82,20 @@ event(init) ->
     ets:insert(globals,{wf:session_id(),GamePid}),
     put(game_session, GamePid);
 
-event(combo)  -> wf:info("Combo: ~p",[wf:q(dddiscard)]);
+event(combo)  -> wf:info("Combo: ~p",[wf:q(discard_combo)]);
 event(join)   -> wf:wire(join("1000001"));
+event(take)   -> wf:wire(take("1000001", wf:q(take_combo)));
+event(player_info) -> wf:wire(player_info(wf:f("'~s'",["maxim"]),wf:f("'~s'",[game_okey])));
 event(attach) -> 
     Token = auth_server:generate_token(1000001,"maxim"),
     wf:wire(attach(wf:f("'~s'",[Token])));
 
-event(take)   -> wf:wire(take("1000001", wf:q(ddtake)));
-
 event(discard) -> 
     TilesList = get(game_okey_tiles),
-%    wf:info("dd ~p", [wf:q(dddiscard)]),
-    {_, {C, V}} = lists:keyfind(erlang:list_to_binary(wf:q(dddiscard)), 1, TilesList),
+    {_, {C, V}} = lists:keyfind(erlang:list_to_binary(wf:q(discard_combo)), 1, TilesList),
     wf:wire(discard("1000001", erlang:integer_to_list(C), erlang:integer_to_list(V)));
 
+
 event({binary,M}) -> {ok,<<"Hello">>};
 
 event({client,Message}) ->
@@ -93,10 +105,12 @@ event({client,Message}) ->
 
 event({server, {game_event, _, okey_game_started, Args}}) ->
     {_, Tiles} = lists:keyfind(tiles, 1, Args),
-    TilesList = [{erlang:list_to_binary([erlang:integer_to_list(C), " ", erlang:integer_to_list(V)]), {C, V}} || {_, C, V} <- Tiles],
+    TilesList = [{erlang:list_to_binary([erlang:integer_to_list(C), " ",
+                 erlang:integer_to_list(V)]), {C, V}} || {_, C, V} <- Tiles],
     wf:info("tiles ~p", [TilesList]),
     put(game_okey_tiles, TilesList),
     redraw_tiles(TilesList);
+
 event({server, {game_event, _, okey_tile_discarded, Args}}) ->
     Im = get(okey_im),
     {_, Player} = lists:keyfind(player, 1, Args),
@@ -104,7 +118,6 @@ event({server, {game_event, _, okey_tile_discarded, Args}}) ->
     if
        Im == Player ->
             {_, {_, C, V}} = lists:keyfind(tile, 1, Args),
-%            wf:info("c ~p v ~p", [C, V]),
             TilesListOld = get(game_okey_tiles),
             TilesList = lists:keydelete({C, V}, 2, TilesListOld),
             put(game_okey_tiles, TilesList),
@@ -112,6 +125,7 @@ event({server, {game_event, _, okey_tile_discarded, Args}}) ->
        true ->
             ok
     end;
+
 event({server, {game_event, _, okey_tile_taken, Args}}) ->
     Im = get(okey_im),
     {_, Player} = lists:keyfind(player, 1, Args),
@@ -119,7 +133,8 @@ event({server, {game_event, _, okey_tile_taken, Args}}) ->
        Im == Player ->
             case lists:keyfind(revealed, 1, Args) of
                 {_, {_, C, V}} ->
-                    TilesList = [{erlang:list_to_binary([erlang:integer_to_list(C), " ", erlang:integer_to_list(V)]), {C, V}} | get(game_okey_tiles)],
+                    TilesList = [{erlang:list_to_binary([erlang:integer_to_list(C), " ",
+                                  erlang:integer_to_list(V)]), {C, V}} | get(game_okey_tiles)],
                     put(game_okey_tiles, TilesList),
                     redraw_tiles(TilesList);
                 _ ->
@@ -128,16 +143,19 @@ event({server, {game_event, _, okey_tile_taken, Args}}) ->
        true ->
             ok
     end;
+
 event({server,{game_event, Game, okey_turn_timeout, Args}}) ->
     wf:info("okey_turn_timeout ~p", [Args]),
     {_, TileTaken} = lists:keyfind(tile_taken, 1, Args),
-    event({server, {game_event, Game, okey_tile_taken, [{player, get(okey_im)}, {revealed, TileTaken}]}}),
+    event({server, {game_event, Game, okey_tile_taken,
+            [{player, get(okey_im)}, {revealed, TileTaken}]}}),
     {_, TileDiscarded} = lists:keyfind(tile_discarded, 1, Args),
-    event({server, {game_event, Game, okey_tile_discarded, [{player, get(okey_im)}, {tile, TileDiscarded}]}});
+    event({server, {game_event, Game, okey_tile_discarded,
+            [{player, get(okey_im)}, {tile, TileDiscarded}]}});
+
 event({server, {game_event, _, okey_game_info, Args}}) ->
     wf:info("okay_game_info ~p", [Args]),
     {_, PlayersInfo} = lists:keyfind(players, 1, Args),
-%    wf:info("pi ~p", [PlayersInfo]),
     Players = 
         lists:zipwith(
           fun(ListId, {PlayerId, PlayerLabel}) ->
@@ -147,10 +165,8 @@ event({server, {game_event, _, okey_game_info, Args}}) ->
           lists:map(
             fun
                 (#'PlayerInfo'{id = Id, robot = true} = P) ->
-%                    wf:info("pp ~p", [P]),
                     {Id, <<Id/binary, <<" R ">>/binary>>};
                 (#'PlayerInfo'{id = Id, robot = false} = P) ->
-%                    wf:info("pr ~p", [P]),
                     put(okey_im, Id),
                     {Id, <<Id/binary, <<" M ">>/binary>>}
             end,
@@ -159,7 +175,9 @@ event({server, {game_event, _, okey_game_info, Args}}) ->
          ),
     wf:info("players ~p", [Players]),
     put(okey_players, Players),
-    [wf:update(LabelId, [#label{id = LabelId, body = PlayerLabel}]) || {LabelId, _, PlayerLabel}  <- Players];
+    [wf:update(LabelId, [#label{id = LabelId, body = PlayerLabel}]) 
+         || {LabelId, _, PlayerLabel}  <- Players];
+
 event({server,{game_event, _, okey_next_turn, Args}}) ->
     {player, PlayerId} = lists:keyfind(player, 1, Args),
     {LabelId, _, _} = lists:keyfind(PlayerId, 2, get(okey_players)),
@@ -167,8 +185,12 @@ event({server,{game_event, _, okey_next_turn, Args}}) ->
         undefined ->
             ok;
         OldLabelId -> 
-            wf:wire("document.querySelector('#" ++ erlang:atom_to_list(OldLabelId) ++ "').style.color = \"black\";")
+            wf:wire("document.querySelector('#" ++ 
+                erlang:atom_to_list(OldLabelId) ++ "').style.color = \"black\";")
     end,
-    wf:wire("document.querySelector('#" ++ erlang:atom_to_list(LabelId) ++ "').style.color = \"red\";"),
+    wf:wire("document.querySelector('#" ++ erlang:atom_to_list(LabelId) 
+        ++ "').style.color = \"red\";"),
+
     put(okey_turn_mark, LabelId);
-event(Event)  -> ok. % wf:info("Event: ~p", [Event]).
+
+event(Event)  -> wf:info("Event: ~p", [Event]).

+ 2 - 2
apps/server/include/requests.hrl

@@ -67,7 +67,7 @@
 
 -record(game_action, {
           game      :: 'GameId'(),
-          action    :: atom(),
+          action    :: any(),
           args = [] :: proplist()
          }).
 %%%
@@ -75,7 +75,7 @@
 %%%
 -record(game_event, {
           game      :: 'GameId'(),
-          event     :: string(),
+          event     :: any(),
           args = [] :: proplist()
          }).
 

+ 0 - 68
apps/server/src/api_utils.erl

@@ -1,68 +0,0 @@
--module(api_utils).
-
--include("classes.hrl").
--include("logging.hrl").
--include_lib("server/include/log.hrl").
-
--export([to_known_record/2]).
--export([members/1, members/2, name/1]).
--export([gametype_to_atom/1, gametype_to_binary/1,
-         gamemodule_to_gametype/1, gametype_to_gamemodule/1]).
-
-gametype_to_atom(<<"okey">>) -> okey;
-gametype_to_atom(<<"king">>) -> king;
-gametype_to_atom(<<"tavla">>) -> tavla;
-gametype_to_atom(A) when is_atom(A) -> A.
-
-gamemodule_to_gametype(Atom) -> "game_" ++ X = atom_to_list(Atom), list_to_atom(X).
-gametype_to_gamemodule(Atom) -> list_to_atom("game_" ++ atom_to_list(Atom)).
-gametype_to_binary(GT) -> atom_to_binary(GT, latin1).
-
-members(T) -> members(T, recrunt).
-members(T, recrunt) -> Keys = recrunt:fields(T), Values = tl(tuple_to_list(T)), lists:zip(Keys, Values);
-members(T, Module) ->
-    try
-        Keys = Module:fields(T),
-        Values = tl(tuple_to_list(T)),
-        lists:zip(Keys, Values)
-    catch _:_ ->
-            members(T, recrunt)
-    end.
-
-name(T) -> element(1, T).
-
-to_known_record(Bin, Members) when is_binary(Bin) ->
-    Tag = try
-              T = list_to_atom(binary_to_list(Bin)),
-              recrunt:fields(T),
-              T
-          catch
-              _:_ ->
-                  gas:info(?MODULE,"{Bin, Members}: ~p", [{Bin, Members}]),
-                  erlang:error(api_error_unknown_call)
-          end,
-    to_known_record(Tag, Members);
-
-to_known_record(Tag, Members0) when is_atom(Tag) ->
-    try
-        Names = recrunt:fields(Tag),
-%        gas:info(?MODULE,"Names: ~p, Members: ~p",[Names,case Members0 of null -> []; X -> X end]),
-        Members = case to_proper_proplists(Members0) of null -> []; Y -> Y end,
-%        gas:info(?MODULE,"Members: ~p",[Members]),
-        Rev = lists:map(fun(X) ->
-                                Res = proplists:get_value(X, Members),
-                                %% true = (Res =/= undefined),
-                                Res
-                        end, Names),
-        List = [Tag | Rev],
-        list_to_tuple(List)
-    catch
-        _:_ ->
-            gas:info(?MODULE,"{Tag, Members0}: ~p", [{Tag, Members0}]),
-            erlang:error(api_error_wrong_params)
-    end.
-
-to_proper_proplists([{A, _} | _] = List) when is_binary(A)-> to_proper_proplists(List, []);
-to_proper_proplists(List) -> List.
-to_proper_proplists([], Acc) -> lists:reverse(Acc);
-to_proper_proplists([{A, B} | R], Acc) when is_binary(A)-> to_proper_proplists(R, [{list_to_atom(binary_to_list(A)), B} | Acc]).

+ 2 - 4
apps/server/src/game_session.erl

@@ -192,11 +192,9 @@ handle_client_request(#logout{}, _From, State) ->
     gas:info(?MODULE,"client requests #logout{}", []),
     {stop, normal, ok, State};
 
-handle_client_request(#get_player_stats{player_id = PlayerId, game_type = Game}, _From,
-                      State) when is_binary(Game) ->
-    gas:info(?MODULE,"get player stats", []),
-    GameModule = api_utils:gametype_to_gamemodule(api_utils:gametype_to_atom(Game)),
+handle_client_request(#get_player_stats{player_id = PlayerId, game_type = GameModule}, _From, State) ->
     Res = GameModule:get_player_stats(PlayerId),
+    gas:info(?MODULE,"get player stats: ~p", [Res]),
     {reply, Res, State};
 
 handle_client_request(#chat{chat_id = GameId, message = Msg0}, _From,

+ 1 - 1
apps/server/src/gas.erl

@@ -1,7 +1,7 @@
 -module(gas).
 -compile(export_all).
 
--define(ALLOWED, [nsg_trn_lucky,game_manager,game_okey_ng_table_trn]).
+-define(ALLOWED, [nsg_trn_lucky,game_session,game_manager,game_okey_ng_table_trn]).
 
 info(Module,String, Args) ->
     case lists:member(Module,?ALLOWED) of

+ 1 - 5
apps/server/src/recrunt.erl → apps/server/src/known_records.erl

@@ -1,4 +1,4 @@
--module(recrunt).
+-module(known_records).
 
 -include("types.hrl").
 -include("classes.hrl").
@@ -12,10 +12,6 @@
 
 fields(T) when is_tuple(T) ->  fields(element(1, T));
 
-fields('KamfRequest') ->           record_info(fields, 'KamfRequest');
-fields('KamfResponse') ->          record_info(fields, 'KamfResponse');
-fields('KamfFatalError') ->        record_info(fields, 'KamfFatalError');
-fields('KamfMessage') ->           record_info(fields, 'KamfMessage');
 fields(game_action) ->             record_info(fields, game_action);
 fields(match_me) ->                record_info(fields, match_me);
 fields(join_game) ->               record_info(fields, join_game);

+ 15 - 16
apps/server/src/okey/game_okey_ng_table_trn.erl

@@ -515,18 +515,11 @@ handle_player_action(#player{id = PlayerId, seat_num = SeatNum, user_id = UserId
                      {submit, #game_action{action = Action, args = Args} = GA}, From,
                      StateName,
                      #state{game_id = GameId, table_id = TableId} = StateData) ->
-    try api_utils:to_known_record(Action, Args) of
-        ExtAction ->
-            gas:info(?MODULE,"OKEY_NG_TABLE_TRN <~p,~p> Player <~p> (~p) submit the game action: ~p.",
-                  [GameId, TableId, PlayerId, UserId, ExtAction]),
-            do_action(SeatNum, ExtAction, From, StateName, StateData)
-    catch
-        _Class:_Exception ->
-            ?ERROR("OKEY_NG_TABLE_TRN <~p,~p> Can't convert action ~p. Exception: ~p:~p.",
-                   [GameId, TableId, GA, _Class, _Exception]),
-            {reply, {error, invalid_action}, StateName, StateData}
-    end;
-
+    {Keys,Values} = lists:unzip(Args),
+    ExtAction = list_to_tuple([Action|Values]),
+    gas:info(?MODULE,"OKEY_NG_TABLE_TRN <~p,~p> Player <~p> (~p) submit the game action: ~p.",
+        [GameId, TableId, PlayerId, UserId, ExtAction]),
+    do_action(SeatNum, ExtAction, From, StateName, StateData);
 
 handle_player_action(#player{id = PlayerId, user_id = UserId},
                      {signal, {pause_game, _}=Signal}, _From,
@@ -1001,17 +994,23 @@ init_players([{PlayerId, UserInfo, SeatNum, _StartPoints} | PlayersInfo], Player
     NewPlayers = reg_player(PlayerId, SeatNum, UserId, IsBot, UserInfo, _Connected = false, Players),
     init_players(PlayersInfo, NewPlayers).
 
-%%===================================================================
+%%=================================================================
 send_to_subscriber_ge(Relay, SubscrId, Msg) ->
-    Event = #game_event{event = api_utils:name(Msg), args = api_utils:members(Msg)},
+    [Name|List] = tuple_to_list(Msg),
+    Event = #game_event{event = Name, args = lists:zip(known_records:fields(Name),List) },
+    gas:info(?MODULE,"SEND SUB ~p",[Event]),
     ?RELAY:table_message(Relay, {to_subscriber, SubscrId, Event}).
 
 send_to_client_ge(Relay, PlayerId, Msg) ->
-    Event = #game_event{event = api_utils:name(Msg), args = api_utils:members(Msg)},
+    [Name|List] = tuple_to_list(Msg),
+    Event = #game_event{event = Name, args = lists:zip(known_records:fields(Name),List) },
+    gas:info(?MODULE,"SEND CLIENT ~p",[Event]),
     ?RELAY:table_message(Relay, {to_client, PlayerId, Event}).
 
 relay_publish_ge(Relay, Msg) ->
-    Event = #game_event{event = api_utils:name(Msg), args = api_utils:members(Msg)},
+    [Name|List] = tuple_to_list(Msg),
+    Event = #game_event{event = Name, args = lists:zip(known_records:fields(Name),List) },
+    gas:info(?MODULE,"RELAY PUBLISH ~p",[Event]),
     relay_publish(Relay, Event).
 
 relay_publish(Relay, Msg) ->

+ 4 - 2
apps/server/src/okey/test_okey.erl

@@ -421,7 +421,8 @@ pickup_game(S0) ->
     log(game_picked_up),
     GI = receive
              #'game_event'{event = <<"okey_game_info">>, args = Args0} ->
-                 A0 = api_utils:to_known_record(okey_game_info, Args0),
+                 {Keys,Values} = lists:unzip(Args0),
+                 A0 = list_to_tuple([okey_game_info|Values]),
                  gas:info(?MODULE,"A0: ~p", [A0]),
                  A0
          after ?BT -> erlang:error({server_timeout, "game_rematched"})
@@ -429,7 +430,8 @@ pickup_game(S0) ->
     gas:info(?MODULE,"ID: ~p, waiting for #okey_game_player_state", [Id]),
     GS = receive
              #'game_event'{event = <<"okey_game_player_state">>, args = Args} ->
-                 A = api_utils:to_known_record(okey_game_player_state, Args),
+                 {Keys2,Values2} = lists:unzip(Args),
+                 A = list_to_tuple([okey_game_player_state|Values2]),
                  gas:info(?MODULE,"A: ~p", [A]),
                  A
          after ?BT -> erlang:error({server_timeout, "game_rematched"})

+ 9 - 14
apps/server/src/tavla/game_tavla_ng_table.erl

@@ -622,18 +622,11 @@ handle_player_action(#player{id = PlayerId, seat_num = SeatNum, user_id = UserId
                      {submit, #game_action{action = Action, args = Args} = GA}, From,
                      StateName,
                      #state{game_id = GameId, table_id = TableId} = StateData) ->
-    try api_utils:to_known_record(Action, Args) of
-        ExtAction ->
-            gas:info(?MODULE,"TAVLA_NG_TABLE <~p,~p> Player <~p> (~p) submit the game action: ~p.",
-                  [GameId, TableId, PlayerId, UserId, ExtAction]),
-            do_action(SeatNum, ExtAction, From, StateName, StateData)
-    catch
-        _Class:_Exception ->
-            ?ERROR("TAVLA_NG_TABLE <~p,~p> Can't convert action ~p. Exception: ~p:~p.",
-                   [GameId, TableId, GA, _Class, _Exception]),
-            {reply, {error, invalid_action}, StateName, StateData}
-    end;
-
+    {Keys,Values} = lists:unzip(Args),
+    ExtAction = list_to_tuple([Action|Values]),
+    gas:info(?MODULE,"TAVLA_NG_TABLE <~p,~p> Player <~p> (~p) submit the game action: ~p.",
+        [GameId, TableId, PlayerId, UserId, ExtAction]),
+    do_action(SeatNum, ExtAction, From, StateName, StateData);
 
 handle_player_action(#player{id = PlayerId, user_id = UserId},
                      {signal, {pause_game, _}=Signal}, _From,
@@ -1154,11 +1147,13 @@ init_players([{PlayerId, UserInfo, SeatNum, _StartPoints} | PlayersInfo], Player
 %%===================================================================
 
 send_to_subscriber_ge(Relay, SubscrId, Msg) ->
-    Event = #game_event{event = api_utils:name(Msg), args = api_utils:members(Msg)},
+    [Name|List] = tuple_to_list(Msg),
+    Event = #game_event{event = Name, args = lists:zip(known_records:fields(Name),List) },
     ?RELAY:table_message(Relay, {to_subscriber, SubscrId, Event}).
 
 relay_publish_ge(Relay, Msg) ->
-    Event = #game_event{event = api_utils:name(Msg), args = api_utils:members(Msg)},
+    [Name|List] = tuple_to_list(Msg),
+    Event = #game_event{event = Name, args = lists:zip(known_records:fields(Name),List) },
     relay_publish(Relay, Event).
 
 relay_publish(Relay, Msg) ->

+ 1 - 0
rels/web/reltool.config

@@ -14,6 +14,7 @@
          erlydtl,
          db,
          server,
+         sync,
          kvs,
          face
         ]},