@@ -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
431453end
0 commit comments