From bcd9fdc52f7de10d8532f265fc64f54a2f7a138a Mon Sep 17 00:00:00 2001 From: Eren KARA Date: Thu, 22 May 2025 17:35:47 +0300 Subject: [PATCH 01/21] timezone support --- .../skript/expressions/ExprAllTimezones.java | 45 +++++++++++++++++++ .../ch/njol/skript/expressions/ExprNow.java | 43 +++++++++++++++--- 2 files changed, 82 insertions(+), 6 deletions(-) create mode 100644 src/main/java/ch/njol/skript/expressions/ExprAllTimezones.java diff --git a/src/main/java/ch/njol/skript/expressions/ExprAllTimezones.java b/src/main/java/ch/njol/skript/expressions/ExprAllTimezones.java new file mode 100644 index 00000000000..d0931b64da2 --- /dev/null +++ b/src/main/java/ch/njol/skript/expressions/ExprAllTimezones.java @@ -0,0 +1,45 @@ +package ch.njol.skript.expressions; + +import ch.njol.skript.Skript; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.ExpressionType; +import ch.njol.skript.lang.SkriptParser; +import ch.njol.skript.lang.util.SimpleExpression; +import ch.njol.util.Kleenean; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; + +import java.time.ZoneId; + +public class ExprAllTimezones extends SimpleExpression { + + static { + Skript.registerExpression(ExprAllTimezones.class, String.class, ExpressionType.SIMPLE, "all time[ ]zones"); + } + + @Override + public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) { + return true; + } + + @Override + @Nullable + protected String[] get(Event event) { + return ZoneId.getAvailableZoneIds().toArray(new String[0]); + } + + @Override + public boolean isSingle() { + return false; + } + @Override + public Class getReturnType() { + return String.class; + } + + @Override + public String toString(@Nullable Event event, boolean debug) { + return "all timezones"; + } + +} diff --git a/src/main/java/ch/njol/skript/expressions/ExprNow.java b/src/main/java/ch/njol/skript/expressions/ExprNow.java index fc1e12739d5..ae3f3dd0cbc 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprNow.java +++ b/src/main/java/ch/njol/skript/expressions/ExprNow.java @@ -15,24 +15,52 @@ import ch.njol.skript.util.Date; import ch.njol.util.Kleenean; +import java.time.DateTimeException; +import java.time.Instant; +import java.time.ZoneId; +import java.time.ZonedDateTime; + @Name("Now") @Description("The current system time of the server. Use time to get the Minecraft time of a world.") @Examples({"broadcast \"Current server time: %now%\""}) -@Since("1.4") +@Since("1.4, INSERT VERSION (timezones)") public class ExprNow extends SimpleExpression { static { - Skript.registerExpression(ExprNow.class, Date.class, ExpressionType.SIMPLE, "now"); + Skript.registerExpression(ExprNow.class, Date.class, ExpressionType.SIMPLE, "now [timezone:in time[ ]zone %-string%]"); } + + private boolean usingTimezone; + private Expression timezone; @Override - public boolean init(final Expression[] exprs, final int matchedPattern, final Kleenean isDelayed, final ParseResult parseResult) { + public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + usingTimezone = parseResult.hasTag("timezone"); + timezone = (Expression) exprs[0]; return true; } @Override - protected Date[] get(final Event e) { - return new Date[] {new Date()}; + protected Date[] get(Event event) { + if (usingTimezone) { + String timezone = this.timezone.getSingle(event); + if (timezone == null) { + return new Date[0]; + } + + ZoneId zoneId; + try { + zoneId = ZoneId.of(timezone); + } catch (DateTimeException e) { // invalid zone format + return new Date[0]; + } + + Instant instant = ZonedDateTime.now(zoneId).toInstant(); + java.util.Date javaDate = java.util.Date.from(instant); + Date date = Date.fromJavaDate(javaDate); + return new Date[]{ date }; + } + return new Date[]{ new Date() }; } @Override @@ -46,7 +74,10 @@ public Class getReturnType() { } @Override - public String toString(final @Nullable Event e, final boolean debug) { + public String toString(@Nullable Event e, boolean debug) { + if (usingTimezone) { + return "now in timezone " + timezone.toString(e, debug); + } return "now"; } From f027b75d33a9bf6124afb4f97f659b49f7246c6d Mon Sep 17 00:00:00 2001 From: Eren KARA Date: Thu, 22 May 2025 18:38:52 +0300 Subject: [PATCH 02/21] fix shifting --- .../java/ch/njol/skript/expressions/ExprNow.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/ch/njol/skript/expressions/ExprNow.java b/src/main/java/ch/njol/skript/expressions/ExprNow.java index ae3f3dd0cbc..7be0246734a 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprNow.java +++ b/src/main/java/ch/njol/skript/expressions/ExprNow.java @@ -48,15 +48,19 @@ protected Date[] get(Event event) { return new Date[0]; } - ZoneId zoneId; + ZoneId targetZoneId; try { - zoneId = ZoneId.of(timezone); + targetZoneId = ZoneId.of(timezone); } catch (DateTimeException e) { // invalid zone format return new Date[0]; } - Instant instant = ZonedDateTime.now(zoneId).toInstant(); - java.util.Date javaDate = java.util.Date.from(instant); + ZoneId localZoneId = ZoneId.systemDefault(); + Instant shiftedNow = ZonedDateTime.now(targetZoneId) + .toLocalDateTime() + .atZone(localZoneId) + .toInstant(); + java.util.Date javaDate = java.util.Date.from(shiftedNow); Date date = Date.fromJavaDate(javaDate); return new Date[]{ date }; } From 6d0a0dff0eff8d573c1241c3a860a4056d2f4b41 Mon Sep 17 00:00:00 2001 From: Eren KARA Date: Fri, 23 May 2025 18:30:21 +0300 Subject: [PATCH 03/21] requested changes --- .../skript/expressions/ExprAllTimezones.java | 16 +++++++++--- .../ch/njol/skript/expressions/ExprNow.java | 26 ++++++++++++------- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/main/java/ch/njol/skript/expressions/ExprAllTimezones.java b/src/main/java/ch/njol/skript/expressions/ExprAllTimezones.java index d0931b64da2..aefeb722401 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprAllTimezones.java +++ b/src/main/java/ch/njol/skript/expressions/ExprAllTimezones.java @@ -1,9 +1,13 @@ package ch.njol.skript.expressions; import ch.njol.skript.Skript; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Example; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.ExpressionType; -import ch.njol.skript.lang.SkriptParser; +import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.util.Kleenean; import org.bukkit.event.Event; @@ -11,6 +15,10 @@ import java.time.ZoneId; +@Name("All Timezones") +@Description("Returns a list of all timezones that can be used in the now expression.") +@Since("INSERT VERSION") +@Example("set {_timezones::*} to all timezones") public class ExprAllTimezones extends SimpleExpression { static { @@ -18,13 +26,12 @@ public class ExprAllTimezones extends SimpleExpression { } @Override - public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) { + public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { return true; } @Override - @Nullable - protected String[] get(Event event) { + protected String @Nullable [] get(Event event) { return ZoneId.getAvailableZoneIds().toArray(new String[0]); } @@ -32,6 +39,7 @@ protected String[] get(Event event) { public boolean isSingle() { return false; } + @Override public Class getReturnType() { return String.class; diff --git a/src/main/java/ch/njol/skript/expressions/ExprNow.java b/src/main/java/ch/njol/skript/expressions/ExprNow.java index 7be0246734a..8848c10b24b 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprNow.java +++ b/src/main/java/ch/njol/skript/expressions/ExprNow.java @@ -1,13 +1,10 @@ package ch.njol.skript.expressions; +import ch.njol.skript.doc.*; import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; import ch.njol.skript.Skript; -import ch.njol.skript.doc.Description; -import ch.njol.skript.doc.Examples; -import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.Since; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.ExpressionType; import ch.njol.skript.lang.SkriptParser.ParseResult; @@ -21,8 +18,19 @@ import java.time.ZonedDateTime; @Name("Now") -@Description("The current system time of the server. Use time to get the Minecraft time of a world.") -@Examples({"broadcast \"Current server time: %now%\""}) +@Description({ + "The current system time of the server. " + + "Use time to get the Minecraft time of a world.", + "Optionally specify a timezone to get the current date at a timezone. The returned value might not be equal to" + + "'now' without timezones. If a timezone is invalid no value will be returned.", + "Use all timezones to get a list of valid timezones." +}) +@Example("broadcast \"Current server time: %now%\"") +@Example(""" + set {_date} to now in timezone "Europe/Istanbul" + set {_clock} to {_date} formatted as "kk:mm" + send "It is currently %{_clock}% in Istanbul!" to player + """) @Since("1.4, INSERT VERSION (timezones)") public class ExprNow extends SimpleExpression { @@ -78,11 +86,11 @@ public Class getReturnType() { } @Override - public String toString(@Nullable Event e, boolean debug) { + public String toString(@Nullable Event event, boolean debug) { if (usingTimezone) { - return "now in timezone " + timezone.toString(e, debug); + return "now in timezone " + timezone.toString(event, debug); } return "now"; } - + } From ce306e79c0d56ba02704f4ffb5ea8c0e528e4397 Mon Sep 17 00:00:00 2001 From: Eren KARA Date: Wed, 4 Jun 2025 21:15:01 +0300 Subject: [PATCH 04/21] revert ExprNow --- .../ch/njol/skript/expressions/ExprNow.java | 79 +++++-------------- 1 file changed, 18 insertions(+), 61 deletions(-) diff --git a/src/main/java/ch/njol/skript/expressions/ExprNow.java b/src/main/java/ch/njol/skript/expressions/ExprNow.java index 8848c10b24b..da549a7aa6e 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprNow.java +++ b/src/main/java/ch/njol/skript/expressions/ExprNow.java @@ -1,10 +1,13 @@ package ch.njol.skript.expressions; -import ch.njol.skript.doc.*; import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; import ch.njol.skript.Skript; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.ExpressionType; import ch.njol.skript.lang.SkriptParser.ParseResult; @@ -12,85 +15,39 @@ import ch.njol.skript.util.Date; import ch.njol.util.Kleenean; -import java.time.DateTimeException; -import java.time.Instant; -import java.time.ZoneId; -import java.time.ZonedDateTime; - @Name("Now") -@Description({ - "The current system time of the server. " - + "Use time to get the Minecraft time of a world.", - "Optionally specify a timezone to get the current date at a timezone. The returned value might not be equal to" - + "'now' without timezones. If a timezone is invalid no value will be returned.", - "Use all timezones to get a list of valid timezones." -}) -@Example("broadcast \"Current server time: %now%\"") -@Example(""" - set {_date} to now in timezone "Europe/Istanbul" - set {_clock} to {_date} formatted as "kk:mm" - send "It is currently %{_clock}% in Istanbul!" to player - """) -@Since("1.4, INSERT VERSION (timezones)") +@Description("The current system time of the server. Use time to get the Minecraft time of a world.") +@Examples({"broadcast \"Current server time: %now%\""}) +@Since("1.4") public class ExprNow extends SimpleExpression { - + static { - Skript.registerExpression(ExprNow.class, Date.class, ExpressionType.SIMPLE, "now [timezone:in time[ ]zone %-string%]"); + Skript.registerExpression(ExprNow.class, Date.class, ExpressionType.SIMPLE, "now"); } - private boolean usingTimezone; - private Expression timezone; - @Override - public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - usingTimezone = parseResult.hasTag("timezone"); - timezone = (Expression) exprs[0]; + public boolean init(final Expression[] exprs, final int matchedPattern, final Kleenean isDelayed, final ParseResult parseResult) { return true; } - - @Override - protected Date[] get(Event event) { - if (usingTimezone) { - String timezone = this.timezone.getSingle(event); - if (timezone == null) { - return new Date[0]; - } - - ZoneId targetZoneId; - try { - targetZoneId = ZoneId.of(timezone); - } catch (DateTimeException e) { // invalid zone format - return new Date[0]; - } - ZoneId localZoneId = ZoneId.systemDefault(); - Instant shiftedNow = ZonedDateTime.now(targetZoneId) - .toLocalDateTime() - .atZone(localZoneId) - .toInstant(); - java.util.Date javaDate = java.util.Date.from(shiftedNow); - Date date = Date.fromJavaDate(javaDate); - return new Date[]{ date }; - } - return new Date[]{ new Date() }; + @Override + protected Date[] get(final Event e) { + return new Date[] {new Date()}; } - + @Override public boolean isSingle() { return true; } - + @Override public Class getReturnType() { return Date.class; } - + @Override - public String toString(@Nullable Event event, boolean debug) { - if (usingTimezone) { - return "now in timezone " + timezone.toString(event, debug); - } + public String toString(final @Nullable Event e, final boolean debug) { return "now"; } -} +} \ No newline at end of file From 2b911a81abe16687c7b20413ad896c79cfe86abd Mon Sep 17 00:00:00 2001 From: Eren KARA Date: Wed, 4 Jun 2025 21:15:11 +0300 Subject: [PATCH 05/21] add ExprDateInTimezone --- .../expressions/ExprDateInTimezone.java | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 src/main/java/ch/njol/skript/expressions/ExprDateInTimezone.java diff --git a/src/main/java/ch/njol/skript/expressions/ExprDateInTimezone.java b/src/main/java/ch/njol/skript/expressions/ExprDateInTimezone.java new file mode 100644 index 00000000000..92426832232 --- /dev/null +++ b/src/main/java/ch/njol/skript/expressions/ExprDateInTimezone.java @@ -0,0 +1,106 @@ +package ch.njol.skript.expressions; + +import ch.njol.skript.Skript; +import ch.njol.skript.config.Node; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Example; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.ExpressionType; +import ch.njol.skript.lang.SkriptParser; +import ch.njol.skript.lang.util.SimpleExpression; +import ch.njol.skript.util.Date; +import ch.njol.util.Kleenean; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; +import org.skriptlang.skript.log.runtime.SyntaxRuntimeErrorProducer; + +import java.time.DateTimeException; +import java.time.Instant; +import java.time.ZoneId; +import java.time.ZonedDateTime; + +@Name("Date in Timezone") +@Description({ + "Returns a date in the specified timezone. Note that the result date might not be equal to the input date.", + "Use all timezones to get a list of valid timezones." +}) +@Example(""" + set {_date} to now in timezone "Europe/Istanbul" + set {_clock} to {_date} formatted as "kk:mm" + send "It is currently %{_clock}% in Istanbul!" to player + """) +@Since("INSERT VERSION") +public class ExprDateInTimezone extends SimpleExpression implements SyntaxRuntimeErrorProducer { + + static { + Skript.registerExpression(ExprDateInTimezone.class, Date.class, ExpressionType.SIMPLE, "[date] %date% in time[ ]zone %string%"); + } + + private Node node; + private Expression date; + private Expression timezone; + + @Override + public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) { + node = getParser().getNode(); + date = (Expression) expressions[0]; + timezone = (Expression) expressions[1]; + return true; + } + + @Override + protected Date @Nullable [] get(Event event) { + String timezone = this.timezone.getSingle(event); + Date date = this.date.getSingle(event); + + if (timezone == null) { + error("Timezone is not set."); + return new Date[0]; + } + + if (date == null) { + return new Date[0]; + } + + ZoneId targetZoneId; + try { + targetZoneId = ZoneId.of(timezone); + } catch (DateTimeException e) { // invalid zone format + error("Invalid timezone."); + return new Date[0]; + } + + Instant instantDate = date.toInstant(); + ZoneId localZoneId = ZoneId.systemDefault(); + Instant shiftedNow = ZonedDateTime.ofInstant(instantDate, targetZoneId) + .toLocalDateTime() + .atZone(localZoneId) + .toInstant(); + java.util.Date javaDate = java.util.Date.from(shiftedNow); + Date shiftedDate = Date.fromJavaDate(javaDate); + return new Date[]{ shiftedDate }; + } + + @Override + public boolean isSingle() { + return true; + } + + @Override + public Class getReturnType() { + return Date.class; + } + + @Override + public String toString(@Nullable Event event, boolean debug) { + return "date " + date.toString(event, debug) + " in timezone " + timezone.toString(event, debug); + } + + @Override + public Node getNode() { + return node; + } + +} From d62d417fa299ad7548a7a96d96a36ed5045ba9d0 Mon Sep 17 00:00:00 2001 From: Eren KARA Date: Wed, 4 Jun 2025 21:53:53 +0300 Subject: [PATCH 06/21] add ExprDateInTimezone --- .../conditions/CondIsTimezoneValid.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java diff --git a/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java b/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java new file mode 100644 index 00000000000..9963fa79834 --- /dev/null +++ b/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java @@ -0,0 +1,52 @@ +package ch.njol.skript.conditions; + +import ch.njol.skript.Skript; +import ch.njol.skript.lang.Condition; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.SkriptParser; +import ch.njol.util.Kleenean; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; + +import java.time.DateTimeException; +import java.time.ZoneId; + +public class CondIsTimezoneValid extends Condition { + + static { + Skript.registerCondition(CondIsTimezoneValid.class, "time[ ]zone[s] %strings% (is|are) [negate:in]valid"); + } + + private Expression timezones; + private boolean isNegated; + + @Override + public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) { + timezones = (Expression) expressions[0]; + isNegated = parseResult.hasTag("negate"); + return true; + } + + @Override + public boolean check(Event event) { + for (String timezone : timezones.getAll(event)) { + if (timezone == null) { + return isNegated; + } + + try { + ZoneId.of(timezone); + } catch (DateTimeException e) { + return isNegated; + } + } + + return !isNegated; + } + + @Override + public String toString(@Nullable Event event, boolean debug) { + return "timezone " + timezones.toString(event, debug) + " is " + (isNegated ? "in" : "") + "valid"; + } + +} From af2dd89a8632c401388c2025c250659beb5120f0 Mon Sep 17 00:00:00 2001 From: Eren KARA Date: Wed, 4 Jun 2025 21:53:59 +0300 Subject: [PATCH 07/21] tests --- src/test/skript/tests/misc/timezone.sk | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/test/skript/tests/misc/timezone.sk diff --git a/src/test/skript/tests/misc/timezone.sk b/src/test/skript/tests/misc/timezone.sk new file mode 100644 index 00000000000..cc4155da464 --- /dev/null +++ b/src/test/skript/tests/misc/timezone.sk @@ -0,0 +1,15 @@ +test "timezone syntaxes": + assert size of all timezones > 0 with "timezones aren't set" + + assert timezone "Europe/Istanbul" is valid with "single timezone should've been valid" + assert timezones ("Europe/Istanbul", "Asia/Tokyo") are valid with "multiple timezones should've been valid" + + assert timezone "hello!" is invalid with "single timezone should've been invalid" + assert timezones ("hello!", "Asia/Tokyo") are invalid with "multiple timezones should've been invalid" + + set {_d} to date(2030, 6, 4, 11, 23) + set {_d.in.nyc} to date(2030, 6, 4, 4, 23) + set {_d.in.istanbul} to date(2030, 6, 4, 11, 23) + + assert {_d} in timezone "America/New_York" is {_d.in.nyc} with "returned incorrect date for New York" + assert {_d} in timezone "Europe/Istanbul" is {_d.in.istanbul} with "returned incorrect date for Istanbul" From 37244651288fba1f5074a19c96df0c6552f0a577 Mon Sep 17 00:00:00 2001 From: Eren KARA Date: Wed, 4 Jun 2025 21:57:10 +0300 Subject: [PATCH 08/21] docs --- .../ch/njol/skript/conditions/CondIsTimezoneValid.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java b/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java index 9963fa79834..2544cc2089c 100644 --- a/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java +++ b/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java @@ -1,6 +1,7 @@ package ch.njol.skript.conditions; import ch.njol.skript.Skript; +import ch.njol.skript.doc.*; import ch.njol.skript.lang.Condition; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.SkriptParser; @@ -11,6 +12,14 @@ import java.time.DateTimeException; import java.time.ZoneId; +@Name("Is Timezone Valid") +@Description("Checks if a timezone is valid.") +@Example(""" + set {_timezone} to "America/New_York" + if timezone {_timezone} is valid: + set {_date} to now in timezone {_timezone} + """) +@Since("1.4") public class CondIsTimezoneValid extends Condition { static { From 695252e1e268a6493c21a1eb9fc3199f3c8b365a Mon Sep 17 00:00:00 2001 From: Eren KARA Date: Wed, 4 Jun 2025 22:02:52 +0300 Subject: [PATCH 09/21] update test --- src/test/skript/tests/misc/timezone.sk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/skript/tests/misc/timezone.sk b/src/test/skript/tests/misc/timezone.sk index cc4155da464..d3ac6f48a57 100644 --- a/src/test/skript/tests/misc/timezone.sk +++ b/src/test/skript/tests/misc/timezone.sk @@ -11,5 +11,5 @@ test "timezone syntaxes": set {_d.in.nyc} to date(2030, 6, 4, 4, 23) set {_d.in.istanbul} to date(2030, 6, 4, 11, 23) - assert {_d} in timezone "America/New_York" is {_d.in.nyc} with "returned incorrect date for New York" - assert {_d} in timezone "Europe/Istanbul" is {_d.in.istanbul} with "returned incorrect date for Istanbul" + assert difference between ({_d} in timezone "America/New_York") and {_d.in.nyc} < 1 second with "returned incorrect date for New York" + assert difference between ({_d} in timezone "Europe/Istanbul") and {_d.in.istanbul} < 1 second with "returned incorrect date for Istanbul" From 708fa49d2fb509d8f841641373705938297b53e0 Mon Sep 17 00:00:00 2001 From: Eren KARA Date: Wed, 4 Jun 2025 22:12:53 +0300 Subject: [PATCH 10/21] force environment timezone --- src/main/java/ch/njol/skript/test/platform/Environment.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/ch/njol/skript/test/platform/Environment.java b/src/main/java/ch/njol/skript/test/platform/Environment.java index ecd41b32944..f08c8ac7da1 100644 --- a/src/main/java/ch/njol/skript/test/platform/Environment.java +++ b/src/main/java/ch/njol/skript/test/platform/Environment.java @@ -233,6 +233,7 @@ public TestResults runTests(Path runnerRoot, Path testsRoot, boolean devMode, bo args.add("-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000"); args.add("-Duser.language=en"); args.add("-Duser.country=US"); + args.add("-Duser.timezone=UTC"); args.addAll(jvmArgs); args.addAll(Arrays.asList(commandLine)); From ce4a3cf055a2ea41b4fa89d8beb024cc7cfdb9ca Mon Sep 17 00:00:00 2001 From: Eren KARA Date: Wed, 4 Jun 2025 22:13:08 +0300 Subject: [PATCH 11/21] update test --- src/test/skript/tests/misc/timezone.sk | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/skript/tests/misc/timezone.sk b/src/test/skript/tests/misc/timezone.sk index d3ac6f48a57..2ac60559383 100644 --- a/src/test/skript/tests/misc/timezone.sk +++ b/src/test/skript/tests/misc/timezone.sk @@ -7,9 +7,9 @@ test "timezone syntaxes": assert timezone "hello!" is invalid with "single timezone should've been invalid" assert timezones ("hello!", "Asia/Tokyo") are invalid with "multiple timezones should've been invalid" - set {_d} to date(2030, 6, 4, 11, 23) - set {_d.in.nyc} to date(2030, 6, 4, 4, 23) - set {_d.in.istanbul} to date(2030, 6, 4, 11, 23) + set {_d} to date(2030, 6, 4, 7, 23) + set {_d.in.nyc} to date(2030, 6, 4, 3, 23) + set {_d.in.istanbul} to date(2030, 6, 4, 10, 23) assert difference between ({_d} in timezone "America/New_York") and {_d.in.nyc} < 1 second with "returned incorrect date for New York" assert difference between ({_d} in timezone "Europe/Istanbul") and {_d.in.istanbul} < 1 second with "returned incorrect date for Istanbul" From d822c910d4e7ff63de3789fa1b58da5d2f7d50b4 Mon Sep 17 00:00:00 2001 From: Eren KARA Date: Wed, 4 Jun 2025 22:22:07 +0300 Subject: [PATCH 12/21] requested changes --- .../skript/conditions/CondIsTimezoneValid.java | 5 +++-- .../njol/skript/expressions/ExprAllTimezones.java | 8 +++++--- .../skript/expressions/ExprDateInTimezone.java | 14 ++++---------- .../java/ch/njol/skript/expressions/ExprNow.java | 2 +- 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java b/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java index 2544cc2089c..e4255f304e6 100644 --- a/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java +++ b/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java @@ -5,6 +5,7 @@ import ch.njol.skript.lang.Condition; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.SkriptParser; +import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.util.Kleenean; import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; @@ -19,7 +20,7 @@ if timezone {_timezone} is valid: set {_date} to now in timezone {_timezone} """) -@Since("1.4") +@Since("INSERT VERSION") public class CondIsTimezoneValid extends Condition { static { @@ -30,7 +31,7 @@ public class CondIsTimezoneValid extends Condition { private boolean isNegated; @Override - public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) { + public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { timezones = (Expression) expressions[0]; isNegated = parseResult.hasTag("negate"); return true; diff --git a/src/main/java/ch/njol/skript/expressions/ExprAllTimezones.java b/src/main/java/ch/njol/skript/expressions/ExprAllTimezones.java index aefeb722401..dba162af980 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprAllTimezones.java +++ b/src/main/java/ch/njol/skript/expressions/ExprAllTimezones.java @@ -17,14 +17,16 @@ @Name("All Timezones") @Description("Returns a list of all timezones that can be used in the now expression.") -@Since("INSERT VERSION") @Example("set {_timezones::*} to all timezones") +@Since("INSERT VERSION") public class ExprAllTimezones extends SimpleExpression { static { - Skript.registerExpression(ExprAllTimezones.class, String.class, ExpressionType.SIMPLE, "all time[ ]zones"); + Skript.registerExpression(ExprAllTimezones.class, String.class, ExpressionType.SIMPLE, "all [of [the]] time[ ]zones"); } + private static String[] timezones = ZoneId.getAvailableZoneIds().toArray(new String[0]); + @Override public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { return true; @@ -32,7 +34,7 @@ public boolean init(Expression[] expressions, int matchedPattern, Kleenean is @Override protected String @Nullable [] get(Event event) { - return ZoneId.getAvailableZoneIds().toArray(new String[0]); + return timezones; } @Override diff --git a/src/main/java/ch/njol/skript/expressions/ExprDateInTimezone.java b/src/main/java/ch/njol/skript/expressions/ExprDateInTimezone.java index 92426832232..672bf8141ca 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprDateInTimezone.java +++ b/src/main/java/ch/njol/skript/expressions/ExprDateInTimezone.java @@ -9,6 +9,7 @@ import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.ExpressionType; import ch.njol.skript.lang.SkriptParser; +import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.skript.util.Date; import ch.njol.util.Kleenean; @@ -32,19 +33,17 @@ send "It is currently %{_clock}% in Istanbul!" to player """) @Since("INSERT VERSION") -public class ExprDateInTimezone extends SimpleExpression implements SyntaxRuntimeErrorProducer { +public class ExprDateInTimezone extends SimpleExpression { static { - Skript.registerExpression(ExprDateInTimezone.class, Date.class, ExpressionType.SIMPLE, "[date] %date% in time[ ]zone %string%"); + Skript.registerExpression(ExprDateInTimezone.class, Date.class, ExpressionType.SIMPLE, "[the] [date] %date% in time[ ]zone %string%"); } - private Node node; private Expression date; private Expression timezone; @Override - public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) { - node = getParser().getNode(); + public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { date = (Expression) expressions[0]; timezone = (Expression) expressions[1]; return true; @@ -98,9 +97,4 @@ public String toString(@Nullable Event event, boolean debug) { return "date " + date.toString(event, debug) + " in timezone " + timezone.toString(event, debug); } - @Override - public Node getNode() { - return node; - } - } diff --git a/src/main/java/ch/njol/skript/expressions/ExprNow.java b/src/main/java/ch/njol/skript/expressions/ExprNow.java index da549a7aa6e..198d7eea3f5 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprNow.java +++ b/src/main/java/ch/njol/skript/expressions/ExprNow.java @@ -50,4 +50,4 @@ public String toString(final @Nullable Event e, final boolean debug) { return "now"; } -} \ No newline at end of file +} From 05e9edf507e9fdf2bcdc1c74fb8b50d95e01398e Mon Sep 17 00:00:00 2001 From: Eren <67760502+erenkarakal@users.noreply.github.com> Date: Sat, 7 Jun 2025 19:29:56 +0300 Subject: [PATCH 13/21] update syntax Co-authored-by: sovdee <10354869+sovdeeth@users.noreply.github.com> --- .../java/ch/njol/skript/conditions/CondIsTimezoneValid.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java b/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java index e4255f304e6..6e9529fe5dc 100644 --- a/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java +++ b/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java @@ -24,7 +24,7 @@ public class CondIsTimezoneValid extends Condition { static { - Skript.registerCondition(CondIsTimezoneValid.class, "time[ ]zone[s] %strings% (is|are) [negate:in]valid"); + Skript.registerCondition(CondIsTimezoneValid.class, "%strings% (is [a]|are) [negate:in]valid time[ ]zone[s]"); } private Expression timezones; From 1a423a12bfe28b89f1813b5ed107d8ed376e0d29 Mon Sep 17 00:00:00 2001 From: Eren <67760502+erenkarakal@users.noreply.github.com> Date: Sat, 7 Jun 2025 19:30:09 +0300 Subject: [PATCH 14/21] getarray() Co-authored-by: sovdee <10354869+sovdeeth@users.noreply.github.com> --- .../java/ch/njol/skript/conditions/CondIsTimezoneValid.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java b/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java index 6e9529fe5dc..2958049a30e 100644 --- a/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java +++ b/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java @@ -39,7 +39,7 @@ public boolean init(Expression[] expressions, int matchedPattern, Kleenean is @Override public boolean check(Event event) { - for (String timezone : timezones.getAll(event)) { + for (String timezone : timezones.getArray(event)) { if (timezone == null) { return isNegated; } From de725b96caebe07111c2d251c780acf72684ff5a Mon Sep 17 00:00:00 2001 From: Eren KARA Date: Sat, 7 Jun 2025 20:59:25 +0300 Subject: [PATCH 15/21] update syntaxes --- .../conditions/CondIsTimezoneValid.java | 31 ++++----- .../expressions/ExprDateInTimezone.java | 67 +++++++++++-------- 2 files changed, 54 insertions(+), 44 deletions(-) diff --git a/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java b/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java index 2958049a30e..c9b267a3715 100644 --- a/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java +++ b/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java @@ -4,7 +4,6 @@ import ch.njol.skript.doc.*; import ch.njol.skript.lang.Condition; import ch.njol.skript.lang.Expression; -import ch.njol.skript.lang.SkriptParser; import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.util.Kleenean; import org.bukkit.event.Event; @@ -17,14 +16,14 @@ @Description("Checks if a timezone is valid.") @Example(""" set {_timezone} to "America/New_York" - if timezone {_timezone} is valid: + if {_timezone} is a valid timezone: set {_date} to now in timezone {_timezone} """) @Since("INSERT VERSION") public class CondIsTimezoneValid extends Condition { static { - Skript.registerCondition(CondIsTimezoneValid.class, "%strings% (is [a]|are) [negate:in]valid time[ ]zone[s]"); + Skript.registerCondition(CondIsTimezoneValid.class, "%strings% (are|is [an]) [negate:in]valid time[ ]zone[s]"); } private Expression timezones; @@ -39,24 +38,22 @@ public boolean init(Expression[] expressions, int matchedPattern, Kleenean is @Override public boolean check(Event event) { - for (String timezone : timezones.getArray(event)) { - if (timezone == null) { - return isNegated; - } - - try { - ZoneId.of(timezone); - } catch (DateTimeException e) { - return isNegated; - } - } - - return !isNegated; + return timezones.check(event, CondIsTimezoneValid::isValidTimezone, isNegated); } @Override public String toString(@Nullable Event event, boolean debug) { - return "timezone " + timezones.toString(event, debug) + " is " + (isNegated ? "in" : "") + "valid"; + return timezones.toString(event, debug) + " are " + (isNegated ? "in" : "") + "valid timezones"; + } + + private static boolean isValidTimezone(String timezone) { + try { + ZoneId.of(timezone); + } catch (DateTimeException e) { + return false; + } + + return true; } } diff --git a/src/main/java/ch/njol/skript/expressions/ExprDateInTimezone.java b/src/main/java/ch/njol/skript/expressions/ExprDateInTimezone.java index 672bf8141ca..c4ed1a38bc6 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprDateInTimezone.java +++ b/src/main/java/ch/njol/skript/expressions/ExprDateInTimezone.java @@ -1,21 +1,18 @@ package ch.njol.skript.expressions; import ch.njol.skript.Skript; -import ch.njol.skript.config.Node; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Example; import ch.njol.skript.doc.Name; import ch.njol.skript.doc.Since; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.ExpressionType; -import ch.njol.skript.lang.SkriptParser; import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.skript.util.Date; import ch.njol.util.Kleenean; import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; -import org.skriptlang.skript.log.runtime.SyntaxRuntimeErrorProducer; import java.time.DateTimeException; import java.time.Instant; @@ -36,15 +33,20 @@ public class ExprDateInTimezone extends SimpleExpression { static { - Skript.registerExpression(ExprDateInTimezone.class, Date.class, ExpressionType.SIMPLE, "[the] [date] %date% in time[ ]zone %string%"); + Skript.registerExpression(ExprDateInTimezone.class, Date.class, ExpressionType.SIMPLE, + "[the] [date[s]] %dates% in time[ ]zone %string%", + "[the] [date[s]] %dates% in [the] %string% time[ ]zone"); } - private Expression date; + private boolean isSingle; + + private Expression dates; private Expression timezone; @Override public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - date = (Expression) expressions[0]; + dates = (Expression) expressions[0]; + isSingle = dates.isSingle(); timezone = (Expression) expressions[1]; return true; } @@ -52,39 +54,24 @@ public boolean init(Expression[] expressions, int matchedPattern, Kleenean is @Override protected Date @Nullable [] get(Event event) { String timezone = this.timezone.getSingle(event); - Date date = this.date.getSingle(event); if (timezone == null) { error("Timezone is not set."); return new Date[0]; } - if (date == null) { - return new Date[0]; - } + Date[] dates = this.dates.getArray(event); - ZoneId targetZoneId; - try { - targetZoneId = ZoneId.of(timezone); - } catch (DateTimeException e) { // invalid zone format - error("Invalid timezone."); - return new Date[0]; + for (int i = 0; i < dates.length; i++) { + dates[i] = getShiftedDate(dates[i], timezone); } - Instant instantDate = date.toInstant(); - ZoneId localZoneId = ZoneId.systemDefault(); - Instant shiftedNow = ZonedDateTime.ofInstant(instantDate, targetZoneId) - .toLocalDateTime() - .atZone(localZoneId) - .toInstant(); - java.util.Date javaDate = java.util.Date.from(shiftedNow); - Date shiftedDate = Date.fromJavaDate(javaDate); - return new Date[]{ shiftedDate }; + return dates; } @Override public boolean isSingle() { - return true; + return isSingle; } @Override @@ -94,7 +81,33 @@ public Class getReturnType() { @Override public String toString(@Nullable Event event, boolean debug) { - return "date " + date.toString(event, debug) + " in timezone " + timezone.toString(event, debug); + return "dates " + dates.toString(event, debug) + " in timezone " + timezone.toString(event, debug); + } + + /** + * Shifts a date by the given timezone. Meaning if the system timezone is UTC and you give it a GMT+3 timezone, + * it will add 3 hours to the given date. + * @param date The date to shift + * @param timezone The timezone + * @return A new Date + */ + private Date getShiftedDate(Date date, String timezone) { + ZoneId targetZoneId; + try { + targetZoneId = ZoneId.of(timezone); + } catch (DateTimeException e) { // invalid zone format + error("Invalid timezone."); + return null; + } + + Instant instantDate = date.toInstant(); + ZoneId localZoneId = ZoneId.systemDefault(); + Instant shiftedNow = ZonedDateTime.ofInstant(instantDate, targetZoneId) + .toLocalDateTime() + .atZone(localZoneId) + .toInstant(); + java.util.Date javaDate = java.util.Date.from(shiftedNow); + return Date.fromJavaDate(javaDate); } } From ab77896f88e4735d994a632f00a33e0b5d101b0f Mon Sep 17 00:00:00 2001 From: Eren KARA Date: Sun, 8 Jun 2025 23:28:42 +0300 Subject: [PATCH 16/21] update tests --- .../ch/njol/skript/conditions/CondIsTimezoneValid.java | 2 +- src/test/skript/tests/misc/timezone.sk | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java b/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java index c9b267a3715..523d23b5a18 100644 --- a/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java +++ b/src/main/java/ch/njol/skript/conditions/CondIsTimezoneValid.java @@ -23,7 +23,7 @@ public class CondIsTimezoneValid extends Condition { static { - Skript.registerCondition(CondIsTimezoneValid.class, "%strings% (are|is [an]) [negate:in]valid time[ ]zone[s]"); + Skript.registerCondition(CondIsTimezoneValid.class, "%strings% (are|is [a[n]]) [negate:in]valid time[ ]zone[s]"); } private Expression timezones; diff --git a/src/test/skript/tests/misc/timezone.sk b/src/test/skript/tests/misc/timezone.sk index 2ac60559383..750c6a4f3a7 100644 --- a/src/test/skript/tests/misc/timezone.sk +++ b/src/test/skript/tests/misc/timezone.sk @@ -1,11 +1,13 @@ test "timezone syntaxes": assert size of all timezones > 0 with "timezones aren't set" - assert timezone "Europe/Istanbul" is valid with "single timezone should've been valid" - assert timezones ("Europe/Istanbul", "Asia/Tokyo") are valid with "multiple timezones should've been valid" + assert "Europe/Istanbul" is a valid timezone with "single timezone should've been valid" + assert ("Europe/Istanbul" and "Asia/Tokyo") are valid timezones with "multiple timezones with 'and' should've been valid" + assert ("Europe/Istanbul" or "Asia/Tokyo") are valid timezones with "multiple timezones with 'or' should've been valid" - assert timezone "hello!" is invalid with "single timezone should've been invalid" - assert timezones ("hello!", "Asia/Tokyo") are invalid with "multiple timezones should've been invalid" + assert "hello!" is an invalid timezone with "single timezone should've been invalid" + assert ("hello!" and "Asia/Tokyo") are invalid timezones with "multiple timezones with 'and' should've been invalid" + assert ("hello!" or "Asia/Tokyo") is an invalid timezone with "multiple timezones with 'or' should've been invalid" set {_d} to date(2030, 6, 4, 7, 23) set {_d.in.nyc} to date(2030, 6, 4, 3, 23) From ae175db98116a36568639c9a0b0adc20416be5d5 Mon Sep 17 00:00:00 2001 From: Eren KARA Date: Sun, 8 Jun 2025 23:29:07 +0300 Subject: [PATCH 17/21] grammar --- src/test/skript/tests/misc/timezone.sk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/skript/tests/misc/timezone.sk b/src/test/skript/tests/misc/timezone.sk index 750c6a4f3a7..fe1ae88eebb 100644 --- a/src/test/skript/tests/misc/timezone.sk +++ b/src/test/skript/tests/misc/timezone.sk @@ -3,7 +3,7 @@ test "timezone syntaxes": assert "Europe/Istanbul" is a valid timezone with "single timezone should've been valid" assert ("Europe/Istanbul" and "Asia/Tokyo") are valid timezones with "multiple timezones with 'and' should've been valid" - assert ("Europe/Istanbul" or "Asia/Tokyo") are valid timezones with "multiple timezones with 'or' should've been valid" + assert ("Europe/Istanbul" or "Asia/Tokyo") is a valid timezone with "multiple timezones with 'or' should've been valid" assert "hello!" is an invalid timezone with "single timezone should've been invalid" assert ("hello!" and "Asia/Tokyo") are invalid timezones with "multiple timezones with 'and' should've been invalid" From 4f848e15c21e6bf740a4082413727215d6637ae8 Mon Sep 17 00:00:00 2001 From: Eren KARA Date: Sun, 8 Jun 2025 23:33:17 +0300 Subject: [PATCH 18/21] update test --- src/test/skript/tests/misc/timezone.sk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/skript/tests/misc/timezone.sk b/src/test/skript/tests/misc/timezone.sk index fe1ae88eebb..5fbc37dd1e1 100644 --- a/src/test/skript/tests/misc/timezone.sk +++ b/src/test/skript/tests/misc/timezone.sk @@ -6,7 +6,7 @@ test "timezone syntaxes": assert ("Europe/Istanbul" or "Asia/Tokyo") is a valid timezone with "multiple timezones with 'or' should've been valid" assert "hello!" is an invalid timezone with "single timezone should've been invalid" - assert ("hello!" and "Asia/Tokyo") are invalid timezones with "multiple timezones with 'and' should've been invalid" + assert ("hello!" and "hi!") are invalid timezones with "multiple timezones with 'and' should've been invalid" assert ("hello!" or "Asia/Tokyo") is an invalid timezone with "multiple timezones with 'or' should've been invalid" set {_d} to date(2030, 6, 4, 7, 23) From e3eee4343817f0d4f9078e88684a7a8754d6c6e7 Mon Sep 17 00:00:00 2001 From: Eren KARA Date: Sun, 8 Jun 2025 23:37:17 +0300 Subject: [PATCH 19/21] update description --- src/main/java/ch/njol/skript/expressions/ExprAllTimezones.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ch/njol/skript/expressions/ExprAllTimezones.java b/src/main/java/ch/njol/skript/expressions/ExprAllTimezones.java index dba162af980..174953159f2 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprAllTimezones.java +++ b/src/main/java/ch/njol/skript/expressions/ExprAllTimezones.java @@ -16,7 +16,7 @@ import java.time.ZoneId; @Name("All Timezones") -@Description("Returns a list of all timezones that can be used in the now expression.") +@Description("Returns a list of all timezones that can be used in the date in timezone expression.") @Example("set {_timezones::*} to all timezones") @Since("INSERT VERSION") public class ExprAllTimezones extends SimpleExpression { From a4f28684d335ac6f886e5248afdfce424b1c2266 Mon Sep 17 00:00:00 2001 From: Eren KARA Date: Tue, 17 Jun 2025 13:21:38 +0300 Subject: [PATCH 20/21] simpleliteral --- .../skript/expressions/ExprAllTimezones.java | 23 +++++-------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/src/main/java/ch/njol/skript/expressions/ExprAllTimezones.java b/src/main/java/ch/njol/skript/expressions/ExprAllTimezones.java index 174953159f2..273329cdee5 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprAllTimezones.java +++ b/src/main/java/ch/njol/skript/expressions/ExprAllTimezones.java @@ -8,7 +8,7 @@ import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.ExpressionType; import ch.njol.skript.lang.SkriptParser.ParseResult; -import ch.njol.skript.lang.util.SimpleExpression; +import ch.njol.skript.lang.util.SimpleLiteral; import ch.njol.util.Kleenean; import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; @@ -19,7 +19,7 @@ @Description("Returns a list of all timezones that can be used in the date in timezone expression.") @Example("set {_timezones::*} to all timezones") @Since("INSERT VERSION") -public class ExprAllTimezones extends SimpleExpression { +public class ExprAllTimezones extends SimpleLiteral { static { Skript.registerExpression(ExprAllTimezones.class, String.class, ExpressionType.SIMPLE, "all [of [the]] time[ ]zones"); @@ -27,24 +27,13 @@ public class ExprAllTimezones extends SimpleExpression { private static String[] timezones = ZoneId.getAvailableZoneIds().toArray(new String[0]); - @Override - public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - return true; - } - - @Override - protected String @Nullable [] get(Event event) { - return timezones; + public ExprAllTimezones() { + super(timezones, String.class, true); } @Override - public boolean isSingle() { - return false; - } - - @Override - public Class getReturnType() { - return String.class; + public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + return true; } @Override From 06e9e0c2ac45c9a26d6ac13197719d7163de5110 Mon Sep 17 00:00:00 2001 From: Eren KARA Date: Tue, 17 Jun 2025 13:22:21 +0300 Subject: [PATCH 21/21] remove isSingle --- .../java/ch/njol/skript/expressions/ExprDateInTimezone.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/ch/njol/skript/expressions/ExprDateInTimezone.java b/src/main/java/ch/njol/skript/expressions/ExprDateInTimezone.java index c4ed1a38bc6..e62605a353f 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprDateInTimezone.java +++ b/src/main/java/ch/njol/skript/expressions/ExprDateInTimezone.java @@ -38,15 +38,12 @@ public class ExprDateInTimezone extends SimpleExpression { "[the] [date[s]] %dates% in [the] %string% time[ ]zone"); } - private boolean isSingle; - private Expression dates; private Expression timezone; @Override public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { dates = (Expression) expressions[0]; - isSingle = dates.isSingle(); timezone = (Expression) expressions[1]; return true; } @@ -71,7 +68,7 @@ public boolean init(Expression[] expressions, int matchedPattern, Kleenean is @Override public boolean isSingle() { - return isSingle; + return dates.isSingle(); } @Override