or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

audio.mdcore-management.mdentities.mdevents.mdindex.mdinteractions.mdmessaging.mdrestactions.mdsharding.md

interactions.mddocs/

0

# Interaction System

1

2

Modern Discord interactions including slash commands, buttons, select menus, modals, and context menus with full builder pattern support.

3

4

## Capabilities

5

6

### Slash Command Interactions

7

8

Modern command system using Discord's native slash command interface.

9

10

```java { .api }

11

/**

12

* Represents a slash command interaction.

13

*/

14

interface SlashCommandInteraction extends IReplyCallback {

15

/** Get command name */

16

String getName();

17

18

/** Get full command string with options */

19

String getCommandString();

20

21

/** Get command ID */

22

long getCommandIdLong();

23

String getCommandId();

24

25

/** Get subcommand name (if used) */

26

String getSubcommandName();

27

28

/** Get subcommand group name (if used) */

29

String getSubcommandGroup();

30

31

/** Get all command options */

32

List<OptionMapping> getOptions();

33

34

/** Get option by name */

35

OptionMapping getOption(String name);

36

37

/** Get option by name with type checking */

38

OptionMapping getOption(String name, OptionType type);

39

40

/** Get options for subcommand */

41

List<OptionMapping> getOptionsByName(String name);

42

43

/** Get options by type */

44

List<OptionMapping> getOptionsByType(OptionType type);

45

}

46

47

/**

48

* Represents an option value in a slash command.

49

*/

50

interface OptionMapping {

51

/** Get option name */

52

String getName();

53

54

/** Get option type */

55

OptionType getType();

56

57

/** Get raw string value */

58

String getAsString();

59

60

/** Get as boolean */

61

boolean getAsBoolean();

62

63

/** Get as long */

64

long getAsLong();

65

66

/** Get as double */

67

double getAsDouble();

68

69

/** Get as snowflake */

70

IMentionable getAsMentionable();

71

72

/** Get as user */

73

User getAsUser();

74

75

/** Get as member */

76

Member getAsMember();

77

78

/** Get as role */

79

Role getAsRole();

80

81

/** Get as channel */

82

GuildChannel getAsChannel();

83

84

/** Get as message channel */

85

MessageChannel getAsMessageChannel();

86

87

/** Get as attachment */

88

Message.Attachment getAsAttachment();

89

}

90

91

/**

92

* Utility class for creating command data.

93

*/

94

class Commands {

95

/** Create slash command */

96

static SlashCommandData slash(String name, String description);

97

98

/** Create user context menu command */

99

static CommandData user(String name);

100

101

/** Create message context menu command */

102

static CommandData message(String name);

103

}

104

105

/**

106

* Builder for slash command data.

107

*/

108

interface SlashCommandData extends CommandData {

109

/** Add string option */

110

SlashCommandData addOption(OptionType type, String name, String description);

111

SlashCommandData addOption(OptionType type, String name, String description, boolean required);

112

SlashCommandData addOption(OptionType type, String name, String description, boolean required, boolean autoComplete);

113

114

/** Add options */

115

SlashCommandData addOptions(OptionData... options);

116

SlashCommandData addOptions(Collection<? extends OptionData> options);

117

118

/** Add subcommand */

119

SlashCommandData addSubcommands(SubcommandData... subcommands);

120

SlashCommandData addSubcommands(Collection<? extends SubcommandData> subcommands);

121

122

/** Add subcommand group */

123

SlashCommandData addSubcommandGroups(SubcommandGroupData... groups);

124

SlashCommandData addSubcommandGroups(Collection<? extends SubcommandGroupData> groups);

125

}

126

127

/**

128

* Builder for command options.

129

*/

130

class OptionData {

131

/** Create option */

132

OptionData(OptionType type, String name, String description);

133

OptionData(OptionType type, String name, String description, boolean required);

134

OptionData(OptionType type, String name, String description, boolean required, boolean autoComplete);

135

136

/** Set option as required */

137

OptionData setRequired(boolean required);

138

139

/** Set option as auto-complete */

140

OptionData setAutoComplete(boolean autoComplete);

141

142

/** Add string choice */

143

OptionData addChoice(String name, String value);

144

145

/** Add number choice */

146

OptionData addChoice(String name, long value);

147

OptionData addChoice(String name, double value);

148

149

/** Add choices */

150

OptionData addChoices(Command.Choice... choices);

151

OptionData addChoices(Collection<? extends Command.Choice> choices);

152

153

/** Set channel types (for channel options) */

154

OptionData setChannelTypes(ChannelType... channelTypes);

155

OptionData setChannelTypes(Collection<ChannelType> channelTypes);

156

157

/** Set number range */

158

OptionData setRequiredRange(long min, long max);

159

OptionData setRequiredRange(double min, double max);

160

161

/** Set string length range */

162

OptionData setRequiredLength(int min, int max);

163

}

164

```

