25
25
import okhttp3 .OkHttpClient ;
26
26
27
27
import javax .security .auth .login .LoginException ;
28
- import java .util .ArrayList ;
29
- import java .util .Arrays ;
30
- import java .util .Collection ;
31
- import java .util .List ;
28
+ import java .util .*;
32
29
import java .util .concurrent .ConcurrentMap ;
33
30
import java .util .concurrent .ThreadFactory ;
34
31
import java .util .function .IntFunction ;
46
43
public class DefaultShardManagerBuilder
47
44
{
48
45
protected final List <Object > listeners = new ArrayList <>();
46
+ protected final List <IntFunction <Object >> listenerProviders = new ArrayList <>();
49
47
protected SessionController sessionController = null ;
50
48
protected IntFunction <ConcurrentMap <String , String >> contextProvider = null ;
51
49
protected boolean enableContext = true ;
@@ -55,6 +53,7 @@ public class DefaultShardManagerBuilder
55
53
protected boolean autoReconnect = true ;
56
54
protected boolean retryOnTimeout = true ;
57
55
protected boolean useShutdownNow = false ;
56
+ protected boolean enableCompression = true ;
58
57
protected int shardsTotal = -1 ;
59
58
protected int maxReconnectDelay = 900 ;
60
59
protected int corePoolSize = 2 ;
@@ -138,6 +137,28 @@ public DefaultShardManagerBuilder setContextEnabled(boolean enable)
138
137
return this ;
139
138
}
140
139
140
+ /**
141
+ * Enable stream-compression on the gateway connection,
142
+ * this will decrease the amount of used bandwidth for the running bot instance
143
+ * for the cost of a few extra cycles for decompression.
144
+ * <br><b>Default: true</b>
145
+ *
146
+ * <p><b>We recommend to keep this enabled unless you have issues with the decompression</b>
147
+ * <br>This mode might become obligatory in a future version, do not rely on this switch to stay.
148
+ *
149
+ * @param enable
150
+ * True, if the gateway connection should use compression
151
+ *
152
+ * @return The {@link net.dv8tion.jda.bot.sharding.DefaultShardManagerBuilder DefaultShardManagerBuilder} instance. Useful for chaining.
153
+ *
154
+ * @see <a href="https://discordapp.com/developers/docs/topics/gateway#transport-compression" target="_blank">Official Discord Documentation - Transport Compression</a>
155
+ */
156
+ public DefaultShardManagerBuilder setCompressionEnabled (boolean enable )
157
+ {
158
+ this .enableCompression = enable ;
159
+ return this ;
160
+ }
161
+
141
162
/**
142
163
* Adds all provided listeners to the list of listeners that will be used to populate the {@link DefaultShardManager DefaultShardManager} object.
143
164
* <br>This uses the {@link net.dv8tion.jda.core.hooks.InterfacedEventManager InterfacedEventListener} by default.
@@ -216,6 +237,82 @@ public DefaultShardManagerBuilder removeEventListeners(final Collection<Object>
216
237
return this ;
217
238
}
218
239
240
+ /**
241
+ * Adds the provided listener provider to the list of listener providers that will be used to create listeners.
242
+ * On shard creation (including shard restarts) the provider will have the shard id applied and must return a listener,
243
+ * which will be used, along all other listeners, to populate the listeners of the JDA object of that shard.
244
+ *
245
+ * <br>This uses the {@link net.dv8tion.jda.core.hooks.InterfacedEventManager InterfacedEventListener} by default.
246
+ * <br>To switch to the {@link net.dv8tion.jda.core.hooks.AnnotatedEventManager AnnotatedEventManager},
247
+ * use {@link #setEventManager(net.dv8tion.jda.core.hooks.IEventManager) setEventManager(new AnnotatedEventManager())}.
248
+ *
249
+ * <p><b>Note:</b> When using the {@link net.dv8tion.jda.core.hooks.InterfacedEventManager InterfacedEventListener} (default),
250
+ * given listener(s) <b>must</b> be instance of {@link net.dv8tion.jda.core.hooks.EventListener EventListener}!
251
+ *
252
+ * @param listenerProvider
253
+ * The listener provider to add to the list of listener providers.
254
+ *
255
+ * @return The {@link net.dv8tion.jda.bot.sharding.DefaultShardManagerBuilder DefaultShardManagerBuilder} instance. Useful for chaining.
256
+ */
257
+ public DefaultShardManagerBuilder addEventListenerProvider (final IntFunction <Object > listenerProvider )
258
+ {
259
+ return this .addEventListenerProviders (Collections .singleton (listenerProvider ));
260
+ }
261
+
262
+ /**
263
+ * Adds the provided listener providers to the list of listener providers that will be used to create listeners.
264
+ * On shard creation (including shard restarts) each provider will have the shard id applied and must return a listener,
265
+ * which will be used, along all other listeners, to populate the listeners of the JDA object of that shard.
266
+ *
267
+ * <br>This uses the {@link net.dv8tion.jda.core.hooks.InterfacedEventManager InterfacedEventListener} by default.
268
+ * <br>To switch to the {@link net.dv8tion.jda.core.hooks.AnnotatedEventManager AnnotatedEventManager},
269
+ * use {@link #setEventManager(net.dv8tion.jda.core.hooks.IEventManager) setEventManager(new AnnotatedEventManager())}.
270
+ *
271
+ * <p><b>Note:</b> When using the {@link net.dv8tion.jda.core.hooks.InterfacedEventManager InterfacedEventListener} (default),
272
+ * given listener(s) <b>must</b> be instance of {@link net.dv8tion.jda.core.hooks.EventListener EventListener}!
273
+ *
274
+ * @param listenerProviders
275
+ * The listener provider to add to the list of listener providers.
276
+ *
277
+ * @return The {@link net.dv8tion.jda.bot.sharding.DefaultShardManagerBuilder DefaultShardManagerBuilder} instance. Useful for chaining.
278
+ */
279
+ public DefaultShardManagerBuilder addEventListenerProviders (final Collection <IntFunction <Object >> listenerProviders )
280
+ {
281
+ Checks .noneNull (listenerProviders , "listener providers" );
282
+
283
+ this .listenerProviders .addAll (listenerProviders );
284
+ return this ;
285
+ }
286
+
287
+ /**
288
+ * Removes the provided listener provider from the list of listener providers.
289
+ *
290
+ * @param listenerProvider
291
+ * The listener provider to remove from the list of listener providers.
292
+ *
293
+ * @return The {@link net.dv8tion.jda.bot.sharding.DefaultShardManagerBuilder DefaultShardManagerBuilder} instance. Useful for chaining.
294
+ */
295
+ public DefaultShardManagerBuilder removeEventListenerProvider (final IntFunction <Object > listenerProvider )
296
+ {
297
+ return this .removeEventListenerProviders (Collections .singleton (listenerProvider ));
298
+ }
299
+
300
+ /**
301
+ * Removes all provided listener providers from the list of listener providers.
302
+ *
303
+ * @param listenerProviders
304
+ * The listener provider(s) to remove from the list of listener providers.
305
+ *
306
+ * @return The {@link net.dv8tion.jda.bot.sharding.DefaultShardManagerBuilder DefaultShardManagerBuilder} instance. Useful for chaining.
307
+ */
308
+ public DefaultShardManagerBuilder removeEventListenerProviders (final Collection <IntFunction <Object >> listenerProviders )
309
+ {
310
+ Checks .noneNull (listenerProviders , "listener providers" );
311
+
312
+ this .listenerProviders .removeAll (listenerProviders );
313
+ return this ;
314
+ }
315
+
219
316
/**
220
317
* Enables/Disables Voice functionality.
221
318
* <br>This is useful, if your current system doesn't support Voice and you do not need it.
@@ -731,11 +828,11 @@ public ShardManager build() throws LoginException, IllegalArgumentException
731
828
{
732
829
final DefaultShardManager manager = new DefaultShardManager (
733
830
this .shardsTotal , this .shards , this .sessionController ,
734
- this .listeners , this .token , this .eventManager ,
831
+ this .listeners , this .listenerProviders , this . token , this .eventManager ,
735
832
this .audioSendFactory , this .gameProvider , this .statusProvider ,
736
833
this .httpClientBuilder , this .wsFactory , this .threadFactory ,
737
834
this .maxReconnectDelay , this .corePoolSize , this .enableVoice , this .enableShutdownHook , this .enableBulkDeleteSplitting ,
738
- this .autoReconnect , this .idleProvider , this .retryOnTimeout , this .useShutdownNow , this .enableContext , this .contextProvider );
835
+ this .autoReconnect , this .idleProvider , this .retryOnTimeout , this .useShutdownNow , this .enableContext , this .contextProvider , this . enableCompression );
739
836
740
837
manager .login ();
741
838
0 commit comments