Просмотр исходного кода

Merge branch 'master' of github.com:kakaranet/games

Maxim Sokhatsky 11 лет назад
Родитель
Сommit
68cdee8492

+ 3 - 1
apps/db/include/game_event_container.hrl

@@ -6,7 +6,9 @@
 -record(game_event_container,
 -record(game_event_container,
         {
         {
           ?ITERATOR(feed),
           ?ITERATOR(feed),
-          time,
+          game_id,
+          timestamp,
+          event,
           game_event
           game_event
         }).
         }).
 
 

+ 1 - 1
apps/db/src/db_game_event_container.erl

@@ -5,5 +5,5 @@
 
 
 metainfo() ->
 metainfo() ->
     #schema{name=kvs,tables=[
     #schema{name=kvs,tables=[
-        #table{name=game_event_container,fields=record_info(fields,game_event_container)}
+        #table{name=game_event_container,fields=record_info(fields,game_event_container), keys=[game_id, event]}
     ]}.
     ]}.

+ 1 - 0
apps/server/include/game_okey.hrl

@@ -171,6 +171,7 @@
           }).
           }).
 
 
 -record(okey_turn_timeout, {
 -record(okey_turn_timeout, {
+          player :: 'PlayerId'(),
           tile_taken = null :: #'OkeyPiece'{} | null,
           tile_taken = null :: #'OkeyPiece'{} | null,
           tile_discarded    :: #'OkeyPiece'{}
           tile_discarded    :: #'OkeyPiece'{}
           }).
           }).

+ 46 - 6
apps/server/src/game_observer.erl

@@ -22,7 +22,7 @@
          terminate/2, code_change/3]).
          terminate/2, code_change/3]).
 
 
 %% api
 %% api
--export([mypid/0, clear_history/0, get_history/0]).
+-export([mypid/0, clear_history/0, get_history/0, log_event/1]).
 
 
 -define(SERVER, ?MODULE).
 -define(SERVER, ?MODULE).
 
 
@@ -50,7 +50,9 @@ clear_history() ->
 
 
 get_history() ->
 get_history() ->
     gen_server:call(?SERVER, get_history).
     gen_server:call(?SERVER, get_history).
-    
+
+log_event(Event) ->
+    gen_server:cast(?SERVER, {log_event, Event}).
 
 
 %%%===================================================================
 %%%===================================================================
 %%% gen_server callbacks
 %%% gen_server callbacks
@@ -103,6 +105,24 @@ handle_call(_Request, _From, State) ->
 %%                                  {stop, Reason, State}
 %%                                  {stop, Reason, State}
 %% @end
 %% @end
 %%--------------------------------------------------------------------
 %%--------------------------------------------------------------------
