From 4ac3edb4af2c987707b02b421b07b3457ad7f93c Mon Sep 17 00:00:00 2001 From: GiantLuigi4 <49770992+GiantLuigi4@users.noreply.github.com> Date: Thu, 1 Jun 2023 22:39:28 -0400 Subject: [PATCH] slight tweaks, start looking into a potential way to sync videos --- .../net/montoyo/wd/client/ClientProxy.java | 10 +- .../montoyo/wd/client/JSQueryDispatcher.java | 2 + .../montoyo/wd/entity/TileEntityScreen.java | 9 +- .../server_bound/C2SMessageScreenCtrl.java | 2 +- .../net/montoyo/wd/utilities/VideoType.java | 203 +++++++++++------- 5 files changed, 142 insertions(+), 84 deletions(-) diff --git a/src/main/java/net/montoyo/wd/client/ClientProxy.java b/src/main/java/net/montoyo/wd/client/ClientProxy.java index 55d5c62..ac2b70e 100644 --- a/src/main/java/net/montoyo/wd/client/ClientProxy.java +++ b/src/main/java/net/montoyo/wd/client/ClientProxy.java @@ -179,7 +179,7 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer throw new RuntimeException("MCEF is missing"); mcef.registerDisplayHandler(this); - //mcef.registerJSQueryHandler(this); //TODO why crashing on this method! + mcef.registerJSQueryHandler(this); findAdvancementToProgressField(); } @@ -698,13 +698,17 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer if(t - lastPointPacket >= 100) { lastPointPacket = t; - WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.laserMove(tes, side, hit)); + if (Minecraft.getInstance().player.isShiftKeyDown()) { + WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.laserDown(tes, side, hit)); + } else { + WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.laserMove(tes, side, hit)); + } } } else { deselectScreen(); pointedScreen = tes; pointedScreenSide = side; - WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.laserDown(tes, side, hit)); +// WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.laserDown(tes, side, hit)); } } diff --git a/src/main/java/net/montoyo/wd/client/JSQueryDispatcher.java b/src/main/java/net/montoyo/wd/client/JSQueryDispatcher.java index 283db73..7bd5ee0 100644 --- a/src/main/java/net/montoyo/wd/client/JSQueryDispatcher.java +++ b/src/main/java/net/montoyo/wd/client/JSQueryDispatcher.java @@ -218,6 +218,8 @@ public final class JSQueryDispatcher { } private void registerDefaults() { + VideoType.registerQueries(this); + register("GetSize", (cb, tes, side, args) -> { Vector2i size = tes.getScreen(side).size; cb.success("{\"x\":" + size.x + ",\"y\":" + size.y + "}"); diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java index d40fe38..84b73ad 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java +++ b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java @@ -1074,11 +1074,12 @@ public class TileEntityScreen extends BlockEntity { if (scr != null) { if (down) { //Try to acquire laser lock - if (getLaserUser(scr) == null) { +// if (getLaserUser(scr) == null) { scr.laserUser = ply; - WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), S2CMessageScreenUpdate.click(this, side, S2CMessageScreenUpdate.MOUSE_DOWN, pos)); - } - } else if (getLaserUser(scr) == ply) + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), S2CMessageScreenUpdate.click(this, side, S2CMessageScreenUpdate.MOUSE_CLICK, pos)); +// } + } else +// if (getLaserUser(scr) == ply) WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), S2CMessageScreenUpdate.click(this, side, S2CMessageScreenUpdate.MOUSE_MOVE, pos)); } } diff --git a/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageScreenCtrl.java b/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageScreenCtrl.java index 1ea5274..716e88d 100644 --- a/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageScreenCtrl.java +++ b/src/main/java/net/montoyo/wd/net/server_bound/C2SMessageScreenCtrl.java @@ -107,7 +107,7 @@ public class C2SMessageScreenCtrl extends Packet { public static C2SMessageScreenCtrl laserDown(TileEntityScreen tes, BlockSide side, Vector2i vec) { C2SMessageScreenCtrl ret = base(tes, side); - ret.control = new LaserControl(LaserControl.ControlType.MOVE, vec); + ret.control = new LaserControl(LaserControl.ControlType.DOWN, vec); return ret; } diff --git a/src/main/java/net/montoyo/wd/utilities/VideoType.java b/src/main/java/net/montoyo/wd/utilities/VideoType.java index eae8212..f05d4ce 100644 --- a/src/main/java/net/montoyo/wd/utilities/VideoType.java +++ b/src/main/java/net/montoyo/wd/utilities/VideoType.java @@ -4,87 +4,138 @@ package net.montoyo.wd.utilities; +import net.montoyo.wd.client.JSQueryDispatcher; + import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.net.MalformedURLException; import java.net.URL; public enum VideoType { - - YOUTUBE("document.getElementById(\"movie_player\").setVolume(", ")"), - YOUTUBE_EMBED("document.getElementsByClassName(\"html5-video-player\")[0].setVolume(", ")"); - - private final String volumePrefix; - private final String volumeSuffix; - private final int volumeCap; - - VideoType(String prefix, String suffix) { - volumePrefix = prefix; - volumeSuffix = suffix; - volumeCap = prefix.length() + 5 + suffix.length(); + + YOUTUBE( + "document.getElementById(\"movie_player\").", + new Function("setVolume(", ")"), + new Function("getCurrentTime(", ")"), + new Function("seekTo(", ")") + ), + YOUTUBE_EMBED( + "document.getElementsByClassName(\"html5-video-player\")[0].", + new Function("setVolume(", ")"), + new Function("getCurrentTime(", ")"), + new Function("seekTo(", ")") + ); + + private final String base; + private final Function volume; + private final Function getTime; + private final Function setTime; + private final int volumeCap; + + VideoType( + String base, + Function volume, + Function getTime, + Function setTime + ) { + this.base = base; + this.volume = volume; + this.getTime = getTime; + this.setTime = setTime; + // lol, what? + volumeCap = volume.prefix.length() + 5 + volume.suffix.length(); + } + + public static void registerQueries(JSQueryDispatcher jsQueryDispatcher) { + // TODO: register GetTime query } - - @Nullable - public static VideoType getTypeFromURL(@Nonnull URL url) { - String loHost = url.getHost().toLowerCase(); - if(loHost.equals("youtu.be")) - return url.getPath().length() > 1 ? YOUTUBE : null; - else if(!loHost.equals("www.youtube.com") && !loHost.equals("youtube.com")) - return null; - - String loPath = url.getPath().toLowerCase(); - if(loPath.equals("/watch")) { - if(url.getQuery() != null && (url.getQuery().startsWith("v=") || url.getQuery().contains("&v="))) - return YOUTUBE; - } else if(loPath.startsWith("/embed/")) - return loPath.length() > 7 ? YOUTUBE_EMBED : null; - - return null; - } - - @Nullable - public static VideoType getTypeFromURL(@Nonnull String url) { - try { - return getTypeFromURL(new URL(url)); - } catch(MalformedURLException ex) { - return null; - } - } - - @Nonnull - public String getVideoIDFromURL(@Nonnull URL url) { - if(this == YOUTUBE) { - if(url.getHost().equalsIgnoreCase("youtu.be")) - return url.getPath().substring(1); - - String args[] = url.getQuery().split("&"); - for(String arg : args) { - if(arg.startsWith("v=")) - return arg.substring(2); - } - } else if(this == YOUTUBE_EMBED) - return url.getPath().substring(7); - - return ""; - } - - @Nonnull - public String getURLFromID(@Nonnull String vid, boolean autoplay) { - String format; - if(this == YOUTUBE) - format = autoplay ? "https://www.youtube.com/watch?v=%s&autoplay=1" : "https://www.youtube.com/watch?v=%s"; - else if(this == YOUTUBE_EMBED) - format = autoplay ? "https://www.youtube.com/embed/%s?autoplay=1" : "https://www.youtube.com/embed/%s"; - else - return ""; - - return String.format(format, vid); - } - - // TODO: timestamp stuff - @Nonnull - public String getVolumeJSQuery(int volInt, int volFrac) { - return (new StringBuilder(volumeCap)).append(volumePrefix).append(volInt).append('.').append(volFrac).append(volumeSuffix).toString(); - } - + + protected static class Function { + String prefix, suffix; + + public Function(String prefix, String suffix) { + this.prefix = prefix; + this.suffix = suffix; + } + + public String apply() { + return prefix + suffix; + } + + public String apply(String arg) { + return prefix + arg + suffix; + } + } + + @Nullable + public static VideoType getTypeFromURL(@Nonnull URL url) { + String loHost = url.getHost().toLowerCase(); + if (loHost.equals("youtu.be")) + return url.getPath().length() > 1 ? YOUTUBE : null; + else if (!loHost.equals("www.youtube.com") && !loHost.equals("youtube.com")) + return null; + + String loPath = url.getPath().toLowerCase(); + if (loPath.equals("/watch")) { + if (url.getQuery() != null && (url.getQuery().startsWith("v=") || url.getQuery().contains("&v="))) + return YOUTUBE; + } else if (loPath.startsWith("/embed/")) + return loPath.length() > 7 ? YOUTUBE_EMBED : null; + + return null; + } + + @Nullable + public static VideoType getTypeFromURL(@Nonnull String url) { + try { + return getTypeFromURL(new URL(url)); + } catch (MalformedURLException ex) { + return null; + } + } + + @Nonnull + public String getVideoIDFromURL(@Nonnull URL url) { + if (this == YOUTUBE) { + if (url.getHost().equalsIgnoreCase("youtu.be")) + return url.getPath().substring(1); + + String args[] = url.getQuery().split("&"); + for (String arg : args) { + if (arg.startsWith("v=")) + return arg.substring(2); + } + } else if (this == YOUTUBE_EMBED) + return url.getPath().substring(7); + + return ""; + } + + @Nonnull + public String getURLFromID(@Nonnull String vid, boolean autoplay) { + String format; + if (this == YOUTUBE) + format = autoplay ? "https://www.youtube.com/watch?v=%s&autoplay=1" : "https://www.youtube.com/watch?v=%s"; + else if (this == YOUTUBE_EMBED) + format = autoplay ? "https://www.youtube.com/embed/%s?autoplay=1" : "https://www.youtube.com/embed/%s"; + else + return ""; + + return String.format(format, vid); + } + + // TODO: timestamp stuff + @Nonnull + public String getVolumeJSQuery(int volInt, int volFrac) { + return volume.apply(volInt + "." + volFrac); + } + + public String getTimeStampQuery() { + return getTime.apply(); + } + + public String setTimeStampQuery(float ts) { + return setTime.apply(String.valueOf(ts)); + } + }