kvs_meeting.erl 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. -module(kvs_meeting).
  2. -include_lib("kvs/include/users.hrl").
  3. -include_lib("kvs/include/meetings.hrl").
  4. -include_lib("kvs/include/feed_state.hrl").
  5. -include_lib("kvs/include/log.hrl").
  6. -compile(export_all).
  7. create_team(Name) ->
  8. TID = kvs:next_id("team",1),
  9. ok = kvs:put(Team = #team{id=TID,name=Name}),
  10. TID.
  11. create(UID, Name) -> create(UID, Name, "", date(), time(), 100, 100, undefined, pointing, game_okey, standard, 8, slow).
  12. create(UID, Name, Desc, Date, Time, Players, Quota, Awards, Type, Game, Mode, Tours, Speed) ->
  13. NodeAtom = nsx_opt:get_env(store,game_srv_node,'game@doxtop.cc'),
  14. TID = rpc:call(NodeAtom, game_manager, gen_game_id, []),
  15. CTime = erlang:now(),
  16. ok = kvs:put(#meeting{name = Name,
  17. id = TID,
  18. description = Desc,
  19. quota = Quota,
  20. players_count = Players,
  21. start_date = Date,
  22. awards = Awards,
  23. creator = UID,
  24. created = CTime,
  25. game_type = Game,
  26. game_mode = Mode,
  27. type = Type,
  28. tours = Tours,
  29. speed = Speed,
  30. start_time = Time,
  31. status = created,
  32. owner = UID}),
  33. TID.
  34. get(TID) ->
  35. case kvs:get(meeting, TID) of
  36. {ok, Tournament} -> Tournament;
  37. {error, not_found} -> #meeting{};
  38. {error, notfound} -> #meeting{}
  39. end.
  40. start(_TID) -> ok.
  41. join(UID, TID) -> kvs:join_tournament(UID, TID).
  42. remove(UID, TID) -> kvs:leave_tournament(UID, TID).
  43. waiting_player(TID) -> kvs:tournament_pop_waiting_player(TID).
  44. joined_users(TID) -> kvs:tournament_waiting_queue(TID).
  45. user_joined(TID, UID) ->
  46. AllJoined = [UId || #play_record{who = UId} <- joined_users(TID)],
  47. lists:member(UID, AllJoined).
  48. all() -> kvs:all(tournament).
  49. user_is_team_creator(_UID, _TID) -> true.
  50. list_users_per_team(_TeamID) -> [].
  51. destroy(TID) -> kvs:delete_by_index(play_record, <<"play_record_tournament_bin">>, TID),
  52. kvs:delete(tournament,TID).
  53. clear() -> [destroy(T#meeting.id) || T <- kvs:all(meeting)].
  54. lost() -> lists:usort([erlang:element(3, I) || I <- kvs:all(play_record)]).
  55. fake_join(TID) -> [kvs_meeting:join(auth:ima_gio2(X),TID)||X<-lists:seq(1,30)].
  56. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  57. handle_notice(["tournaments", "user", UId, "create"] = Route,
  58. Message, #state{owner = Owner, type =Type} = State) ->
  59. ?INFO("queue_action(~p): create: Owner=~p, Route=~p, Message=~p", [self(), {Type, Owner}, Route, Message]),
  60. {TourName, TourDesc, {Y,M,D}, Time, MaxPlayers, Quota, Award, TourType, GameType} = Message,
  61. case kvs_meeting:create(UId, TourName, TourDesc, {Y,M,D}, Time, MaxPlayers, Quota, Award, TourType, GameType) of
  62. {error,X} ->
  63. ?ERROR("Error creating tournament: ~p", X);
  64. TId -> skip
  65. end,
  66. {noreply, State};
  67. handle_notice(["tournaments", "user", UId, "create_and_join"] = Route,
  68. Message, #state{owner = Owner, type =Type} = State) ->
  69. ?INFO("queue_action(~p): create_and_join: Owner=~p, Route=~p, Message=~p", [self(), {Type, Owner}, Route, Message]),
  70. {TourName, TourDesc, {Y,M,D}, Time, MaxPlayers, Quota, Award, TourType, GameType} = Message,
  71. case kvs_meeting:create(UId, TourName, TourDesc, {Y,M,D}, Time, MaxPlayers, Quota, Award, TourType, GameType) of
  72. {error,X} ->
  73. ?ERROR("Error creating tournament: ~p", X);
  74. TId ->
  75. kvs_meeting:join(UId, TId)
  76. end,
  77. {noreply, State};
  78. handle_notice(["system", "tournament_join"] = Route,
  79. Message, #state{owner = Owner, type =Type} = State) ->
  80. ?INFO("queue_action(~p): tournament_join: Owner=~p, Route=~p, Message=~p", [self(), {Type, Owner}, Route, Message]),
  81. {UId, TId} = Message,
  82. kvs_meeting:join(UId, TId),
  83. {noreply, State};
  84. handle_notice(["system", "tournament_remove"] = Route,
  85. Message, #state{owner = Owner, type =Type} = State) ->
  86. ?INFO("queue_action(~p): tournament_remove: Owner=~p, Route=~p, Message=~p", [self(), {Type, Owner}, Route, Message]),
  87. {UId, TId} = Message,
  88. kvs_meeting:remove(UId, TId),
  89. {noreply, State};
  90. handle_notice(Route, Message, State) -> error_logger:info_msg("Unknown MEETINGS notice").
  91. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  92. join_tournament(UserId, TournamentId) ->
  93. case kvs:get(user, UserId) of
  94. {ok, User} ->
  95. GP = case kvs_account:balance(UserId, points) of
  96. {ok, AS1} -> AS1;
  97. {error, _} -> 0 end,
  98. Q = case kvs_account:balance(UserId, quota) of
  99. {ok, AS4} -> AS4;
  100. {error, _} -> 0 end,
  101. RN = kvs_users:user_realname(UserId),
  102. kvs:put(#play_record{
  103. who = UserId,
  104. tournament = TournamentId,
  105. team = User#user.team,
  106. game_id = undefined,
  107. other = now(),
  108. realname = RN,
  109. points = GP,
  110. quota = Q});
  111. _ ->
  112. ?INFO(" User ~p not found for joining tournament ~p", [UserId, TournamentId])
  113. end.
  114. leave_tournament(UserId, TournamentId) ->
  115. case kvs:get(play_record, {UserId, TournamentId}) of
  116. {ok, _} ->
  117. kvs:delete(play_record, {UserId, TournamentId}),
  118. leave_tournament(UserId, TournamentId); % due to WTF error with old records
  119. _ -> ok
  120. end.
  121. user_tournaments(UId) ->
  122. kvs:all_by_index(play_record, <<"play_record_who_bin">>, list_to_binary(UId)).
  123. tournament_waiting_queue(TId) ->
  124. kvs:all_by_index(play_record, <<"play_record_tournament_bin">>, list_to_binary(integer_to_list(TId))).