Newer
Older
KeeperJerry_Launcher / Launcher / source / request / auth / JoinServerRequest.java
package launcher.request.auth;

import java.io.IOException;
import java.util.regex.Pattern;

import launcher.LauncherAPI;
import launcher.helper.SecurityHelper;
import launcher.helper.VerifyHelper;
import launcher.request.Request;
import launcher.serialize.HInput;
import launcher.serialize.HOutput;

public final class JoinServerRequest extends Request<Boolean> {
	private static final Pattern SERVERID_PATTERN = Pattern.compile("-?[0-9a-f]{1,40}");

	// Instance
	private final String username;
	private final String accessToken;
	private final String serverID;

	@LauncherAPI
	public JoinServerRequest(String username, String accessToken, String serverID) {
		this.username = VerifyHelper.verifyUsername(username);
		this.accessToken = SecurityHelper.verifyToken(accessToken);
		this.serverID = verifyServerID(serverID);
	}

	@Override
	public Type getType() {
		return Type.JOIN_SERVER;
	}

	@Override
	protected Boolean requestDo(HInput input, HOutput output) throws IOException {
		output.writeASCII(username, 16);
		output.writeASCII(accessToken, -SecurityHelper.TOKEN_STRING_LENGTH);
		output.writeASCII(serverID, 41); // 1 char for minus sign
		output.flush();

		// Read response
		return input.readBoolean();
	}

	@LauncherAPI
	public static boolean isValidServerID(CharSequence serverID) {
		return SERVERID_PATTERN.matcher(serverID).matches();
	}

	@LauncherAPI
	public static String verifyServerID(String serverID) {
		return VerifyHelper.verify(serverID, JoinServerRequest::isValidServerID,
			String.format("Invalid server ID: '%s'", serverID));
	}
}