Skip to content

Commit 14bba3b

Browse files
VitalyVitaly
authored andcommitted
Improve ranking system
1 parent d0abfa9 commit 14bba3b

40 files changed

+6200
-6389
lines changed

services/app/apps/codebattle/assets/js/widgets/pages/tournament/StartRoundConfirmationModal.jsx

Lines changed: 32 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
import React, {
2-
useCallback,
3-
useRef,
4-
memo,
5-
useContext,
2+
useCallback, useRef, memo, useContext,
63
} from 'react';
74

85
import cn from 'classnames';
@@ -16,35 +13,29 @@ import {
1613
startRoundTournament as handleStartRoundTournament,
1714
} from '../../middlewares/TournamentAdmin';
1815

19-
import StageTitle from './StageTitle';
20-
2116
const getModalTittle = type => {
2217
switch (type) {
23-
case 'firstRound': return 'Start tournament confirmation';
24-
case 'nextRound': return 'Start next round';
25-
default: return '';
18+
case 'firstRound':
19+
return 'Start tournament confirmation';
20+
case 'nextRound':
21+
return 'Start next round';
22+
default:
23+
return '';
2624
}
2725
};
2826

2927
const getModalText = type => {
3028
switch (type) {
31-
case 'firstRound': return 'Are you sure you want to start the tournament?';
32-
case 'nextRound': return 'Are you sure you want to start the round?';
33-
default: return '';
34-
}
35-
};
36-
37-
const getSelectedRound = (type, currentRoundPosition) => {
38-
switch (type) {
39-
case 'firstRound': return currentRoundPosition;
40-
case 'nextRound': return currentRoundPosition + 1;
41-
default: return '';
29+
case 'firstRound':
30+
return 'Are you sure you want to start the tournament?';
31+
case 'nextRound':
32+
return 'Are you sure you want to start the round?';
33+
default:
34+
return '';
4235
}
4336
};
4437

