Browse Source

reveal log

Maxim Sokhatsky 11 years ago
parent
commit
f2198202d3

+ 12 - 8
apps/db/include/game_log.hrl

@@ -2,14 +2,18 @@
 -define(GAME_LOG_HRL, "game_log.hrl").
 -define(GAME_LOG_HRL, "game_log.hrl").
 
 
 -include_lib("kvs/include/kvs.hrl").
 -include_lib("kvs/include/kvs.hrl").
+-define(LOG_HEADER, game_id, date, time, user, module, type, speed, rounds).
+-define(CONTAINER_LOG, ?CONTAINER, ?LOG_HEADER, stats=[]).
+-record(container_log, {?CONTAINER_LOG}).
+-record(container_event, {?ITERATOR(container_log), ?LOG_HEADER }).
 
 
--record(game_log,  {?CONTAINER, protocol_stat=[] }).
--record(reveal_log,  {?CONTAINER, reveal_stat=[] }).
--record(event_log, {?ITERATOR(game_log),
-    game_id,
-    timestamp,
-    user,
-    event,
-    game_event}).
+-record(series_log,  {?CONTAINER_LOG}).
+-record(series_event,  {?ITERATOR(series_log),?LOG_HEADER}).
+
+-record(reveal_log,  {?CONTAINER_LOG}).
+-record(reveal_event,  {?ITERATOR(reveal_log), ?LOG_HEADER, reason, winner, score, total}).
+
+-record(protocol_log,  {?CONTAINER_LOG}).
+-record(protocol_event, {?ITERATOR(protocol_log), ?LOG_HEADER, event, game_event}).
 
 
 -endif.
 -endif.

+ 6 - 3
apps/db/src/db_game_log.erl

@@ -5,7 +5,10 @@
 
 
 metainfo() ->
 metainfo() ->
     #schema{name=kvs,tables=[
     #schema{name=kvs,tables=[
-        #table{name=game_log,container=true,fields=record_info(fields,game_log)},
-        #table{name=reveal_log,container=true,fields=record_info(fields,reveal_log)},
-        #table{name=event_log,container=game_log,fields=record_info(fields,event_log)}
+        #table{name=series_log,container=true,fields=record_info(fields,series_log),keys=[?LOG_HEADER]},
+        #table{name=reveal_log,container=true,fields=record_info(fields,reveal_log),keys=[?LOG_HEADER]},
+        #table{name=protocol_log,container=true,fields=record_info(fields,protocol_log),keys=[?LOG_HEADER]},
+        #table{name=series_event,container=series_log,fields=record_info(fields,series_event),keys=[?LOG_HEADER]},
+        #table{name=reveal_event,container=reveal_log,fields=record_info(fields,reveal_event),keys=[?LOG_HEADER]},
+        #table{name=protocol_event,container=protocol_log,fields=record_info(fields,protocol_event),keys=[?LOG_HEADER]}
     ]}.
     ]}.

+ 31 - 15
apps/server/src/okey/game_okey_table.erl

@@ -15,6 +15,7 @@
 -include_lib("server/include/game_okey.hrl").
 -include_lib("server/include/game_okey.hrl").
 -include_lib("server/include/game_state.hrl").
 -include_lib("server/include/game_state.hrl").
 -include_lib("server/include/requests.hrl").
 -include_lib("server/include/requests.hrl").
+-include_lib("db/include/game_log.hrl").
 
 
 %% --------------------------------------------------------------------
 %% --------------------------------------------------------------------
 %% External exports
 %% External exports
