Skip to content

Commit 413bcd4

Browse files
Merge pull request #70 from bertt6/front-fix
Tournament Finished
2 parents b336948 + d81b6c7 commit 413bcd4

File tree

10 files changed

+172
-87
lines changed

10 files changed

+172
-87
lines changed

.idea/.gitignore

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

API/Apps/Game/consumers.py

+16-8
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,16 @@
1616
from Apps.Profile.models import Profile
1717
from Apps.Game.matchmaking import match
1818

19+
from django.core.serializers.json import DjangoJSONEncoder
20+
1921

2022
class MatchMakingConsumer(WebsocketConsumer):
2123
def connect(self):
2224
self.accept()
23-
self.profile = ProfileGetSerializer(Profile.objects.get(nickname=self.scope['url_route']['kwargs']['nickname'])).data
25+
self.profile = ProfileGetSerializer(
26+
Profile.objects.get(nickname=self.scope['url_route']['kwargs']['nickname'])).data
2427
async_to_sync(self.channel_layer.group_add)(
25-
'player-%s' %self.profile['nickname'],
28+
'player-%s' % self.profile['nickname'],
2629
self.channel_name
2730
)
2831
add_player_in_que(self.profile)
@@ -176,7 +179,7 @@ async def send_initial_state(self):
176179
'state_type': 'initial_state',
177180
'details': data,
178181
'game': GameConsumer.game_states[self.game_id]
179-
}))
182+
}, cls=DjangoJSONEncoder))
180183

181184
async def send_score_state(self, event):
182185
await self.send(text_data=json.dumps({
@@ -189,6 +192,7 @@ async def send_finish_state(self, event):
189192
'state_type': 'finish_state',
190193
'game': event['game'],
191194
'winner': event['winner'],
195+
'tournament_id': str(event['tournament_id'])
192196
}))
193197
await self.close()
194198

@@ -240,7 +244,7 @@ async def update(self):
240244
paddle_height = 200
241245
ball_speed = 1.0006
242246

243-
winner_ball_count = 5
247+
winner_ball_count = 1
244248

245249
player1_score = GameConsumer.game_states[self.game_id]['player_one']['score']
246250
player2_score = GameConsumer.game_states[self.game_id]['player_two']['score']
@@ -295,13 +299,15 @@ async def update(self):
295299
'dy': random.choice([-5, 5])
296300
})
297301
if GameConsumer.game_states[self.game_id]['player_two']['score'] >= winner_ball_count:
298-
self.finish_game(self.player2['nickname'])
302+
game = await self.get_game()
303+
await self.finish_game(self.player2['nickname'])
299304
await self.channel_layer.group_send(
300305
self.game_group_name,
301306
{
302307
'type': 'send_finish_state',
303308
'game': GameConsumer.game_states[self.game_id],
304-
'winner': self.player2
309+
'winner': self.player2,
310+
'tournament_id': str(game['tournament'])
305311
}
306312
)
307313
self.stop_event.set()
@@ -325,13 +331,15 @@ async def update(self):
325331
'dy': random.choice([-5, 5])
326332
})
327333
if GameConsumer.game_states[self.game_id]['player_one']['score'] >= winner_ball_count:
328-
self.finish_game(self.player1['nickname'])
334+
game = await self.get_game()
335+
await self.finish_game(self.player1['nickname'])
329336
await self.channel_layer.group_send(
330337
self.game_group_name,
331338
{
332339
'type': 'send_finish_state',
333340
'game': GameConsumer.game_states[self.game_id],
334-
'winner': self.player1
341+
'winner': self.player1,
342+
'tournament_id': str(game['tournament'])
335343
}
336344
)
337345
self.stop_event.set()

API/Apps/Tournament/admin.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from django.contrib import admin
22

3-
from Apps.Tournament.models import Tournament
3+
from Apps.Tournament.models import Tournament, Round
44

55
# Register your models here.
66

7-
admin.site.register(Tournament)
7+
admin.site.register(Tournament)
8+
admin.site.register(Round)

API/Apps/Tournament/api/urls.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
path('profile/<int:profile_id>', create),
88
path('<int:profile_id>/<uuid:tournament_id>', get_tournaments),
99
path('join/<int:tournament_id>', join),
10-
path('delete/<int:tournament_id>', delete),
10+
path('delete/<uuid:tournament_id>', delete),
1111
path('profile/w/<str:nickname>/', websocket_test)
1212

1313
]

API/Apps/Tournament/consumers.py

+31-25
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ def check_params(self):
4141
return True
4242

4343
def connect(self):
44-
self.accept()
4544
query_string = self.scope['query_string'].decode()
4645
params = urllib.parse.parse_qs(query_string)
4746

