Skip to content

Commit 3b7c2fc

Browse files
committed
Completely broken will not work!
1 parent 1873891 commit 3b7c2fc

28 files changed

Lines changed: 1740 additions & 435 deletions

backend/pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,13 @@
3030
</properties>
3131

3232
<dependencies>
33+
34+
<dependency>
35+
<groupId>org.springframework.boot</groupId>
36+
<artifactId>spring-boot-starter-websocket</artifactId>
37+
<version>3.5.6</version>
38+
</dependency>
39+
3340
<dependency>
3441
<groupId>org.springframework.boot</groupId>
3542
<artifactId>spring-boot-starter-web</artifactId>
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.onevoneme.config;
2+
3+
import org.springframework.context.annotation.Configuration;
4+
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
5+
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
6+
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
7+
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
8+
9+
@Configuration
10+
@EnableWebSocketMessageBroker
11+
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
12+
13+
@Override
14+
public void configureMessageBroker(MessageBrokerRegistry config) {
15+
config.enableSimpleBroker("/topic");
16+
config.setApplicationDestinationPrefixes("/ws");
17+
}
18+
19+
@Override
20+
public void registerStompEndpoints(StompEndpointRegistry registry) {
21+
registry.addEndpoint("/connect-ws"); // connection endpoint
22+
}
23+
24+
}

backend/src/main/java/com/onevoneme/controller/BackendController.java renamed to backend/src/main/java/com/onevoneme/controller/RestController.java

Lines changed: 14 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,22 @@
11
package com.onevoneme.controller;
22

3-
import com.onevoneme.model.GameUser;
4-
import com.onevoneme.model.game.Game;
5-
import com.onevoneme.model.move.TTTMove;
63
import com.onevoneme.services.ManageGameService;
74
import com.onevoneme.services.UsernamePolicyService;
85
import org.springframework.http.HttpStatus;
96
import org.springframework.http.ResponseEntity;
7+
import org.springframework.messaging.handler.annotation.MessageMapping;
108
import org.springframework.web.bind.annotation.*;
119

1210
import java.util.HashMap;
1311
import java.util.Map;
1412

