Skip to content

Commit b5a49c9

Browse files
committed
feat(sdk): create ObservableRoomMessage marker interface
1 parent 2365c7e commit b5a49c9

File tree

8 files changed

+30
-25
lines changed

8 files changed

+30
-25
lines changed

sdk/src/framework/sc/shared/GameResult.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package sc.shared
33
import com.thoughtworks.xstream.annotations.XStreamAlias
44
import com.thoughtworks.xstream.annotations.XStreamImplicit
55
import sc.framework.plugins.Player
6+
import sc.protocol.room.ObservableRoomMessage
67
import sc.protocol.room.RoomOrchestrationMessage
78

89
/**
@@ -17,7 +18,7 @@ data class GameResult(
1718
val scores: List<PlayerScore>,
1819
@XStreamImplicit(itemFieldName = "winner")
1920
val winners: List<Player>?
20-
): RoomOrchestrationMessage {
21+
): RoomOrchestrationMessage, ObservableRoomMessage {
2122

2223
val isRegular: Boolean
2324
get() = scores.all { it.cause == ScoreCause.REGULAR }

sdk/src/server-api/sc/networking/clients/AdminClient.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package sc.networking.clients
22

33
import sc.protocol.requests.ObservationRequest
44
import sc.protocol.requests.PrepareGameRequest
5-
import sc.protocol.room.RoomMessage
5+
import sc.protocol.room.ObservableRoomMessage
66

77
class AdminClient(private val client: LobbyClient) {
88

@@ -15,7 +15,7 @@ class AdminClient(private val client: LobbyClient) {
1515
GameController(roomId, client)
1616

1717
/** Registers [listener] onto the given room. */
18-
fun observe(roomId: String, listener: (RoomMessage) -> Unit) {
18+
fun observe(roomId: String, listener: (ObservableRoomMessage) -> Unit) {
1919
client.observeRoom(roomId, listener)
2020
client.send(ObservationRequest(roomId))
2121
}

sdk/src/server-api/sc/networking/clients/LobbyClient.java

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public final class LobbyClient extends XStreamClient implements IPollsHistory {
3232
private final List<ILobbyClientListener> listeners = new ArrayList<>();
3333
private final List<IHistoryListener> historyListeners = new ArrayList<>();
3434

35-
private final Map<String, Consumer<RoomMessage>> roomObservers = new HashMap<>();
35+
private final Map<String, Consumer<ObservableRoomMessage>> roomObservers = new HashMap<>();
3636
private Consumer<ResponsePacket> administrativeListener = null;
3737

3838
public LobbyClient(String host, int port) throws IOException {
@@ -47,18 +47,20 @@ protected final void onObject(ProtocolPacket message) {
4747
RoomPacket packet = (RoomPacket) message;
4848
String roomId = packet.getRoomId();
4949
RoomMessage data = packet.getData();
50-
roomObservers.getOrDefault(roomId, (m) -> {}).accept(data);
51-
if (data instanceof MementoMessage) {
52-
onNewState(roomId, ((MementoMessage) data).getState());
53-
} else if (data instanceof GameResult) {
54-
onGameOver(roomId, (GameResult) data);
55-
} else if (data instanceof GamePaused) {
56-
onGamePaused(roomId, ((GamePaused) data).getNextPlayer());
57-
} else if (data instanceof ErrorMessage) {
58-
ErrorMessage error = (ErrorMessage) data;
59-
logger.warn("{} in room {}", error.getLogMessage(), roomId);
60-
for (IHistoryListener listener : this.historyListeners) {
61-
listener.onGameError(roomId, error);
50+
if(data instanceof ObservableRoomMessage) {
51+
roomObservers.getOrDefault(roomId, (m) -> {}).accept((ObservableRoomMessage) data);
52+
if (data instanceof MementoMessage) {
53+
onNewState(roomId, ((MementoMessage) data).getState());
54+
} else if (data instanceof GameResult) {
55+
onGameOver(roomId, (GameResult) data);
56+
} else if (data instanceof GamePaused) {
57+
onGamePaused(roomId, ((GamePaused) data).getNextPlayer());
58+
} else if (data instanceof ErrorMessage) {
59+
ErrorMessage error = (ErrorMessage) data;
60+
logger.warn("{} in room {}", error.getLogMessage(), roomId);
61+
for (IHistoryListener listener : this.historyListeners) {
62+
listener.onGameError(roomId, error);
63+
}
6264
}
6365
} else {
6466
onRoomMessage(roomId, data);
@@ -197,7 +199,7 @@ public ObservingClient observe(String roomId, boolean isPaused) {
197199
/** Sets observer to observe messages in the given room.
198200
* Whether administrative messages are received depends on authentication,
199201
* which has to be done separately. */
200-
public void observeRoom(String roomId, Consumer<RoomMessage> observer) {
202+
public void observeRoom(String roomId, Consumer<ObservableRoomMessage> observer) {
201203
roomObservers.put(roomId, observer);
202204
}
203205

sdk/src/server-api/sc/protocol/room/ErrorMessage.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ data class ErrorMessage(
99
val originalMessage: RoomMessage,
1010
@XStreamAsAttribute
1111
val message: String,
12-
): RoomOrchestrationMessage {
12+
): RoomOrchestrationMessage, ObservableRoomMessage {
1313
val logMessage
1414
get() = "$originalMessage caused an error: $message"
1515
}

sdk/src/server-api/sc/protocol/room/GamePaused.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,4 @@ import sc.framework.plugins.Player
1414
data class GamePaused(
1515
@XStreamAsAttribute
1616
val nextPlayer: Player
17-
): RoomOrchestrationMessage
17+
): ObservableRoomMessage

sdk/src/server-api/sc/protocol/room/MementoMessage.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ import sc.framework.plugins.IPerspectiveProvider
1010
data class MementoMessage(
1111
val state: IGameState,
1212
@XStreamOmitField private val perspective: Any?
13-
): RoomMessage, IPerspectiveProvider {
13+
): ObservableRoomMessage, IPerspectiveProvider {
1414
override fun getPerspective() = perspective
1515
}
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package sc.protocol.room
22

3-
/** Implemented by any message sent within a GameRoom. */
3+
/** A sent within a GameRoom. */
44
interface RoomMessage
55

6-
/** Implemented by any message within a room
7-
* that does not concern the progress of the game. */
6+
/** Marks a [RoomMessage] that does not concern the progress of the game. */
87
interface RoomOrchestrationMessage: RoomMessage
8+
9+
/** Marks a [RoomMessage] that can be received by observers. */
10+
interface ObservableRoomMessage: RoomMessage

server/src/sc/server/gaming/GameRoom.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ public void saveReplay(Writer writer) throws IOException {
154154
}
155155

156156
/** Send the given message to all Players and Observers in this room. */
157-
private void broadcast(RoomMessage message) {
157+
private void broadcast(ObservableRoomMessage message) {
158158
broadcast(createRoomPacket(message));
159159
}
160160

@@ -165,7 +165,7 @@ private void broadcast(ProtocolPacket packet) {
165165
}
166166

167167
/** Send Message to all registered Observers. */
168-
private void observerBroadcast(RoomMessage message) {
168+
private void observerBroadcast(ObservableRoomMessage message) {
169169
observers.forEach(observer -> observer.send(createRoomPacket(message)));
170170
}
171171

0 commit comments

Comments
 (0)