Skip to content

Commit a931958

Browse files
authored
Merge pull request #2215 from hexlet-codebattle/add-fixes
Add fixes
2 parents a633176 + 4c73665 commit a931958

File tree

16 files changed

+565
-209
lines changed

16 files changed

+565
-209
lines changed

services/app/apps/codebattle/assets/js/socket.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ export const channelTopics = {
5555
tournamentPlayerFinishedRoundTopic: 'tournament:player:finished_round',
5656
tournamentPlayerFinishedTopic: 'tournament:player:finished',
5757
tournamentActivated: 'tournament:activated',
58+
tournamentCanceled: 'tournament:canceled',
5859

5960
roundCreatedTopic: 'round:created',
6061

services/app/apps/codebattle/assets/js/widgets/middlewares/Main.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,11 @@ const initPresence = followId => dispatch => {
104104
data => {
105105
camelizeKeysAndDispatch(dispatch, actions.changeTournamentState)(data);
106106
},
107+
).addListener(
108+
channelTopics.tournamentCanceled,
109+
data => {
110+
camelizeKeysAndDispatch(dispatch, actions.changeTournamentState)(data);
111+
},
107112
);
108113
};
109114

services/app/apps/codebattle/assets/js/widgets/pages/rating/RatingList.jsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ const renderUser = (page, pageSize, user, index) => (
3131
<UserInfo user={user} truncate />
3232
</td>
3333
<td className="p-3 align-middle text-nowrap text-white cb-border-color">{user.rank}</td>
34+
<td className="p-3 align-middle text-nowrap text-white cb-border-color">{user.points}</td>
3435
<td className="p-3 align-middle text-nowrap text-white cb-border-color">{user.rating}</td>
3536
<td className="p-3 align-middle text-nowrap text-white cb-border-color">{user.gamesPlayed}</td>
3637
<td className="p-3 align-middle text-nowrap text-white cb-border-color">
@@ -235,6 +236,13 @@ function UsersRating() {
235236
Rank &nbsp;
236237
{renderSortArrow('rank', sortParams)}
237238
</th>
239+
<th
240+
className="p-3 border-0 text-nowrap cursor-pointer"
241+
onClick={() => triggerSort('points')}
242+
>
243+
Points &nbsp;
244+
{renderSortArrow('points', sortParams)}
245+
</th>
238246
<th
239247
className="p-3 text-nowrap border-0 cursor-pointer"
240248
onClick={() => triggerSort('rating')}

services/app/apps/codebattle/assets/js/widgets/slices/lobby.js

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ const lobby = createSlice({
5858
state.activeGames = state.activeGames.map(game => {
5959
if (game.id === payload.gameId) {
6060
const newPlayers = game.players.map(player => (player.id === payload.userId
61-
? { ...player, editorLang: payload.editorLang }
62-
: player));
61+
? { ...player, editorLang: payload.editorLang }
62+
: player));
6363

6464
return { ...game, players: newPlayers };
6565
}
@@ -71,8 +71,8 @@ const lobby = createSlice({
7171
state.activeGames = state.activeGames.map(game => {
7272
if (game.id === payload.gameId) {
7373
const newPlayers = game.players.map(player => (player.id === payload.userId
74-
? { ...player, checkResult: payload.checkResult }
75-
: player));
74+
? { ...player, checkResult: payload.checkResult }
75+
: player));
7676

7777
return { ...game, players: newPlayers };
7878
}
@@ -131,16 +131,25 @@ const lobby = createSlice({
131131
},
132132
extraReducers: {
133133
[tournamentActions.changeTournamentState]: (state, { payload }) => {
134-
const seasonTournament = state.seasonTournaments.find(t => t.id === payload.id);
135-
const liveTournament = state.liveTournaments.find(t => t.id === payload.id);
134+
const seasonTournament = state.seasonTournaments.find(
135+
t => t.id === payload.id,
136+
);
137+
const liveTournament = state.liveTournaments.find(
138+
t => t.id === payload.id,
139+
);
136140

137141
if (seasonTournament) {
138-
state.upcomingTournaments = state.upcomingTournaments.filter(t => t.id !== payload.id);
139-
state.liveTournaments = [...state.liveTournaments, seasonTournament].sort(sortByStartsAt);
142+
state.seasonTournaments = state.seasonTournaments.filter(
143+
t => t.id !== payload.id,
144+
);
145+
state.liveTournaments = [
146+
...state.liveTournaments,
147+
{ ...seasonTournament, state: payload.state },
148+
].sort(sortByStartsAt);
140149
}
141150

142151
if (liveTournament) {
143-
state.liveTournaments = state.liveTournaments.map(t => (t.id === payload.id ? ({ ...t, state: payload.state }) : t));
152+
state.liveTournaments = state.liveTournaments.map(t => (t.id === payload.id ? { ...t, state: payload.state } : t));
144153
}
145154
},
146155
},

services/app/apps/codebattle/lib/codebattle/pub_sub/events.ex

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,16 @@ defmodule Codebattle.PubSub.Events do
1616
]
1717
end
1818

19+
def get_messages("tournament:canceled", params) do
20+
[
21+
%Message{
22+
topic: "season",
23+
event: "tournament:canceled",
24+
payload: %{tournament: params.tournament}
25+
}
26+
]
27+
end
28+
1929
def get_messages("tournament:activated", params) do
2030
[
2131
%Message{

services/app/apps/codebattle/lib/codebattle/tournament/context.ex

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -109,18 +109,6 @@ defmodule Codebattle.Tournament.Context do
109109
)
110110
end
111111

112-
@spec get_waiting_participants_to_start_candidates() :: list(Tournament.t())
113-
def get_waiting_participants_to_start_candidates do
114-
Enum.filter(get_live_tournaments(), fn tournament ->
115-
tournament.state == "waiting_participants" &&
116-
tournament.grade != "open" &&
117-
tournament.starts_at
118-
119-
# &&
120-
# DateTime.compare(tournament.starts_at, DateTime.utc_now()) == :lt
121-
end)
122-
end
123-
124112
@spec get_upcoming_to_live_candidate(non_neg_integer()) :: Tournament.t() | nil
125113
def get_upcoming_to_live_candidate(starts_at_delay_mins) do
126114
now = DateTime.utc_now()
@@ -133,8 +121,8 @@ defmodule Codebattle.Tournament.Context do
133121
where:
134122
t.state == "upcoming" and
135123
t.grade != "open" and
136-
t.starts_at > ^now and
137-
t.starts_at < ^delay_time
124+
t.starts_at >= ^now and
125+
t.starts_at <= ^delay_time
138126
)
139127
)
140128
end
@@ -341,11 +329,12 @@ defmodule Codebattle.Tournament.Context do
341329

342330
@spec move_upcoming_to_live(Tournament.t()) :: :ok
343331
def move_upcoming_to_live(tournament) do
344-
tournament
345-
|> Tournament.changeset(%{state: "waiting_participants"})
346-
|> Repo.update!()
332+
tournament =
333+
tournament
334+
|> Tournament.changeset(%{state: "waiting_participants"})
335+
|> Repo.update!()
347336

348-
:timer.sleep(1000)
337+
:timer.sleep(100)
349338

350339
Tournament.GlobalSupervisor.start_tournament(tournament)
351340
Codebattle.PubSub.broadcast("tournament:activated", %{tournament: tournament})

services/app/apps/codebattle/lib/codebattle/tournament/server.ex

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,14 @@ defmodule Codebattle.Tournament.Server do
9797
{:error, :not_found}
9898
end
9999

100+
def cast_event(tournament_id, event_type, params) do
101+
GenServer.cast(server_name(tournament_id), {:fire_event, event_type, params})
102+
catch
103+
:exit, reason ->
104+
Logger.warning("Error to send tournament update: #{inspect(reason)}")
105+
{:error, :not_found}
106+
end
107+
100108
# SERVER
101109
def init(tournament_id) do
102110
# Create tournament_info_cache table if it doesn't exist
@@ -120,6 +128,11 @@ defmodule Codebattle.Tournament.Server do
120128
|> Map.put(:tasks_table, tasks_table)
121129
|> Map.put(:clans_table, clans_table)
122130

131+
if tournament.grade != "open" do
132+
time_diff_ms = DateTime.diff(tournament.starts_at, DateTime.utc_now()) * 1000
133+
Process.send_after(self(), :start_grade_tournament, time_diff_ms)
134+
end
135+
123136
{:ok, %{tournament: tournament}}
124137
end
125138

@@ -130,6 +143,12 @@ defmodule Codebattle.Tournament.Server do
130143
end
131144
end
132145

146+
def handle_cast({:fire_event, event_type, params}, state) do
147+
{:reply, _tournament, state} = handle_call({:fire_event, event_type, params}, nil, state)
148+
149+
{:noreply, state}
150+
end
151+
133152
def handle_cast(:match_waiting_room_players, state) do
134153
handle_info(:match_waiting_room_players, state)
135154
{:noreply, state}
@@ -243,6 +262,15 @@ defmodule Codebattle.Tournament.Server do
243262
{:reply, tournament, Map.put(state, :tournament, new_tournament)}
244263
end
245264

265+
def handle_info(:start_grade_tournament, %{tournament: tournament}) do
266+
case tournament do
267+
%{players_count: pc} = t when pc > 0 -> cast_event(t.id, :start, %{})
268+
%{players_count: 0} = t -> cast_event(t.id, :cancel, %{})
269+
end
270+
271+
{:noreply, %{tournament: tournament}}
272+
end
273+
246274
def handle_info({:stop_round_break, round_position}, %{tournament: tournament}) do
247275
if tournament.current_round_position == round_position and
248276
in_break?(tournament) and
@@ -422,10 +450,4 @@ defmodule Codebattle.Tournament.Server do
422450
end
423451

424452
defp server_name(id), do: {:via, Registry, {Codebattle.Registry, "tournament_srv::#{id}"}}
425-
426-
# defp prepare_wr_player(player) do
427-
# player
428-
# |> Map.take([:id, :clan_id, :score, :wr_joined_at])
429-
# |> Map.put(:tasks, Enum.count(player.task_ids))
430-
# end
431453
end

services/app/apps/codebattle/lib/codebattle/tournament/strategy/base.ex

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -260,21 +260,21 @@ defmodule Codebattle.Tournament.Base do
260260

261261
def cancel(tournament, params \\ %{})
262262

263-
def cancel(tournament, %{user: user}) do
263+
def cancel(tournament, %{user: user} = params) do
264264
if can_moderate?(tournament, user) do
265-
new_tournament = tournament |> update_struct(%{state: "canceled"}) |> db_save!()
266-
267-
Game.Context.terminate_tournament_games(tournament.id)
268-
Tournament.GlobalSupervisor.terminate_tournament(tournament.id)
269-
270-
new_tournament
265+
cancel_tournament(tournament, params)
271266
else
272267
tournament
273268
end
274269
end
275270

276271
def cancel(tournament, _params) do
272+
cancel_tournament(tournament)
273+
end
274+
275+
defp cancel_tournament(tournament, params \\ %{}) do
277276
new_tournament = tournament |> update_struct(%{state: "canceled"}) |> db_save!()
277+
broadcast_tournament_canceled(new_tournament)
278278

279279
Game.Context.terminate_tournament_games(tournament.id)
280280
Tournament.GlobalSupervisor.terminate_tournament(tournament.id)
@@ -917,6 +917,11 @@ defmodule Codebattle.Tournament.Base do
917917
tournament
918918
end
919919

920+
defp broadcast_tournament_canceled(tournament) do
921+
Codebattle.PubSub.broadcast("tournament:canceled", %{tournament: tournament})
922+
tournament
923+
end
924+
920925
defp broadcast_tournament_finished(tournament) do
921926
Codebattle.PubSub.broadcast("tournament:finished", %{tournament: tournament})
922927
tournament

services/app/apps/codebattle/lib/codebattle/tournament/upcoming_runner.ex

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ defmodule Codebattle.Tournament.UpcomingRunner do
99
require Logger
1010

1111
@tournament_run_upcoming Application.compile_env(:codebattle, :tournament_run_upcoming)
12-
@worker_timeout to_timeout(second: 30)
12+
@worker_timeout to_timeout(second: 3)
1313

1414
@upcoming_time_before_live_mins 7
1515

@@ -30,7 +30,6 @@ defmodule Codebattle.Tournament.UpcomingRunner do
3030
@impl GenServer
3131
def handle_info(:run_upcoming, state) do
3232
run_upcoming()
33-
start_or_cancel_waiting_participants()
3433

3534
Process.send_after(self(), :run_upcoming, @worker_timeout)
3635

@@ -50,22 +49,4 @@ defmodule Codebattle.Tournament.UpcomingRunner do
5049
:noop
5150
end
5251
end
53-
54-
def start_or_cancel_waiting_participants do
55-
case Tournament.Context.get_waiting_participants_to_start_candidates() do
56-
tournaments when is_list(tournaments) ->
57-
Enum.each(
58-
tournaments,
59-
fn
60-
%{players_count: pc} = t when pc > 0 ->
61-
Tournament.Context.handle_event(t.id, :start, %{})
62-
63-
%{players_count: 0} = t ->
64-
Tournament.Context.handle_event(t.id, :cancel, %{})
65-
end
66-
)
67-
68-
:ok
69-
end
70-
end
7152
end

services/app/apps/codebattle/lib/codebattle/user/scope.ex

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ defmodule Codebattle.User.Scope do
3333
lang: u.lang,
3434
name: u.name,
3535
rank: u.rank,
36+
points: u.points,
3637
rating: u.rating
3738
})
3839
end
@@ -80,6 +81,10 @@ defmodule Codebattle.User.Scope do
8081
order_by(query, {^direction, :rank})
8182
end
8283

84+
defp apply_sort(query, "points", direction) do
85+
order_by(query, {^direction, :points})
86+
end
87+
8388
defp apply_sort(query, "rating", direction) do
8489
order_by(query, {^direction, :rating})
8590
end

0 commit comments

Comments
 (0)