Skip to content

Commit 2816702

Browse files
VitalyVitaly
authored andcommitted
improve tournaments
1 parent 8a6329c commit 2816702

File tree

4 files changed

+35
-25
lines changed

4 files changed

+35
-25
lines changed

services/app/apps/codebattle/lib/codebattle/game/engine.ex

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ defmodule Codebattle.Game.Engine do
336336

337337
update_game!(game, %{
338338
state: get_state(game),
339-
players: get_game_players(game),
339+
players: get_players(game),
340340
duration_sec: params[:duration_sec] || game.duration_sec,
341341
finishes_at: game.finishes_at
342342
})
@@ -359,21 +359,15 @@ defmodule Codebattle.Game.Engine do
359359
|> Repo.update!()
360360
end
361361

362-
@spec update_game!(Game.t()) :: Game.t()
363362
@spec update_game!(Game.t(), map()) :: Game.t()
364-
def update_game!(%Game{} = game) do
365-
case Repo.get(Game, game.id) do
366-
nil ->
367-
game
368-
369-
game ->
370-
game
371-
|> Game.changeset(Map.from_struct(game))
372-
|> Repo.update!()
373-
end
374-
end
375-
376363
def update_game!(%Game{} = game, params) do
364+
params =
365+
if Map.has_key?(params, :players) do
366+
Map.put(params, :players, sanitize_players(params.players))
367+
else
368+
params
369+
end
370+
377371
case Repo.get(Game, game.id) do
378372
nil ->
379373
game
@@ -390,7 +384,9 @@ defmodule Codebattle.Game.Engine do
390384
end
391385

392386
def toggle_ban_player(%Game{} = game, player_id) do
393-
{:ok, {_old_game_state, new_game}} = fire_transition(game.id, :toggle_ban_player, %{id: player_id})
387+
{:ok, {_old_game_state, new_game}} =
388+
fire_transition(game.id, :toggle_ban_player, %{id: player_id})
389+
394390
{:ok, new_game}
395391
end
396392

@@ -409,7 +405,7 @@ defmodule Codebattle.Game.Engine do
409405
when old_state in ["waiting_opponent", "playing"] ->
410406
update_game!(new_game, %{
411407
state: get_state(new_game),
412-
players: get_game_players(new_game),
408+
players: get_players(new_game),
413409
duration_sec: new_game.duration_sec,
414410
finishes_at: new_game.finishes_at
415411
})
@@ -518,10 +514,8 @@ defmodule Codebattle.Game.Engine do
518514
end)
519515
end
520516

521-
defp get_game_players(game) do
522-
game
523-
|> get_players()
524-
|> Enum.map(fn player ->
517+
defp sanitize_players(players) do
518+
Enum.map(players, fn player ->
525519
editor_text = Utils.sanitize_jsonb(player.editor_text)
526520

527521
player

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,7 @@ defmodule Codebattle.Tournament.TournamentResult do
7777
games g
7878
where tournament_id = #{tournament.id}
7979
and state = 'game_over'
80-
and id not in (
81-
select distinct g.id from user_games ug inner join games g on g.id = ug.game_id
82-
where ug.is_bot = 't' and ug.result = 'won' and g.tournament_id = #{tournament.id}
83-
)
80+
and bot_won = FALSE
8481
GROUP BY
8582
task_id, level),
8683
stats as (

services/app/apps/codebattle/lib/codebattle_web/channels/tournament_admin_channel.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,7 @@ defmodule CodebattleWeb.TournamentAdminChannel do
433433

434434
# end
435435

436-
active_game_id = tournament.id |> get_active_game() |> dbg()
436+
active_game_id = get_active_game(tournament.id)
437437

438438
%{
439439
tasks_info: tasks_info,
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
defmodule Codebattle.Repo.Migrations.AddBotWonToGames do
2+
use Ecto.Migration
3+
@disable_ddl_transaction true
4+
@disable_migration_lock true
5+
6+
def change do
7+
execute("""
8+
ALTER TABLE games
9+
ADD COLUMN bot_won boolean
10+
GENERATED ALWAYS AS (players @> '[{"is_bot": true, "result": "won"}]') STORED
11+
""")
12+
13+
execute("""
14+
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_games_over_tourn_task_dur_nowin
15+
ON games (tournament_id, task_id, duration_sec)
16+
WHERE state = 'game_over' AND bot_won = FALSE
17+
""")
18+
end
19+
end

0 commit comments

Comments
 (0)