165

166

**Usage Examples:**

167

168

```java

169

import net.dv8tion.jda.api.interactions.commands.build.Commands;

170

import net.dv8tion.jda.api.interactions.commands.build.OptionData;

171

import net.dv8tion.jda.api.interactions.commands.OptionType;

172

import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;

173

174

// Register slash commands

175

jda.updateCommands().addCommands(

176

Commands.slash("ping", "Check bot latency"),

177

Commands.slash("userinfo", "Get information about a user")

178

.addOption(OptionType.USER, "user", "Target user", false),

179

Commands.slash("ban", "Ban a user from the server")

180

.addOption(OptionType.USER, "user", "User to ban", true)

181

.addOption(OptionType.STRING, "reason", "Reason for ban", false)

182

.addOption(OptionType.INTEGER, "days", "Days of messages to delete", false)

183

.setDefaultPermissions(DefaultMemberPermissions.enabledFor(Permission.BAN_MEMBERS)),

184

Commands.slash("poll", "Create a poll")

185

.addOption(OptionType.STRING, "question", "Poll question", true)

186

.addOption(OptionType.STRING, "option1", "First option", true)

187

.addOption(OptionType.STRING, "option2", "Second option", true)

188

.addOption(OptionType.STRING, "option3", "Third option", false)

189

).queue();

190

191

// Handle slash command interactions

192

public class SlashCommandHandler extends ListenerAdapter {

193

@Override

194

public void onSlashCommandInteraction(SlashCommandInteractionEvent event) {

195

switch (event.getName()) {

196

case "ping" -> {

197

long gatewayPing = event.getJDA().getGatewayPing();

198

event.reply("Gateway ping: " + gatewayPing + "ms").queue();

199

}

200

case "userinfo" -> {

201

User target = event.getOption("user", event.getUser(), OptionMapping::getAsUser);

202

Member member = event.getGuild().getMember(target);

203

204

EmbedBuilder embed = new EmbedBuilder()

205

.setTitle("User Information")

206

.addField("Username", target.getName(), true)

207

.addField("ID", target.getId(), true)

208

.addField("Created", target.getTimeCreated().format(DateTimeFormatter.RFC_1123_DATE_TIME), false)

209

.setThumbnail(target.getEffectiveAvatarUrl());

210

211

if (member != null) {

212

embed.addField("Joined", member.getTimeJoined().format(DateTimeFormatter.RFC_1123_DATE_TIME), false);

213

embed.addField("Roles", member.getRoles().stream()

214

.map(Role::getAsMention)

215

.collect(Collectors.joining(", ")), false);

216

}

217

218

event.replyEmbeds(embed.build()).queue();

219

}

220

case "ban" -> {

221

User target = event.getOption("user", OptionMapping::getAsUser);

222

String reason = event.getOption("reason", "No reason provided", OptionMapping::getAsString);

223

int days = event.getOption("days", 0, OptionMapping::getAsInt);

224

225

event.getGuild().ban(target, days, TimeUnit.DAYS)

226

.reason(reason)

227

.queue(

228

success -> event.reply("Successfully banned " + target.getAsTag()).setEphemeral(true).queue(),

229

error -> event.reply("Failed to ban user: " + error.getMessage()).setEphemeral(true).queue()

230

);

231

}

232

}

233

}

234

}

235

```

236

237

### Button Interactions

238

239

Interactive button components in messages for user interaction.

240

241