+handle_cast({log_event, #game_event{game = GameId, event = EventName, args = Args} = Event}, #state{history = History} = State) ->
+
+    PlayerId = case lists:keyfind(player, 1, Args) of {_, Id} -> Id; _ -> <<"unknow">> end,
+    
+    Container = 
+        #game_event_container{
+           feed_id = {GameId, PlayerId},
+           id = {timestamp(), GameId, PlayerId},
+           game_id = GameId,
+           event = EventName,
+           timestamp = calendar:now_to_universal_time(erlang:now()), %% date in universal time
+           game_event = Event},
+ 
+    gas:info(?MODULE, ">>>>>>>>>>>>>>>>> Container ~p", [Container]),
+    
+    kvs:add(Container), %% will be spamming kvs
+
+    {noreply, State#state{history = [Event | History]}};
 handle_cast(clear_history, State) ->
 handle_cast(clear_history, State) ->
     {noreply, State#state{history = []}};
     {noreply, State#state{history = []}};
 handle_cast(_Msg, State) ->
 handle_cast(_Msg, State) ->
@@ -119,10 +139,25 @@ handle_cast(_Msg, State) ->
 %%                                   {stop, Reason, State}
 %%                                   {stop, Reason, State}
 %% @end
 %% @end
 %%--------------------------------------------------------------------
 %%--------------------------------------------------------------------
-handle_info({relay_event, _Ref, Event}, #state{history = History} = State) ->
-%%    Container = #game_event_container{id = erlang:now(), time = erlang:now(), game_event = Event},
-%%    kvs:add(Container), %% will be spamming kvs, remarked 
-    {noreply, State#state{history = [Event | History]}};
+
+%%handle_info({relay_event, _Ref, #game_event{game = GameId, event = Event, args = Args} = GameEvent},
+%%            #state{history = History} = State) ->
+%%    
+%%    {_, PlayerId} = lists:keyfind(player, 1, Args),
+%%    
+%%    Container = 
+%%        #game_event_container{
+%%           feed_id = {GameId, PlayerId},
+%%           id = {timestamp(), GameId, PlayerId},
+%%           game_id = GameId,
+%%           event = Event,
+%%           timestamp = calendar:now_to_universal_time(erlang:now()), %% date in universal time
+%%           game_event = GameEvent},
+%% 
+%%    gas:info(?MODULE, ">>>>>>>>>>>>>>>>> Container ~p", [Container]),
+%%    
+%%    kvs:add(Container), %% will be spamming kvs
+%%    {noreply, State#state{history = [Event | History]}};
 handle_info(_Info, State) ->
 handle_info(_Info, State) ->
     gas:info(?MODULE, ">>>>>>>>>>>>>>>>> info message ~p", [_Info]),
     gas:info(?MODULE, ">>>>>>>>>>>>>>>>> info message ~p", [_Info]),
     {noreply, State}.
     {noreply, State}.
@@ -155,3 +190,8 @@ code_change(_OldVsn, State, _Extra) ->
 %%%===================================================================
 %%%===================================================================
 %%% Internal functions
 %%% Internal functions
 %%%===================================================================
 %%%===================================================================
+
+
+timestamp() ->
+    {MegaSec, Sec, MiliSec} = erlang:now(),
+    MegaSec * 1000 * 1000 * 1000  + Sec * 1000 + MiliSec.

+ 19 - 14
apps/server/src/okey/game_okey_table.erl

@@ -118,7 +118,7 @@ init([GameId, TableId, Params]) ->
 
 
     Players = init_players(PlayersInfo),
     Players = init_players(PlayersInfo),
     RelayParams = [{players, [{PlayerId, UserInfo#'PlayerInfo'.id} || {PlayerId, UserInfo, _, _} <- PlayersInfo]},
     RelayParams = [{players, [{PlayerId, UserInfo#'PlayerInfo'.id} || {PlayerId, UserInfo, _, _} <- PlayersInfo]},
-                   {observers_allowed, true},
+                   {observers_allowed, false},
                    {table, {?MODULE, self()}}],
                    {table, {?MODULE, self()}}],
     {ok, Relay} = ?RELAY:start(RelayParams),
     {ok, Relay} = ?RELAY:start(RelayParams),
 
 
@@ -251,7 +251,7 @@ handle_parent_message({register_player, RequestId, UserInfo, PlayerId, SeatNum},
     {next_state, StateName, StateData#okey_state{players = NewPlayers}};
     {next_state, StateName, StateData#okey_state{players = NewPlayers}};
 
 
 handle_parent_message({replace_player, RequestId, UserInfo, PlayerId, SeatNum}, StateName,
 handle_parent_message({replace_player, RequestId, UserInfo, PlayerId, SeatNum}, StateName,
-                      #okey_state{game_id = GameId, table_id = TableId, players = Players,
+                      #okey_state{table_id = TableId, players = Players,
                              parent = Parent, relay = Relay} = StateData) ->
                              parent = Parent, relay = Relay} = StateData) ->
     #'PlayerInfo'{id = UserId, robot = IsBot} = UserInfo,
     #'PlayerInfo'{id = UserId, robot = IsBot} = UserInfo,
     #player{id = OldPlayerId} = get_player_by_seat_num(SeatNum, Players),
     #player{id = OldPlayerId} = get_player_by_seat_num(SeatNum, Players),
@@ -265,7 +265,7 @@ handle_parent_message({replace_player, RequestId, UserInfo, PlayerId, SeatNum},
     {next_state, StateName, StateData#okey_state{players = NewPlayers2}};
     {next_state, StateName, StateData#okey_state{players = NewPlayers2}};
 
 
 handle_parent_message(start_round, StateName,
 handle_parent_message(start_round, StateName,
-                      #okey_state{game_id = GameId, game_mode = GameMode, cur_round = CurRound,
+                      #okey_state{game_mode = GameMode, cur_round = CurRound,
                              gosterge_finish_allowed = GostergeFinishAllowed,
                              gosterge_finish_allowed = GostergeFinishAllowed,
                              start_seat = LastStartSeat, players = Players,
                              start_seat = LastStartSeat, players = Players,
                              relay = Relay, turn_timeout = TurnTimeout,
                              relay = Relay, turn_timeout = TurnTimeout,
@@ -360,7 +360,7 @@ handle_parent_message(show_round_result, StateName,
 
 
 %% Results = [{PlayerId, Position, Score, Status}] Status = winner | loser | eliminated | none
 %% Results = [{PlayerId, Position, Score, Status}] Status = winner | loser | eliminated | none
 handle_parent_message({show_series_result, Results}, StateName,
 handle_parent_message({show_series_result, Results}, StateName,
-                      #okey_state{game_id = GameId, relay = Relay, players = Players,
+                      #okey_state{relay = Relay, players = Players,
                              next_series_confirmation = Confirm} = StateData) ->
                              next_series_confirmation = Confirm} = StateData) ->
     Msg = create_okey_series_ended(Results, Players, Confirm),
     Msg = create_okey_series_ended(Results, Players, Confirm),
     relay_publish_ge(Relay, Msg, StateData),
     relay_publish_ge(Relay, Msg, StateData),
@@ -368,7 +368,7 @@ handle_parent_message({show_series_result, Results}, StateName,
 
 
 %% Results = [{UserId, Position, Score, Status}] Status = active | eliminated
 %% Results = [{UserId, Position, Score, Status}] Status = active | eliminated
 handle_parent_message({tour_result, TourNum, Results}, StateName,
 handle_parent_message({tour_result, TourNum, Results}, StateName,
-                      #okey_state{game_id = GameId, relay = Relay, tournament_table = TTable} = StateData) ->
+                      #okey_state{relay = Relay, tournament_table = TTable} = StateData) ->
     NewTTable = [{TourNum, Results} | TTable],
     NewTTable = [{TourNum, Results} | TTable],
     Msg = create_okey_tour_result(TourNum, Results),
     Msg = create_okey_tour_result(TourNum, Results),
     relay_publish_ge(Relay, Msg, StateData),
     relay_publish_ge(Relay, Msg, StateData),
@@ -695,7 +695,7 @@ do_game_action(SeatNum, GameAction, From, StateName,
 
 
 
 
 process_game_events(Events, #okey_state{desk_state = DeskState, players = Players,
 process_game_events(Events, #okey_state{desk_state = DeskState, players = Players,
-                                   game_id = GameId, relay = Relay, timeout_timer = OldTRef,
+                                   relay = Relay, timeout_timer = OldTRef,
                                    round_timeout = RoundTimeout, round_timer = RoundTRef,
                                    round_timeout = RoundTimeout, round_timer = RoundTRef,
                                    turn_timeout = TurnTimeout} = StateData) ->
                                    turn_timeout = TurnTimeout} = StateData) ->
     NewDeskState = handle_desk_events(Events, DeskState, Players, Relay, StateData), %% Track the desk and send game events to clients
     NewDeskState = handle_desk_events(Events, DeskState, Players, Relay, StateData), %% Track the desk and send game events to clients
@@ -846,13 +846,13 @@ handle_desk_events([Event | Events], DeskState, Players, Relay, #okey_state{} =
                 NewDiscarded = lists:keyreplace(SeatNum, 1, Discarded, {SeatNum, [Tash | Pile]}),
                 NewDiscarded = lists:keyreplace(SeatNum, 1, Discarded, {SeatNum, [Tash | Pile]}),
                 DeskState#desk_state{hands = NewHands, discarded = NewDiscarded, state = state_take};
                 DeskState#desk_state{hands = NewHands, discarded = NewDiscarded, state = state_take};
             {auto_take_discard, SeatNum, Tash} ->    %% Injected event
             {auto_take_discard, SeatNum, Tash} ->    %% Injected event
-                #player{id = PlayerId} = get_player_by_seat_num(SeatNum, Players),
-                Msg = create_okey_turn_timeout(Tash, Tash),
+                #player{id = PlayerId, user_id = UserId} = get_player_by_seat_num(SeatNum, Players),
+                Msg = create_okey_turn_timeout(UserId, Tash, Tash),
                 send_to_client_ge(Relay, PlayerId, Msg, StateData),
                 send_to_client_ge(Relay, PlayerId, Msg, StateData),
                 DeskState;
                 DeskState;
             {auto_discard, SeatNum, Tash} ->         %% Injected event
             {auto_discard, SeatNum, Tash} ->         %% Injected event
-                #player{id = PlayerId} = get_player_by_seat_num(SeatNum, Players),
-                Msg = create_okey_turn_timeout(null, Tash),
+                #player{id = PlayerId, user_id = UserId} = get_player_by_seat_num(SeatNum, Players),
+                Msg = create_okey_turn_timeout(UserId, null, Tash),
                 send_to_client_ge(Relay, PlayerId, Msg, StateData),
                 send_to_client_ge(Relay, PlayerId, Msg, StateData),
                 DeskState;
                 DeskState;
             {next_player, SeatNum} ->
             {next_player, SeatNum} ->
@@ -961,18 +961,21 @@ send_to_subscriber_ge(Relay, SubscrId, Msg, #okey_state{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,"SEND SUB ~p",[Event]),
     gas:info(?MODULE,"SEND SUB ~p",[Event]),
+    game_observer:log_event(Event),
     ?RELAY:table_message(Relay, {to_subscriber, SubscrId, Event}).
     ?RELAY:table_message(Relay, {to_subscriber, SubscrId, Event}).
 
 
 send_to_client_ge(Relay, PlayerId, Msg, #okey_state{game_id = GameId} = _StateData) ->
 send_to_client_ge(Relay, PlayerId, Msg, #okey_state{game_id = GameId} = _StateData) ->
     [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_observer:log_event(Event),
     ?RELAY:table_message(Relay, {to_client, PlayerId, Event}).
     ?RELAY:table_message(Relay, {to_client, PlayerId, Event}).
 
 
 relay_publish_ge(Relay, Msg, #okey_state{game_id = GameId} = _StateData) ->
 relay_publish_ge(Relay, Msg, #okey_state{game_id = GameId} = _StateData) ->
     [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,"RELAY PUBLISH ~p",[Event]),
     gas:info(?MODULE,"RELAY PUBLISH ~p",[Event]),
+    game_observer:log_event(Event),
     relay_publish(Relay, Event).
     relay_publish(Relay, Event).
 
 
 relay_publish(Relay, Msg) ->
 relay_publish(Relay, Msg) ->
@@ -1392,11 +1395,13 @@ create_okey_revealed(SeatNum, DiscardedTash, TashPlaces, Players) ->
                    hand = TashPlacesExt}.
                    hand = TashPlacesExt}.
 
 
 
 
-create_okey_turn_timeout(null, TashDiscarded) ->
-    #okey_turn_timeout{tile_taken = null,
+create_okey_turn_timeout(UserId, null, TashDiscarded) ->
+    #okey_turn_timeout{player = UserId,
+                       tile_taken = null,
                        tile_discarded = tash_to_ext(TashDiscarded)};
                        tile_discarded = tash_to_ext(TashDiscarded)};
-create_okey_turn_timeout(TashTaken, TashDiscarded) ->
-    #okey_turn_timeout{tile_taken = tash_to_ext(TashTaken),
+create_okey_turn_timeout(UserId, TashTaken, TashDiscarded) ->
+    #okey_turn_timeout{player = UserId,
+                       tile_taken = tash_to_ext(TashTaken),
                        tile_discarded = tash_to_ext(TashDiscarded)}.
                        tile_discarded = tash_to_ext(TashDiscarded)}.
 
 
 create_game_paused_pause(UserId, GameId) ->
 create_game_paused_pause(UserId, GameId) ->