Skip to content

Commit d81b6c7

Browse files
test123
1 parent b0009ad commit d81b6c7

File tree

5 files changed

+107
-72
lines changed

5 files changed

+107
-72
lines changed

API/Apps/Game/consumers.py

+8-5
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,15 @@
1717
from Apps.Game.matchmaking import match
1818

1919
from django.core.serializers.json import DjangoJSONEncoder
20+
21+
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)
@@ -241,7 +244,7 @@ async def update(self):
241244
paddle_height = 200
242245
ball_speed = 1.0006
243246

244-
winner_ball_count = 5
247+
winner_ball_count = 1
245248

246249
player1_score = GameConsumer.game_states[self.game_id]['player_one']['score']
247250
player2_score = GameConsumer.game_states[self.game_id]['player_two']['score']
@@ -296,8 +299,8 @@ async def update(self):
296299
'dy': random.choice([-5, 5])
297300
})
298301
if GameConsumer.game_states[self.game_id]['player_two']['score'] >= winner_ball_count:
299-
self.finish_game(self.player2['nickname'])
300302
game = await self.get_game()
303+
await self.finish_game(self.player2['nickname'])
301304
await self.channel_layer.group_send(
302305
self.game_group_name,
303306
{
@@ -329,7 +332,7 @@ async def update(self):
329332
})
330333
if GameConsumer.game_states[self.game_id]['player_one']['score'] >= winner_ball_count:
331334
game = await self.get_game()
332-
self.finish_game(self.player1['nickname'])
335+
await self.finish_game(self.player1['nickname'])
333336
await self.channel_layer.group_send(
334337
self.game_group_name,
335338
{

API/Apps/Tournament/consumers.py

+13-11
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,16 @@ def connect(self):
5555
self.send_error("invalid_params")
5656
self.close(code=1000)
5757
return
58+
self.accept()
5859
instance = Profile.objects.get(nickname=self.nickname)
5960
serializer = TournamentProfileSerializer(instance)
6061
cache_key = f"user_{self.tournament_id}"
6162
created_by = False
6263
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
6368
if tournament.created_by == instance:
6469
created_by = True
6570
data = add_player_to_cache(serializer.data, cache_key, created_by)
@@ -73,12 +78,11 @@ def connect(self):
7378
"tournament_name": tournament.name,
7479
"players": data
7580
}
76-
self.accept()
7781
self.send_to_group(tournament_info, "tournament_info")
7882

7983
def receive(self, text_data):
8084
data = json.loads(text_data)
81-
print("data",data)
85+
print("data", data)
8286
if data['send_type'] == 'checkMatch':
8387
self.checkMatch(self.nickname, self.tournament_id)
8488
elif data['send_type'] == 'start':
@@ -107,7 +111,8 @@ def send_error(self, error_type):
107111
self.send(text_data=json.dumps({"error": "players_not_ready", "message": "All players must be ready"}))
108112
elif error_type == "invalid_params":
109113
self.send(text_data=json.dumps({"error": "invalid_params", "message": "Something went wrong"}))
110-
114+
elif error_type == "tournament_finished":
115+
self.send(text_data=json.dumps({"error": "tournament_finished", "message": "Tournament is finished"}))
111116
def disconnect(self, close_code):
112117
async_to_sync(self.channel_layer.group_discard)(
113118
self.room_group_name,
@@ -128,7 +133,6 @@ def disconnect(self, close_code):
128133
tournament.delete()
129134

130135
def StartTournament(self, data):
131-
print(get_players_from_cache(f"user_{self.tournament_id}"))
132136
tournament = Tournament.objects.get(id=self.tournament_id)
133137
participants = tournament.current_participants.all()
134138
if tournament.current_participants.count() > 2:
@@ -168,7 +172,6 @@ def StartTournament(self, data):
168172
print(e)
169173

170174
def checkMatch(self, profile_id1, tournament_id):
171-
172175
try:
173176
tournament = Tournament.objects.get(pk=self.tournament_id)
174177
last_round = tournament.rounds.order_by('-round_number').first()
@@ -189,30 +192,28 @@ def checkMatch(self, profile_id1, tournament_id):
189192
for game in last_round.matches.all():
190193
if game.player1.nickname == self.nickname or game.player2.nickname == self.nickname:
191194
player_participated = True
192-
if game.winner is None:
193-
game.winner = game.player2
194-
game.save()
195-
print("Maçı Player 2 kazandı")
196-
return
197195

198196
if last_round.matches.count() == 1 and not last_round.participants.exists() and last_round.matches.first().winner:
199197
game = last_round.matches.first()
200198
tournament.winner = game.winner
201199
tournament.is_finished = True
202200
tournament.save()
201+
self.send_to_group({"winner": game.winner.nickname, "profile_picture": game.winner.profile_picture.url},
202+
"tournament_finished")
203203
if not player_participated:
204204
print("Player Maclarda Yok")
205205
return
206206

207207
winners = [game.winner for game in last_round.matches.all()]
208208
if len(last_round.participants.all()) == 1:
209209
winners.append(last_round.participants.first())
210+
print(winners)
210211
new_round.participants.set(winners)
211212
tournament.rounds.add(new_round)
212213
all_games = []
213214
for i in range(0, len(winners), 2):
214215
if i + 1 < len(winners):
215-
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)
216217
game_id = str(game.id)
217218
game.tournament_id = self.tournament_id
218219
player1_nick = str(winners[i].nickname)
@@ -226,4 +227,5 @@ def checkMatch(self, profile_id1, tournament_id):
226227
new_round.participants.remove(winners[i])
227228
new_round.participants.remove(winners[i + 1])
228229
new_round.save()
230+
self.send_to_group(all_games, "game_info")
229231
return

API/static/scripts/spa.js

+9-11
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=""/>

API/static/scripts/tournament.js

+61-45
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {BASE_URL, loadPage, WEBSOCKET_URL} from "./spa.js";
22
import {getActiveUserNickname} from "./utils.js";
33
import BaseComponent from "../components/Component.js";
44
import {notify} from "../components/Notification.js";
5+
56
class TournamentPlayers extends BaseComponent {
67
constructor(state, parentElement) {
78
super(state, parentElement);
@@ -24,111 +25,126 @@ class TournamentPlayers extends BaseComponent {
2425
`).join("")}
2526
`;
2627
}
28+
2729
render() {
2830
this.html = this.handleHTML();
2931
super.render();
3032

3133
}
3234
}
33-
function handleButtons(players,socket)
34-
{
35+
36+
function handleButtons(players, socket) {
3537
const nickname = getActiveUserNickname();
3638
const buttonWrapper = document.getElementById("button-wrapper");
3739
let player = players.find(player => player.nickname === nickname)
38-
if(!player)
40+
if (!player)
3941
return
40-
if(player.owner)
41-
{
42+
if (player.owner) {
4243
buttonWrapper.innerHTML = `<button id="start-button">Start</button>`
4344
let button = document.getElementById("start-button");
4445
button.addEventListener("click", () => {
4546
socket.send(JSON.stringify({send_type: "start", data: {nickname: nickname}}));
4647
});
47-
}
48-
else
49-
{
48+
} else {
5049
buttonWrapper.innerHTML = `<button id="ready-button">Ready</button>`
5150
let button = document.getElementById("ready-button");
5251
button.addEventListener("click", () => {
5352
socket.send(JSON.stringify({send_type: "ready", data: {nickname: nickname}}));
5453
});
5554
}
5655
}
57-
function handleErrorStates(data)
58-
{
59-
notify(data.message,3,'error')
56+
57+
function handleErrorStates(data) {
58+
notify(data.message, 3, 'error')
59+
setTimeout(() => {
60+
loadPage("/home/")
61+
}, 3000);
6062
}
61-
function renderTournamentInfo(response,socket)
62-
{
63-
let parentElement = document.getElementById("tournament-participants");
63+
64+
function renderTournamentInfo(response, socket) {
65+
let parentElement = document.getElementById("tournament-participants");
6466
const tournamentPlayers = new TournamentPlayers({players: response.data.players}, parentElement);
6567
tournamentPlayers.render();
66-
handleButtons(response.data.players,socket)
68+
handleButtons(response.data.players, socket)
6769
document.getElementById("tournament-header").innerText = response.data.tournament_name;
6870
}
69-
function handleGameRedirection(response)
70-
{
71-
for (let game of response.data)
72-
{
73-
if(game.players.includes(getActiveUserNickname()))
74-
{
71+
72+
function handleGameRedirection(response) {
73+
for (let game of response.data) {
74+
if (game.players.includes(getActiveUserNickname())) {
7575
console.log("redirecting to game")
7676
loadPage(`/game/${game.game_id}`)
7777
}
7878
}
7979
}
80-
function connectToSocket()
81-
{
80+
81+
function handleFinishedTournament(response) {
82+
let winner = response.data.winner;
83+
console.log("winner", winner)
84+
let winnerHTML = `
85+
<div class="winner-wrapper">
86+
<div class="winner-image-wrapper">
87+
<img src="${BASE_URL}${winner.profile_picture}" alt="" />
88+
</div>
89+
<h1>Winner is ${winner.nickname}</h1>
90+
</div>
91+
`
92+
93+
let element = document.createElement("div");
94+
element.id = "game-message-wrapper";
95+
element.innerHTML = winnerHTML;
96+
document.body.appendChild(element);
97+
setTimeout(() => {
98+
loadPage("/home/")
99+
}, 5000);
100+
}
101+
102+
function connectToSocket() {
82103
let errorStates = [
83104
"invalid_profile",
84105
"invalid_tournament",
85106
"tournament_started",
86107
"players_not_ready",
87108
"invalid_params",
109+
"tournament_finished"
88110
]
89-
try
90-
{
111+
try {
91112
const nickname = getActiveUserNickname();
92-
const tournamentId =window.location.pathname.split("/").filter(Boolean)[1];
113+
const tournamentId = window.location.pathname.split("/").filter(Boolean)[1];
93114
const url = `${WEBSOCKET_URL}/tournament/?nickname=${nickname}&tournament_id=${tournamentId}`;
94115
const socket = new WebSocket(url);
95116

96117
socket.onopen = () => {
97-
if(localStorage.getItem("tournament_id"))
98-
{
99-
localStorage.removeItem("tournament_id");
100-
console.log("sending check_match")
101-
socket.send(JSON.stringify({send_type: "checkMatch"}));
102-
}
118+
if (localStorage.getItem("tournament_id")) {
119+
localStorage.removeItem("tournament_id");
120+
socket.send(JSON.stringify({send_type: "checkMatch"}));
121+
}
103122
}
104123
socket.onmessage = (event) => {
105124
const response = JSON.parse(event.data);
106125
console.log("socket sent data", response)
107-
if(errorStates.includes(response.send_type))
108-
{
126+
if (errorStates.includes(response.send_type)) {
109127
handleErrorStates(response);
110128
}
111-
if(response.send_type === "tournament_info")
112-
{
113-
renderTournamentInfo(response,socket);
114-
}
115-
else if(response.send_type === "game_info")
116-
{
129+
if (response.send_type === "tournament_info") {
130+
renderTournamentInfo(response, socket);
131+
} else if (response.send_type === "game_info") {
117132
handleGameRedirection(response);
133+
} else if (response.send_type === "tournament_finished") {
134+
handleFinishedTournament(response);
118135
}
119136
}
120137
socket.onclose = () => {
121138
console.log("disconnected from the server");
122139
}
123140

124-
}
125-
catch (e)
126-
{
141+
} catch (e) {
127142
console.error(e);
128143
}
129144
}
130-
async function App()
131-
{
145+
146+
async function App() {
132147
connectToSocket()
133148
}
149+
134150
App().catch(e => console.error(e))

API/static/styles/tournament.css

+16
Original file line numberDiff line numberDiff line change
@@ -139,3 +139,19 @@
139139
gap: 2rem;
140140
align-items: center;
141141
}
142+
143+
.winner-wrapper{
144+
display: flex;
145+
align-items: center;
146+
justify-content: center;
147+
animation: fadeIn 1s;
148+
}
149+
.winner-wrapper h1{
150+
margin: 0;
151+
}
152+
.winner-image-wrapper{
153+
aspect-ratio: 1/1;
154+
width: 5rem;
155+
height: 5rem;
156+
border-radius: 50%;
157+
}

0 commit comments

Comments
 (0)