```java { .api }

242

/**

243

* Represents a button interaction event.

244

*/

245

interface ButtonInteraction extends IMessageEditCallback {

246

/** Get button that was clicked */

247

Button getButton();

248

249

/** Get button component ID */

250

String getComponentId();

251

252

/** Get message containing the button */

253

Message getMessage();

254

255

/** Get button style */

256

ButtonStyle getStyle();

257

258

/** Get button label */

259

String getLabel();

260

261

/** Get button emoji */

262

Emoji getEmoji();

263

}

264

265

/**

266

* Button component builder.

267

*/

268

class Button {

269

/** Create primary button */

270

static Button primary(String id, String label);

271

static Button primary(String id, Emoji emoji);

272

static Button primary(String id, String label, Emoji emoji);

273

274

/** Create secondary button */

275

static Button secondary(String id, String label);

276

static Button secondary(String id, Emoji emoji);

277

static Button secondary(String id, String label, Emoji emoji);

278

279

/** Create success button (green) */

280

static Button success(String id, String label);

281

static Button success(String id, Emoji emoji);

282

static Button success(String id, String label, Emoji emoji);

283

284

/** Create danger button (red) */

285

static Button danger(String id, String label);

286

static Button danger(String id, Emoji emoji);

287

static Button danger(String id, String label, Emoji emoji);

288

289

/** Create link button */

290

static Button link(String url, String label);

291

static Button link(String url, Emoji emoji);

292

static Button link(String url, String label, Emoji emoji);

293

294

/** Get button properties */

295

String getId();

296

String getLabel();

297

ButtonStyle getStyle();

298

Emoji getEmoji();

299

String getUrl();

300

boolean isDisabled();

301

302

/** Create disabled/enabled versions */

303

Button asDisabled();

304

Button asEnabled();

305

306

/** Modify button properties */

307

Button withId(String id);

308

Button withLabel(String label);

309

Button withEmoji(Emoji emoji);

310

Button withStyle(ButtonStyle style);

311

Button withUrl(String url);

312

Button withDisabled(boolean disabled);

313

}

314

```

315

316

**Usage Examples:**

317

318

```java

319

import net.dv8tion.jda.api.interactions.components.ActionRow;

320

import net.dv8tion.jda.api.interactions.components.buttons.Button;

321

import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;

322

323

// Send message with buttons

324

Button acceptButton = Button.success("accept", "Accept");

325

Button declineButton = Button.danger("decline", "Decline");

326

Button infoButton = Button.secondary("info", "More Info");

327

328

channel.sendMessage("Do you want to join the event?")

329

.setComponents(ActionRow.of(acceptButton, declineButton, infoButton))

330

.queue();

331

332

// Handle button interactions

333

public class ButtonHandler extends ListenerAdapter {

334

@Override

335

public void onButtonInteraction(ButtonInteractionEvent event) {

336

String componentId = event.getComponentId();

337

338

switch (componentId) {

339

case "accept" -> {

340

event.reply("✅ You have accepted the invitation!").setEphemeral(true).queue();

341

342

// Disable the buttons after interaction

343

List<ActionRow> updatedRows = event.getMessage().getActionRows().stream()

344

.map(row -> ActionRow.of(row.getComponents().stream()

345

.map(component -> {

346

if (component instanceof Button button) {

347

return button.asDisabled();

348

}

349

return component;

350

})

351

.collect(Collectors.toList())))

352

.collect(Collectors.toList());

353

354

event.getHook().editOriginalComponents(updatedRows).queue();

355

}

356

case "decline" -> {

357

event.reply("❌ You have declined the invitation.").setEphemeral(true).queue();

358

}

359

case "info" -> {

360

EmbedBuilder embed = new EmbedBuilder()

361

.setTitle("Event Information")

362

.setDescription("This is a community gaming event")

363

.addField("Date", "Tomorrow at 8 PM", true)

364

.addField("Duration", "2 hours", true)

365

.setColor(Color.BLUE);

366

367

event.replyEmbeds(embed.build()).setEphemeral(true).queue();

368

}

369

}

370

}

371

}

372

```

373

374

### Select Menu Interactions

375

376

Dropdown selection components for multiple choice interactions.

377

378

