@@ -3,11 +3,13 @@ defmodule CodebattleWeb.GroupTournamentChannel do
33 use CodebattleWeb , :channel
44
55 alias Codebattle.ExternalPlatformInvite.Context , as: InviteContext
6+ alias Codebattle.GroupTask.Context , as: GroupTaskContext
67 alias Codebattle.GroupTournament.Context , as: GroupTournamentContext
78 alias Codebattle.GroupTournament.Server , as: GroupTournamentServer
89 alias Codebattle.PubSub.Message
910 alias Codebattle.UserGroupTournament.Context , as: UserGroupTournamentContext
1011 alias Codebattle.Workers.PlatformInviteAdvancerWorker
12+ alias Runner.Languages
1113
1214 def join ( "group_tournament:" <> tournament_id , _payload , socket ) do
1315 case parse_tournament_id ( tournament_id ) do
@@ -58,7 +60,8 @@ defmodule CodebattleWeb.GroupTournamentChannel do
5860 require_invitation: true ,
5961 run_on_external_platform: group_tournament . run_on_external_platform ,
6062 platform_error: platform_error ,
61- external_setup: serialize_external_setup ( external_setup , user , group_tournament )
63+ external_setup: serialize_external_setup ( external_setup , user , group_tournament ) ,
64+ snapshot: build_snapshot ( group_tournament , user )
6265 } , socket }
6366 end
6467
@@ -71,10 +74,55 @@ defmodule CodebattleWeb.GroupTournamentChannel do
7174 invite: % { state: "accepted" } ,
7275 require_invitation: false ,
7376 run_on_external_platform: group_tournament . run_on_external_platform ,
74- external_setup: serialize_external_setup ( external_setup , current_user , group_tournament )
77+ external_setup: serialize_external_setup ( external_setup , current_user , group_tournament ) ,
78+ snapshot: build_snapshot ( group_tournament , current_user )
7579 } , socket }
7680 end
7781
82+ defp build_snapshot ( group_tournament , current_user ) do
83+ player_ids = Enum . map ( group_tournament . players , & & 1 . user_id )
84+
85+ latest_solutions =
86+ GroupTaskContext . list_latest_solutions ( group_tournament . group_task_id , player_ids ,
87+ group_tournament_id: group_tournament . id
88+ )
89+
90+ current_user_solutions =
91+ GroupTaskContext . list_user_solutions ( group_tournament . group_task_id , current_user . id ,
92+ group_tournament_id: group_tournament . id
93+ )
94+
95+ current_player = Enum . find ( group_tournament . players , & ( & 1 . user_id == current_user . id ) )
96+
97+ % {
98+ group_tournament: GroupTournamentContext . serialize_group_tournament ( group_tournament ) ,
99+ current_player: serialize_player ( current_player ) ,
100+ players: Enum . map ( group_tournament . players , & serialize_player / 1 ) ,
101+ latest_solutions: Map . new ( latest_solutions , & { & 1 . user_id , serialize_solution ( & 1 ) } ) ,
102+ solution_history: Enum . map ( current_user_solutions , & serialize_solution / 1 ) ,
103+ latest_solution: current_user_solutions |> List . first ( ) |> serialize_solution ( ) ,
104+ runs:
105+ group_tournament
106+ |> GroupTournamentContext . list_runs ( limit: :infinity )
107+ |> Enum . map ( & GroupTournamentContext . serialize_run / 1 ) ,
108+ langs: Languages . get_langs ( )
109+ }
110+ end
111+
112+ defp serialize_player ( nil ) , do: nil
113+
114+ defp serialize_player ( player ) do
115+ % {
116+ id: player . id ,
117+ user_id: player . user_id ,
118+ name: player . user && player . user . name ,
119+ lang: player . lang ,
120+ state: player . state ,
121+ last_setup_at: player . last_setup_at ,
122+ inserted_at: player . inserted_at
123+ }
124+ end
125+
78126 def handle_in ( "request_invite_update" , _ , socket ) do
79127 current_user = socket . assigns . current_user
80128
0 commit comments