@@ -53,12 +52,19 @@ def connect(self):
5352
self.channel_name
5453
)
5554
if self.check_params():
55+
self.send_error("invalid_params")
5656
self.close(code=1000)
57+
return
58+
self.accept()
5759
instance = Profile.objects.get(nickname=self.nickname)
5860
serializer = TournamentProfileSerializer(instance)
5961
cache_key = f"user_{self.tournament_id}"
6062
created_by = False
6163
tournament = Tournament.objects.get(id=self.tournament_id)
64+
if tournament.is_finished:
65+
self.send_error("tournament_finished")
66+
self.close(code=1000)
67+
return
6268
if tournament.created_by == instance:
6369
created_by = True
6470
data = add_player_to_cache(serializer.data, cache_key, created_by)
@@ -76,11 +82,12 @@ def connect(self):
7682

7783
def receive(self, text_data):
7884
data = json.loads(text_data)
85+
print("data", data)
7986
if data['send_type'] == 'checkMatch':
8087
self.checkMatch(self.nickname, self.tournament_id)
8188
elif data['send_type'] == 'start':
8289
self.check_start_conditions()
83-
# self.StartTournament(data)
90+
self.StartTournament(data)
8491

8592
def check_start_conditions(self):
8693
player = get_player_from_cache(f"user_{self.tournament_id}", self.nickname)
@@ -91,10 +98,6 @@ def check_start_conditions(self):
9198
if len(players) < 3:
9299
self.send_error("invalid_tournament")
93100
return
94-
for player in players:
95-
if not player['is_ready']:
96-
self.send_error("players_not_ready")
97-
return
98101