```java { .api }

379

/**

380

* Represents a select menu interaction.

381

*/

382

interface SelectMenuInteraction extends IMessageEditCallback {

383

/** Get selected values */

384

List<String> getValues();

385

386

/** Get selected options */

387

List<SelectOption> getSelectedOptions();

388

389

/** Get select menu component */

390

SelectMenu getSelectMenu();

391

392

/** Get component ID */

393

String getComponentId();

394

395

/** Get message containing the select menu */

396

Message getMessage();

397

}

398

399

/**

400

* String select menu builder.

401

*/

402

class StringSelectMenu {

403

/** Create string select menu builder */

404

static StringSelectMenu.Builder create(String customId);

405

406

static class Builder {

407

/** Set placeholder text */

408

Builder setPlaceholder(String placeholder);

409

410

/** Set value range */

411

Builder setRequiredRange(int min, int max);

412

Builder setMinValues(int min);

413

Builder setMaxValues(int max);

414

415

/** Add option */

416

Builder addOption(String label, String value);

417

Builder addOption(String label, String value, String description);

418

Builder addOption(String label, String value, String description, Emoji emoji);

419

Builder addOption(String label, String value, String description, boolean defaultValue);

420

421

/** Add options */

422

Builder addOptions(SelectOption... options);

423

Builder addOptions(Collection<? extends SelectOption> options);

424

425

/** Set as disabled */

426

Builder setDisabled(boolean disabled);

427

428

/** Build the select menu */

429

StringSelectMenu build();

430

}

431

}

432

433

/**

434

* Entity select menu for Discord entities.

435

*/

436

class EntitySelectMenu {

437

/** Create entity select menu builder */

438

static EntitySelectMenu.Builder create(String customId, SelectTarget target);

439

440

enum SelectTarget {

441

USER, ROLE, MENTIONABLE, CHANNEL

442

}

443

444

static class Builder {

445

/** Set placeholder text */

446

Builder setPlaceholder(String placeholder);

447

448

/** Set value range */

449

Builder setRequiredRange(int min, int max);

450

Builder setMinValues(int min);

451

Builder setMaxValues(int max);

452

453

/** Set channel types (for channel select) */

454

Builder setChannelTypes(ChannelType... types);

455

Builder setChannelTypes(Collection<ChannelType> types);

456

457

/** Set default values */

458

Builder setDefaultValues(SelectOption... options);

459

Builder setDefaultValues(Collection<? extends SelectOption> options);

460

461

/** Set as disabled */

462

Builder setDisabled(boolean disabled);

463

464

/** Build the select menu */

465

EntitySelectMenu build();

466

}

467

}

468

469

/**

470

* Select option builder.

471

*/

472

class SelectOption {

473

/** Create select option */

474

static SelectOption of(String label, String value);

475

static SelectOption of(String label, String value, String description);

476

static SelectOption of(String label, String value, String description, Emoji emoji);

477

478

/** Get option properties */

479

String getLabel();

480

String getValue();

481

String getDescription();

482

Emoji getEmoji();

483

boolean isDefault();

484

485

/** Create modified versions */

486

SelectOption withLabel(String label);

487

SelectOption withValue(String value);

488

SelectOption withDescription(String description);

489

SelectOption withEmoji(Emoji emoji);

490

SelectOption withDefault(boolean defaultValue);

491

}

492

```

493

494

**Usage Examples:**

495

496

```java

497

import net.dv8tion.jda.api.interactions.components.selections.StringSelectMenu;

498

import net.dv8tion.jda.api.interactions.components.selections.SelectOption;

499

import net.dv8tion.jda.api.events.interaction.component.StringSelectInteractionEvent;

500

501

// Create select menu

502

StringSelectMenu gameMenu = StringSelectMenu.create("game-select")

503

.setPlaceholder("Choose your favorite games")

504

.setRequiredRange(1, 3)

505

.addOptions(

506

SelectOption.of("Minecraft", "minecraft")

507

.withDescription("Block building sandbox game")

508

.withEmoji(Emoji.fromUnicode("🧱")),

509

SelectOption.of("Valorant", "valorant")

510

.withDescription("Tactical shooter game")

511

.withEmoji(Emoji.fromUnicode("🔫")),

512

SelectOption.of("League of Legends", "lol")

513

.withDescription("MOBA game")

514

.withEmoji(Emoji.fromUnicode("⚔️")),

515

SelectOption.of("Among Us", "amongus")

516

.withDescription("Social deduction game")

517

.withEmoji(Emoji.fromUnicode("👾"))

518

)

519

.build();

520

521

channel.sendMessage("What games do you play?")

522

.setComponents(ActionRow.of(gameMenu))

523

.queue();

524

525

// Handle select menu interactions

526

public class SelectMenuHandler extends ListenerAdapter {

527

@Override

528

public void onStringSelectInteraction(StringSelectInteractionEvent event) {

529

if (event.getComponentId().equals("game-select")) {

530

List<String> selectedGames = event.getValues();

531

532

String response = "You selected: " + String.join(", ", selectedGames);

533

534

// Get role assignments based on games

535

List<Role> rolesToAdd = new ArrayList<>();

536

Guild guild = event.getGuild();

537

538

for (String game : selectedGames) {

539

Role gameRole = guild.getRolesByName(game + "-player", true).stream()

540

.findFirst()

541

.orElse(null);

542

if (gameRole != null) {

543

rolesToAdd.add(gameRole);

544

}

545

}

546

547

if (!rolesToAdd.isEmpty()) {

548

Member member = event.getMember();

549

guild.modifyMemberRoles(member, rolesToAdd, null)

550

.queue(success -> {

551

event.reply(response + "\n🎮 Game roles have been assigned!").setEphemeral(true).queue();

552

});

553

} else {

554

event.reply(response).setEphemeral(true).queue();

555

}

556

}

557

}

558

}

559

```

