forked from GeyserMC/Geyser
Add form API and other small changes
This commit is contained in:
parent
ff11a55884
commit
657f12654b
36 changed files with 1613 additions and 54 deletions
|
@ -30,7 +30,7 @@ import com.nukkitx.protocol.bedrock.BedrockPong;
|
|||
import com.nukkitx.protocol.bedrock.BedrockServerEventHandler;
|
||||
import com.nukkitx.protocol.bedrock.BedrockServerSession;
|
||||
import com.nukkitx.protocol.bedrock.v361.Bedrock_v361;
|
||||
import org.geysermc.api.events.player.PingEvent;
|
||||
import org.geysermc.api.events.PingEvent;
|
||||
import org.geysermc.connector.GeyserConnector;
|
||||
import org.geysermc.connector.configuration.GeyserConfiguration;
|
||||
import org.geysermc.connector.console.GeyserLogger;
|
||||
|
|
|
@ -34,8 +34,12 @@ import com.nukkitx.protocol.bedrock.packet.*;
|
|||
import net.minidev.json.JSONArray;
|
||||
import net.minidev.json.JSONObject;
|
||||
import net.minidev.json.JSONValue;
|
||||
import org.geysermc.api.events.player.PlayerFormResponseEvent;
|
||||
import org.geysermc.api.window.FormWindow;
|
||||
import org.geysermc.connector.GeyserConnector;
|
||||
import org.geysermc.connector.network.session.GeyserSession;
|
||||
import org.geysermc.connector.network.session.auth.BedrockAuthData;
|
||||
import org.geysermc.connector.network.session.cache.WindowCache;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
|
@ -69,7 +73,7 @@ public class UpstreamPacketHandler implements BedrockPacketHandler {
|
|||
JWSObject identity = JWSObject.parse((String) identityObject);
|
||||
JSONObject extraData = (JSONObject) identity.getPayload().toJSONObject().get("extraData");
|
||||
|
||||
session.setAuthenticationData(extraData.getAsString("displayName"), UUID.fromString(extraData.getAsString("identity")), extraData.getAsString("XUID"));
|
||||
session.setAuthenticationData(new BedrockAuthData(extraData.getAsString("displayName"), UUID.fromString(extraData.getAsString("identity")), extraData.getAsString("XUID")));
|
||||
} catch (Exception ex) {
|
||||
session.getUpstream().disconnect("An internal error occurred when connecting to this server.");
|
||||
ex.printStackTrace();
|
||||
|
@ -82,6 +86,18 @@ public class UpstreamPacketHandler implements BedrockPacketHandler {
|
|||
|
||||
ResourcePacksInfoPacket resourcePacksInfo = new ResourcePacksInfoPacket();
|
||||
session.getUpstream().sendPacketImmediately(resourcePacksInfo);
|
||||
|
||||
// TODO: Implement this
|
||||
/**
|
||||
CustomFormWindow window = new CustomFormBuilder("Login")
|
||||
.addComponent(new LabelComponent("Minecraft: Java Edition account authentication."))
|
||||
.addComponent(new LabelComponent("Enter the credentials for your Minecraft: Java Edition account below."))
|
||||
.addComponent(new InputComponent("Email/Username", "account@geysermc.org", ""))
|
||||
.addComponent(new InputComponent("Password", "123456", ""))
|
||||
.build();
|
||||
|
||||
session.sendForm(window, 1);
|
||||
*/
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -304,7 +320,16 @@ public class UpstreamPacketHandler implements BedrockPacketHandler {
|
|||
@Override
|
||||
public boolean handle(ModalFormResponsePacket packet) {
|
||||
connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName());
|
||||
return false;
|
||||
WindowCache windowCache = session.getWindowCache();
|
||||
if (!windowCache.getWindows().containsKey(packet.getFormId()))
|
||||
return false;
|
||||
|
||||
FormWindow window = windowCache.getWindows().remove(packet.getFormId());
|
||||
window.setResponse(packet.getFormData().trim());
|
||||
|
||||
PlayerFormResponseEvent event = new PlayerFormResponseEvent(session, packet.getFormId(), window);
|
||||
connector.getPluginManager().runEvent(event);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -27,10 +27,11 @@ package org.geysermc.connector.network.remote;
|
|||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import org.geysermc.api.RemoteServer;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public class RemoteJavaServer {
|
||||
public class RemoteJavaServer implements RemoteServer {
|
||||
|
||||
private String address;
|
||||
private int port;
|
||||
|
|
|
@ -36,21 +36,21 @@ import com.nukkitx.network.util.DisconnectReason;
|
|||
import com.nukkitx.protocol.PlayerSession;
|
||||
import com.nukkitx.protocol.bedrock.BedrockServerSession;
|
||||
import com.nukkitx.protocol.bedrock.packet.TextPacket;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import org.geysermc.api.command.CommandSender;
|
||||
import org.geysermc.api.Player;
|
||||
import org.geysermc.api.RemoteServer;
|
||||
import org.geysermc.api.session.AuthData;
|
||||
import org.geysermc.api.window.FormWindow;
|
||||
import org.geysermc.connector.GeyserConnector;
|
||||
import org.geysermc.connector.network.remote.RemoteJavaServer;
|
||||
import org.geysermc.connector.network.session.cache.WindowCache;
|
||||
import org.geysermc.connector.network.translators.Registry;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
public class GeyserSession implements PlayerSession, CommandSender {
|
||||
public class GeyserSession implements PlayerSession, Player {
|
||||
|
||||
private GeyserConnector connector;
|
||||
|
||||
@Getter
|
||||
private RemoteJavaServer remoteServer;
|
||||
private RemoteServer remoteServer;
|
||||
|
||||
@Getter
|
||||
private BedrockServerSession upstream;
|
||||
|
@ -61,16 +61,21 @@ public class GeyserSession implements PlayerSession, CommandSender {
|
|||
private final GeyserSession THIS = this;
|
||||
|
||||
@Getter
|
||||
private AuthenticationData authenticationData;
|
||||
private AuthData authenticationData;
|
||||
|
||||
@Getter
|
||||
private WindowCache windowCache;
|
||||
|
||||
private boolean closed;
|
||||
|
||||
public GeyserSession(GeyserConnector connector, BedrockServerSession bedrockServerSession) {
|
||||
this.connector = connector;
|
||||
this.upstream = bedrockServerSession;
|
||||
|
||||
this.windowCache = new WindowCache(this);
|
||||
}
|
||||
|
||||
public void connect(RemoteJavaServer remoteServer) {
|
||||
public void connect(RemoteServer remoteServer) {
|
||||
MinecraftProtocol protocol = new MinecraftProtocol(authenticationData.getName());
|
||||
downstream = new Client(remoteServer.getAddress(), remoteServer.getPort(), protocol, new TcpSessionFactory());
|
||||
downstream.getSession().addListener(new SessionAdapter() {
|
||||
|
@ -123,8 +128,8 @@ public class GeyserSession implements PlayerSession, CommandSender {
|
|||
downstream.getSession().disconnect("Disconnected from server. Reason: " + reason);
|
||||
}
|
||||
|
||||
public void setAuthenticationData(String name, UUID uuid, String xboxUUID) {
|
||||
authenticationData = new AuthenticationData(name, uuid, xboxUUID);
|
||||
public void setAuthenticationData(AuthData authData) {
|
||||
authenticationData = authData;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -152,12 +157,11 @@ public class GeyserSession implements PlayerSession, CommandSender {
|
|||
}
|
||||
}
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public class AuthenticationData {
|
||||
public void sendForm(FormWindow window, int id) {
|
||||
windowCache.showWindow(window, id);
|
||||
}
|
||||
|
||||
private String name;
|
||||
private UUID uuid;
|
||||
private String xboxUUID;
|
||||
public void sendForm(FormWindow window) {
|
||||
windowCache.showWindow(window);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
package org.geysermc.connector.network.session.auth;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import org.geysermc.api.session.AuthData;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public class BedrockAuthData implements AuthData {
|
||||
|
||||
private String name;
|
||||
private UUID UUID;
|
||||
private String xboxUUID;
|
||||
}
|
54
connector/src/main/java/org/geysermc/connector/network/session/cache/WindowCache.java
vendored
Normal file
54
connector/src/main/java/org/geysermc/connector/network/session/cache/WindowCache.java
vendored
Normal file
|
@ -0,0 +1,54 @@
|
|||
package org.geysermc.connector.network.session.cache;
|
||||
|
||||
import com.nukkitx.protocol.bedrock.packet.ModalFormRequestPacket;
|
||||
import lombok.Getter;
|
||||
import org.geysermc.connector.network.session.GeyserSession;
|
||||
import org.geysermc.api.window.FormWindow;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class WindowCache {
|
||||
|
||||
private GeyserSession session;
|
||||
|
||||
public WindowCache(GeyserSession session) {
|
||||
this.session = session;
|
||||
}
|
||||
|
||||
@Getter
|
||||
private Map<Integer, FormWindow> windows = new HashMap<Integer, FormWindow>();
|
||||
|
||||
public void addWindow(FormWindow window) {
|
||||
windows.put(windows.size() + 1, window);
|
||||
}
|
||||
|
||||
public void addWindow(FormWindow window, int id) {
|
||||
windows.put(id, window);
|
||||
}
|
||||
|
||||
public void showWindow(FormWindow window) {
|
||||
showWindow(window, windows.size() + 1);
|
||||
}
|
||||
|
||||
public void showWindow(int id) {
|
||||
if (!windows.containsKey(id))
|
||||
return;
|
||||
|
||||
ModalFormRequestPacket formRequestPacket = new ModalFormRequestPacket();
|
||||
formRequestPacket.setFormId(id);
|
||||
formRequestPacket.setFormData(windows.get(id).getJSONData());
|
||||
|
||||
session.getUpstream().sendPacket(formRequestPacket);
|
||||
}
|
||||
|
||||
public void showWindow(FormWindow window, int id) {
|
||||
ModalFormRequestPacket formRequestPacket = new ModalFormRequestPacket();
|
||||
formRequestPacket.setFormId(id);
|
||||
formRequestPacket.setFormData(window.getJSONData());
|
||||
|
||||
session.getUpstream().sendPacket(formRequestPacket);
|
||||
|
||||
addWindow(window, id);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue