diff --git a/src/main/java/net/montoyo/wd/client/ClientProxy.java b/src/main/java/net/montoyo/wd/client/ClientProxy.java index 561fd79..9c78cda 100644 --- a/src/main/java/net/montoyo/wd/client/ClientProxy.java +++ b/src/main/java/net/montoyo/wd/client/ClientProxy.java @@ -72,6 +72,7 @@ import net.montoyo.wd.utilities.*; import org.lwjgl.glfw.GLFW; import javax.annotation.Nonnull; +import java.io.IOException; import java.lang.reflect.Field; import java.net.InetSocketAddress; import java.net.SocketAddress; @@ -89,7 +90,13 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer private long lastURLSent; private PadData(String url, int id) { - view = mcef.createBrowser(WebDisplays.applyBlacklist(url)); + String webUrl; + try { + webUrl = TileEntityScreen.url(url); + } catch (IOException e) { + throw new RuntimeException(e); + } + view = mcef.createBrowser(WebDisplays.applyBlacklist(webUrl)); view.resize((int) WebDisplays.INSTANCE.padResX, (int) WebDisplays.INSTANCE.padResY); isInHotbar = true; this.id = id; @@ -165,6 +172,8 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer mcef.registerDisplayHandler(this); //mcef.registerJSQueryHandler(this); //TODO why crashing on this method! findAdvancementToProgressField(); + String url = "https://www.google.com"; + new ScreenRenderer(url); } @Override diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java b/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java index 144c034..680704e 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java @@ -16,6 +16,8 @@ import net.montoyo.wd.client.ClientProxy; import net.montoyo.wd.client.gui.controls.Button; import net.montoyo.wd.client.gui.controls.TextField; import net.montoyo.wd.client.gui.loading.FillControl; +import net.montoyo.wd.client.renderers.ScreenRenderer; +import net.montoyo.wd.entity.ServerEventHandler; import net.montoyo.wd.entity.TileEntityScreen; import net.montoyo.wd.init.ItemInit; import net.montoyo.wd.net.Messages; @@ -119,8 +121,9 @@ public class GuiSetURL2 extends WDScreen { if(held.getItem().equals(ItemInit.itemMinePad.get()) && held.getTag() != null && held.getTag().contains("PadID")) { ClientProxy.PadData pd = ((ClientProxy) WebDisplays.PROXY).getPadByID(held.getTag().getInt("PadID")); - if(pd != null && pd.view != null) + if(pd != null && pd.view != null) { pd.view.loadURL(WebDisplays.applyBlacklist(url)); + } } } else Messages.INSTANCE.sendToServer(SMessageScreenCtrl.setURL(tileEntity, screenSide, url, remoteLocation)); diff --git a/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java b/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java index e1146c0..b88acd0 100644 --- a/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java +++ b/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java @@ -7,6 +7,7 @@ package net.montoyo.wd.client.renderers; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; @@ -15,7 +16,9 @@ import net.minecraft.world.phys.AABB; import net.montoyo.wd.SharedProxy; import net.montoyo.wd.WebDisplays; import net.montoyo.wd.client.ClientProxy; +import net.montoyo.wd.entity.ServerEventHandler; import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.miniserv.SyncPlugin; import net.montoyo.wd.utilities.Vector3f; import net.montoyo.wd.utilities.Vector3i; import org.jetbrains.annotations.NotNull; @@ -27,6 +30,14 @@ import static org.lwjgl.opengl.GL11.*; public class ScreenRenderer implements BlockEntityRenderer { + private String url; + + public ScreenRenderer(String url) { + this.url = url; + } + + public ScreenRenderer() {} + public static class ScreenRendererProvider implements BlockEntityRendererProvider { @Override public @NotNull BlockEntityRenderer create(@NotNull Context arg) { @@ -52,7 +63,7 @@ public class ScreenRenderer implements BlockEntityRenderer { TileEntityScreen.Screen scr = te.getScreen(i); if(scr.browser == null) { if(WebDisplays.PROXY instanceof ClientProxy clientProxy) { - scr.browser = clientProxy.getMCEF().createBrowser(WebDisplays.applyBlacklist(scr.url)); + scr.browser = clientProxy.getMCEF().createBrowser(WebDisplays.applyBlacklist(this.url != null ? this.url : "https://www.google.com")); if (scr.rotation.isVertical) scr.browser.resize(scr.resolution.y, scr.resolution.x); diff --git a/src/main/java/net/montoyo/wd/entity/ServerEventHandler.java b/src/main/java/net/montoyo/wd/entity/ServerEventHandler.java new file mode 100644 index 0000000..2069e34 --- /dev/null +++ b/src/main/java/net/montoyo/wd/entity/ServerEventHandler.java @@ -0,0 +1,32 @@ +package net.montoyo.wd.entity; + +import net.minecraft.server.level.ServerPlayer; +import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.montoyo.wd.client.renderers.ScreenRenderer; +import net.montoyo.wd.miniserv.SyncPlugin; + +import java.util.HashMap; +import java.util.Map; + +public class ServerEventHandler extends ScreenRenderer{ + public static final Map playerScreens = new HashMap<>(); + + @SubscribeEvent + public void onPlayerConnect(PlayerEvent.PlayerLoggedInEvent event) { + // create a new instance of the ScreenRenderer class for the player + ServerPlayer player = (ServerPlayer) event.getEntity(); + String url = SyncPlugin.getPlayerString(player); + ScreenRenderer screen = new ScreenRenderer(url); + + // store the ScreenRenderer instance in the playerScreens map + playerScreens.put(player, screen); + } + + @SubscribeEvent + public void onPlayerDisconnect(PlayerEvent.PlayerLoggedOutEvent event) { + // remove the ScreenRenderer instance for the player + ServerPlayer player = (ServerPlayer) event.getEntity(); + playerScreens.remove(player); + } +} \ No newline at end of file diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java index 0f26dc0..08b51e9 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java +++ b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java @@ -4,10 +4,18 @@ package net.montoyo.wd.entity; +import com.mojang.authlib.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.client.multiplayer.PlayerInfo; +import net.minecraft.client.multiplayer.ServerData; +import net.minecraft.client.multiplayer.resolver.ServerAddress; +import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; +import net.minecraft.network.Connection; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvent; @@ -23,8 +31,10 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.network.PacketDistributor; import net.montoyo.mcef.api.IBrowser; +import net.montoyo.wd.SharedProxy; import net.montoyo.wd.WebDisplays; import net.montoyo.wd.block.BlockScreen; +import net.montoyo.wd.client.ClientProxy; import net.montoyo.wd.core.DefaultUpgrade; import net.montoyo.wd.core.IUpgrade; import net.montoyo.wd.core.JSServerRequest; @@ -33,21 +43,21 @@ import net.montoyo.wd.data.ScreenConfigData; import net.montoyo.wd.init.BlockInit; import net.montoyo.wd.init.ItemInit; import net.montoyo.wd.init.TileInit; +import net.montoyo.wd.miniserv.SyncPlugin; import net.montoyo.wd.net.Messages; -import net.montoyo.wd.net.client.CMessageAddScreen; -import net.montoyo.wd.net.client.CMessageCloseGui; -import net.montoyo.wd.net.client.CMessageJSResponse; -import net.montoyo.wd.net.client.CMessageScreenUpdate; +import net.montoyo.wd.net.client.*; +import net.montoyo.wd.net.server.SMessageGetUrl; import net.montoyo.wd.net.server.SMessageRequestTEData; +import net.montoyo.wd.net.server.URLMessage; import net.montoyo.wd.utilities.*; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.IOException; import java.net.*; -import java.util.ArrayList; -import java.util.Collections; -import java.util.UUID; +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import java.util.function.Consumer; import static net.montoyo.wd.block.BlockPeripheral.point; @@ -370,17 +380,17 @@ public class TileEntityScreen extends BlockEntity { } public static String url(String url) throws IOException { - - MinecraftServer server = WebDisplays.PROXY.getServer(); - System.setProperty("http.proxyHost", server.getLocalIp()); - System.setProperty("http.proxyPort", String.valueOf(server.getPort())); - Proxy webProxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(InetAddress.getByName(server.getLocalIp()), server.getPort())); - - URL weburl1 = new URL(url); - - HttpURLConnection webProxyConnection = (HttpURLConnection) weburl1.openConnection(webProxy); - - return webProxyConnection.getURL().toString(); + System.out.println("URL received: " + url); + if (!(WebDisplays.PROXY instanceof ClientProxy)) { + List serverPlayers = WebDisplays.PROXY.getServer().getPlayerList().getPlayers(); + SyncPlugin.syncPlayers(serverPlayers); + for (ServerPlayer serverPlayer : serverPlayers) { + SyncPlugin.setPlayerString(serverPlayer, url); + } + return url; + } else { + return null; + } } public void setScreenURL(BlockSide side, String url) throws IOException { @@ -403,9 +413,6 @@ public class TileEntityScreen extends BlockEntity { Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), CMessageScreenUpdate.setURL(this, side, weburl)); setChanged(); } - - System.setProperty("http.proxyHost", null); - System.setProperty("http.proxyPort", null); } public void removeScreen(BlockSide side) { @@ -714,6 +721,12 @@ public class TileEntityScreen extends BlockEntity { public void updateClientSideURL(IBrowser target, String url) { for (Screen scr : screens) { if (scr.browser == target) { + String webUrl; + try { + webUrl = TileEntityScreen.url(url); + } catch (IOException e) { + throw new RuntimeException(e); + } boolean blacklisted = WebDisplays.isSiteBlacklisted(url); scr.url = blacklisted ? WebDisplays.BLACKLIST_URL : url; //FIXME: This is an invalid fix for something that CANNOT be fixed scr.videoType = VideoType.getTypeFromURL(scr.url); diff --git a/src/main/java/net/montoyo/wd/miniserv/SyncPlugin.java b/src/main/java/net/montoyo/wd/miniserv/SyncPlugin.java new file mode 100644 index 0000000..b2e246c --- /dev/null +++ b/src/main/java/net/montoyo/wd/miniserv/SyncPlugin.java @@ -0,0 +1,51 @@ +package net.montoyo.wd.miniserv; + +import com.mojang.math.Vector3d; +import net.minecraft.core.RegistryAccess; +import net.minecraft.network.Connection; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.PacketFlow; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.network.NetworkDirection; +import net.minecraftforge.network.PacketDistributor; +import net.montoyo.wd.WebDisplays; +import net.montoyo.wd.net.Messages; +import net.montoyo.wd.net.server.SMessageGetUrl; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class SyncPlugin { + private static final Map> syncedPlayers = new HashMap<>(); + private static final Map URL = new HashMap<>(); + + public static void syncPlayers(List players) { + for (ServerPlayer player : players) { + List syncedPlayersList = new ArrayList<>(players); + syncedPlayersList.remove(player); + syncedPlayers.put(player, syncedPlayersList); + } + } + + public static String getPlayerString(ServerPlayer player) { + if(URL.get(player) == null) { + return "https://www.google.com"; + } + return URL.get(player); + } + + public static void setPlayerString(ServerPlayer player, String value) { + URL.put(player, value); + List syncedPlayersList = syncedPlayers.get(player); + if (syncedPlayersList != null) { + for (ServerPlayer syncedPlayer : syncedPlayersList) { + if(!syncedPlayer.hasDisconnected()) { + Messages.INSTANCE.sendToServer(new SMessageGetUrl(URL.get(syncedPlayer))); + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/net/montoyo/wd/net/Messages.java b/src/main/java/net/montoyo/wd/net/Messages.java index e249e9d..d55de2c 100644 --- a/src/main/java/net/montoyo/wd/net/Messages.java +++ b/src/main/java/net/montoyo/wd/net/Messages.java @@ -4,18 +4,28 @@ package net.montoyo.wd.net; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.util.AttributeKey; +import net.minecraft.core.Holder; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.network.NetworkRegistry; import net.minecraftforge.network.simple.SimpleChannel; import net.montoyo.wd.net.client.*; import net.montoyo.wd.net.server.*; +import java.lang.reflect.InvocationTargetException; +import java.util.function.Supplier; + @Mod.EventBusSubscriber public class Messages { @@ -44,5 +54,7 @@ public class Messages { INSTANCE.registerMessage(index++, SMessageScreenCtrl.class, SMessageScreenCtrl::encode, SMessageScreenCtrl::decode, SMessageScreenCtrl::handle); INSTANCE.registerMessage(index++, SMessagePadCtrl.class, SMessagePadCtrl::encode, SMessagePadCtrl::decode, SMessagePadCtrl::handle); INSTANCE.registerMessage(index++, CMessageOpenGui.class, CMessageOpenGui::encode, CMessageOpenGui::decode, CMessageOpenGui::handle); + INSTANCE.registerMessage(index++, SMessageGetUrl.class, SMessageGetUrl::encode, SMessageGetUrl::decode, SMessageGetUrl::handle); + INSTANCE.registerMessage(index++, URLMessage.class, URLMessage::encode, URLMessage::decode, URLMessage::handle); } } diff --git a/src/main/java/net/montoyo/wd/net/server/SMessageGetUrl.java b/src/main/java/net/montoyo/wd/net/server/SMessageGetUrl.java new file mode 100644 index 0000000..ae6149a --- /dev/null +++ b/src/main/java/net/montoyo/wd/net/server/SMessageGetUrl.java @@ -0,0 +1,41 @@ +package net.montoyo.wd.net.server; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; +import net.minecraftforge.network.PacketDistributor; +import net.montoyo.wd.net.Messages; + +import java.util.Objects; +import java.util.function.Supplier; + +public class SMessageGetUrl { + String url; + + public SMessageGetUrl() { + } + + public SMessageGetUrl(String url) { + this.url = url; + } + + public static SMessageGetUrl decode(FriendlyByteBuf buf) { + SMessageGetUrl message = new SMessageGetUrl(); + message.url = buf.readUtf(); + return message; + } + + public void encode(FriendlyByteBuf buf) { + buf.writeUtf(url); + } + + public void handle(Supplier contextSupplier) { + contextSupplier.get().enqueueWork(() -> { + int connectTime = Objects.requireNonNull(Objects.requireNonNull(contextSupplier.get().getSender()).getServer()).getTickCount() - Objects.requireNonNull(contextSupplier.get().getSender()).connection.player.tickCount; + if(Objects.requireNonNull(contextSupplier.get().getSender()).connection.getConnection().isConnected() && connectTime > 20) { + Messages.INSTANCE.send(PacketDistributor.PLAYER.with(() -> contextSupplier.get().getSender()), new URLMessage(url)); + } + Messages.INSTANCE.send(PacketDistributor.ALL.noArg(), new URLMessage(url)); + }); + contextSupplier.get().setPacketHandled(true); + } +} diff --git a/src/main/java/net/montoyo/wd/net/server/SMessagePadCtrl.java b/src/main/java/net/montoyo/wd/net/server/SMessagePadCtrl.java index 6f2f356..09cf3ff 100644 --- a/src/main/java/net/montoyo/wd/net/server/SMessagePadCtrl.java +++ b/src/main/java/net/montoyo/wd/net/server/SMessagePadCtrl.java @@ -12,8 +12,10 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.WebDisplays; +import net.montoyo.wd.entity.TileEntityScreen; import net.montoyo.wd.init.ItemInit; +import java.io.IOException; import java.util.function.Supplier; public class SMessagePadCtrl implements Runnable { @@ -54,7 +56,13 @@ public class SMessagePadCtrl implements Runnable { if(!is.getTag().contains("PadID")) is.getTag().putInt("PadID", WebDisplays.getNextAvailablePadID()); - is.getTag().putString("PadURL", WebDisplays.applyBlacklist(url)); + String webUrl; + try { + webUrl = TileEntityScreen.url(url); + } catch (IOException e) { + throw new RuntimeException(e); + } + is.getTag().putString("PadURL", WebDisplays.applyBlacklist(webUrl)); } } } else { @@ -71,8 +79,15 @@ public class SMessagePadCtrl implements Runnable { if(target == null && matchesMinePadID(player.getInventory().offhand.get(0))) target = player.getInventory().offhand.get(0); - if(target != null) - target.getTag().putString("PadURL", WebDisplays.applyBlacklist(url)); + if(target != null) { + String webUrl; + try { + webUrl = TileEntityScreen.url(url); + } catch (IOException e) { + throw new RuntimeException(e); + } + target.getTag().putString("PadURL", WebDisplays.applyBlacklist(webUrl)); + } } } diff --git a/src/main/java/net/montoyo/wd/net/server/URLMessage.java b/src/main/java/net/montoyo/wd/net/server/URLMessage.java new file mode 100644 index 0000000..a3a86ca --- /dev/null +++ b/src/main/java/net/montoyo/wd/net/server/URLMessage.java @@ -0,0 +1,35 @@ +package net.montoyo.wd.net.server; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; + +import java.util.function.Supplier; + +public class URLMessage { + + private String url; + + public URLMessage() {} + + public URLMessage(String url) { + this.url = url; + } + + public String getURL() { + return url; + } + + public static URLMessage decode(FriendlyByteBuf buf) { + URLMessage message = new URLMessage(); + message.url = buf.readUtf(); + return message; + } + + public void encode(FriendlyByteBuf buf) { + buf.writeUtf(url); + } + + public void handle(Supplier contextSupplier) { + contextSupplier.get().setPacketHandled(true); + } + } \ No newline at end of file