560

561

### Modal Interactions

562

563

Form-based interactions for collecting user input through text fields.

564

565

```java { .api }

566

/**

567

* Represents a modal form interaction.

568

*/

569

interface ModalInteraction extends IReplyCallback {

570

/** Get modal ID */

571

String getModalId();

572

573

/** Get value by component ID */

574

ModalMapping getValue(String id);

575

576

/** Get all input values */

577

List<ModalMapping> getValues();

578

}

579

580

/**

581

* Represents a modal input value.

582

*/

583

interface ModalMapping {

584

/** Get component ID */

585

String getId();

586

587

/** Get input type */

588

TextInput.InputType getType();

589

590

/** Get input value */

591

String getAsString();

592

}

593

594

/**

595

* Modal builder.

596

*/

597

class Modal {

598

/** Create modal builder */

599

static Modal.Builder create(String id, String title);

600

601

static class Builder {

602

/** Add text input component */

603

Builder addActionRows(ActionRow... actionRows);

604

Builder addActionRows(Collection<? extends ActionRow> actionRows);

605

606

/** Add components */

607

Builder addComponents(ItemComponent... components);

608

609

/** Build the modal */

610

Modal build();

611

}

612

}

613

614

/**

615

* Text input component for modals.

616

*/

617

class TextInput {

618

/** Create short text input */

619

static TextInput.Builder create(String id, String label, InputType style);

620

621

enum InputType {

622

SHORT, PARAGRAPH

623

}

624

625

static class Builder {

626

/** Set placeholder text */

627

Builder setPlaceholder(String placeholder);

628

629

/** Set as required */

630

Builder setRequired(boolean required);

631

632

/** Set default value */

633

Builder setValue(String value);

634

635

/** Set length range */

636

Builder setRequiredRange(int min, int max);

637

Builder setMinLength(int min);

638

Builder setMaxLength(int max);

639

640

/** Build the text input */

641

TextInput build();

642

}

643

}

644

```

645

646

**Usage Examples:**

647

648

