-
-
Notifications
You must be signed in to change notification settings - Fork 734
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add sharded listener provider #595
Changes from 4 commits
ce3ed74
c365a17
13cf4e0
5cd56df
deda5c1
b87b4a9
1a6bbb2
13d1318
d10bc77
81aa7f7
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -18,6 +18,7 @@ | |
import java.util.*; | ||
import java.util.function.Function; | ||
import java.util.function.IntFunction; | ||
import java.util.function.IntPredicate; | ||
import java.util.stream.Collectors; | ||
|
||
import net.dv8tion.jda.bot.entities.ApplicationInfo; | ||
|
@@ -76,6 +77,77 @@ default void removeEventListener(final Object... listeners) | |
this.getShardCache().forEach(jda -> jda.removeEventListener(listeners)); | ||
} | ||
|
||
/** | ||
* Adds listeners provided by the listener provider to each shard to the event-listeners that will be used to handle events. | ||
* The listener provider gets a shard id applied and is expected to return a listener. | ||
* | ||
* <p>Note: when using the {@link net.dv8tion.jda.core.hooks.InterfacedEventManager InterfacedEventListener} (default), | ||
* given listener <b>must</b> be instance of {@link net.dv8tion.jda.core.hooks.EventListener EventListener}! | ||
* | ||
* @param eventListenerProvider | ||
* The provider of listener(s) which will react to events. | ||
* | ||
* @throws java.lang.IllegalArgumentException | ||
* If the provided listener provider or any of the listeners or provides are {@code null}. | ||
*/ | ||
default void addEventListeners(final IntFunction<Object> eventListenerProvider) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can we also get the same as |
||
{ | ||
Checks.notNull(eventListenerProvider, "event listener provider"); | ||
this.getShardCache().forEach(jda -> | ||
{ | ||
Object listener = eventListenerProvider.apply(jda.getShardInfo().getShardId()); | ||
Checks.notNull(listener, "listener"); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could we skip on null? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done. |
||
jda.addEventListener(listener); | ||
}); | ||
} | ||
|
||
/** | ||
* Remove all listeners from shards for which id's the provided filter returns {@code true}. | ||
* The filter tests shard ids, and for those ids that it returns {@code true} for, the corresponding shards will | ||
* have all their listeners removed. | ||
* | ||
* @param shardFilter | ||
* a filter that returns {@code true} for those shard ids that should have all their listeners removed | ||
* | ||
* @throws java.lang.IllegalArgumentException | ||
* If the provided shard filter is {@code null}. | ||
*/ | ||
default void removeEventListeners(final IntPredicate shardFilter) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't like this method, I suggested something different on discord |
||
{ | ||
Checks.notNull(shardFilter, "shard id filter"); | ||
this.getShardCache().forEach(jda -> | ||
{ | ||
if (shardFilter.test(jda.getShardInfo().getShardId())) | ||
{ | ||
jda.removeEventListener(jda.getRegisteredListeners().toArray()); | ||
} | ||
}); | ||
} | ||
|
||
/** | ||
* Remove listeners provided by the listener provider from each shard. | ||
* This is the complementary method to {@link ShardManager#addEventListeners(IntFunction)}. | ||
* | ||
* The listener provider gets a shard id applied and is expected to return a listener, that will be removed from the | ||
* respective shard. | ||
* | ||
* <p><b>Note:</b> The produced listeners need to be the exact same objects that were added. If your listener | ||
* provider is based on creating a new listener object on each call, this removal method will not work for you. | ||
* | ||
* @param eventListenerProvider | ||
* The provider of listeners to remove. | ||
* | ||
* @throws java.lang.IllegalArgumentException | ||
* If the provided listener provider is {@code null}. | ||
*/ | ||
default void removeEventListeners(IntFunction<Object> eventListenerProvider) | ||
{ | ||
Checks.notNull(eventListenerProvider, "event listener provider"); | ||
for (JDA jda : this.getShardCache()) { | ||
jda.removeEventListener(eventListenerProvider.apply(jda.getShardInfo().getShardId())); | ||
} | ||
} | ||
|
||
/** | ||
* Returns the amount of shards queued for (re)connecting. | ||
* | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Make this vararg, same for addDecided this is not needed