mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 04:08:01 +00:00
moved forge.net.protocol to .net project
This commit is contained in:
@@ -0,0 +1,9 @@
|
||||
package forge.net.protocol;
|
||||
|
||||
|
||||
/** The protocol is in charge of serialization of internal classes into whatever remote client understands.
|
||||
* Descendants may use different techniques to serialize data, be it Gson, ProtoBuf or common Java serialization */
|
||||
public interface ClientProtocol<TIncoming, TOutComing> {
|
||||
TIncoming decodePacket(String data);
|
||||
String encodePacket(TOutComing packet);
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
package forge.net.protocol;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonParseException;
|
||||
|
||||
import forge.net.protocol.toclient.AuthResultPacketClt;
|
||||
import forge.net.protocol.toclient.ChatPacketClt;
|
||||
import forge.net.protocol.toclient.EchoPacketClt;
|
||||
import forge.net.protocol.toclient.ErrorIncorrectPacketClt;
|
||||
import forge.net.protocol.toclient.ErrorNoStateForPacketClt;
|
||||
import forge.net.protocol.toclient.IPacketClt;
|
||||
import forge.net.protocol.toclient.WelcomePacketClt;
|
||||
import forge.net.protocol.toserver.AuthorizePacketSrv;
|
||||
import forge.net.protocol.toserver.ChatPacketSrv;
|
||||
import forge.net.protocol.toserver.EchoPacketSrv;
|
||||
import forge.net.protocol.toserver.IPacketSrv;
|
||||
import forge.net.protocol.toserver.IncorrectPacketSrv;
|
||||
import forge.util.TextUtil;
|
||||
|
||||
/**
|
||||
* The expected incoming message format is: /{opcode} {json-object}, where opcode is a string among keys of headerToClassInbound
|
||||
* If string starts with a non-slash character, the whole line is considered a chat packet
|
||||
*
|
||||
*/
|
||||
public class ClientProtocolJson implements ClientProtocol<IPacketSrv, IPacketClt> {
|
||||
private final static Map<String, Class<? extends IPacketSrv>> headerToClassInbound = new HashMap<String, Class<? extends IPacketSrv>>();
|
||||
private final static Map<Class<? extends IPacketClt>, String> classToHeaderOutbound = new HashMap<Class<? extends IPacketClt>, String>();
|
||||
|
||||
// Static ctor to fill maps
|
||||
static {
|
||||
// The what remote part sends us
|
||||
headerToClassInbound.put("echo", EchoPacketSrv.class);
|
||||
headerToClassInbound.put("s", ChatPacketSrv.class);
|
||||
headerToClassInbound.put("auth", AuthorizePacketSrv.class);
|
||||
|
||||
// The what we reply there
|
||||
classToHeaderOutbound.put(WelcomePacketClt.class, "welcome");
|
||||
classToHeaderOutbound.put(AuthResultPacketClt.class, "auth");
|
||||
classToHeaderOutbound.put(ChatPacketClt.class, "s");
|
||||
classToHeaderOutbound.put(EchoPacketClt.class, "echo");
|
||||
classToHeaderOutbound.put(ErrorNoStateForPacketClt.class, "err:packet-state");
|
||||
classToHeaderOutbound.put(ErrorIncorrectPacketClt.class, "err:packet");
|
||||
}
|
||||
|
||||
private final Gson gson = new Gson(); // looks like a single instance per class is enough
|
||||
|
||||
@Override
|
||||
public IPacketSrv decodePacket(String data) {
|
||||
if ( '/' != data.charAt(0) )
|
||||
return new ChatPacketSrv(data);
|
||||
|
||||
data = data.substring(1);
|
||||
String[] parts = TextUtil.split(data, ' ', 2);
|
||||
|
||||
Class<? extends IPacketSrv> packetClass = headerToClassInbound.get(parts[0]);
|
||||
if( null == packetClass )
|
||||
return new IncorrectPacketSrv("Unknown header: " + parts[0]);
|
||||
|
||||
String args = parts.length > 1 ? parts[1] : null;
|
||||
if ( StringUtils.isBlank(args) )
|
||||
args = "{}"; // assume default empty object
|
||||
|
||||
try {
|
||||
return gson.fromJson(args, packetClass);
|
||||
} catch( JsonParseException ex ) {
|
||||
return new IncorrectPacketSrv("Invalid json: " + args);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String encodePacket(IPacketClt packet) {
|
||||
Class<? extends IPacketClt> packetClass = packet.getClass();
|
||||
String prefix = classToHeaderOutbound.get(packetClass);
|
||||
return String.format("/%s %s", prefix != null ? prefix : "/!unserialized!: " + packetClass.getName(), gson.toJson(packet));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
/** Model (as in model-view-controller) for Forge. */
|
||||
package forge.net.protocol;
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
package forge.net.protocol.toclient;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
public class AuthResultPacketClt implements IPacketClt {
|
||||
private final boolean successful;
|
||||
private final String username;
|
||||
|
||||
public AuthResultPacketClt(String user, boolean success) {
|
||||
username = user;
|
||||
successful = success;
|
||||
}
|
||||
|
||||
public boolean isSuccessful() {
|
||||
return successful;
|
||||
}
|
||||
|
||||
public String getUsername() {
|
||||
return username;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package forge.net.protocol.toclient;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
public class ChatPacketClt implements IPacketClt {
|
||||
|
||||
private final String actor;
|
||||
private final String message;
|
||||
|
||||
public ChatPacketClt(String playerName, String message) {
|
||||
// TODO Auto-generated constructor stub
|
||||
this.message = message;
|
||||
this.actor = playerName;
|
||||
}
|
||||
|
||||
public String getActor() {
|
||||
return actor;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package forge.net.protocol.toclient;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
public class EchoPacketClt implements IPacketClt {
|
||||
|
||||
private final String message;
|
||||
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for Constructor.
|
||||
* @param message2
|
||||
*/
|
||||
public EchoPacketClt(String message) {
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package forge.net.protocol.toclient;
|
||||
|
||||
/**
|
||||
* A response packet to an Incorrect packet client had sent to server
|
||||
*/
|
||||
public class ErrorIncorrectPacketClt implements IPacketClt {
|
||||
|
||||
private final String message;
|
||||
|
||||
public ErrorIncorrectPacketClt(String msg) {
|
||||
message = msg;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package forge.net.protocol.toclient;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
public class ErrorNoStateForPacketClt implements IPacketClt {
|
||||
|
||||
private final String message;
|
||||
|
||||
public ErrorNoStateForPacketClt(String simpleName) {
|
||||
message = simpleName;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package forge.net.protocol.toclient;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
public interface IPacketClt {
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package forge.net.protocol.toclient;
|
||||
|
||||
import forge.util.BuildInfo;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
public class WelcomePacketClt implements IPacketClt {
|
||||
public final String message;
|
||||
public final String version;
|
||||
|
||||
public WelcomePacketClt(String welcome) {
|
||||
message = welcome;
|
||||
version = BuildInfo.getVersionString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
/** Model (as in model-view-controller) for Forge. */
|
||||
package forge.net.protocol.toclient;
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
package forge.net.protocol.toserver;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
public class AuthorizePacketSrv implements IPacketSrv {
|
||||
private final String username;
|
||||
private final String password;
|
||||
|
||||
private AuthorizePacketSrv(String name, String pass) {
|
||||
username = name;
|
||||
password = pass;
|
||||
}
|
||||
|
||||
public String getUsername() {
|
||||
return username;
|
||||
}
|
||||
|
||||
public String getPassword() {
|
||||
return password;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package forge.net.protocol.toserver;
|
||||
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
public class ChatPacketSrv implements IPacketSrv {
|
||||
private final String message;
|
||||
public ChatPacketSrv(String data) {
|
||||
message = data;
|
||||
}
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package forge.net.protocol.toserver;
|
||||
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
public class EchoPacketSrv implements IPacketSrv {
|
||||
|
||||
private final String message;
|
||||
private EchoPacketSrv(String data) {
|
||||
message = data;
|
||||
}
|
||||
|
||||
public static EchoPacketSrv parse(String data) {
|
||||
return new EchoPacketSrv(data);
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package forge.net.protocol.toserver;
|
||||
|
||||
|
||||
/** A common ancestor for all packets directed to server */
|
||||
public interface IPacketSrv {}
|
||||
@@ -0,0 +1,18 @@
|
||||
package forge.net.protocol.toserver;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
public class IncorrectPacketSrv implements IPacketSrv {
|
||||
|
||||
private final String message;
|
||||
|
||||
public IncorrectPacketSrv(String errorMessage) {
|
||||
message = errorMessage;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
/** Model (as in model-view-controller) for Forge. */
|
||||
package forge.net.protocol.toserver;
|
||||
|
||||
Reference in New Issue
Block a user