Class CommandClientImpl
- All Implemented Interfaces:
CommandClient
,net.dv8tion.jda.api.hooks.EventListener
CommandClient
to be used by a bot.
This is a listener usable with JDA
, as it implements
EventListener
in order to catch and use different kinds of
Event
s. The primary usage of this is where the CommandClient implementation
takes MessageReceivedEvent
s, and automatically
processes arguments, and provide them to a Command
for
running and execution.
- Author:
- John Grosh (jagrosh)
-
Constructor Summary
ConstructorDescriptionCommandClientImpl
(String ownerId, String[] coOwnerIds, String prefix, String altprefix, String[] prefixes, Function<net.dv8tion.jda.api.events.message.MessageReceivedEvent, String> prefixFunction, Function<net.dv8tion.jda.api.events.message.MessageReceivedEvent, Boolean> commandPreProcessFunction, BiFunction<net.dv8tion.jda.api.events.message.MessageReceivedEvent, Command, Boolean> commandPreProcessBiFunction, net.dv8tion.jda.api.entities.Activity activity, net.dv8tion.jda.api.OnlineStatus status, String serverInvite, String success, String warning, String error, String carbonKey, String botsKey, ArrayList<Command> commands, ArrayList<SlashCommand> slashCommands, ArrayList<ContextMenu> contextMenus, String forcedGuildId, boolean manualUpsert, boolean useHelp, boolean shutdownAutomatically, Consumer<CommandEvent> helpConsumer, String helpWord, ScheduledExecutorService executor, int linkedCacheSize, AnnotatedModuleCompiler compiler, GuildSettingsManager manager) -
Method Summary
Modifier and TypeMethodDescriptionvoid
addAnnotatedModule
(Object module) Compiles the providedObject
annotated withJDACommand.Module
into aList
ofCommand
s and adds them to this CommandClient in the order they are listed.void
addAnnotatedModule
(Object module, Function<Command, Integer> mapFunction) Compiles the providedObject
annotated withJDACommand.Module
into aList
ofCommand
s and adds them to this CommandClient via theFunction
provided.void
addCommand
(Command command) Adds a singleCommand
to this CommandClient's registered Commands.void
addCommand
(Command command, int index) Adds a singleCommand
to this CommandClient's registered Commands at the specified index.void
addContextMenu
(ContextMenu menu) Adds a singleContextMenu
to this CommandClient's registered Context Menus.void
addContextMenu
(ContextMenu menu, int index) Adds a singleContextMenu
to this CommandClient's registered Context Menus.void
addSlashCommand
(SlashCommand command) Adds a singleSlashCommand
to this CommandClient's registered SlashCommand.void
addSlashCommand
(SlashCommand command, int index) Adds a singleSlashCommand
to this CommandClient's registered Commands at the specified index.void
applyCooldown
(String name, int seconds) Applies the specified cooldown with the provided name.void
Cleans up expired cooldowns to reduce memory.Returns the forced Guild ID for automatic slash command upsertsGets the Client's alternate prefix.Returns the list of registeredCommand
s during this session.int
getCommandUses
(Command command) Gets the number of uses for the provideCommand
during this session, or0
if the command is not registered to this CommandClient.int
getCommandUses
(String name) Gets the number of uses for aCommand
during this session matching the provided String name, or0
if there is no Command with the name.Returns the list of registeredContextMenu
s during this session.getCooldown
(String name) Gets theOffsetDateTime
that the specified cooldown expires.String[]
Gets the ID(s) of any CoOwners of this bot as a String Array.long[]
Gets the ID(s) of any CoOwners of this bot as along
Array.getError()
Gets the error emoji.Gets the word used to invoke a help DM.Returns the currentCommandListener
.Gets the ID of the owner of this bot as a String.long
Gets the ID of the owner of this bot as along
.Gets the Client's prefix.String[]
Gets the array of prefixesGets the prefix BiConsumerint
getRemainingCooldown
(String name) Gets the remaining number of seconds on the specified cooldown.Gets theScheduledExecutorService
held by this client.Gets the invite to the bot's support server.<S> S
getSettingsFor
(net.dv8tion.jda.api.entities.Guild guild) Returns an Object of the type parameter that should contain settings relating to the specifiedGuild
.<M extends GuildSettingsManager>
MReturns the type ofGuildSettingsManager
, the same type of one provided when building this CommandClient, ornull
if one was not provided there.Returns the list of registeredSlashCommand
s during this session.Gets the time thisCommandClient
implementation was created.Gets the success emoji.Returns the visual representation of the bot's prefix.int
Gets an a recently updated count of all theGuild
s the bot is connected to on all shards.Gets the warning emoji.boolean
Returns whether manual upsertion is enabledvoid
linkIds
(long callId, net.dv8tion.jda.api.entities.Message message) DO NOT USE THIS!void
onEvent
(net.dv8tion.jda.api.events.GenericEvent event) void
removeCommand
(String name) Removes a singleCommand
from this CommandClient's registered Commands at the index linked to the provided name/alias.void
setListener
(CommandListener listener) Sets theCommandListener
to catch command-related events thrown by thisCommandClient
.void
shutdown()
Shuts down internals of the Command Client, such as the threadpool and guild settings managervoid
upsertInteractions
(net.dv8tion.jda.api.JDA jda) Upserts all interactions to the providedforced server
.void
upsertInteractions
(net.dv8tion.jda.api.JDA jda, String serverId) Upserts all interactions to the provided server.boolean
Gets whether this CommandClient uses linked deletion.
-
Constructor Details
-
CommandClientImpl
public CommandClientImpl(String ownerId, String[] coOwnerIds, String prefix, String altprefix, String[] prefixes, Function<net.dv8tion.jda.api.events.message.MessageReceivedEvent, String> prefixFunction, Function<net.dv8tion.jda.api.events.message.MessageReceivedEvent, Boolean> commandPreProcessFunction, BiFunction<net.dv8tion.jda.api.events.message.MessageReceivedEvent, Command, Boolean> commandPreProcessBiFunction, net.dv8tion.jda.api.entities.Activity activity, net.dv8tion.jda.api.OnlineStatus status, String serverInvite, String success, String warning, String error, String carbonKey, String botsKey, ArrayList<Command> commands, ArrayList<SlashCommand> slashCommands, ArrayList<ContextMenu> contextMenus, String forcedGuildId, boolean manualUpsert, boolean useHelp, boolean shutdownAutomatically, Consumer<CommandEvent> helpConsumer, String helpWord, ScheduledExecutorService executor, int linkedCacheSize, AnnotatedModuleCompiler compiler, GuildSettingsManager manager)
-
-
Method Details
-
setListener
Description copied from interface:CommandClient
Sets theCommandListener
to catch command-related events thrown by thisCommandClient
.- Specified by:
setListener
in interfaceCommandClient
- Parameters:
listener
- The CommandListener
-
getListener
Description copied from interface:CommandClient
Returns the currentCommandListener
.- Specified by:
getListener
in interfaceCommandClient
- Returns:
- A possibly-null CommandListener
-
getCommands
Description copied from interface:CommandClient
Returns the list of registeredCommand
s during this session.- Specified by:
getCommands
in interfaceCommandClient
- Returns:
- A never-null List of Commands registered during this session
-
getSlashCommands
Description copied from interface:CommandClient
Returns the list of registeredSlashCommand
s during this session.- Specified by:
getSlashCommands
in interfaceCommandClient
- Returns:
- A never-null List of Slash Commands registered during this session
-
getContextMenus
Description copied from interface:CommandClient
Returns the list of registeredContextMenu
s during this session.- Specified by:
getContextMenus
in interfaceCommandClient
- Returns:
- A never-null List of Context Menus registered during this session
-
isManualUpsert
public boolean isManualUpsert()Description copied from interface:CommandClient
Returns whether manual upsertion is enabled- Specified by:
isManualUpsert
in interfaceCommandClient
- Returns:
- The manual upsertion status
-
forcedGuildId
Description copied from interface:CommandClient
Returns the forced Guild ID for automatic slash command upserts- Specified by:
forcedGuildId
in interfaceCommandClient
- Returns:
- A possibly-null forcedGuildId set in the builder
-
getStartTime
Description copied from interface:CommandClient
Gets the time thisCommandClient
implementation was created.- Specified by:
getStartTime
in interfaceCommandClient
- Returns:
- The start time of this CommandClient implementation
-
getCooldown
Description copied from interface:CommandClient
Gets theOffsetDateTime
that the specified cooldown expires.- Specified by:
getCooldown
in interfaceCommandClient
- Parameters:
name
- The cooldown name- Returns:
- The expiration time, or null if the cooldown does not exist
-
getRemainingCooldown
Description copied from interface:CommandClient
Gets the remaining number of seconds on the specified cooldown.- Specified by:
getRemainingCooldown
in interfaceCommandClient
- Parameters:
name
- The cooldown name- Returns:
- The number of seconds remaining
-
applyCooldown
Description copied from interface:CommandClient
Applies the specified cooldown with the provided name.- Specified by:
applyCooldown
in interfaceCommandClient
- Parameters:
name
- The cooldown nameseconds
- The time to make the cooldown last
-
cleanCooldowns
public void cleanCooldowns()Description copied from interface:CommandClient
Cleans up expired cooldowns to reduce memory.- Specified by:
cleanCooldowns
in interfaceCommandClient
-
getCommandUses
Description copied from interface:CommandClient
Gets the number of uses for the provideCommand
during this session, or0
if the command is not registered to this CommandClient.- Specified by:
getCommandUses
in interfaceCommandClient
- Parameters:
command
- The Command- Returns:
- The number of uses for the Command
-
getCommandUses
Description copied from interface:CommandClient
Gets the number of uses for aCommand
during this session matching the provided String name, or0
if there is no Command with the name.NOTE: this method WILL NOT get uses for a command if an
alias
is provided! Also note thatchild commands
ARE NOT tracked and providing names or effective names of child commands will return0
.- Specified by:
getCommandUses
in interfaceCommandClient
- Parameters:
name
- The name of the Command- Returns:
- The number of uses for the Command, or
0
if the name does not match with a Command
-
addCommand
Description copied from interface:CommandClient
Adds a singleCommand
to this CommandClient's registered Commands.For CommandClient's containing 20 commands or less, command calls by users will have the bot iterate through the entire
ArrayList
to find the command called. As expected, this can get fairly hefty if a bot has a lot of Commands registered to it.To prevent delay a CommandClient that has more that 20 Commands registered to it will begin to use indexed calls.
Indexed calls use aHashMap
which links theirname
and theiraliases
to the index that which they are located at in the ArrayList they are stored.This means that all insertion and removal of Commands must reorganize the index maintained by the HashMap.
For this particular insertion, the Command provided is inserted at the end of the index, meaning it will become the "rightmost" Command in the ArrayList.- Specified by:
addCommand
in interfaceCommandClient
- Parameters:
command
- The Command to add
-
addCommand
Description copied from interface:CommandClient
Adds a singleCommand
to this CommandClient's registered Commands at the specified index.For CommandClient's containing 20 commands or less, command calls by users will have the bot iterate through the entire
ArrayList
to find the command called. As expected, this can get fairly hefty if a bot has a lot of Commands registered to it.To prevent delay a CommandClient that has more that 20 Commands registered to it will begin to use indexed calls.
Indexed calls use aHashMap
which links theirname
and theiraliases
to the index that which they are located at in the ArrayList they are stored.This means that all insertion and removal of Commands must reorganize the index maintained by the HashMap.
For this particular insertion, the Command provided is inserted at the index specified, meaning it will become the Command located at that index in the ArrayList. This will shift the Command previously located at that index as well as any located at greater indices, right one index (size()+1
).- Specified by:
addCommand
in interfaceCommandClient
- Parameters:
command
- The Command to addindex
- The index to add the Command at (must follow the specifications0<=index<=size()
)
-
addSlashCommand
Description copied from interface:CommandClient
Adds a singleSlashCommand
to this CommandClient's registered SlashCommand.For CommandClient's containing 20 commands or less, command calls by users will have the bot iterate through the entire
ArrayList
to find the command called. As expected, this can get fairly hefty if a bot has a lot of Commands registered to it.To prevent delay a CommandClient that has more that 20 Commands registered to it will begin to use indexed calls.
Indexed calls use aHashMap
which links theirname
to the index that which they are located at in the ArrayList they are stored.This means that all insertion and removal of SlashCommands must reorganize the index maintained by the HashMap.
For this particular insertion, the SlashCommand provided is inserted at the end of the index, meaning it will become the "rightmost" Command in the ArrayList.- Specified by:
addSlashCommand
in interfaceCommandClient
- Parameters:
command
- The Command to add
-
addSlashCommand
Description copied from interface:CommandClient
Adds a singleSlashCommand
to this CommandClient's registered Commands at the specified index.For CommandClient's containing 20 commands or less, command calls by users will have the bot iterate through the entire
ArrayList
to find the command called. As expected, this can get fairly hefty if a bot has a lot of Commands registered to it.To prevent delay a CommandClient that has more that 20 Commands registered to it will begin to use indexed calls.
Indexed calls use aHashMap
which links theirname
to the index that which they are located at in the ArrayList they are stored.This means that all insertion and removal of Commands must reorganize the index maintained by the HashMap.
For this particular insertion, the Command provided is inserted at the index specified, meaning it will become the Command located at that index in the ArrayList. This will shift the Command previously located at that index as well as any located at greater indices, right one index (size()+1
).- Specified by:
addSlashCommand
in interfaceCommandClient
- Parameters:
command
- The Command to addindex
- The index to add the Command at (must follow the specifications0<=index<=size()
)
-
addContextMenu
Description copied from interface:CommandClient
Adds a singleContextMenu
to this CommandClient's registered Context Menus.- Specified by:
addContextMenu
in interfaceCommandClient
- Parameters:
menu
- The menu to add
-
addContextMenu
Description copied from interface:CommandClient
Adds a singleContextMenu
to this CommandClient's registered Context Menus.- Specified by:
addContextMenu
in interfaceCommandClient
- Parameters:
menu
- The menu to addindex
- The index to add the Context Menu at (must follow the specifications0<=index<=size()
)
-
removeCommand
Description copied from interface:CommandClient
Removes a singleCommand
from this CommandClient's registered Commands at the index linked to the provided name/alias.For CommandClient's containing 20 commands or less, command calls by users will have the bot iterate through the entire
ArrayList
to find the command called. As expected, this can get fairly hefty if a bot has a lot of Commands registered to it.To prevent delay a CommandClient that has more that 20 Commands registered to it will begin to use indexed calls.
Indexed calls use aHashMap
which links theirname
and theiraliases
to the index that which they are located at in the ArrayList they are stored.This means that all insertion and removal of Commands must reorganize the index maintained by the HashMap.
For this particular removal, the Command removed is that of the corresponding index retrieved by the name provided. This will shift any Commands located at greater indices, left one index (size()-1
).- Specified by:
removeCommand
in interfaceCommandClient
- Parameters:
name
- The name or an alias of the Command to remove
-
addAnnotatedModule
Description copied from interface:CommandClient
Compiles the providedObject
annotated withJDACommand.Module
into aList
ofCommand
s and adds them to this CommandClient in the order they are listed.This is done through the
AnnotatedModuleCompiler
provided when building this CommandClient.- Specified by:
addAnnotatedModule
in interfaceCommandClient
- Parameters:
module
- An object annotated with JDACommand.Module to compile into commands to be added.
-
addAnnotatedModule
Description copied from interface:CommandClient
Compiles the providedObject
annotated withJDACommand.Module
into aList
ofCommand
s and adds them to this CommandClient via theFunction
provided.This is done through the
AnnotatedModuleCompiler
provided when building this CommandClient.The Function will
apply
eachCommand
in the compiled list and request anint
in return.
Using thisint
, the command provided will be applied to the CommandClient viaCommandClient#addCommand(Command, int)
.- Specified by:
addAnnotatedModule
in interfaceCommandClient
- Parameters:
module
- An object annotated with JDACommand.Module to compile into commands to be added.mapFunction
- The Function to get indexes for each compiled Command with when adding them to the CommandClient.
-
getOwnerId
Description copied from interface:CommandClient
Gets the ID of the owner of this bot as a String.- Specified by:
getOwnerId
in interfaceCommandClient
- Returns:
- The String ID of the owner of the bot
-
getOwnerIdLong
public long getOwnerIdLong()Description copied from interface:CommandClient
Gets the ID of the owner of this bot as along
.- Specified by:
getOwnerIdLong
in interfaceCommandClient
- Returns:
- The
long
ID of the owner of the bot
-
getCoOwnerIds
Description copied from interface:CommandClient
Gets the ID(s) of any CoOwners of this bot as a String Array.- Specified by:
getCoOwnerIds
in interfaceCommandClient
- Returns:
- The String ID(s) of any CoOwners of this bot
-
getCoOwnerIdsLong
public long[] getCoOwnerIdsLong()Description copied from interface:CommandClient
Gets the ID(s) of any CoOwners of this bot as along
Array.- Specified by:
getCoOwnerIdsLong
in interfaceCommandClient
- Returns:
- The
long
ID(s) of any CoOwners of this bot
-
getSuccess
Description copied from interface:CommandClient
Gets the success emoji.- Specified by:
getSuccess
in interfaceCommandClient
- Returns:
- The success emoji
-
getWarning
Description copied from interface:CommandClient
Gets the warning emoji.- Specified by:
getWarning
in interfaceCommandClient
- Returns:
- The warning emoji
-
getError
Description copied from interface:CommandClient
Gets the error emoji.- Specified by:
getError
in interfaceCommandClient
- Returns:
- The error emoji
-
getScheduleExecutor
Description copied from interface:CommandClient
Gets theScheduledExecutorService
held by this client.This is used for methods such as
CommandEvent#async(Runnable)
run code asynchronously.- Specified by:
getScheduleExecutor
in interfaceCommandClient
- Returns:
- The ScheduledExecutorService held by this client.
-
getServerInvite
Description copied from interface:CommandClient
Gets the invite to the bot's support server.- Specified by:
getServerInvite
in interfaceCommandClient
- Returns:
- A possibly-null server invite
-
getPrefix
Description copied from interface:CommandClient
Gets the Client's prefix.- Specified by:
getPrefix
in interfaceCommandClient
- Returns:
- A possibly-null prefix
-
getPrefixes
Description copied from interface:CommandClient
Gets the array of prefixes- Specified by:
getPrefixes
in interfaceCommandClient
- Returns:
- A possibly-null list of prefixes
-
getPrefixFunction
Description copied from interface:CommandClient
Gets the prefix BiConsumer- Specified by:
getPrefixFunction
in interfaceCommandClient
- Returns:
- A possibly-null prefix BiConsumer
-
getAltPrefix
Description copied from interface:CommandClient
Gets the Client's alternate prefix.- Specified by:
getAltPrefix
in interfaceCommandClient
- Returns:
- A possibly-null alternate prefix
-
getTextualPrefix
Description copied from interface:CommandClient
Returns the visual representation of the bot's prefix.This is the same as
CommandClient.getPrefix()
unless the prefix is the default, in which case it appears as @Botname.- Specified by:
getTextualPrefix
in interfaceCommandClient
- Returns:
- A never-null prefix
-
getTotalGuilds
public int getTotalGuilds()Description copied from interface:CommandClient
Gets an a recently updated count of all theGuild
s the bot is connected to on all shards.NOTE: This may not always or should not be assumed accurate! Any time a shard joins or leaves a guild it will update the number retrieved by this method but will not update when other shards join or leave guilds. This means that shards will not always retrieve the same value. For instance:
- 1) Shard A joins 10 Guilds
- 2) Shard B invokes this method
- 3) Shard A invokes this method
This feature requires a Discord Bots API Key to be set!
To set your Discord Bots API Key, you'll have to retrieve it from the Discord Bots website.- Specified by:
getTotalGuilds
in interfaceCommandClient
- Returns:
- A recently updated count of all the Guilds the bot is connected to on all shards.
-
getHelpWord
Description copied from interface:CommandClient
Gets the word used to invoke a help DM.- Specified by:
getHelpWord
in interfaceCommandClient
- Returns:
- The help word
-
usesLinkedDeletion
public boolean usesLinkedDeletion()Description copied from interface:CommandClient
Gets whether this CommandClient uses linked deletion.Linking calls is the basic principle of pairing bot responses with their calling
Message
s.
Using this with a basic function such as deletion, this causes bots to delete their Messages as a response to the calling Message being deleted.- Specified by:
usesLinkedDeletion
in interfaceCommandClient
- Returns:
true
if the bot uses linked deletion,false
otherwise.- See Also:
-
getSettingsFor
public <S> S getSettingsFor(net.dv8tion.jda.api.entities.Guild guild) Description copied from interface:CommandClient
Returns an Object of the type parameter that should contain settings relating to the specifiedGuild
.The returning object for this is specified via provision of a
GuildSettingsManager
toCommandClientBuilder#setGuildSettingsManager(GuildSettingsManager)
, more specificallyGuildSettingsManager#getSettings(Guild)
.- Specified by:
getSettingsFor
in interfaceCommandClient
- Type Parameters:
S
- The type of settings the GuildSettingsManager provides- Parameters:
guild
- The Guild to get Settings for- Returns:
- The settings object for the Guild, specified in
GuildSettingsManager#getSettings(Guild)
, can benull
if the implementation allows it.
-
getSettingsManager
Description copied from interface:CommandClient
Returns the type ofGuildSettingsManager
, the same type of one provided when building this CommandClient, ornull
if one was not provided there.This is good if you want to use non-abstract methods specific to your implementation.
- Specified by:
getSettingsManager
in interfaceCommandClient
- Type Parameters:
M
- The type of the GuildSettingsManager- Returns:
- The GuildSettingsManager, or
null
if one was not provided when building this CommandClient.
-
shutdown
public void shutdown()Description copied from interface:CommandClient
Shuts down internals of the Command Client, such as the threadpool and guild settings manager- Specified by:
shutdown
in interfaceCommandClient
-
onEvent
public void onEvent(net.dv8tion.jda.api.events.GenericEvent event) - Specified by:
onEvent
in interfacenet.dv8tion.jda.api.hooks.EventListener
-
upsertInteractions
public void upsertInteractions(net.dv8tion.jda.api.JDA jda) Description copied from interface:CommandClient
Upserts all interactions to the providedforced server
.
This runs after theReadyEvent
has been fired ifCommandClient.isManualUpsert()
isfalse
.
IfCommandClient.forcedGuildId()
isnull
, commands will upsert globally. This may take up to an hour.- Specified by:
upsertInteractions
in interfaceCommandClient
- Parameters:
jda
- The JDA instance to use
-
upsertInteractions
Description copied from interface:CommandClient
Upserts all interactions to the provided server.
This runs after theReadyEvent
has been fired ifCommandClient.isManualUpsert()
isfalse
.
Ifnull
is passed for the server, commands will upsert globally. This may take up to an hour.- Specified by:
upsertInteractions
in interfaceCommandClient
- Parameters:
jda
- The JDA instance to useserverId
- The server to upsert interactions for
-
linkIds
public void linkIds(long callId, net.dv8tion.jda.api.entities.Message message) DO NOT USE THIS!This is a method necessary for linking a bot's response messages to their corresponding call message ID.
Using this anywhere in your code can and will break your bot.- Parameters:
callId
- The ID of the call Messagemessage
- The Message to link to the ID
-