4538
function StartRoundConfirmationModal({
46-
meta,
47-
currentRoundPosition,
4839
matchTimeoutSeconds,
4940
level,
5041
taskPackName,
@@ -85,71 +76,35 @@ function StartRoundConfirmationModal({
8576

8677
const title = getModalTittle(modalShowing);
8778
const text = getModalText(modalShowing);
88-
const selectedRound = getSelectedRound(modalShowing, currentRoundPosition);
8979

9080
return (
9181
<Modal show={!!modalShowing} onHide={onClose}>
9282
<Modal.Header closeButton>
9383
<Modal.Title>{title}</Modal.Title>
9484
</Modal.Header>
9585
<Modal.Body>
96-
<div
97-
className="d-flex flex-column justify-content-between align-items-center"
98-
>
86+
<div className="d-flex flex-column justify-content-between align-items-center">
9987
<h4 className="mb-4">{text}</h4>
10088
<div className="d-flex flex-column justify-content-center">
101-
{meta.roundsConfigType === 'per_round' ? (
102-
meta.roundsConfig.map((config, index) => {
103-
const textClassName = cn({
104-
'font-weight-bold': index === selectedRound,
105-
});
106-
107-
return (
108-
<div className={textClassName}>
109-
<span className="mr-4">
110-
<StageTitle stage={index} stagesLimit={meta.roundsLimit} />
111-
</span>
112-
<span title="Round timeout seconds" className="mr-2">
113-
{'Seconds: '}
114-
{config.roundTimeoutSeconds}
115-
{', '}
116-
</span>
117-
{config.taskPackId && (
118-
<span title="Round task pack id">
119-
{'Task pack id: '}
120-
{config.taskPackId}
121-
</span>
122-
)}
123-
{config.level && (
124-
<span title="Round task level">
125-
{'Task level: '}
126-
{config.taskLevel}
127-
</span>
128-
)}
129-
</div>
130-
);
131-
})
132-
) : (
133-
<div className="d-flex justify-content-center">
134-
<span title="Round timeout seconds" className="mr-2">
135-
{'Seconds: '}
136-
{matchTimeoutSeconds}
137-
{', '}
89+
<div className="d-flex justify-content-center">
90+
<span title="Round timeout seconds" className="mr-2">
91+
{'Seconds: '}
92+
{matchTimeoutSeconds}
93+
{', '}
94+
</span>
95+
{taskProvider === 'task_pack' && (
96+
<span title="Round task pack id">
97+
{'Task pack name: '}
98+
{taskPackName}
99+
</span>
100+
)}
101+
{taskProvider === 'level' && (
102+
<span title="Round task level">
103+
{'Task level: '}
104+
{level}
138105
</span>
139-
{taskProvider === 'task_pack' && (
140-
<span title="Round task pack id">
141-
{'Task pack name: '}
142-
{taskPackName}
143-
</span>
144-
)}
145-
{taskProvider === 'level' && (
146-
<span title="Round task level">
147-
{'Task level: '}
148-
{level}
149-
</span>
150-
)}
151-
</div>
152-
)}
106+
)}
107+
</div>
153108
</div>
154109
</div>
155110
</Modal.Body>

services/app/apps/codebattle/assets/js/widgets/pages/tournament/Tournament.jsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ function InfoPanel({
7777
matches={tournament.matches}
7878
tournamentId={tournament.id}
7979
currentUserId={currentUserId}
80-
roundsLimit={tournament.meta?.roundsLimit}
80+
roundsLimit={tournament.roundsLimit}
8181
currentRoundPosition={tournament.currentRoundPosition}
8282
pageNumber={tournament.playersPageNumber}
8383
pageSize={tournament.playersPageSize}
@@ -286,8 +286,6 @@ function Tournament({ waitingRoomMachine }) {
286286
setModalShowing={setDetailsModalShowing}
287287
/>
288288
<StartRoundConfirmationModal
289-
meta={tournament.meta}
290-
currentRoundPosition={tournament.currentRoundPosition}
291289
level={tournament.level}
292290
matchTimeoutSeconds={tournament.matchTimeoutSeconds}
293291
taskPackName={tournament.taskPackName}

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

Lines changed: 31 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -74,22 +74,22 @@ const initialLeaderboardUsers = leaderboardUsersData
7474
: [];
7575
const initialEvent = eventData
7676
? {
77-
...camelizeKeys(eventData),
78-
loading: loadingStatuses.PENDING,
79-
}
77+
...camelizeKeys(eventData),
78+
loading: loadingStatuses.PENDING,
79+
}
8080
: {
81-
loading: loadingStatuses.PENDING,
82-
};
81+
loading: loadingStatuses.PENDING,
82+
};
8383
const reportsParams = reportsData ? { list: camelizeKeys(reportsData) } : {};
8484

8585
// TODO: camelizeKeys initialUsers and refactor all selectors/reducers/components
8686
const initialUsers = currentUserParams
8787
? {
88-
[currentUserParams.id]: {
89-
...currentUserParams,
90-
type: userTypes.spectator,
91-
},
92-
}
88+
[currentUserParams.id]: {
89+
...currentUserParams,
90+
type: userTypes.spectator,
91+
},
92+
}
9393
: {};
9494

9595
// ******************************
@@ -114,9 +114,9 @@ export const defaultGameStatusState = {
114114

115115
const initialGameStatus = gameParams
116116
? {
117-
...defaultGameStatusState,
118-
...getGameStatus(gameParams),
119-
}
117+
...defaultGameStatusState,
118+
...getGameStatus(gameParams),
119+
}
120120
: defaultGameStatusState;
121121

122122
const initialGameAward = gameParams ? gameParams.award : null;
@@ -157,21 +157,21 @@ const setPlayersLangToSliseState = (state, { userId, langSlug }) => ({
157157

158158
const initialMeta = gameParams
159159
? gameParams.players
160-
.map(getPlayersText)
161-
.reduce(setPlayersMetaToSliseState, {})
160+
.map(getPlayersText)
161+
.reduce(setPlayersMetaToSliseState, {})
162162
: {};
163163

164164
const initialText = gameParams
165165
? gameParams.players
166-
.map(getPlayersText)
167-
.reduce(setPlayersTextToSliseState, {})
166+
.map(getPlayersText)
167+
.reduce(setPlayersTextToSliseState, {})
168168
: {};
169169

170170
const initialLangsHistory = gameParams && isRecord
171-
? gameParams.players
172-
.map(getPlayersText)
173-
.reduce(setPlayersLangToSliseState, {})
174-
: {};
171+
? gameParams.players
172+
.map(getPlayersText)
173+
.reduce(setPlayersLangToSliseState, {})
174+
: {};
175175

176176
const setPlayersResultsToSliceState = (state, { userId, ...rest }) => ({
177177
...state,
@@ -180,8 +180,8 @@ const setPlayersResultsToSliceState = (state, { userId, ...rest }) => ({
180180

181181
const initialResults = gameParams
182182
? gameParams.players
183-
.map(getPlayersExecutionData)
184-
.reduce(setPlayersResultsToSliceState, {})
183+
.map(getPlayersExecutionData)
184+
.reduce(setPlayersResultsToSliceState, {})
185185
: {};
186186

187187
const defaultTaskParams = {
@@ -238,9 +238,9 @@ const initialTemplates = taskParams
238238
: defaultTaskTemplates;
239239
const initialAssertsStatus = taskParams
240240
? {
241-
status: taskParams.asserts.length > 0 ? 'ok' : 'none',
242-
output: '',
243-
}
241+
status: taskParams.asserts.length > 0 ? 'ok' : 'none',
242+
output: '',
243+
}
244244
: defaultTaskAssertsStatus;
245245
const initialValidationStatuses = taskParams
246246
? getTaskValidationStatuses(taskParams)
@@ -259,6 +259,7 @@ const defaultTournamentParams = {
259259
clans: {},
260260
creator: {},
261261
creatorId: null,
262+
roundsLimit: 3,
262263
gameResults: {},
263264
insertedAt: null,
264265
isLive: false,
@@ -272,20 +273,6 @@ const defaultTournamentParams = {
272273
startsAt: null,
273274
state: 'loading',
274275
type: null,
275-
meta: {
276-
roundsToWin: 3,
277-
roundsLimit: 3,
278-
roundsConfigType: 'all',
279-
roundsConfig: [
280-
{
281-
roundTimeoutSeconds: 60,
282-
taskPackId: null,
283-
taskLevel: null,
284-
},
285-
],
286-
teams: [],
287-
},
288-
289276
accessType: 'token',
290277
accessToken: null,
291278
currentRoundPosition: null,
@@ -315,10 +302,10 @@ const defaultTournamentParams = {
315302

316303
const initialTournament = tournamentParams
317304
? {
318-
...defaultTournamentParams,
319-
...tournamentParams,
320-
channel: { online: !tournamentParams.isLive },
321-
}
305+
...defaultTournamentParams,
306+
...tournamentParams,
307+
channel: { online: !tournamentParams.isLive },
308+
}
322309
: defaultTournamentParams;
323310

324311
const initialLiveTournaments = tournamentsParams.filter(x => x.isLive);

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,7 @@ defmodule Codebattle.Tournament.Context do
104104
Repo.all(
105105
from(t in Tournament,
106106
order_by: t.starts_at,
107-
where:
108-
t.event_id == ^event_id and t.state in ["waiting_participants", "active", "finished"]
107+
where: t.event_id == ^event_id and t.state in ["waiting_participants", "active", "finished"]
109108
)
110109
)
111110
end

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

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@ defmodule Codebattle.Tournament.Ranking do
33

44
alias Codebattle.Tournament
55
alias Codebattle.Tournament.Ranking.ByClan
6-
alias Codebattle.Tournament.Ranking.ByPercentile
7-
alias Codebattle.Tournament.Ranking.Void
6+
alias Codebattle.Tournament.Ranking.ByUser
87
alias Codebattle.Tournament.Storage.Ranking
98

109
@spec get_first(tournament :: Tournament.t(), limit :: pos_integer()) :: list(map())
@@ -31,7 +30,8 @@ defmodule Codebattle.Tournament.Ranking do
3130
get_module(tournament).get_nearest_page_by_player(tournament, player)
3231
end
3332

34-
@spec get_page(tournament :: Tournament.t(), page :: pos_integer(), page_size :: pos_integer()) :: map()
33+
@spec get_page(tournament :: Tournament.t(), page :: pos_integer(), page_size :: pos_integer()) ::
34+
map()
3535
def get_page(tournament, page, page_size \\ 10)
3636

3737
def get_page(%{ranking_table: nil}, _page, _page_size),
@@ -50,7 +50,7 @@ defmodule Codebattle.Tournament.Ranking do
5050

5151
@spec drop_player(Tournament.t(), player_id :: pos_integer()) :: Tournament.t()
5252
def drop_player(tournament, player_id) do
53-
if get_module(tournament) == ByPercentile do
53+
if get_module(tournament) == ByUser do
5454
Ranking.drop_player(tournament, player_id)
5555
end
5656
end
@@ -74,25 +74,11 @@ defmodule Codebattle.Tournament.Ranking do
7474
tournament
7575
end
7676

77-
@spec preload_event_ranking(Tournament.t()) :: Tournament.t()
78-
def preload_event_ranking(%{use_event_ranking: true, event_id: event_id} = tournament) when not is_nil(event_id) do
79-
ranking = get_module(tournament).get_event_ranking(tournament)
80-
81-
Ranking.put_ranking(tournament, ranking)
82-
83-
event_ranking = Map.new(ranking, fn %{id: id} = item -> {id, item} end)
84-
Map.put(tournament, :event_ranking, event_ranking)
85-
end
86-
87-
def preload_event_ranking(t), do: t
88-
8977
@spec create_table(pos_integer()) :: term()
9078
def create_table(tournament_id) do
9179
Ranking.create_table(tournament_id)
9280
end
9381

9482
defp get_module(%{ranking_type: "by_clan"}), do: ByClan
95-
defp get_module(%{ranking_type: "by_percentile"}), do: ByPercentile
96-
defp get_module(%{ranking_type: "void"}), do: Void
97-
defp get_module(_tournament), do: ByPercentile
83+
defp get_module(%{ranking_type: "by_user"}), do: ByUser
9884
end

0 commit comments

Comments
 (0)