@@ -338,15 +339,15 @@ handle_parent_message(show_round_result, StateName,
 %                  create_okey_round_ended_reveal(
 %                  create_okey_round_ended_reveal(
 %                    Revealer, false, [], RoundScore, TotalScore, AchsPoints, StateData);
 %                    Revealer, false, [], RoundScore, TotalScore, AchsPoints, StateData);
               tashes_out ->
               tashes_out ->
-                    round_results(tashes_out,[],false,[],RoundScore,TotalScore,AchsPoints,StateData);
+                    round_results(tashes_out,none,false,[],RoundScore,TotalScore,AchsPoints,StateData);
 %                  create_okey_round_ended_tashes_out(
 %                  create_okey_round_ended_tashes_out(
 %                    RoundScore, TotalScore, AchsPoints, StateData);
 %                    RoundScore, TotalScore, AchsPoints, StateData);
               timeout ->
               timeout ->
-                    round_results(timeout,[],false,[],RoundScore,TotalScore,AchsPoints,StateData);
+                    round_results(timeout,none,false,[],RoundScore,TotalScore,AchsPoints,StateData);
 %                  create_okey_round_ended_tashes_out(
 %                  create_okey_round_ended_tashes_out(
 %                    RoundScore, TotalScore, AchsPoints, StateData);
 %                    RoundScore, TotalScore, AchsPoints, StateData);
               set_timeout ->
               set_timeout ->
-                    round_results(timeout,[],false,[],RoundScore,TotalScore,AchsPoints,StateData);
+                    round_results(timeout,none,false,[],RoundScore,TotalScore,AchsPoints,StateData);
 %                  create_okey_round_ended_tashes_out(
 %                  create_okey_round_ended_tashes_out(
 %                    RoundScore, TotalScore, AchsPoints, StateData);
 %                    RoundScore, TotalScore, AchsPoints, StateData);
               {gosterge_finish, Winner} ->
               {gosterge_finish, Winner} ->
@@ -957,10 +958,10 @@ init_players([{PlayerId, UserInfo, SeatNum, _StartPoints} | PlayersInfo], Player
 
 
 %%=================================================================
 %%=================================================================
 
 
-handle_log(PlayerId,Players,Event,State) ->
+handle_log(PlayerId,Players,Event,#okey_state{game_id=GameId}=State) ->
     case get_player(PlayerId, Players) of
     case get_player(PlayerId, Players) of
-        {ok, #player{info=#'PlayerInfo'{robot=false}=PlayerInfo}} ->
-             game_log:put(PlayerInfo,Event,State);
+        {ok, #player{info=#'PlayerInfo'{robot=false,id=User}=PlayerInfo}} ->
+             game_log:update_stats(User,User,Event,#game_event.event,State);
         _ -> ok end.
         _ -> ok end.
 
 
 send_to_subscriber_ge(Relay, SubscrId, Msg, #okey_state{players=Players,game_id = GameId} = State) ->
 send_to_subscriber_ge(Relay, SubscrId, Msg, #okey_state{players=Players,game_id = GameId} = State) ->
@@ -973,6 +974,7 @@ send_to_client_ge(Relay, PlayerId, Msg, #okey_state{players=Players,game_id = Ga
     [Name|List] = tuple_to_list(Msg),
     [Name|List] = tuple_to_list(Msg),
     Event = #game_event{game = GameId, event = Name, args = lists:zip(known_records:fields(Name),List) },
     Event = #game_event{game = GameId, event = Name, args = lists:zip(known_records:fields(Name),List) },
     gas:info(?MODULE,"SEND CLIENT ~p",[Event]),
     gas:info(?MODULE,"SEND CLIENT ~p",[Event]),
+    game_log:protocol_event(table,Event,State),
     handle_log(PlayerId,Players,Event,State),
     handle_log(PlayerId,Players,Event,State),
     ?RELAY:table_message(Relay, {to_client, PlayerId, Event}).
     ?RELAY:table_message(Relay, {to_client, PlayerId, Event}).
 
 
@@ -980,6 +982,7 @@ relay_publish_ge(Relay, Msg, #okey_state{players=Players,game_id = GameId} = Sta
     [Name|List] = tuple_to_list(Msg),
     [Name|List] = tuple_to_list(Msg),
     Event = #game_event{game = GameId, event = Name, args = lists:zip(known_records:fields(Name),List) },
     Event = #game_event{game = GameId, event = Name, args = lists:zip(known_records:fields(Name),List) },
     gas:info(?MODULE,"RELAYX PUBLISH ~p",[Event]),
     gas:info(?MODULE,"RELAYX PUBLISH ~p",[Event]),
+    game_log:protocol_event(table,Event,State),
     [ handle_log(Id,Players,Event,State) || {_,#player{id=Id},_} <- midict:to_list(Players)],
     [ handle_log(Id,Players,Event,State) || {_,#player{id=Id},_} <- midict:to_list(Players)],
     relay_publish(Relay, Event).
     relay_publish(Relay, Event).
 
 
@@ -1283,10 +1286,14 @@ round_results(
     Revealer, RevealerWin, WrongRejects, RoundScore,
     Revealer, RevealerWin, WrongRejects, RoundScore,
     TotalScore, PlayersAchsPoints,
     TotalScore, PlayersAchsPoints,
     State=#okey_state{
     State=#okey_state{
+        tournament_type=GameKind,
+        game_mode=GameMode,
+        speed=Speed,
+        rounds=Rounds,
         game_id=GameId,
         game_id=GameId,
         players=Players}) ->
         players=Players}) ->
 
 
-    [begin
+    Results = [begin
 
 
         #player{user_id = UserId} = get_player_by_seat_num(SeatNum, Players),
         #player{user_id = UserId} = get_player_by_seat_num(SeatNum, Players),
         IsWinner = if SeatNum == Revealer -> RevealerWin; true -> not RevealerWin end,
         IsWinner = if SeatNum == Revealer -> RevealerWin; true -> not RevealerWin end,
@@ -1294,17 +1301,26 @@ round_results(
         {_, PlayerScoreTotal} = lists:keyfind(SeatNum, 1, TotalScore),
         {_, PlayerScoreTotal} = lists:keyfind(SeatNum, 1, TotalScore),
         {_, PlayerScoreRound} = lists:keyfind(SeatNum, 1, RoundScore),
         {_, PlayerScoreRound} = lists:keyfind(SeatNum, 1, RoundScore),
 
 
-        player_result(Reason,GameId,UserId,IsWinner,PlayerScoreRound)
+        RE = #reveal_event{
+            id = game_log:timestamp(),
+            user = UserId,
+            module = GameKind,
+            speed = Speed,
+            rounds = Rounds,
+            type = GameMode,
+            reason = Reason,
+            winner = IsWinner,
+            score = PlayerScoreRound,
+            total = PlayerScoreTotal},
+        game_log:reveal_event(UserId,RE,State),
+        RE
 
 
     end || SeatNum <- lists:seq(1, ?SEATS_NUM)],
     end || SeatNum <- lists:seq(1, ?SEATS_NUM)],
 
 
-    ok.
-
-player_result(Reason,GameId,UserId,IsWinner,PlayerScoreRound) ->
-
-    
-
-    ok.
+    #okey_round_ended{
+        reason = Reason,
+        results = Results,
+        next_action = next_round}.
 
 
 create_okey_round_ended_reveal(Revealer, RevealerWin, WrongRejects, RoundScore, TotalScore, PlayersAchsPoints,
 create_okey_round_ended_reveal(Revealer, RevealerWin, WrongRejects, RoundScore, TotalScore, PlayersAchsPoints,
                         #okey_state{players = Players}) ->
                         #okey_state{players = Players}) ->

+ 67 - 17
apps/server/src/sup/game_log.erl

@@ -1,9 +1,8 @@
 -module(game_log).
 -module(game_log).
--author("Dayneko Roman <me@h0.org.ua>").
--copyright("Kakaranet").
 -behaviour(gen_server).
 -behaviour(gen_server).
 -include_lib("kvs/include/kvs.hrl").
 -include_lib("kvs/include/kvs.hrl").
 -include_lib("db/include/game_log.hrl").
 -include_lib("db/include/game_log.hrl").
+-include_lib("server/include/game_state.hrl").
 -include_lib("server/include/requests.hrl").
 -include_lib("server/include/requests.hrl").
 -compile(export_all).
 -compile(export_all).
 -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
 -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
@@ -14,7 +13,9 @@ start_link() -> gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
 mypid() -> gen_server:call(?SERVER, mypid).
 mypid() -> gen_server:call(?SERVER, mypid).
 clear_history() -> gen_server:cast(?SERVER, clear_history).
 clear_history() -> gen_server:cast(?SERVER, clear_history).
 get_history() -> gen_server:call(?SERVER, get_history).
 get_history() -> gen_server:call(?SERVER, get_history).
-put(PI,Event,State) -> gen_server:cast(?SERVER, {log_event, PI, Event, State}).
+protocol_event(PI,Event,State) -> gen_server:cast(?SERVER, {protocol_event, PI, Event, State}).
+reveal_event(User,Event,State) -> gen_server:cast(?SERVER, {reveal_event, User, Event, State}).
+update_stats(Key,User,Event,Pos,State) -> gen_server:cast(?SERVER, {update_stats, Key, User, Event, Pos, State}).
 timestamp() -> {MegaSec, Sec, MiliSec} = erlang:now(), MegaSec * 1000 * 1000 * 1000  + Sec * 1000 + MiliSec.
 timestamp() -> {MegaSec, Sec, MiliSec} = erlang:now(), MegaSec * 1000 * 1000 * 1000  + Sec * 1000 + MiliSec.
 
 
 init([]) -> {ok, #state{}}.
 init([]) -> {ok, #state{}}.
@@ -24,31 +25,80 @@ handle_call(_Request, _From, State) ->
     gas:info(?MODULE, "Event Log: call message ~p from ~p", [_Request, _From]),
     gas:info(?MODULE, "Event Log: call message ~p from ~p", [_Request, _From]),
     Reply = ok,
     Reply = ok,
     {reply, Reply, State}.
     {reply, Reply, State}.
-handle_cast({log_event, PI, #game_event{game = GameId, event = EventName, args = Args} = Event, GameState}, #state{history = History} = State) ->
+handle_cast({protocol_event, UserId,
+    #game_event{event=EventName}=Event, GameState}, State) ->
+
+    {Date,Time} = calendar:local_time(),
+    GameKind = element(#table_state.tournament_type, GameState),
+    GameMode = element(#table_state.game_mode, GameState),
+    GameId = element(#table_state.game_id, GameState),
+    Speed = element(#table_state.speed, GameState),
+    Rounds = element(#table_state.rounds, GameState),
+
+    Key = {GameKind,GameMode,Speed,Rounds,GameId},
 
 
     EventLogEntry = 
     EventLogEntry = 
-        #event_log{
-           feed_id = {GameId, PI#'PlayerInfo'.id},
-           id = {timestamp(), GameId, PI#'PlayerInfo'.id},
+        #protocol_event{
+           user = UserId,
+           feed_id = Key,
+           id = timestamp(),
            game_id = GameId,
            game_id = GameId,
+           date = Date,
+           time = Time,
+           module = GameKind,
+           speed = Speed,
+           rounds = Rounds,
            event = EventName,
            event = EventName,
-           timestamp = calendar:now_to_universal_time(erlang:now()),
            game_event = Event},
            game_event = Event},
 
 
     gas:info(?MODULE, "Event Log: ~p", [EventLogEntry]),
     gas:info(?MODULE, "Event Log: ~p", [EventLogEntry]),
     kvs:add(EventLogEntry),
     kvs:add(EventLogEntry),
+    update_container_stats(Key, UserId, Event,#protocol_event.event,State),
 
 
-    {ok,GL} = kvs:get(game_log,{GameId, PI#'PlayerInfo'.id}),
-    ProtocolStats = GL#game_log.protocol_stat,
-    PS = case is_list(ProtocolStats) of true -> ProtocolStats; _ -> [] end,
-    Stats = case lists:keyfind(EventName,1,PS) of
-        {EventName,Count} -> lists:keyreplace(EventName,1,PS,{EventName,Count+1});
-        false -> [{EventName,1}|PS] end,
-    kvs:put(GL#game_log{protocol_stat=Stats}),
-
-    {noreply, State#state{history = [Event | History]}};
+    {noreply, State};
+handle_cast({update_stats, Key, User, Event, Pos, GameState}, State) ->
+    update_container_stats(Key, User, Event,Pos, GameState),
+    {noreply, State};
+handle_cast({reveal_event, User, Event, GameState}, State) ->
+    kvs:add(Event),
+    update_container_stats(element(#container_event.id,Event), User, Event, #reveal_event.reason, GameState),
+    {noreply, State};
 handle_cast(clear_history, State) -> {noreply, State#state{history = []}};
 handle_cast(clear_history, State) -> {noreply, State#state{history = []}};
 handle_cast(_Msg, State) -> gas:info(?MODULE, "Event Log: cast message ~p", [_Msg]), {noreply, State}.
 handle_cast(_Msg, State) -> gas:info(?MODULE, "Event Log: cast message ~p", [_Msg]), {noreply, State}.
 handle_info(_Info, State) -> gas:info(?MODULE, "Event Log: info message ~p", [_Info]), {noreply, State}.
 handle_info(_Info, State) -> gas:info(?MODULE, "Event Log: info message ~p", [_Info]), {noreply, State}.
 terminate(_Reason, _State) -> ok.
 terminate(_Reason, _State) -> ok.
 code_change(_OldVsn, State, _Extra) -> {ok, State}.
 code_change(_OldVsn, State, _Extra) -> {ok, State}.
+
+update_container_stats(Key,User,Event,Pos,GameState) ->
+    {Date,Time} = calendar:local_time(),
+
+    GameKind = element(#table_state.tournament_type,GameState),
+    GameMode = element(#table_state.game_mode,GameState),
+    GameId = element(#table_state.game_id,GameState),
+    Speed = element(#table_state.speed,GameState),
+    Rounds = element(#table_state.rounds,GameState),
+
+    ContainerName = element(#container_event.container,Event),
+    Container = case kvs:get(ContainerName,Key) of
+        {ok,GL} -> GL;
+        _ ->
+            NC = list_to_tuple([ContainerName|proplists:get_value(ContainerName, kvs:containers())]),
+            C1 = setelement(#container_log.id, NC, Key),
+            C2 = setelement(#container_log.speed, C1, Speed),
+            C3 = setelement(#container_log.rounds, C2, Rounds),
+            C4 = setelement(#container_log.type, C3, GameMode),
+            C5 = setelement(#container_log.module, C4, GameKind),
+            C6 = setelement(#container_log.date, C5, Date),
+            C7 = setelement(#container_log.time, C6, Time),
+            C8 = setelement(#container_log.user, C7, User),
+            C8
+
+            end,
+    ContainerStats = element(#container_log.stats, Container),
+    EventName = element(Pos,Event),
+    PS = case is_list(ContainerStats) of true -> ContainerStats; _ -> [] end,
+    Stats = case lists:keyfind(EventName,1,PS) of
+        {EventName,Count} -> lists:keyreplace(EventName,1,PS,{EventName,Count+1});
+        false -> [{EventName,1}|PS] end,
+    NewContainer = setelement(#container_log.stats,Container,Stats),
+    kvs:put(NewContainer).