/
ApplicationInfo.java
426 lines (392 loc) · 15.1 KB
/
ApplicationInfo.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
/*
* Copyright 2015 Austin Keener, Michael Ritter, Florian Spieß, and the JDA contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.dv8tion.jda.api.entities;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.utils.ImageProxy;
import net.dv8tion.jda.internal.utils.Checks;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Arrays;
import java.util.Collection;
import java.util.EnumSet;
import java.util.List;
/**
* Represents a Discord Application from its bot's point of view.
*
* @since 3.0
* @author Aljoscha Grebe
*
* @see net.dv8tion.jda.api.JDA#retrieveApplicationInfo()
*/
public interface ApplicationInfo extends ISnowflake
{
/**
* Whether the bot requires code grant to invite or not.
*
* <p>This means that additional OAuth2 steps are required to authorize the application to make a bot join a guild
* like {@code &response_type=code} together with a valid {@code &redirect_uri}.
* <br>For more information look at the <a href="https://discord.com/developers/docs/topics/oauth2">Discord OAuth2 documentation</a>.
*
* @return Whether the bot requires code grant
*/
boolean doesBotRequireCodeGrant();
/**
* The description of the bot's application.
*
* @return The description of the bot's application or an empty {@link String} if no description is defined
*/
@Nonnull
String getDescription();
/**
* The URL for the application's terms of service.
*
* @return The URL for the application's terms of service or {@code null} if none is set
*/
@Nullable
String getTermsOfServiceUrl();
/**
* The URL for the application's privacy policy.
*
* @return The URL for the application's privacy policy or {@code null} if none is set
*/
@Nullable
String getPrivacyPolicyUrl();
/**
* The icon id of the bot's application.
* <br>The application icon is <b>not</b> necessarily the same as the bot's avatar!
*
* @return The icon id of the bot's application or null if no icon is defined
*/
@Nullable
String getIconId();
/**
* The icon-url of the bot's application.
* <br>The application icon is <b>not</b> necessarily the same as the bot's avatar!
*
* @return The icon-url of the bot's application or null if no icon is defined
*/
@Nullable
String getIconUrl();
/**
* Returns an {@link ImageProxy} for this application info's icon.
*
* @return The {@link ImageProxy} of this application info's icon or null if no icon is defined
*
* @see #getIconUrl()
*/
@Nullable
default ImageProxy getIcon()
{
final String iconUrl = getIconUrl();
return iconUrl == null ? null : new ImageProxy(iconUrl);
}
/**
* The team information for this application.
*
* @return The {@link net.dv8tion.jda.api.entities.ApplicationTeam}, or null if this application is not in a team.
*/
@Nullable
ApplicationTeam getTeam();
/**
* Configures the required scopes applied to the {@link #getInviteUrl(Permission...)} and similar methods.
* <br>To use slash commands you must add {@code "applications.commands"} to these scopes. The scope {@code "bot"} is always applied.
*
* @param scopes
* The scopes to use with {@link #getInviteUrl(Permission...)} and the likes
*
* @throws IllegalArgumentException
* If null is provided
*
* @return The current ApplicationInfo instance
*/
@Nonnull
default ApplicationInfo setRequiredScopes(@Nonnull String... scopes)
{
Checks.noneNull(scopes, "Scopes");
return setRequiredScopes(Arrays.asList(scopes));
}
/**
* Configures the required scopes applied to the {@link #getInviteUrl(Permission...)} and similar methods.
* <br>To use slash commands you must add {@code "applications.commands"} to these scopes. The scope {@code "bot"} is always applied.
*
* @param scopes
* The scopes to use with {@link #getInviteUrl(Permission...)} and the likes
*
* @throws IllegalArgumentException
* If null is provided
*
* @return The current ApplicationInfo instance
*/
@Nonnull
ApplicationInfo setRequiredScopes(@Nonnull Collection<String> scopes);
/**
* Creates a OAuth invite-link used to invite the bot.
*
* <p>The link is provided in the following format:
* <br>{@code https://discord.com/oauth2/authorize?client_id=APPLICATION_ID&scope=bot&permissions=PERMISSIONS}
* <br>Unnecessary query parameters are stripped.
*
* @param permissions
* Possibly empty {@link java.util.Collection Collection} of {@link net.dv8tion.jda.api.Permission Permissions}
* that should be requested via invite.
*
* @return The link used to invite the bot
*/
@Nonnull
default String getInviteUrl(@Nullable Collection<Permission> permissions)
{
return getInviteUrl(null, permissions);
}
/**
* Creates a OAuth invite-link used to invite the bot.
*
* <p>The link is provided in the following format:
* <br>{@code https://discord.com/oauth2/authorize?client_id=APPLICATION_ID&scope=bot&permissions=PERMISSIONS}
* <br>Unnecessary query parameters are stripped.
*
* @param permissions
* {@link net.dv8tion.jda.api.Permission Permissions} that should be requested via invite.
*
* @return The link used to invite the bot
*/
@Nonnull
default String getInviteUrl(@Nullable Permission... permissions)
{
return getInviteUrl(null, permissions);
}
/**
* Creates a OAuth invite-link used to invite the bot.
*
* <p>The link is provided in the following format:
* <br>{@code https://discord.com/oauth2/authorize?client_id=APPLICATION_ID&scope=bot&permissions=PERMISSIONS&guild_id=GUILD_ID}
* <br>Unnecessary query parameters are stripped.
*
* @param guildId
* The id of the pre-selected guild.
* @param permissions
* Possibly empty {@link java.util.Collection Collection} of {@link net.dv8tion.jda.api.Permission Permissions}
* that should be requested via invite.
*
* @throws java.lang.NumberFormatException
* If the provided {@code id} cannot be parsed by {@link Long#parseLong(String)}
*
* @return The link used to invite the bot
*/
@Nonnull
String getInviteUrl(@Nullable String guildId, @Nullable Collection<Permission> permissions);
/**
* Creates a OAuth invite-link used to invite the bot.
*
* <p>The link is provided in the following format:
* <br>{@code https://discord.com/oauth2/authorize?client_id=APPLICATION_ID&scope=bot&permissions=PERMISSIONS&guild_id=GUILD_ID}
* <br>Unnecessary query parameters are stripped.
*
* @param guildId
* The id of the pre-selected guild.
* @param permissions
* Possibly empty {@link java.util.Collection Collection} of {@link net.dv8tion.jda.api.Permission Permissions}
* that should be requested via invite.
*
* @return The link used to invite the bot
*/
@Nonnull
default String getInviteUrl(long guildId, @Nullable Collection<Permission> permissions)
{
return getInviteUrl(Long.toUnsignedString(guildId), permissions);
}
/**
* Creates a OAuth invite-link used to invite the bot.
*
* <p>The link is provided in the following format:
* <br>{@code https://discord.com/oauth2/authorize?client_id=APPLICATION_ID&scope=bot&permissions=PERMISSIONS&guild_id=GUILD_ID}
* <br>Unnecessary query parameters are stripped.
*
* @param guildId
* The id of the pre-selected guild.
* @param permissions
* Possibly empty array of {@link net.dv8tion.jda.api.Permission Permissions}
* that should be requested via invite.
*
* @throws java.lang.NumberFormatException
* If the provided {@code id} cannot be parsed by {@link Long#parseLong(String)}
*
* @return The link used to invite the bot
*/
@Nonnull
default String getInviteUrl(@Nullable String guildId, @Nullable Permission... permissions)
{
return getInviteUrl(guildId, permissions == null ? null : Arrays.asList(permissions));
}
/**
* Creates a OAuth invite-link used to invite the bot.
*
* <p>The link is provided in the following format:
* <br>{@code https://discord.com/oauth2/authorize?client_id=APPLICATION_ID&scope=bot&permissions=PERMISSIONS&guild_id=GUILD_ID}
* <br>Unnecessary query parameters are stripped.
*
* @param guildId
* The id of the pre-selected guild.
* @param permissions
* Possibly empty array of {@link net.dv8tion.jda.api.Permission Permissions}
* that should be requested via invite.
*
* @return The link used to invite the bot
*/
@Nonnull
default String getInviteUrl(long guildId, @Nullable Permission... permissions)
{
return getInviteUrl(Long.toUnsignedString(guildId), permissions);
}
/**
* The {@link net.dv8tion.jda.api.JDA JDA} instance of this ApplicationInfo
* (the one logged into this application's bot account).
*
* @return The JDA instance of this ApplicationInfo
*/
@Nonnull
JDA getJDA();
/**
* The name of the bot's application.
* <br>The application name is <b>not</b> necessarily the same as the bot's name!
*
* @return The name of the bot's application.
*/
@Nonnull
String getName();
/**
* The owner of the bot's application.
*
* @return The owner of the bot's application
*/
@Nonnull
User getOwner();
/**
* Whether the bot is public or not.
* Public bots can be added by anyone. When false only the owner can invite the bot to guilds.
*
* @return Whether the bot is public
*/
boolean isBotPublic();
/**
* A {@link java.util.List} containing the tags of this bot's application.
*
* <p>This List is empty if no tags are set in the <a href="https://discord.com/developers/applications" target="_blank">Developer Portal</a>.
*
* @return Immutable list containing the tags of this bot's application
*/
@Nonnull
List<String> getTags();
/**
* The custom Authorization URL of this bot's application.
*
* <p>This returns {@code null} if no custom URL is set in the <a href="https://discord.com/developers/applications" target="_blank">Developer Portal</a> or if In-app Authorization is enabled.
*
* @return Custom Authorization URL, or null if it has not been set
*/
@Nullable
String getCustomAuthorizationUrl();
/**
* A {@link java.util.List} of scopes the default authorization URL is set up with.
*
* <p>This List is empty if you set a custom URL in the <a href="https://discord.com/developers/applications" target="_blank">Developer Portal</a>.
*
* @return Immutable list of scopes the default authorization URL is set up with.
*/
@Nonnull
List<String> getScopes();
/**
* An {@link java.util.EnumSet} of permissions the default authorization URL is set up with.
*
* <p>This is empty if you set a custom URL in the <a href="https://discord.com/developers/applications" target="_blank">Developer Portal</a>.
*
* @return Set of permissions the default authorization URL is set up with.
*/
@Nonnull
EnumSet<Permission> getPermissions();
/**
* The {@code long} representation of the literal permissions the default authorization URL is set up with.
*
* @return Never-negative long containing offset permissions the default authorization URL is set up with.
*/
long getPermissionsRaw();
/**
* The {@link Flag Flags} set for the application.
* <br>Modifying the returned EnumSet will have not actually change the flags of the application.
*
* @return {@link EnumSet} of {@link Flag}
*/
@Nonnull
default EnumSet<Flag> getFlags()
{
return Flag.fromRaw(getFlagsRaw());
}
/**
* The raw bitset representing this application's flags.
*
* @return The bitset
*/
long getFlagsRaw();
/**
* Flag constants corresponding to the <a href="https://discord.com/developers/docs/resources/application#application-object-application-flags" target="_blank">Discord Enum</a>
*
* @see #getFlags()
*/
enum Flag
{
/** Bot can use {@link net.dv8tion.jda.api.requests.GatewayIntent#GUILD_PRESENCES GatewayIntent.GUILD_PRESENCES} in 100 or more guilds */
GATEWAY_PRESENCE(1 << 12),
/** Bot can use {@link net.dv8tion.jda.api.requests.GatewayIntent#GUILD_PRESENCES GatewayIntent.GUILD_PRESENCES} in under 100 guilds */
GATEWAY_PRESENCE_LIMITED(1 << 13),
/** Bot can use {@link net.dv8tion.jda.api.requests.GatewayIntent#GUILD_MEMBERS GatewayIntent.GUILD_MEMBERS} in 100 or more guilds */
GATEWAY_GUILD_MEMBERS(1 << 14),
/** Bot can use {@link net.dv8tion.jda.api.requests.GatewayIntent#GUILD_MEMBERS GatewayIntent.GUILD_MEMBERS} in under 100 guilds */
GATEWAY_GUILD_MEMBERS_LIMITED(1 << 15),
/** Indicates unusual growth of an app that prevents verification */
VERIFICATION_PENDING_GUILD_LIMIT(1 << 16),
/** Indicates if an app is embedded within the Discord client (currently unavailable publicly) */
EMBEDDED(1 << 17),
/** Bot can use {@link net.dv8tion.jda.api.requests.GatewayIntent#MESSAGE_CONTENT GatewayIntent.MESSAGE_CONTENT} in 100 or more guilds */
GATEWAY_MESSAGE_CONTENT(1 << 18),
/** Bot can use {@link net.dv8tion.jda.api.requests.GatewayIntent#MESSAGE_CONTENT GatewayIntent.MESSAGE_CONTENT} in under 100 guilds */
GATEWAY_MESSAGE_CONTENT_LIMITED(1 << 19),
;
private final long value;
Flag(long value)
{
this.value = value;
}
/**
* Converts the provided bitset to the corresponding enum constants.
*
* @param raw
* The bitset of flags
*
* @return {@link EnumSet} of {@link Flag}
*/
@Nonnull
public static EnumSet<Flag> fromRaw(long raw)
{
EnumSet<Flag> set = EnumSet.noneOf(Flag.class);
for (Flag flag : values())
{
if ((raw & flag.value) != 0)
set.add(flag);
}
return set;
}
}
}