game_log.erl 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. -module(game_log).
  2. -behaviour(gen_server).
  3. -include_lib("kvs/include/kvs.hrl").
  4. -include_lib("db/include/game_log.hrl").
  5. -include_lib("server/include/game_state.hrl").
  6. -include_lib("server/include/requests.hrl").
  7. -compile(export_all).
  8. -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
  9. -define(SERVER, ?MODULE).
  10. -record(state, {history = []}).
  11. start_link() -> gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
  12. mypid() -> gen_server:call(?SERVER, mypid).
  13. clear_history() -> gen_server:cast(?SERVER, clear_history).
  14. get_history() -> gen_server:call(?SERVER, get_history).
  15. protocol_event(PI,Event,State) -> gen_server:cast(?SERVER, {protocol_event, PI, Event, State}).
  16. reveal_event(User,Event,State) -> gen_server:cast(?SERVER, {reveal_event, User, Event, State}).
  17. update_stats(Key,User,Event,Pos,State) -> gen_server:cast(?SERVER, {update_stats, Key, User, Event, Pos, State}).
  18. timestamp() -> {MegaSec, Sec, MiliSec} = erlang:now(), MegaSec * 1000 * 1000 * 1000 + Sec * 1000 + MiliSec.
  19. init([]) -> {ok, #state{}}.
  20. handle_call(mypid, _From, State) -> {reply, {ok, self()}, State};
  21. handle_call(get_history, _From, #state{history = History} = State) -> {reply, {ok, lists:reverse(History)}, State};
  22. handle_call(_Request, _From, State) ->
  23. gas:info(?MODULE, "Event Log: call message ~p from ~p", [_Request, _From]),
  24. Reply = ok,
  25. {reply, Reply, State}.
  26. handle_cast({protocol_event, UserId,
  27. #game_event{event=EventName}=Event, GameState}, State) ->
  28. {Date,Time} = calendar:local_time(),
  29. GameKind = element(#table_state.tournament_type, GameState),
  30. GameMode = element(#table_state.game_mode, GameState),
  31. GameId = element(#table_state.game_id, GameState),
  32. Speed = element(#table_state.speed, GameState),
  33. Rounds = element(#table_state.rounds, GameState),
  34. Key = {GameKind,GameMode,Speed,Rounds,GameId},
  35. EventLogEntry =
  36. #protocol_event{
  37. user = UserId,
  38. feed_id = Key,
  39. id = timestamp(),
  40. game_id = GameId,
  41. date = Date,
  42. time = Time,
  43. module = GameKind,
  44. speed = Speed,
  45. rounds = Rounds,
  46. event = EventName,
  47. game_event = Event},
  48. gas:info(?MODULE, "Event Log: ~p", [EventLogEntry]),
  49. kvs:add(EventLogEntry),
  50. update_container_stats(Key, UserId, Event,#protocol_event.event,State),
  51. {noreply, State};
  52. handle_cast({update_stats, Key, User, Event, Pos, GameState}, State) ->
  53. update_container_stats(Key, User, Event,Pos, GameState),
  54. {noreply, State};
  55. handle_cast({reveal_event, User, Event, GameState}, State) ->
  56. kvs:add(Event),
  57. update_container_stats(element(#container_event.id,Event), User, Event, #reveal_event.reason, GameState),
  58. {noreply, State};
  59. handle_cast(clear_history, State) -> {noreply, State#state{history = []}};
  60. handle_cast(_Msg, State) -> gas:info(?MODULE, "Event Log: cast message ~p", [_Msg]), {noreply, State}.
  61. handle_info(_Info, State) -> gas:info(?MODULE, "Event Log: info message ~p", [_Info]), {noreply, State}.
  62. terminate(_Reason, _State) -> ok.
  63. code_change(_OldVsn, State, _Extra) -> {ok, State}.
  64. update_container_stats(Key,User,Event,Pos,GameState) ->
  65. {Date,Time} = calendar:local_time(),
  66. GameKind = element(#table_state.tournament_type,GameState),
  67. GameMode = element(#table_state.game_mode,GameState),
  68. GameId = element(#table_state.game_id,GameState),
  69. Speed = element(#table_state.speed,GameState),
  70. Rounds = element(#table_state.rounds,GameState),
  71. ContainerName = element(#container_event.container,Event),
  72. Container = case kvs:get(ContainerName,Key) of
  73. {ok,GL} -> GL;
  74. _ ->
  75. NC = list_to_tuple([ContainerName|proplists:get_value(ContainerName, kvs:containers())]),
  76. C1 = setelement(#container_log.id, NC, Key),
  77. C2 = setelement(#container_log.speed, C1, Speed),
  78. C3 = setelement(#container_log.rounds, C2, Rounds),
  79. C4 = setelement(#container_log.type, C3, GameMode),
  80. C5 = setelement(#container_log.module, C4, GameKind),
  81. C6 = setelement(#container_log.date, C5, Date),
  82. C7 = setelement(#container_log.time, C6, Time),
  83. C8 = setelement(#container_log.user, C7, User),
  84. C8
  85. end,
  86. ContainerStats = element(#container_log.stats, Container),
  87. EventName = element(Pos,Event),
  88. PS = case is_list(ContainerStats) of true -> ContainerStats; _ -> [] end,
  89. Stats = case lists:keyfind(EventName,1,PS) of
  90. {EventName,Count} -> lists:keyreplace(EventName,1,PS,{EventName,Count+1});
  91. false -> [{EventName,1}|PS] end,
  92. NewContainer = setelement(#container_log.stats,Container,Stats),
  93. kvs:put(NewContainer).