Client- und Server-Nachrichten verbessert(#9)
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
package eu.jonahbauer.wizard.common.messages.client;
|
||||
|
||||
import eu.jonahbauer.wizard.common.model.Configuration;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
@@ -10,23 +11,19 @@ import org.jetbrains.annotations.Range;
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public final class CreateSessionMessage extends ClientMessage {
|
||||
/**
|
||||
* Name of session
|
||||
* Name of the session
|
||||
*/
|
||||
private final String name;
|
||||
private final String sessionName;
|
||||
/**
|
||||
* Name of creating and joining player
|
||||
* Name of the creating and joining player
|
||||
*/
|
||||
private final String playerName;
|
||||
/**
|
||||
* Choose of Deck
|
||||
* timout in milliseconds for user interactions
|
||||
*/
|
||||
private final String deck;
|
||||
private final long timeout;
|
||||
/**
|
||||
* Choose if exact predictions are allowed
|
||||
* Game configuration
|
||||
*/
|
||||
private final boolean exactPrediction;
|
||||
/**
|
||||
* timout in milliseconds
|
||||
*/
|
||||
private final @Range(from = 30*1000, to = 10* 60*1000) long timeout;
|
||||
private final Configuration configuration;
|
||||
}
|
||||
|
@@ -10,7 +10,7 @@ import lombok.RequiredArgsConstructor;
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public final class InteractionMessage extends ClientMessage {
|
||||
/**
|
||||
* Reference to wrapped {@link PlayerMessage}
|
||||
* Wrapped {@link PlayerMessage}
|
||||
*/
|
||||
private final PlayerMessage playerMessage;
|
||||
}
|
||||
|
@@ -11,11 +11,11 @@ import java.util.UUID;
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public final class JoinSessionMessage extends ClientMessage {
|
||||
/**
|
||||
* uuid of joining session
|
||||
* UUID of the session
|
||||
*/
|
||||
private final UUID session;
|
||||
/**
|
||||
* Name of joining player
|
||||
* Name of the joining player
|
||||
*/
|
||||
private final String playerName;
|
||||
}
|
||||
|
@@ -9,7 +9,7 @@ import lombok.RequiredArgsConstructor;
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public final class ReadyMessage extends ClientMessage {
|
||||
/**
|
||||
* State of ready
|
||||
* State of readiness
|
||||
*/
|
||||
private final boolean ready;
|
||||
}
|
||||
|
@@ -8,18 +8,18 @@ import java.util.UUID;
|
||||
|
||||
@Getter
|
||||
@RequiredArgsConstructor
|
||||
@EqualsAndHashCode
|
||||
@EqualsAndHashCode(of = "uuid")
|
||||
public class PlayerData {
|
||||
/**
|
||||
* UUID of corresponding player
|
||||
* UUID of the player
|
||||
*/
|
||||
private final UUID id;
|
||||
private final UUID uuid;
|
||||
/**
|
||||
* name of corresponding player
|
||||
* Name of the player
|
||||
*/
|
||||
private final String name;
|
||||
/**
|
||||
* readyState of corresponding player
|
||||
* Readiness state of the player
|
||||
*/
|
||||
private final boolean ready;
|
||||
}
|
||||
|
@@ -1,5 +1,6 @@
|
||||
package eu.jonahbauer.wizard.common.messages.data;
|
||||
|
||||
import eu.jonahbauer.wizard.common.model.Configuration;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
@@ -8,18 +9,22 @@ import java.util.UUID;
|
||||
|
||||
@Getter
|
||||
@RequiredArgsConstructor
|
||||
@EqualsAndHashCode
|
||||
@EqualsAndHashCode(of = "uuid")
|
||||
public class SessionData {
|
||||
/**
|
||||
* uuid of corresponding session
|
||||
* UUID of the session
|
||||
*/
|
||||
private final UUID uuid;
|
||||
/**
|
||||
* name of corresponding session
|
||||
* Name of the session
|
||||
*/
|
||||
private final String name;
|
||||
/**
|
||||
* number of players in the corresponding session
|
||||
* Number of players currently in the session
|
||||
*/
|
||||
private final int playerCount;
|
||||
/**
|
||||
* Configuration of the session
|
||||
*/
|
||||
private final Configuration configuration;
|
||||
}
|
||||
|
@@ -1,6 +1,6 @@
|
||||
package eu.jonahbauer.wizard.common.messages.observer;
|
||||
|
||||
import eu.jonahbauer.wizard.common.model.card.Card;
|
||||
import eu.jonahbauer.wizard.common.model.Card;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
@@ -1,6 +1,6 @@
|
||||
package eu.jonahbauer.wizard.common.messages.observer;
|
||||
|
||||
import eu.jonahbauer.wizard.common.model.card.Card;
|
||||
import eu.jonahbauer.wizard.common.model.Card;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
@@ -1,6 +1,6 @@
|
||||
package eu.jonahbauer.wizard.common.messages.observer;
|
||||
|
||||
import eu.jonahbauer.wizard.common.model.card.Card;
|
||||
import eu.jonahbauer.wizard.common.model.Card;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
package eu.jonahbauer.wizard.common.messages.observer;
|
||||
|
||||
import eu.jonahbauer.wizard.common.model.card.Card;
|
||||
import eu.jonahbauer.wizard.common.model.Card;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
@@ -4,7 +4,7 @@ import eu.jonahbauer.wizard.common.messages.player.JuggleMessage;
|
||||
import eu.jonahbauer.wizard.common.messages.player.PickTrumpMessage;
|
||||
import eu.jonahbauer.wizard.common.messages.player.PlayCardMessage;
|
||||
import eu.jonahbauer.wizard.common.messages.player.PredictMessage;
|
||||
import eu.jonahbauer.wizard.common.model.card.Card;
|
||||
import eu.jonahbauer.wizard.common.model.Card;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
@@ -1,6 +1,6 @@
|
||||
package eu.jonahbauer.wizard.common.messages.player;
|
||||
|
||||
import eu.jonahbauer.wizard.common.model.card.Card;
|
||||
import eu.jonahbauer.wizard.common.model.Card;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
@@ -1,6 +1,6 @@
|
||||
package eu.jonahbauer.wizard.common.messages.player;
|
||||
|
||||
import eu.jonahbauer.wizard.common.model.card.Card;
|
||||
import eu.jonahbauer.wizard.common.model.Card;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
@@ -1,6 +1,6 @@
|
||||
package eu.jonahbauer.wizard.common.messages.player;
|
||||
|
||||
import eu.jonahbauer.wizard.common.model.card.Card;
|
||||
import eu.jonahbauer.wizard.common.model.Card;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
@@ -1,5 +1,5 @@
|
||||
package eu.jonahbauer.wizard.common.messages.server;
|
||||
|
||||
public final class AckMessage extends ServerMessage {
|
||||
public final class AckMessage extends ServerMessage implements Response {
|
||||
|
||||
}
|
||||
|
@@ -10,7 +10,7 @@ import lombok.RequiredArgsConstructor;
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public final class GameMessage extends ServerMessage {
|
||||
/**
|
||||
* Reference to wrapped {@link ObserverMessage}
|
||||
* Wrapped {@link ObserverMessage}
|
||||
*/
|
||||
private final ObserverMessage observerMessage;
|
||||
}
|
||||
|
@@ -3,20 +3,29 @@ package eu.jonahbauer.wizard.common.messages.server;
|
||||
import eu.jonahbauer.wizard.common.messages.data.PlayerData;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
@Getter
|
||||
@RequiredArgsConstructor
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public final class JoinedSessionMessage extends ServerMessage {
|
||||
public final class JoinedSessionMessage extends ServerMessage implements Response {
|
||||
/**
|
||||
* uuid of joined session
|
||||
* UUID of joined session
|
||||
*/
|
||||
private final UUID session;
|
||||
/**
|
||||
* Reference to data of joined player
|
||||
* UUID assigned to the player
|
||||
*/
|
||||
private final PlayerData playerData;
|
||||
private final UUID player;
|
||||
/**
|
||||
* List of players already in the session
|
||||
*/
|
||||
private final List<PlayerData> players;
|
||||
|
||||
public JoinedSessionMessage(UUID session, UUID player, List<PlayerData> players) {
|
||||
this.session = session;
|
||||
this.player = player;
|
||||
this.players = List.copyOf(players);
|
||||
}
|
||||
}
|
||||
|
@@ -7,7 +7,7 @@ import lombok.RequiredArgsConstructor;
|
||||
@Getter
|
||||
@RequiredArgsConstructor
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public final class NackMessage extends ServerMessage {
|
||||
public final class NackMessage extends ServerMessage implements Response {
|
||||
private final int code;
|
||||
private final String message;
|
||||
}
|
||||
|
@@ -2,15 +2,11 @@ package eu.jonahbauer.wizard.common.messages.server;
|
||||
|
||||
import eu.jonahbauer.wizard.common.messages.data.PlayerData;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
@Getter
|
||||
@RequiredArgsConstructor
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public final class PlayerJoinMessage extends ServerMessage {
|
||||
/**
|
||||
* Reference to data of left player
|
||||
*/
|
||||
private final PlayerData playerData;
|
||||
public final class PlayerJoinMessage extends PlayerModifiedMessage {
|
||||
|
||||
public PlayerJoinMessage(PlayerData playerData) {
|
||||
super(playerData);
|
||||
}
|
||||
}
|
||||
|
@@ -11,7 +11,7 @@ import java.util.UUID;
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public final class PlayerLeaveMessage extends ServerMessage {
|
||||
/**
|
||||
* {@link java.util.UUID} of leaving player
|
||||
* UUID of player who has left
|
||||
*/
|
||||
private final UUID player;
|
||||
}
|
||||
|
@@ -0,0 +1,16 @@
|
||||
package eu.jonahbauer.wizard.common.messages.server;
|
||||
|
||||
import eu.jonahbauer.wizard.common.messages.data.PlayerData;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
@Getter
|
||||
@RequiredArgsConstructor
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public sealed class PlayerModifiedMessage extends ServerMessage permits PlayerJoinMessage {
|
||||
/**
|
||||
* Joining player
|
||||
*/
|
||||
private final PlayerData playerData;
|
||||
}
|
@@ -0,0 +1,5 @@
|
||||
package eu.jonahbauer.wizard.common.messages.server;
|
||||
|
||||
public interface Response {
|
||||
//marker interface
|
||||
}
|
@@ -7,7 +7,7 @@ import eu.jonahbauer.wizard.common.util.SealedClassTypeAdapterFactory;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
@EqualsAndHashCode
|
||||
public abstract sealed class ServerMessage permits AckMessage, GameMessage, JoinedSessionMessage, NackMessage, PlayerJoinMessage, PlayerLeaveMessage, SessionCreatedMessage, SessionListMessage, SessionRemovedMessage, StartingGameMessage {
|
||||
public abstract sealed class ServerMessage permits AckMessage, GameMessage, JoinedSessionMessage, NackMessage, PlayerLeaveMessage, PlayerModifiedMessage, SessionListMessage, SessionModifiedMessage, SessionRemovedMessage, StartingGameMessage {
|
||||
public static final Gson GSON = new GsonBuilder()
|
||||
.registerTypeAdapterFactory(SealedClassTypeAdapterFactory.of(ServerMessage.class, "Message"))
|
||||
.registerTypeAdapterFactory(SealedClassTypeAdapterFactory.of(ObserverMessage.class, "Message"))
|
||||
|
@@ -2,15 +2,11 @@ package eu.jonahbauer.wizard.common.messages.server;
|
||||
|
||||
import eu.jonahbauer.wizard.common.messages.data.SessionData;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
@Getter
|
||||
@RequiredArgsConstructor
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public final class SessionCreatedMessage extends ServerMessage {
|
||||
/**
|
||||
* Reference to data of created Session
|
||||
*/
|
||||
private final SessionData sessionData;
|
||||
public final class SessionCreatedMessage extends SessionModifiedMessage {
|
||||
|
||||
public SessionCreatedMessage(SessionData session) {
|
||||
super(session);
|
||||
}
|
||||
}
|
||||
|
@@ -3,14 +3,18 @@ package eu.jonahbauer.wizard.common.messages.server;
|
||||
import eu.jonahbauer.wizard.common.messages.data.SessionData;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Getter
|
||||
@RequiredArgsConstructor
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public final class SessionListMessage extends ServerMessage {
|
||||
public final class SessionListMessage extends ServerMessage implements Response {
|
||||
/**
|
||||
* Reference to data of existing Sessions
|
||||
* List of available sessions
|
||||
*/
|
||||
private final SessionData[] sessionData;
|
||||
private final List<SessionData> sessions;
|
||||
|
||||
public SessionListMessage(List<SessionData> sessions) {
|
||||
this.sessions = List.copyOf(sessions);
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,16 @@
|
||||
package eu.jonahbauer.wizard.common.messages.server;
|
||||
|
||||
import eu.jonahbauer.wizard.common.messages.data.SessionData;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
@Getter
|
||||
@RequiredArgsConstructor
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public sealed class SessionModifiedMessage extends ServerMessage permits SessionCreatedMessage {
|
||||
/**
|
||||
* The created session
|
||||
*/
|
||||
private final SessionData session;
|
||||
}
|
@@ -11,7 +11,7 @@ import java.util.UUID;
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public final class SessionRemovedMessage extends ServerMessage {
|
||||
/**
|
||||
* {@link UUID} of leaving player
|
||||
* UUID of the removed session
|
||||
*/
|
||||
private final UUID player;
|
||||
private final UUID session;
|
||||
}
|
||||
|
@@ -9,8 +9,7 @@ import lombok.RequiredArgsConstructor;
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public final class StartingGameMessage extends ServerMessage {
|
||||
/**
|
||||
* Time of game start in
|
||||
* {@link System#currentTimeMillis() UNIX time}
|
||||
* Time of game start in {@link System#currentTimeMillis() UNIX time}
|
||||
*/
|
||||
private final long time;
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
package eu.jonahbauer.wizard.common.model.card;
|
||||
package eu.jonahbauer.wizard.common.model;
|
||||
|
||||
public enum Card {
|
||||
HIDDEN,
|
@@ -0,0 +1,7 @@
|
||||
package eu.jonahbauer.wizard.common.model;
|
||||
|
||||
public enum Configuration {
|
||||
DEFAULT, DEFAULT_PM1,
|
||||
ANNIVERSARY_2016, ANNIVERSARY_2016_PM1,
|
||||
ANNIVERSARY_2021, ANNIVERSARY_2021_PM1
|
||||
}
|
@@ -7,6 +7,7 @@ import com.google.gson.reflect.TypeToken;
|
||||
import com.google.gson.typeadapters.RuntimeTypeAdapterFactory;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.Locale;
|
||||
|
||||
public final class SealedClassTypeAdapterFactory<T> implements TypeAdapterFactory {
|
||||
@@ -22,19 +23,36 @@ public final class SealedClassTypeAdapterFactory<T> implements TypeAdapterFactor
|
||||
|
||||
private SealedClassTypeAdapterFactory(Class<T> clazz, @Nullable String suffix) {
|
||||
factory = RuntimeTypeAdapterFactory.of(clazz);
|
||||
register(clazz, suffix);
|
||||
}
|
||||
|
||||
private void register(Class<? extends T> clazz, String suffix) {
|
||||
for (Class<?> subclass : clazz.getPermittedSubclasses()) {
|
||||
String name = subclass.getSimpleName();
|
||||
int modifiers = subclass.getModifiers();
|
||||
if (Modifier.isFinal(modifiers) || subclass.isSealed() && !Modifier.isAbstract(modifiers)) {
|
||||
String name = subclass.getSimpleName();
|
||||
|
||||
// remove suffix
|
||||
if (suffix != null) {
|
||||
if (name.endsWith(suffix)) name = name.substring(0, name.length() - suffix.length());
|
||||
// remove suffix
|
||||
if (suffix != null) {
|
||||
if (name.endsWith(suffix)) name = name.substring(0, name.length() - suffix.length());
|
||||
}
|
||||
|
||||
// transform camelCast to snake_case
|
||||
name = name.replaceAll("([a-z])([A-Z]+)", "$1_$2").toLowerCase(Locale.ROOT);
|
||||
|
||||
factory.registerSubtype(subclass.asSubclass(clazz), name);
|
||||
}
|
||||
if (subclass.isSealed()) {
|
||||
register(subclass.asSubclass(clazz), suffix);
|
||||
} else if (!Modifier.isFinal(modifiers)) {
|
||||
//subclass is non-sealed
|
||||
throw new IllegalArgumentException(
|
||||
"SealedClassTypeAdapterFactory does not support a type hierarchy that contains non-sealed classes. " +
|
||||
"Found non-sealed class " + subclass.getName()
|
||||
);
|
||||
}
|
||||
|
||||
// transform camelCast to snake_case
|
||||
name = name.replaceAll("([a-z])([A-Z]+)", "$1_$2").toLowerCase(Locale.ROOT);
|
||||
|
||||
factory.registerSubtype(subclass.asSubclass(clazz), name);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
Reference in New Issue
Block a user