99102
def send_error(self, error_type):
100103
if error_type == "invalid_profile":
@@ -106,7 +109,10 @@ def send_error(self, error_type):
106109
self.send(text_data=json.dumps({"error": "tournament_started", "message": "Tournament Already Started"}))
107110
elif error_type == "players_not_ready":
108111
self.send(text_data=json.dumps({"error": "players_not_ready", "message": "All players must be ready"}))
109-
112+
elif error_type == "invalid_params":
113+
self.send(text_data=json.dumps({"error": "invalid_params", "message": "Something went wrong"}))
114+
elif error_type == "tournament_finished":
115+
self.send(text_data=json.dumps({"error": "tournament_finished", "message": "Tournament is finished"}))
110116
def disconnect(self, close_code):
111117
async_to_sync(self.channel_layer.group_discard)(
112118
self.room_group_name,
@@ -129,9 +135,6 @@ def disconnect(self, close_code):
129135
def StartTournament(self, data):
130136
tournament = Tournament.objects.get(id=self.tournament_id)
131137
participants = tournament.current_participants.all()
132-
if tournament.rounds.exists():
133-
self.send_error("tournament_started")
134-
return
135138
if tournament.current_participants.count() > 2:
136139
round_number = 1
137140
round_obj = Round.objects.create(round_number=round_number)
@@ -153,6 +156,7 @@ def StartTournament(self, data):
153156
return
154157
game = Game.objects.create(player1=profile1, player2=profile2, tournament_id=self.tournament_id)
155158
game_id = str(game.id)
159+
game.tournament_id = self.tournament_id
156160
player1_nick = str(profile1.nickname)
157161
player2_nick = str(profile2.nickname)
158162
game_info = {
@@ -169,11 +173,7 @@ def StartTournament(self, data):
169173

170174
def checkMatch(self, profile_id1, tournament_id):
171175
try:
172-
profile_id = int(profile_id1)
173-
except ValueError:
174-
print("Tournament ID metin olarak beklenen türde değil.")
175-
try:
176-
tournament = Tournament.objects.get(pk=tournament_id)
176+
tournament = Tournament.objects.get(pk=self.tournament_id)
177177
last_round = tournament.rounds.order_by('-round_number').first()
178178
except Tournament.DoesNotExist:
179179
print("Turnuva Yok")
@@ -190,36 +190,42 @@ def checkMatch(self, profile_id1, tournament_id):
190190

191191
player_participated = False
192192
for game in last_round.matches.all():
193-
if game.player1.id == profile_id or game.player2.id == profile_id:
194-
print(game.player1.id, game.player2.id)
193+
if game.player1.nickname == self.nickname or game.player2.nickname == self.nickname:
195194
player_participated = True
196-
if game.winner is None:
197-
game.winner = game.player2
198-
game.save()
199-
print("Maçı Player 2 kazandı")
200-
return
201195

202196
if last_round.matches.count() == 1 and not last_round.participants.exists() and last_round.matches.first().winner:
203197
game = last_round.matches.first()
204198
tournament.winner = game.winner
205199
tournament.is_finished = True
206200
tournament.save()
201+
self.send_to_group({"winner": game.winner.nickname, "profile_picture": game.winner.profile_picture.url},
202+
"tournament_finished")
207203
if not player_participated:
208204
print("Player Maclarda Yok")
209205
return
210206

211207
winners = [game.winner for game in last_round.matches.all()]
212208
if len(last_round.participants.all()) == 1:
213209
winners.append(last_round.participants.first())
210+
print(winners)
214211
new_round.participants.set(winners)
215212
tournament.rounds.add(new_round)
216-
213+
all_games = []
217214
for i in range(0, len(winners), 2):
218215
if i + 1 < len(winners):
219-
game = Game.objects.create(player1=winners[i], player2=winners[i + 1])
216+
game = Game.objects.create(player1=winners[i], player2=winners[i + 1], tournament=tournament)
217+
game_id = str(game.id)
218+
game.tournament_id = self.tournament_id
219+
player1_nick = str(winners[i].nickname)
220+
player2_nick = str(winners[i + 1].nickname)
221+
game_info = {
222+
"game_id": game_id,
223+
"players": [player1_nick, player2_nick]
224+
}
225+
all_games.append(game_info)
220226
new_round.matches.add(game)
221227
new_round.participants.remove(winners[i])
222228
new_round.participants.remove(winners[i + 1])
223229
new_round.save()
224-
print("Yeni Turnuva Oluşturuldu")
230+
self.send_to_group(all_games, "game_info")
225231
return

API/static/scripts/game.js

+18-4
Original file line numberDiff line numberDiff line change
@@ -127,11 +127,12 @@ function setPlayerData(state)
127127
}
128128
function handleInitialState(state)
129129
{
130+
130131
setCurrentPoints(state)
131132
setPlayerData(state);
132133
draw(state.game,"red","blue");
133134
}
134-
function printWinner(winner,socket){
135+
function printWinner(data,winner,socket){
135136
let winnerHTML = `
136137
<div class="winner-wrapper">
137138
<div class="winner-image-wrapper">
@@ -146,8 +147,21 @@ function printWinner(winner,socket){
146147
document.body.appendChild(element);
147148
setTimeout(() => {
148149
element.remove();
149-
loadPage("/home/");
150150
}, 5000);
151+
console.log(data)
152+
if(data.tournament_id)
153+
{
154+
localStorage.setItem("tournament_id",data.tournament_id);
155+
setTimeout(() => {
156+
loadPage(`/tournament/${data.tournament_id}/`);
157+
}, 5000);
158+
}
159+
else
160+
{
161+
setTimeout(() => {
162+
loadPage("/home/");
163+
}, 5000);
164+
}
151165
}
152166
function printCountdown()
153167
{
@@ -204,6 +218,7 @@ async function connectToServer()
204218

205219
socket.onmessage = async (event) => {
206220
const data = JSON.parse(event.data);
221+
console.log(data)
207222
if(data.state_type === "initial_state")
208223
{
209224
try {
@@ -225,9 +240,8 @@ async function connectToServer()
225240
printCountdown();
226241
} else if (data.state_type === 'finish_state') {
227242
draw(data.game,"red","blue");
228-
229243
setCurrentPoints(data);
230-
printWinner(data.winner);
244+
printWinner(data,data.winner);
231245
}
232246
else if(data.state_type === "game_state")
233247
{

API/static/scripts/login.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ async function loginForm(event)
3939
const spinner = new Spinner({isVisible:true,className:"login-button-loader"}, loginButton);
4040
spinner.render();
4141
try{
42-
let response = await fetch(endpoint, {
42+
let response = await request(endpoint, {
4343
method: 'POST',
4444
headers: {
4545
'Content-Type': 'application/json',

API/static/scripts/spa.js

+10-12
Original file line numberDiff line numberDiff line change
@@ -53,21 +53,19 @@ const routes = new Map([
5353
</div>
5454
<div>
5555
<input
56-
type="password"
57-
class="login-input p-2"
58-
id="password"
59-
placeholder="PASSWORD"
56+
type="password"
57+
class="login-input p-2"
58+
id="password"
59+
placeholder="PASSWORD"
6060
/>
6161
</div>
6262
<div class="buttons-wrapper">
63-
64-
<button class="login-button" id="login-button" type="submit">LOGIN</button>
65-
<pong-redirect href="/auth/register/">
66-
<button class="login-button" type="button">REGISTER</button>
67-
</pong-redirect>
68-
63+
<button class="login-button" id="login-button" type="submit">LOGIN</button>
64+
<pong-redirect href="/auth/register/">
65+
<button class="login-button" type="button">REGISTER</button>
66+
</pong-redirect>
6967
</div>
70-
<button class="ecole-login-button">
68+
<button class="ecole-login-button" id="ecole-login-button" type="button">
7169
Login with 42
7270
<div>
7371
<img src="/static/public/42.svg" alt=""/>
@@ -828,7 +826,7 @@ async function tryRefreshToken() {
828826
return;
829827
try {
830828

831-
let data = await request(`token/refresh/`, {
829+
let data = await request(`auth/token/refresh/`, {
832830
method: 'POST',
833831
body: JSON.stringify({
834832
refresh: refresh_token

0 commit comments

Comments
 (0)