Add form API and other small changes

This commit is contained in:
RednedEpic 2019-07-23 18:16:25 -05:00
parent ff11a55884
commit 657f12654b
36 changed files with 1613 additions and 54 deletions

View file

@ -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;

View file

@ -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

View file

@ -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;

View file

@ -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);
}
}

View file

@ -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;
}

View 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);
}
}