Skip to content

Commit fc26214

Browse files
committed
login, logout via status map
todo: OpenGames via status map
1 parent 5b18c3e commit fc26214

File tree

8 files changed

+83
-39
lines changed

8 files changed

+83
-39
lines changed

src/main/client/src/feature/lobby/LobbyPanel.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,6 @@ function Panel() {
3838
return undefined
3939
}, [auth])
4040
return (
41-
<Chat chatId="Lobby" />
41+
<Chat chatId="lobby" />
4242
)
4343
}

src/main/java/com/bernd/CleanupController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public class CleanupController {
2121

2222
@Scheduled(fixedDelay = 40 * 1000)
2323
public void runScheduled() {
24-
Map<String, List<String>> updatedRooms = statusMap.prune();
24+
Map<String, List<String>> updatedRooms = statusMap.removeInactiveUsers();
2525
for (Map.Entry<String, List<String>> e : updatedRooms.entrySet()) {
2626
String room = e.getKey();
2727
List<String> users = e.getValue();

src/main/java/com/bernd/GameController.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@
99
import com.bernd.model.Game;
1010
import com.bernd.model.Move;
1111
import com.bernd.model.OpenGame;
12+
import com.bernd.model.StatusMap;
1213
import com.bernd.model.ViewGame;
14+
import com.bernd.util.Auth;
1315
import com.bernd.util.RandomString;
16+
import com.bernd.util.RoomManager;
1417
import com.bernd.util.SgfCreator;
1518
import java.security.Principal;
1619
import java.time.LocalDate;
@@ -36,20 +39,24 @@
3639
public class GameController {
3740

3841
private final MessageSendingOperations<String> operations;
39-
private final Users users;
42+
private final RoomManager roomManager;
43+
private final StatusMap statusMap;
4044
private final Games games;
4145
private final OpenGames openGames;
4246
private final ActiveGames activeGames;
4347
private final Chats chats;
4448

4549
GameController(
4650
MessageSendingOperations<String> operations,
47-
Users users,
51+
RoomManager roomManager,
52+
StatusMap statusMap,
4853
Games games,
4954
OpenGames openGames,
50-
ActiveGames activeGames, Chats chats) {
55+
ActiveGames activeGames,
56+
Chats chats) {
5157
this.operations = operations;
52-
this.users = users;
58+
this.roomManager = roomManager;
59+
this.statusMap = statusMap;
5360
this.games = games;
5461
this.openGames = openGames;
5562
this.activeGames = activeGames;
@@ -59,7 +66,7 @@ public class GameController {
5966
@ResponseBody
6067
@GetMapping(value = "/api/game/{id}")
6168
public ViewGame getGame(@PathVariable String id, Principal p) {
62-
users.get(p).setCurrentGame(id);
69+
roomManager.updateStatus(Auth.getPrincipal(p), id);
6370
Game game = games.get(id);
6471
if (game == null) {
6572
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "no such game");
@@ -69,7 +76,11 @@ public ViewGame getGame(@PathVariable String id, Principal p) {
6976

7077
@MessageMapping("/game/move")
7178
public void action(Move move, Principal p) {
72-
Game game = games.get(users.get(p).currentGame());
79+
String id = statusMap.get(getPrincipal(p));
80+
if (id == null) {
81+
return;
82+
}
83+
Game game = games.get(id);
7384
if (p == null || game == null) {
7485
return;
7586
}

src/main/java/com/bernd/LoginController.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import com.bernd.model.Error;
66
import com.bernd.model.LoginRequest;
77
import com.bernd.model.LoginResponse;
8+
import com.bernd.model.StatusMap;
9+
import com.bernd.util.RoomManager;
810
import org.springframework.core.env.Environment;
911
import org.springframework.http.HttpStatus;
1012
import org.springframework.http.ResponseEntity;
@@ -17,13 +19,16 @@
1719
@RequestMapping("/api")
1820
public class LoginController {
1921

20-
private final Users users;
22+
private final StatusMap statusMap;
23+
private final RoomManager roomManager;
2124
private final Environment environment;
2225

2326
LoginController(
24-
Users users,
27+
StatusMap statusMap,
28+
RoomManager roomManager,
2529
Environment environment) {
26-
this.users = users;
30+
this.statusMap = statusMap;
31+
this.roomManager = roomManager;
2732
this.environment = environment;
2833
}
2934

@@ -34,7 +39,7 @@ public ResponseEntity<?> loginAction(
3439
return ResponseEntity.status(HttpStatus.UNAUTHORIZED)
3540
.body(new Error("The name must not be empty"));
3641
}
37-
if (users.contains(request.name())) {
42+
if (statusMap.contains(request.name())) {
3843
return ResponseEntity.status(HttpStatus.UNAUTHORIZED)
3944
.body(new Error("Please choose another name"));
4045
}
@@ -48,7 +53,7 @@ public ResponseEntity<?> loginAction(
4853
.withIssuer("auth0")
4954
.withClaim("name", request.name())
5055
.sign(algorithm);
51-
users.login(request.name());
56+
roomManager.login(request.name());
5257
return ResponseEntity.ok(new LoginResponse(request.name(), token));
5358
}
5459
}

src/main/java/com/bernd/SessionDisconnectEventListener.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
package com.bernd;
22

3+
import com.bernd.util.RoomManager;
4+
import java.security.Principal;
35
import org.springframework.context.ApplicationListener;
46
import org.springframework.messaging.core.MessageSendingOperations;
57
import org.springframework.stereotype.Component;
68
import org.springframework.web.socket.messaging.SessionDisconnectEvent;
79

8-
import java.security.Principal;
9-
1010
@Component
1111
public class SessionDisconnectEventListener implements ApplicationListener<SessionDisconnectEvent> {
1212

1313
private final MessageSendingOperations<String> operations;
14-
private final Users users;
14+
private final RoomManager roomManager;
1515
private final OpenGames openGames;
1616

1717
SessionDisconnectEventListener(
1818
MessageSendingOperations<String> operations,
19-
Users users,
19+
RoomManager roomManager,
2020
OpenGames openGames) {
2121
this.operations = operations;
22-
this.users = users;
22+
this.roomManager = roomManager;
2323
this.openGames = openGames;
2424
}
2525

@@ -30,7 +30,7 @@ public void onApplicationEvent(SessionDisconnectEvent event) {
3030
return;
3131
}
3232
String name = user.getName();
33-
users.logout(name);
33+
roomManager.logout(name);
3434
openGames.remove(name);
3535
operations.convertAndSend("/topic/lobby/open_games", openGames.games());
3636
}

src/main/java/com/bernd/model/StatusMap.java

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,37 @@
11
package com.bernd.model;
22

3-
import org.springframework.stereotype.Component;
4-
53
import java.util.ArrayList;
64
import java.util.HashMap;
75
import java.util.LinkedHashMap;
86
import java.util.LinkedHashSet;
97
import java.util.List;
108
import java.util.Map;
119
import java.util.Set;
10+
import org.springframework.stereotype.Component;
1211

1312
@Component
1413
public final class StatusMap {
1514

1615
private final Map<String, UserStatus> map = new LinkedHashMap<>();
1716

18-
public UserStatus put(String user, UserStatus status) {
19-
return map.put(user, status);
17+
public UserStatus put(String user, String room) {
18+
return map.put(user, UserStatus.create(room));
19+
}
20+
21+
public String get(String user) {
22+
UserStatus status = map.get(user);
23+
if (status == null) {
24+
return null;
25+
}
26+
return put(user, status.room()).room();
27+
}
28+
29+
public String remove(String user) {
30+
UserStatus status = map.remove(user);
31+
if (status == null) {
32+
return null;
33+
}
34+
return status.room();
2035
}
2136

2237
public List<String> usersInRoom(String room) {
@@ -29,24 +44,27 @@ public List<String> usersInRoom(String room) {
2944
return result;
3045
}
3146

32-
public Map<String, List<String>> prune() {
47+
/**
48+
* @return all changed rooms, where inactive users have been removed
49+
*/
50+
public Map<String, List<String>> removeInactiveUsers() {
3351
long current = System.currentTimeMillis();
3452
Map<String, List<String>> tmp = new HashMap<>();
35-
List<RemoveItem> remove = new ArrayList<>();
53+
List<RemoveTask> removeTasks = new ArrayList<>();
3654
for (Map.Entry<String, UserStatus> e : map.entrySet()) {
3755
UserStatus status = e.getValue();
3856
String room = status.room();
3957
String user = e.getKey();
4058
if (status.isActive(current)) {
4159
tmp.computeIfAbsent(room, key -> new ArrayList<>()).add(user);
4260
} else {
43-
remove.add(new RemoveItem(user, room));
61+
removeTasks.add(new RemoveTask(user, room));
4462
}
4563
}
4664
Map<String, List<String>> result = new LinkedHashMap<>(Math.max(8, (int) (tmp.size() * 1.5)));
47-
for (RemoveItem item : remove) {
48-
result.put(item.room, tmp.getOrDefault(item.room, List.of()));
49-
map.remove(item.user);
65+
for (RemoveTask task : removeTasks) {
66+
result.put(task.room, tmp.getOrDefault(task.room, List.of()));
67+
map.remove(task.user);
5068
}
5169
return result;
5270
}
@@ -62,6 +80,10 @@ public Set<String> activeGames() {
6280
return result;
6381
}
6482

65-
private record RemoveItem(String user, String room) {
83+
public boolean contains(String user) {
84+
return map.containsKey(user);
85+
}
86+
87+
private record RemoveTask(String user, String room) {
6688
}
6789
}

src/main/java/com/bernd/model/UserList.java

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

src/main/java/com/bernd/util/RoomManager.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22

33
import com.bernd.model.StatusMap;
44
import com.bernd.model.UserStatus;
5-
import org.springframework.stereotype.Component;
6-
75
import java.util.List;
6+
import org.springframework.stereotype.Component;
87

98
@Component
109
public class RoomManager {
@@ -22,7 +21,7 @@ public void updateRooms(String user, String room) {
2221
}
2322

2423
public void updateStatus(String user, String room) {
25-
UserStatus old = statusMap.put(user, UserStatus.create(room));
24+
UserStatus old = statusMap.put(user, room);
2625
List<String> users = statusMap.usersInRoom(room);
2726
if (old == null) {
2827
sender.sendUsers(room, users);
@@ -31,4 +30,17 @@ public void updateStatus(String user, String room) {
3130
sender.sendUsers(old.room(), statusMap.usersInRoom(old.room()));
3231
}
3332
}
33+
34+
public void login(String user) {
35+
updateStatus(user, "lobby");
36+
}
37+
38+
public void logout(String user) {
39+
String room = statusMap.remove(user);
40+
if (room == null) {
41+
return;
42+
}
43+
List<String> users = statusMap.usersInRoom(room);
44+
sender.sendUsers(room, users);
45+
}
3446
}

0 commit comments

Comments
 (0)