// Path: src/com/vauff/maunzdiscord/objects/Await.java
// public class Await
// {
// 	private Snowflake id;
// 	private AbstractCommand command;
// 	private ChatInputInteractionEvent event;
// 
// 	/**
// 	 * @param id      An ID of a user who triggered the message or a message to be removed later on
// 	 * @param command The command with which to continue execution upon adding a reaction
// 	 * @param event   The ChatInputInteractionEvent that triggered the execution of {@link Await#command}
// 	 */
// 	public Await(Snowflake id, AbstractCommand command, ChatInputInteractionEvent event)
// 	{
// 		this.id = id;
// 		this.command = command;
// 		this.event = event;
// 	}
// 
// 	/**
// 	 * @param id      An ID of a user who triggered the message or a message to be removed later on
// 	 * @param command The command with which to continue execution upon adding a reaction
// 	 */
// 	public Await(Snowflake id, AbstractCommand command)
// 	{
// 		this(id, command, null);
// 	}
// 
// 	/**
// 	 * @return The ID of the user who triggered the message or of the message to be removed later on
// 	 */
// 	public Snowflake getID()
// 	{
// 		return id;
// 	}
// 
// 	/**
// 	 * @return The command with which to continue execution upon adding a reaction
// 	 */
// 	public AbstractCommand getCommand()
// 	{
// 		return command;
// 	}
// 
// 	/**
// 	 * @return The ChatInputInteractionEvent that triggered the execution of {@link Await#command}, only present if instance of {@link AbstractSlashCommand}
// 	 */
// 	public ChatInputInteractionEvent getInteractionEvent()
// 	{
// 		return event;
// 	}
// }
// 
// Path: src/com/vauff/maunzdiscord/objects/CommandHelp.java
// public class CommandHelp
// {
// 	private String arguments;
// 	private String description;
// 
// 	/**
// 	 * @param arguments   Arguments available for this command
// 	 * @param description Description of what this command does
// 	 */
// 	public CommandHelp(String arguments, String description)
// 	{
// 		this.arguments = arguments;
// 		this.description = description;
// 	}
// 
// 	/**
// 	 * @return The arguments available for this command
// 	 */
// 	public String getArguments()
// 	{
// 		return arguments;
// 	}
// 
// 	/**
// 	 * @return The description of what this command does
// 	 */
// 	public String getDescription()
// 	{
// 		return description;
// 	}
// 
// 	/**
// 	 * @param arguments The arguments available for this command
// 	 */
// 	public void setArguments(String arguments)
// 	{
// 		this.arguments = arguments;
// 	}
// }


import com.vauff.maunzdiscord.objects.Await;
import com.vauff.maunzdiscord.objects.CommandHelp;
import discord4j.common.util.Snowflake;
import discord4j.core.event.domain.interaction.ChatInputInteractionEvent;
import discord4j.core.event.domain.message.ReactionAddEvent;
import discord4j.core.object.command.ApplicationCommandOption;
import discord4j.core.object.entity.Guild;
import discord4j.core.object.entity.Message;
import discord4j.core.object.entity.User;
import discord4j.core.object.entity.channel.MessageChannel;
import discord4j.discordjson.json.ApplicationCommandOptionData;
import discord4j.discordjson.json.ApplicationCommandRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
package com.vauff.maunzdiscord.commands.templates;



public abstract class AbstractSlashCommand<M extends ChatInputInteractionEvent> extends AbstractCommand
{
	/**
	 * Executes this command
	 *
	 * @param interaction The interaction that executing this command creates
	 * @throws Exception If an exception gets thrown by any implementing methods
	 */
	public abstract void exe(M interaction, Guild guild, MessageChannel channel, User author) throws Exception;

	/**
	 * Gets called when a reaction is added to a message defined prior in {@link AbstractSlashCommand#waitForReaction(Snowflake, Snowflake, ChatInputInteractionEvent)}
	 *
	 * @param reactionEvent    The event holding information about the added reaction
	 * @param interactionEvent The interaction event that triggered this
	 * @param message          The Message that was reacted to
	 */
	public void onReactionAdd(ReactionAddEvent reactionEvent, ChatInputInteractionEvent interactionEvent, Message message) throws Exception
	{
	}

	/**
	 * Returns the ApplicationCommandRequest object for this command
	 */
	public abstract ApplicationCommandRequest getCommand();

	/**
	 * Defines the name used to trigger the command.
	 *
	 * @return A string containing the name of the command
	 */
	public abstract String getName();

