kvs_meeting.erl 5.0 KB

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