```java

649

import net.dv8tion.jda.api.interactions.modals.Modal;

650

import net.dv8tion.jda.api.interactions.components.text.TextInput;

651

import net.dv8tion.jda.api.interactions.components.text.TextInputStyle;

652

import net.dv8tion.jda.api.events.interaction.ModalInteractionEvent;

653

654

// Create and show modal

655

public void showFeedbackModal(SlashCommandInteractionEvent event) {

656

TextInput subject = TextInput.create("subject", "Subject", TextInputStyle.SHORT)

657

.setPlaceholder("Brief summary of your feedback")

658

.setMaxLength(100)

659

.setRequired(true)

660

.build();

661

662

TextInput feedback = TextInput.create("feedback", "Feedback", TextInputStyle.PARAGRAPH)

663

.setPlaceholder("Detailed feedback...")

664

.setMaxLength(1000)

665

.setRequired(true)

666

.build();

667

668

Modal modal = Modal.create("feedback-modal", "Submit Feedback")

669

.addActionRows(ActionRow.of(subject), ActionRow.of(feedback))

670

.build();

671

672

event.replyModal(modal).queue();

673

}

674

675

// Handle modal interactions

676

public class ModalHandler extends ListenerAdapter {

677

@Override

678

public void onModalInteraction(ModalInteractionEvent event) {

679

if (event.getModalId().equals("feedback-modal")) {

680

String subject = event.getValue("subject").getAsString();

681

String feedback = event.getValue("feedback").getAsString();

682

683

// Process feedback

684

EmbedBuilder embed = new EmbedBuilder()

685

.setTitle("Feedback Received")

686

.addField("Subject", subject, false)

687

.addField("Feedback", feedback, false)

688

.addField("User", event.getUser().getAsTag(), true)

689

.addField("Guild", event.getGuild().getName(), true)

690

.setTimestamp(Instant.now())

691

.setColor(Color.GREEN);

692

693

// Send to feedback channel

694

TextChannel feedbackChannel = event.getGuild().getTextChannelsByName("feedback", true).stream()

695

.findFirst()

696

.orElse(null);

697

698

if (feedbackChannel != null) {

699

feedbackChannel.sendMessageEmbeds(embed.build()).queue();

700

}

701

702

event.reply("Thank you for your feedback! We'll review it soon.").setEphemeral(true).queue();

703

}

704

}

705

}

706

```

707

708

### Context Menu Commands

709

710

Right-click context menu commands for users and messages.

711

712

```java { .api }

713

/**

714

* User context menu interaction.

715

*/

716

interface UserContextInteraction extends IReplyCallback {

717

/** Get target user */

718

User getTarget();

719

720

/** Get target member */

721

Member getTargetMember();

722

}

723

724

/**

725

* Message context menu interaction.

726

*/

727

interface MessageContextInteraction extends IReplyCallback {

728

/** Get target message */

729

Message getTarget();

730

}

731

```

732

733

**Usage Examples:**

734

735

```java

736

// Register context menu commands

737

jda.updateCommands().addCommands(

738

Commands.user("Get Avatar"),

739

Commands.message("Report Message")

740

).queue();

741

742

// Handle context menu interactions

743

public class ContextMenuHandler extends ListenerAdapter {

744

@Override

745

public void onUserContextInteraction(UserContextInteractionEvent event) {

746

if (event.getName().equals("Get Avatar")) {

747

User target = event.getTarget();

748

749

EmbedBuilder embed = new EmbedBuilder()

750

.setTitle(target.getName() + "'s Avatar")

751

.setImage(target.getEffectiveAvatarUrl() + "?size=256")

752

.setColor(Color.BLUE);

753

754

event.replyEmbeds(embed.build()).queue();

755

}

756

}

757

758

@Override

759

public void onMessageContextInteraction(MessageContextInteractionEvent event) {

760

if (event.getName().equals("Report Message")) {

761

Message target = event.getTarget();

762

763

// Create report modal

764

TextInput reason = TextInput.create("reason", "Reason", TextInputStyle.PARAGRAPH)

765

.setPlaceholder("Why are you reporting this message?")

766

.setRequired(true)

767

.build();

768

769

Modal modal = Modal.create("report-modal", "Report Message")

770

.addActionRows(ActionRow.of(reason))

771

.build();

772

773

event.replyModal(modal).queue();

774

}

775

}

776

}

777

```

778

779

## Types

780

781

```java { .api }

782

// Option types for slash commands

783

enum OptionType {

784

SUB_COMMAND, SUB_COMMAND_GROUP, STRING, INTEGER, BOOLEAN, USER, CHANNEL, ROLE, MENTIONABLE, NUMBER, ATTACHMENT

785

}

786

787

// Button styles

788

enum ButtonStyle {

789

PRIMARY, SECONDARY, SUCCESS, DANGER, LINK

790

}

791

792

// Text input styles

793

enum TextInputStyle {

794

SHORT, PARAGRAPH

795

}

796

797

// Interaction context types

798

enum InteractionContextType {

799

GUILD, BOT_DM, PRIVATE_CHANNEL

800

}

801

802

// Default member permissions

803

class DefaultMemberPermissions {

804

static DefaultMemberPermissions ENABLED;

805

static DefaultMemberPermissions DISABLED;

806

807

static DefaultMemberPermissions enabledFor(Permission... permissions);

808

static DefaultMemberPermissions enabledFor(Collection<Permission> permissions);

809

}

810

```