	/**
	 * Sets up this command to await a reaction by the user who triggered this command
	 *
	 * @param messageID The message which should get reacted on
	 * @param userID    The user who triggered this command
	 */
	public final void waitForReaction(Snowflake messageID, Snowflake userID, ChatInputInteractionEvent event)
	{
// Path: src/com/vauff/maunzdiscord/objects/Await.java
// public class Await
// {
// 	private Snowflake id;
// 	private AbstractCommand command;
// 	private ChatInputInteractionEvent event;
// 
// 	/**
// 	 * @param id      An ID of a user who triggered the message or a message to be removed later on
// 	 * @param command The command with which to continue execution upon adding a reaction
// 	 * @param event   The ChatInputInteractionEvent that triggered the execution of {@link Await#command}
// 	 */
// 	public Await(Snowflake id, AbstractCommand command, ChatInputInteractionEvent event)
// 	{
// 		this.id = id;
// 		this.command = command;
// 		this.event = event;
// 	}
// 
// 	/**
// 	 * @param id      An ID of a user who triggered the message or a message to be removed later on
// 	 * @param command The command with which to continue execution upon adding a reaction
// 	 */
// 	public Await(Snowflake id, AbstractCommand command)
// 	{
// 		this(id, command, null);
// 	}
// 
// 	/**
// 	 * @return The ID of the user who triggered the message or of the message to be removed later on
// 	 */
// 	public Snowflake getID()
// 	{
// 		return id;
// 	}
// 
// 	/**
// 	 * @return The command with which to continue execution upon adding a reaction
// 	 */
// 	public AbstractCommand getCommand()
// 	{
// 		return command;
// 	}
// 
// 	/**
// 	 * @return The ChatInputInteractionEvent that triggered the execution of {@link Await#command}, only present if instance of {@link AbstractSlashCommand}
// 	 */
// 	public ChatInputInteractionEvent getInteractionEvent()
// 	{
// 		return event;
// 	}
// }
// 
// Path: src/com/vauff/maunzdiscord/objects/CommandHelp.java
// public class CommandHelp
// {
// 	private String arguments;
// 	private String description;
// 
// 	/**
// 	 * @param arguments   Arguments available for this command
// 	 * @param description Description of what this command does
// 	 */
// 	public CommandHelp(String arguments, String description)
// 	{
// 		this.arguments = arguments;
// 		this.description = description;
// 	}
// 
// 	/**
// 	 * @return The arguments available for this command
// 	 */
// 	public String getArguments()
// 	{
// 		return arguments;
// 	}
// 
// 	/**
// 	 * @return The description of what this command does
// 	 */
// 	public String getDescription()
// 	{
// 		return description;
// 	}
// 
// 	/**
// 	 * @param arguments The arguments available for this command
// 	 */
// 	public void setArguments(String arguments)
// 	{
// 		this.arguments = arguments;
// 	}
// }


// Path: src/com/vauff/maunzdiscord/commands/templates/AbstractSlashCommand.java
import com.vauff.maunzdiscord.objects.Await;
import com.vauff.maunzdiscord.objects.CommandHelp;
import discord4j.common.util.Snowflake;
import discord4j.core.event.domain.interaction.ChatInputInteractionEvent;
import discord4j.core.event.domain.message.ReactionAddEvent;
import discord4j.core.object.command.ApplicationCommandOption;
import discord4j.core.object.entity.Guild;
import discord4j.core.object.entity.Message;
import discord4j.core.object.entity.User;
import discord4j.core.object.entity.channel.MessageChannel;
import discord4j.discordjson.json.ApplicationCommandOptionData;
import discord4j.discordjson.json.ApplicationCommandRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

package com.vauff.maunzdiscord.commands.templates;



public abstract class AbstractSlashCommand<M extends ChatInputInteractionEvent> extends AbstractCommand
{
	/**
	 * Executes this command
	 *
	 * @param interaction The interaction that executing this command creates
	 * @throws Exception If an exception gets thrown by any implementing methods
	 */
	public abstract void exe(M interaction, Guild guild, MessageChannel channel, User author) throws Exception;

	/**
	 * Gets called when a reaction is added to a message defined prior in {@link AbstractSlashCommand#waitForReaction(Snowflake, Snowflake, ChatInputInteractionEvent)}
	 *
	 * @param reactionEvent    The event holding information about the added reaction
	 * @param interactionEvent The interaction event that triggered this
	 * @param message          The Message that was reacted to
	 */
	public void onReactionAdd(ReactionAddEvent reactionEvent, ChatInputInteractionEvent interactionEvent, Message message) throws Exception
	{
	}

	/**
	 * Returns the ApplicationCommandRequest object for this command
	 */
	public abstract ApplicationCommandRequest getCommand();

	/**
	 * Defines the name used to trigger the command.
	 *
	 * @return A string containing the name of the command
	 */
	public abstract String getName();

	/**
	 * Sets up this command to await a reaction by the user who triggered this command
	 *
	 * @param messageID The message which should get reacted on
	 * @param userID    The user who triggered this command
	 */
	public final void waitForReaction(Snowflake messageID, Snowflake userID, ChatInputInteractionEvent event)
	{
		AWAITED.put(messageID, new Await(userID, this, event));