15-
@RestController
13+
@org.springframework.web.bind.annotation.RestController
1614
@RequestMapping("/api")
17-
public class BackendController {
15+
public class RestController {
1816
private final ManageGameService gameService;
1917
private final UsernamePolicyService usernamePolicyService;
2018

21-
public BackendController(ManageGameService gameService, UsernamePolicyService usernamePolicyService) {
19+
public RestController(ManageGameService gameService, UsernamePolicyService usernamePolicyService) {
2220
this.gameService = gameService;
2321
this.usernamePolicyService = usernamePolicyService;
2422
}
@@ -31,6 +29,16 @@ public ResponseEntity<Map<String, String>> health() {
3129
return ResponseEntity.ok(response);
3230
}
3331

32+
33+
@PostMapping("/queue/{username}")
34+
public ResponseEntity<String> queueUp(@PathVariable String username) {
35+
if (!gameService.isUserCreated(username)) {
36+
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
37+
}
38+
39+
return ResponseEntity.status(HttpStatus.ACCEPTED).body(gameService.queueUp(username).toString());
40+
}
41+
3442
@PostMapping("/register/{username}")
3543
public ResponseEntity<String> registerUser(@PathVariable String username) {
3644
String policyError = usernamePolicyService.validateUsername(username);
@@ -44,35 +52,5 @@ public ResponseEntity<String> registerUser(@PathVariable String username) {
4452
return new ResponseEntity<>(HttpStatus.ACCEPTED);
4553
}
4654
}
47-
48-
@PostMapping("/queue/{username}")
49-
public ResponseEntity<?> queueUp(@PathVariable String username) {
50-
if (!gameService.isUserCreated(username)) {
51-
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Please register before queueing.");
52-
}
53-
Game game = gameService.queueUp(username);
54-
return ResponseEntity.ok(game);
55-
}
56-
57-
@PostMapping("/make_move/tictactoe/{username}")
58-
public ResponseEntity<String> makeTicTacMove(@PathVariable String username, @RequestBody TTTMove move) {
59-
boolean success = gameService.makeMove(move);
60-
return success ? ResponseEntity.ok("success") : ResponseEntity.badRequest().body("unsuccessful");
61-
}
62-
63-
@GetMapping("/gamestate/{username}")
64-
public Game getGameState(@PathVariable String username) {
65-
return gameService.getGameState(username);
66-
}
67-
//
68-
// @PostMapping("/make_move/rockpaperscissors/{username}")
69-
// public ResponseEntity<String> makeTicTacMove(@PathVariable String username, @RequestBody TTTMove move) {
70-
// boolean success = gameService.makeMove(move);
71-
// }
72-
73-
@GetMapping("/users")
74-
public HashMap<String, GameUser> getUsers() {
75-
return gameService.getUsers();
76-
}
7755
}
7856

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.onevoneme.controller;
2+
import com.onevoneme.model.user.GameUser;
3+
import com.onevoneme.model.game.Game;
4+
import com.onevoneme.model.move.TTTMove;
5+
import com.onevoneme.services.ManageGameService;
6+
import org.springframework.messaging.handler.annotation.MessageMapping;
7+
import org.springframework.messaging.handler.annotation.SendTo;
8+
import org.springframework.messaging.simp.SimpMessagingTemplate;
9+
import org.springframework.stereotype.Controller;
10+
import org.springframework.web.bind.annotation.GetMapping;
11+
import org.springframework.web.bind.annotation.PathVariable;
12+
import org.springframework.web.bind.annotation.RequestBody;
13+
14+
import java.util.HashMap;
15+
16+
@Controller
17+
public class SocketController {
18+
19+
private final SimpMessagingTemplate messagingTemplate;
20+
private final ManageGameService gameService;
21+
public SocketController(ManageGameService gameService, SimpMessagingTemplate messagingTemplate) {
22+
this.gameService = gameService;
23+
this.messagingTemplate = messagingTemplate;
24+
}
25+
26+
@MessageMapping("/make_move/tictactoe/{username}")
27+
public Game makeTicTacMove(@PathVariable String username, @RequestBody TTTMove move) {
28+
return gameService.makeMove(move);
29+
}
30+
31+
@MessageMapping("/gamestate/{username}")
32+
@SendTo("/topic/gamestate/{gamecode}")
33+
public Game getGameState(@PathVariable String username) {
34+
return gameService.getGameState(username);
35+
}
36+
37+
@GetMapping("/users")
38+
@SendTo("/topic/users")
39+
public HashMap<String, GameUser> getUsers() {
40+
return gameService.getUsers();
41+
}
42+
43+
}
Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,21 @@
11
package com.onevoneme.model.game;
22

3-
import com.onevoneme.model.GameUser;
4-
import java.util.HashSet;
5-
import java.util.Set;
3+
import com.onevoneme.model.user.GameUser;
64

75
public class ActiveGame {
86
private GameUser[] users;
97
private Game game;
10-
private Set<String> usersAcknowledgedEnd = new HashSet<>();
118

129
public ActiveGame(Game game, GameUser user1, GameUser user2) {
1310
this.game = game;
1411
users = new GameUser[] {user1, user2};
1512
}
1613

17-
// Explicit getters to avoid reliance on Lombok annotation processing in build environments
1814
public GameUser[] getUsers() {
1915
return users;
2016
}
2117

2218
public Game getGame() {
2319
return game;
2420
}
25-
26-
public void acknowledgeEnd(String username) {
27-
usersAcknowledgedEnd.add(username);
28-
}
29-
30-
public boolean bothUsersAcknowledgedEnd() {
31-
return usersAcknowledgedEnd.size() >= 2;
32-
}
33-
34-
public Set<String> getUsersAcknowledgedEnd() {
35-
return usersAcknowledgedEnd;
36-
}
3721
}

backend/src/main/java/com/onevoneme/model/game/Game.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@
55
public interface Game {
66
boolean validateMove(Move move);
77
void makeMove(Move move);
8-
boolean getWon();
8+
boolean gameCompleted();
9+
String getWinner();
910
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.onevoneme.model.game;
2+
3+
import java.security.SecureRandom;
4+
5+
public class GameCodeGenerator {
6+
private static final String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
7+
private static final SecureRandom rand = new SecureRandom();
8+
9+
public static String generate(int length) {
10+
StringBuilder sb = new StringBuilder(length);
11+
for (int i = 0; i < length; i++) {
12+
sb.append(characters.charAt(rand.nextInt(characters.length())));
13+
}
14+
return sb.toString();
15+
}
16+
}

backend/src/main/java/com/onevoneme/model/game/RockPaperScissors.java

Lines changed: 0 additions & 50 deletions
This file was deleted.

backend/src/main/java/com/onevoneme/model/game/UltimateTTT.java

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package com.onevoneme.model.game;
22

3-
import com.onevoneme.model.GameUser;
43
import com.onevoneme.model.move.Move;
54
import com.onevoneme.model.move.TTTMove;
65

7-
import java.util.ArrayList;
86
import java.util.HashMap;
97
import java.util.Map;
8+
import java.util.concurrent.atomic.AtomicReference;
109

1110
public class UltimateTTT implements Game {
1211
private int turn = 1;
@@ -15,24 +14,9 @@ public class UltimateTTT implements Game {
1514
private final String[] users;
1615
private int won = 0;
1716
private final String type = "tictactoe";
17+
private final String code = GameCodeGenerator.generate(7);
1818

19-
public String getType() {
20-
return type;
21-
}
22-
23-
public int getTurn() {
24-
return turn;
25-
}
26-
27-
public int[][] getTotalBoard() {
28-
return totalBoard;
29-
}
30-
31-
public Map<String, Integer> getUsernameToTacNumber() {
32-
return usernameToTacNumber;
33-
}
34-
35-
public int getWinner() {
19+
public int getWon() {
3620
return won;
3721
}
3822

@@ -83,10 +67,23 @@ public void makeMove(Move move) {
8367
}
8468

8569
@Override
86-
public boolean getWon() {
70+
public boolean gameCompleted() {
8771
return this.won != 0;
8872
}
8973

74+
@Override
75+
public String getWinner() {
76+
if(this.won == 0) return "None";
77+
if(this.won == -1) return "Cats";
78+
AtomicReference<String> winner = new AtomicReference<>("");
79+
usernameToTacNumber.forEach((key, value) -> {
80+
if(this.won == value) {
81+
winner.set(key);
82+
}
83+
});
84+
return winner.get();
85+
}
86+
9087
// Returns winner number (1 or 2) if someone won, 0 if no winner yet or cat's game
9188
public int isBoardWon() {
9289
// Check rows
@@ -131,4 +128,25 @@ public boolean isBoardFull() {
131128
}
132129
return true;
133130
}
131+
132+
public String getCode() {
133+
return this.code;
134+
}
135+
136+
public String getType() {
137+
return type;
138+
}
139+
140+
public int getTurn() {
141+
return turn;
142+
}
143+
144+
public int[][] getTotalBoard() {
145+
return totalBoard;
146+
}
147+
148+
public Map<String, Integer> getUsernameToTacNumber() {
149+
return usernameToTacNumber;
150+
}
151+
134152
}

backend/src/main/java/com/onevoneme/model/move/RPSMove.java

Lines changed: 0 additions & 12 deletions
This file was deleted.

0 commit comments

Comments
 (0)