From c58f9e0db1f76c416fae6b7eac94f9e75c8a1618 Mon Sep 17 00:00:00 2001 From: Sky Date: Fri, 17 May 2024 18:35:44 +0200 Subject: [PATCH] :zap: Made get member, sticker, user & user in guild expression async --- .../getters/BaseGetterExpression.java | 19 ++++++++++++--- .../disky/elements/getters/GetMember.java | 1 - .../disky/elements/getters/GetSticker.java | 24 ++++++++++++++++++- .../disky/elements/getters/GetUser.java | 7 ++++++ .../elements/getters/GetUserInGuild.java | 20 ++++++++++++---- 5 files changed, 61 insertions(+), 10 deletions(-) diff --git a/src/main/java/info/itsthesky/disky/elements/getters/BaseGetterExpression.java b/src/main/java/info/itsthesky/disky/elements/getters/BaseGetterExpression.java index fe420d75..58fc566a 100644 --- a/src/main/java/info/itsthesky/disky/elements/getters/BaseGetterExpression.java +++ b/src/main/java/info/itsthesky/disky/elements/getters/BaseGetterExpression.java @@ -9,12 +9,13 @@ import info.itsthesky.disky.DiSky; import info.itsthesky.disky.api.skript.EasyElement; import info.itsthesky.disky.core.Bot; +import info.itsthesky.disky.elements.changers.IAsyncGettableExpression; import org.bukkit.event.Event; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @SuppressWarnings({"unchecked"}) -public abstract class BaseGetterExpression extends SimpleExpression { +public abstract class BaseGetterExpression extends SimpleExpression implements IAsyncGettableExpression { protected static void register(Class clazz, Class type, @@ -33,10 +34,13 @@ protected static void register(Class clazz, codeName + " (with|from) [the] "+property+" %string% "+ (allowBot ? "[(with|using) [the] [bot] [(named|with name)] %-bot%]" : "")); } - private Expression exprId; - private Expression exprBot; + protected Expression exprId; + protected Expression exprBot; protected abstract T get(String id, Bot bot); + protected T getAsync(String id, Bot bot) { + return get(id, bot); + }; @Override public boolean init(Expression @NotNull [] exprs, int matchedPattern, @NotNull Kleenean isDelayed, @NotNull SkriptParser.ParseResult parseResult) { @@ -72,4 +76,13 @@ protected boolean allowBot() { exprBot != null ? "using the bot " + exprBot.toString(e, debug) : "" ); } + + @Override + public T[] getAsync(Event e) { + final String id = exprId.getSingle(e); + final Bot bot = EasyElement.parseSingle(exprBot, e, DiSky.getManager().findAny()); + if (EasyElement.anyNull(this, id, bot)) + return (T[]) new Object[0]; + return (T[]) new Object[] {getAsync(id, bot)}; + } } diff --git a/src/main/java/info/itsthesky/disky/elements/getters/GetMember.java b/src/main/java/info/itsthesky/disky/elements/getters/GetMember.java index daed7e60..bd0b4c51 100644 --- a/src/main/java/info/itsthesky/disky/elements/getters/GetMember.java +++ b/src/main/java/info/itsthesky/disky/elements/getters/GetMember.java @@ -71,7 +71,6 @@ public boolean isSingle() { @Override public Member[] getAsync(Event e) { - DiSky.debug("Getting member async"); final String id = exprId.getSingle(e); final Guild guild = exprGuild.getSingle(e); if (EasyElement.anyNull(this, id, guild)) diff --git a/src/main/java/info/itsthesky/disky/elements/getters/GetSticker.java b/src/main/java/info/itsthesky/disky/elements/getters/GetSticker.java index 3177daf6..9815d0bf 100644 --- a/src/main/java/info/itsthesky/disky/elements/getters/GetSticker.java +++ b/src/main/java/info/itsthesky/disky/elements/getters/GetSticker.java @@ -10,20 +10,25 @@ import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.util.Kleenean; import info.itsthesky.disky.api.skript.EasyElement; +import info.itsthesky.disky.elements.changers.IAsyncGettableExpression; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.sticker.GuildSticker; import net.dv8tion.jda.api.entities.sticker.Sticker; import org.bukkit.event.Event; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; +import java.util.stream.Collectors; + @Name("Get Sticker") @Description({"Get a cached sticker from its per-guild name", "This expression is here to get a sticker from its name.", "If you success to get a sticker's ID, use the retrieve sticker effect instead!", "This expression cannot be changed"}) @Examples({"sticker with named \"meliodas\" from event-guild"}) -public class GetSticker extends SimpleExpression { +public class GetSticker extends SimpleExpression implements IAsyncGettableExpression { static { Skript.registerExpression( @@ -67,4 +72,21 @@ public boolean isSingle() { public @NotNull String toString(@Nullable Event e, boolean debug) { return "sticker with name " + exprId.toString(e, debug) +" in " + exprGuild.toString(e, debug); } + + @Override + public Sticker[] getAsync(Event e) { + final String id = exprId.getSingle(e); + final Guild guild = exprGuild.getSingle(e); + if (EasyElement.anyNull(this, id, guild)) + return new Sticker[0]; + + final Sticker found = guild.getStickersByName(id, false).stream().findFirst().orElse(null); + if (found != null) + return new Sticker[] {found}; + + final List retrieveFound = guild.retrieveStickers().complete() + .stream().filter(sticker -> sticker.getName().equalsIgnoreCase(id)).collect(Collectors.toList()); + + return retrieveFound.isEmpty() ? new Sticker[0] : new Sticker[] {retrieveFound.get(0)}; + } } diff --git a/src/main/java/info/itsthesky/disky/elements/getters/GetUser.java b/src/main/java/info/itsthesky/disky/elements/getters/GetUser.java index abbceeeb..932a54cd 100644 --- a/src/main/java/info/itsthesky/disky/elements/getters/GetUser.java +++ b/src/main/java/info/itsthesky/disky/elements/getters/GetUser.java @@ -1,8 +1,10 @@ package info.itsthesky.disky.elements.getters; import info.itsthesky.disky.core.Bot; +import info.itsthesky.disky.elements.changers.IAsyncGettableExpression; import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; import net.dv8tion.jda.api.entities.User; +import org.bukkit.event.Event; import org.jetbrains.annotations.NotNull; public class GetUser extends BaseGetterExpression { @@ -27,4 +29,9 @@ public String getCodeName() { public @NotNull Class getReturnType() { return User.class; } + + @Override + protected User getAsync(String id, Bot bot) { + return bot.getInstance().retrieveUserById(id).complete(); + } } diff --git a/src/main/java/info/itsthesky/disky/elements/getters/GetUserInGuild.java b/src/main/java/info/itsthesky/disky/elements/getters/GetUserInGuild.java index c5f61b92..f9f3dbab 100644 --- a/src/main/java/info/itsthesky/disky/elements/getters/GetUserInGuild.java +++ b/src/main/java/info/itsthesky/disky/elements/getters/GetUserInGuild.java @@ -9,6 +9,7 @@ import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.util.Kleenean; import info.itsthesky.disky.api.skript.EasyElement; +import info.itsthesky.disky.elements.changers.IAsyncGettableExpression; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.User; @@ -21,7 +22,7 @@ "Users are common to whole Discord, two user cannot have the same instance.", "Members are common to guilds, but also holding an user as reference.", "User can have multiple instance according to which guild they are in, therefore they are considered as member."}) -public class GetUserInGuild extends SimpleExpression { +public class GetUserInGuild extends SimpleExpression implements IAsyncGettableExpression { static { Skript.registerExpression(GetUserInGuild.class, @@ -30,6 +31,13 @@ public class GetUserInGuild extends SimpleExpression { "%user% in [the] [guild] %guild%"); } + @Override + public boolean init(Expression @NotNull [] exprs, int matchedPattern, @NotNull Kleenean isDelayed, @NotNull SkriptParser.ParseResult parseResult) { + exprUser = (Expression) exprs[0]; + exprGuild = (Expression) exprs[1]; + return true; + } + private Expression exprUser; private Expression exprGuild; @@ -58,9 +66,11 @@ public boolean isSingle() { } @Override - public boolean init(Expression @NotNull [] exprs, int matchedPattern, @NotNull Kleenean isDelayed, @NotNull SkriptParser.ParseResult parseResult) { - exprUser = (Expression) exprs[0]; - exprGuild = (Expression) exprs[1]; - return true; + public Member[] getAsync(Event e) { + final User user = EasyElement.parseSingle(exprUser, e, null); + final Guild guild = EasyElement.parseSingle(exprGuild, e, null); + if (EasyElement.anyNull(this, user, guild)) + return new Member[0]; + return new Member[] {guild.retrieveMember(user).complete()}; } }