Skip to content

Commit

Permalink
broad cleanup of commands
Browse files Browse the repository at this point in the history
  • Loading branch information
mcmonkey4eva committed Jan 19, 2023
1 parent 4097373 commit 99ef608
Show file tree
Hide file tree
Showing 14 changed files with 655 additions and 815 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public class DenizenDiscordBot extends JavaPlugin {
public static Warning oldStopTyping = new FutureWarning("oldStopTyping", "dDiscordBot's 'discord stop_typing' sub-command is deprecated as it does nothing.");
public static Warning oldDeleteMessage = new FutureWarning("oldDeleteMessage", "dDiscordBot's 'discord delete_message' sub-command is deprecated in favor of 'adjust <[message]> delete'.");
public static Warning oldEditMessage = new SlowWarning("oldEditMessage", "dDiscordBot's 'discord edit_message' sub-command has been moved to the 'discordmessage' command.");
public static Warning oldTokenFile = new FutureWarning("oldTokenFile", "dDiscordBot used to recommend 'tokenfile' for 'discordconnect', however it is now recommended that you use a SecretTag and the 'secrets.secret' file for the token.");
public static Warning oldTokenFile = new SlowWarning("oldTokenFile", "dDiscordBot used to recommend 'tokenfile' for 'discordconnect', however it is now recommended that you use a SecretTag and the 'secrets.secret' file for the token.");
public static Warning oldCommandPermissions = new StrongWarning("oldCommandPermissions", "dDiscordBot's 'discordcommand' command's 'enabled', 'enable_for', 'disable_for' arguments and its 'perms' instruction no longer function due to API changes; use the 'Integrations' panel in your server settings instead.");

public static DenizenDiscordBot instance;
Expand Down
107 changes: 107 additions & 0 deletions src/main/java/com/denizenscript/ddiscordbot/DiscordCommandUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
package com.denizenscript.ddiscordbot;

import com.denizenscript.ddiscordbot.objects.*;
import com.denizenscript.denizencore.exceptions.InvalidArgumentsRuntimeException;
import com.denizenscript.denizencore.scripts.ScriptEntry;
import com.denizenscript.denizencore.utilities.debugging.Debug;
import net.dv8tion.jda.api.requests.RestAction;

import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;

public class DiscordCommandUtils {

public static DiscordBotTag inferBot(Object... options) {
for (Object obj : options) {
DiscordBotTag result = inferBotInternal(obj);
if (result != null) {
return result;
}
}
throw new InvalidArgumentsRuntimeException("Unknown bot to use! Must specify 'id:' argument!");
}

public static DiscordBotTag inferBotInternal(Object obj) {
if (obj instanceof DiscordBotTag botTag) {
return botTag;
}
else if (obj instanceof DiscordUserTag user && user.bot != null) {
return new DiscordBotTag(user.bot);
}
else if (obj instanceof DiscordRoleTag role && role.bot != null) {
return new DiscordBotTag(role.bot);
}
else if (obj instanceof DiscordGroupTag group && group.bot != null) {
return new DiscordBotTag(group.bot);
}
else if (obj instanceof DiscordChannelTag channel && channel.bot != null) {
return new DiscordBotTag(channel.bot);
}
else if (obj instanceof List list) {
for (Object subObj : list) {
DiscordBotTag val = inferBotInternal(subObj);
if (val != null) {
return val;
}
}
}
return null;
}

public static void cleanWait(ScriptEntry scriptEntry, ActionOrValue<?> action) {
action.onErrorFlatMap(t -> {
Debug.echoError(scriptEntry, t);
scriptEntry.setFinished(true);
return null;
}).onSuccess((t) -> scriptEntry.setFinished(true)).queue();
}

public static void cleanWait(ScriptEntry scriptEntry, RestAction<?> action) {
if (action == null) {
scriptEntry.setFinished(true);
return;
}
cleanWait(scriptEntry, new ActionOrValue<>(action));
}

public static class ActionOrValue<T> {
public T raw;
public RestAction<T> action;
public ActionOrValue(T raw) {
this.raw = raw;
}
public ActionOrValue(RestAction<T> action) {
this.action = action;
}
public ActionOrValue<T> onErrorFlatMap(Function<Throwable, RestAction<T>> function) {
if (action != null) {
return new ActionOrValue<T>(action.onErrorFlatMap(function));
}
if (raw == null) {
return new ActionOrValue<T>(function.apply(null));
}
return this;
}
public <O> ActionOrValue<O> flatMap(Function<T, RestAction<O>> function) {
if (raw != null) {
return new ActionOrValue<>(function.apply(raw));
}
else {
return new ActionOrValue<>(action.flatMap(function));
}
}
public ActionOrValue<T> onSuccess(Consumer<T> success) {
if (action != null) {
return new ActionOrValue<>(action.onSuccess(success));
}
success.accept(raw);
return this;
}
public void queue() {
if (action != null) {
action.queue();
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.denizenscript.ddiscordbot.commands;

import com.denizenscript.ddiscordbot.DenizenDiscordBot;
import com.denizenscript.ddiscordbot.DiscordCommandUtils;
import com.denizenscript.ddiscordbot.objects.DiscordBotTag;
import com.denizenscript.ddiscordbot.objects.DiscordGroupTag;
import com.denizenscript.ddiscordbot.objects.DiscordUserTag;
Expand All @@ -9,28 +9,25 @@
import com.denizenscript.denizencore.scripts.commands.AbstractCommand;
import com.denizenscript.denizencore.scripts.commands.Holdable;
import com.denizenscript.denizencore.scripts.commands.generator.*;
import com.denizenscript.denizencore.utilities.debugging.Debug;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.UserSnowflake;
import net.dv8tion.jda.api.requests.restaction.AuditableRestAction;
import org.bukkit.Bukkit;

import java.util.concurrent.TimeUnit;

public class DiscordBanCommand extends AbstractCommand implements Holdable {

public DiscordBanCommand() {
setName("discordban");
setSyntax("discordban [id:<id>] ({add}/remove) [user:<user>] [group:<group>] (reason:<reason>) (deletion_timeframe:<time>/{0s})");
setRequiredArguments(3, 6);
setSyntax("discordban (id:<bot>) ({add}/remove) [user:<user>] [group:<group>] (reason:<reason>) (deletion_timeframe:<time>/{0s})");
setRequiredArguments(2, 6);
isProcedural = false;
autoCompile();
}

// <--[command]
// @Name discordban
// @Syntax discordban [id:<id>] ({add}/remove) [user:<user>] [group:<group>] (reason:<reason>) (deletion_timeframe:<time>/{0s})
// @Required 3
// @Syntax discordban (id:<bot>) ({add}/remove) [user:<user>] [group:<group>] (reason:<reason>) (deletion_timeframe:<time>/{0s})
// @Required 2
// @Maximum 6
// @Short Bans or unbans a member from a group.
// @Plugin dDiscordBot
Expand Down Expand Up @@ -70,37 +67,26 @@ public DiscordBanCommand() {
public enum DiscordBanInstruction { ADD, REMOVE }

public static void autoExecute(ScriptEntry scriptEntry,
@ArgPrefixed @ArgName("id") DiscordBotTag bot,
@ArgPrefixed @ArgName("id") @ArgDefaultNull DiscordBotTag bot,
@ArgName("instruction") @ArgDefaultText("add") DiscordBanInstruction instruction,
@ArgPrefixed @ArgName("user") DiscordUserTag user,
@ArgPrefixed @ArgName("group") DiscordGroupTag group,
@ArgPrefixed @ArgDefaultNull @ArgName("reason") String reason,
@ArgPrefixed @ArgDefaultText("0s") @ArgName("deletion_timeframe") DurationTag deletionTimeframe) {
bot = DiscordCommandUtils.inferBot(bot, group, user);
if (group.bot == null) {
group = new DiscordGroupTag(bot.bot, group.guild_id);
}
Guild guild = group.getGuild();
UserSnowflake userObj = UserSnowflake.fromId(user.user_id);
Runnable runnable = () -> {
try {
switch (instruction) {
case ADD -> {
AuditableRestAction<Void> banAction = guild.ban(userObj, deletionTimeframe.getSecondsAsInt(), TimeUnit.SECONDS);
if (reason != null) {
banAction.reason(reason);
}
banAction.queue();
}
case REMOVE -> guild.unban(userObj).queue();
DiscordCommandUtils.cleanWait(scriptEntry, switch (instruction) {
case ADD -> {
AuditableRestAction<Void> banAction = group.getGuild().ban(userObj, deletionTimeframe.getSecondsAsInt(), TimeUnit.SECONDS);
if (reason != null) {
banAction = banAction.reason(reason);
}
yield banAction;
}
catch (Exception ex) {
Debug.echoError(scriptEntry, ex);
}
};
Bukkit.getScheduler().runTaskAsynchronously(DenizenDiscordBot.instance, () -> {
runnable.run();
scriptEntry.setFinished(true);
case REMOVE -> group.getGuild().unban(userObj);
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.denizenscript.ddiscordbot.objects.*;
import com.denizenscript.denizen.Denizen;
import com.denizenscript.denizen.utilities.Utilities;
import com.denizenscript.denizencore.DenizenCore;
import com.denizenscript.denizencore.scripts.commands.AbstractCommand;
import com.denizenscript.denizencore.scripts.commands.generator.*;
import com.denizenscript.denizencore.utilities.CoreConfiguration;
Expand Down Expand Up @@ -189,11 +190,8 @@ public static void autoExecute(ScriptEntry scriptEntry,
DiscordConnection dc = new DiscordConnection();
dc.botID = id;
DenizenDiscordBot.instance.connections.put(id, dc);
DiscordConnectCommand.DiscordConnectThread dct = new DiscordConnectCommand.DiscordConnectThread();
dct.code = codeRaw;
dct.conn = dc;
dct.ender = () -> scriptEntry.setFinished(true);
dct.start();
final String finalCode = codeRaw;
DenizenCore.runAsync(() -> DiscordConnectCommand.runConnect(finalCode, dc, scriptEntry, DiscordConnectCommand.defaultIntents));
break;
}
case DISCONNECT: {
Expand Down
Loading

0 comments on commit 99ef608

Please sign in to comment.