Implement proper handbook authentication (pt. 1)

This commit is contained in:
KingRainbow44
2023-05-16 02:38:01 -04:00
Unverified
parent 79d417c3ca
commit f1cf6da178
28 changed files with 1019 additions and 53 deletions
@@ -1,7 +1,5 @@
package emu.grasscutter.server.dispatch;
import static emu.grasscutter.config.Configuration.DISPATCH_INFO;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import emu.grasscutter.Grasscutter;
@@ -12,21 +10,25 @@ import emu.grasscutter.utils.Crypto;
import emu.grasscutter.utils.DispatchUtils;
import emu.grasscutter.utils.JsonUtils;
import emu.grasscutter.utils.objects.HandbookBody;
import java.net.ConnectException;
import java.net.URI;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import lombok.Getter;
import org.java_websocket.WebSocket;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import org.slf4j.Logger;
import java.net.ConnectException;
import java.net.URI;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import static emu.grasscutter.config.Configuration.DISPATCH_INFO;
public final class DispatchClient extends WebSocketClient implements IDispatcher {
@Getter private final Logger logger = Grasscutter.getLogger();
@Getter private final Map<Integer, BiConsumer<WebSocket, JsonElement>> handlers = new HashMap<>();
@@ -41,6 +43,7 @@ public final class DispatchClient extends WebSocketClient implements IDispatcher
this.registerHandler(PacketIds.GachaHistoryReq, this::fetchGachaHistory);
this.registerHandler(PacketIds.GmTalkReq, this::handleHandbookAction);
this.registerHandler(PacketIds.GetPlayerFieldsReq, this::fetchPlayerFields);
}
/**
@@ -105,6 +108,32 @@ public final class DispatchClient extends WebSocketClient implements IDispatcher
this.sendMessage(PacketIds.GmTalkRsp, response);
}
/**
* Fetches the fields of an online player.
*
* @param socket The socket the packet was received from.
* @param object The packet data.
*/
private void fetchPlayerFields(WebSocket socket, JsonElement object) {
var message = IDispatcher.decode(object);
var playerId = message.get("playerId").getAsInt();
var fieldsRaw = message.get("fields").getAsJsonArray();
// Get the player with the specified ID.
var player = Grasscutter.getGameServer().getPlayerByUid(playerId, true);
if (player == null) return;
// Convert the fields array.
var fieldsList = new ArrayList<String>();
for (var field : fieldsRaw)
fieldsList.add(field.getAsString());
var fields = fieldsList.toArray(new String[0]);
// Return the response object.
this.sendMessage(PacketIds.GetPlayerFieldsRsp,
DispatchUtils.getPlayerFields(playerId, fields));
}
/**
* Sends a serialized encrypted message to the server.
*