All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.dv8tion.jda.api.requests.restaction.GuildAction Maven / Gradle / Ivy

Go to download

Java wrapper for the popular chat & VOIP service: Discord https://discord.com

There is a newer version: 5.1.0
Show newest version
/*
 * 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.requests.restaction;

import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Icon;
import net.dv8tion.jda.api.entities.channel.ChannelType;
import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
import net.dv8tion.jda.api.requests.RestAction;
import net.dv8tion.jda.api.utils.data.DataObject;
import net.dv8tion.jda.api.utils.data.SerializableData;
import net.dv8tion.jda.internal.requests.restaction.PermOverrideData;
import net.dv8tion.jda.internal.utils.Checks;

import javax.annotation.CheckReturnValue;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.awt.*;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.function.BooleanSupplier;

/**
 * {@link net.dv8tion.jda.api.requests.RestAction RestAction} extension
 * specifically designed to allow for the creation of {@link net.dv8tion.jda.api.entities.Guild Guilds}.
 * 
This is available to all account types but may undergo certain restrictions by Discord. * * @since 3.4.0 * * @see net.dv8tion.jda.api.JDA#createGuild(String) */ public interface GuildAction extends RestAction { @Nonnull @Override GuildAction setCheck(@Nullable BooleanSupplier checks); @Nonnull @Override GuildAction timeout(long timeout, @Nonnull TimeUnit unit); @Nonnull @Override GuildAction deadline(long timestamp); /** * Sets the {@link net.dv8tion.jda.api.entities.Icon Icon} * for the resulting {@link net.dv8tion.jda.api.entities.Guild Guild} * * @param icon * The {@link net.dv8tion.jda.api.entities.Icon Icon} to use * * @return The current GuildAction for chaining convenience */ @Nonnull @CheckReturnValue GuildAction setIcon(@Nullable Icon icon); /** * Sets the name for the resulting {@link net.dv8tion.jda.api.entities.Guild Guild} * * @param name * The name to use * * @throws java.lang.IllegalArgumentException * If the provided name is {@code null}, blank or not between 2-100 characters long * * @return The current GuildAction for chaining convenience */ @Nonnull @CheckReturnValue GuildAction setName(@Nonnull String name); /** * Sets the {@link net.dv8tion.jda.api.entities.Guild.VerificationLevel VerificationLevel} * for the resulting {@link net.dv8tion.jda.api.entities.Guild Guild} * * @param level * The {@link net.dv8tion.jda.api.entities.Guild.VerificationLevel VerificationLevel} to use * * @return The current GuildAction for chaining convenience */ @Nonnull @CheckReturnValue GuildAction setVerificationLevel(@Nullable Guild.VerificationLevel level); /** * Sets the {@link net.dv8tion.jda.api.entities.Guild.NotificationLevel NotificationLevel} * for the resulting {@link net.dv8tion.jda.api.entities.Guild Guild} * * @param level * The {@link net.dv8tion.jda.api.entities.Guild.NotificationLevel NotificationLevel} to use * * @return The current GuildAction for chaining convenience */ @Nonnull @CheckReturnValue GuildAction setNotificationLevel(@Nullable Guild.NotificationLevel level); /** * Sets the {@link net.dv8tion.jda.api.entities.Guild.ExplicitContentLevel ExplicitContentLevel} * for the resulting {@link net.dv8tion.jda.api.entities.Guild Guild} * * @param level * The {@link net.dv8tion.jda.api.entities.Guild.ExplicitContentLevel ExplicitContentLevel} to use * * @return The current GuildAction for chaining convenience */ @Nonnull @CheckReturnValue GuildAction setExplicitContentLevel(@Nullable Guild.ExplicitContentLevel level); /** * Adds a {@link GuildChannel GuildChannel} to the resulting * Guild. This cannot be of type {@link ChannelType#CATEGORY CATEGORY}! * * @param channel * The {@link ChannelData ChannelData} * to use for the construction of the GuildChannel * * @throws java.lang.IllegalArgumentException * If the provided channel is {@code null}! * * @return The current GuildAction for chaining convenience */ @Nonnull @CheckReturnValue GuildAction addChannel(@Nonnull ChannelData channel); /** * Gets the {@link ChannelData ChannelData} * of the specified index. The index is 0 based on insertion order of {@link #addChannel(ChannelData)}! * * @param index * The 0 based index of the channel * * @throws java.lang.IndexOutOfBoundsException * If the provided index is not in bounds * * @return The current GuildAction for chaining convenience */ @Nonnull @CheckReturnValue ChannelData getChannel(int index); /** * Removes the {@link ChannelData ChannelData} * at the specified index and returns the removed object. * * @param index * The index of the channel * * @throws java.lang.IndexOutOfBoundsException * If the index is out of bounds * * @return The removed object */ @Nonnull @CheckReturnValue ChannelData removeChannel(int index); /** * Removes the provided {@link ChannelData ChannelData} * from this GuildAction if present. * * @param data * The ChannelData to remove * * @return The current GuildAction for chaining convenience */ @Nonnull @CheckReturnValue GuildAction removeChannel(@Nonnull ChannelData data); /** * Creates a new {@link ChannelData ChannelData} * instance and adds it to this GuildAction. * * @param type * The {@link ChannelType ChannelType} of the resulting GuildChannel *
This may be of type {@link ChannelType#TEXT TEXT} or {@link ChannelType#VOICE VOICE}! * @param name * The name of the channel. * * @throws java.lang.IllegalArgumentException *
    *
  • If provided with an invalid ChannelType
  • *
  • If the provided name is {@code null} or blank
  • *
  • If the provided name is not between 2-100 characters long
  • *
* * @return The new ChannelData instance */ @Nonnull @CheckReturnValue ChannelData newChannel(@Nonnull ChannelType type, @Nonnull String name); /** * Retrieves the {@link RoleData RoleData} for the * public role ({@link net.dv8tion.jda.api.entities.Guild#getPublicRole() Guild.getPublicRole()}) for the resulting Guild. *
The public role is also known in the official client as the {@code @everyone} role. * *

You can only change the permissions of the public role! * * @return RoleData of the public role */ @Nonnull @CheckReturnValue RoleData getPublicRole(); /** * Retrieves the {@link RoleData RoleData} for the * provided index. *
The public role is at the index 0 and all others are ordered by insertion order! * * @param index * The index of the role * * @throws java.lang.IndexOutOfBoundsException * If the provided index is out of bounds * * @return RoleData of the provided index */ @Nonnull @CheckReturnValue RoleData getRole(int index); /** * Creates and add a new {@link RoleData RoleData} object * representing a Role for the resulting Guild. * *

This can be used in {@link GuildAction.ChannelData#addPermissionOverride(GuildAction.RoleData, long, long) ChannelData.addPermissionOverride(...)}. *
You may change any properties of this {@link RoleData RoleData} instance! * * @return RoleData for the new Role */ @Nonnull @CheckReturnValue RoleData newRole(); /** * Mutable object containing information on a {@link net.dv8tion.jda.api.entities.Role Role} * of the resulting {@link net.dv8tion.jda.api.entities.Guild Guild} that is constructed by a GuildAction instance * *

This may be used in {@link GuildAction.ChannelData#addPermissionOverride(GuildAction.RoleData, long, long)} ChannelData.addPermissionOverride(...)}! */ class RoleData implements SerializableData { protected final long id; protected final boolean isPublicRole; protected Long permissions; protected String name; protected Integer color; protected Integer position; protected Boolean mentionable, hoisted; public RoleData(long id) { this.id = id; this.isPublicRole = id == 0; } /** * Sets the raw permission value for this Role * * @param rawPermissions * Raw permission value * * @return The current RoleData instance for chaining convenience */ @Nonnull public RoleData setPermissionsRaw(@Nullable Long rawPermissions) { this.permissions = rawPermissions; return this; } /** * Adds the provided permissions to the Role * * @param permissions * The permissions to add * * @throws java.lang.IllegalArgumentException * If any of the provided permissions is {@code null} * * @return The current RoleData instance for chaining convenience */ @Nonnull public RoleData addPermissions(@Nonnull Permission... permissions) { Checks.notNull(permissions, "Permissions"); for (Permission perm : permissions) Checks.notNull(perm, "Permissions"); if (this.permissions == null) this.permissions = 0L; this.permissions |= Permission.getRaw(permissions); return this; } /** * Adds the provided permissions to the Role * * @param permissions * The permissions to add * * @throws java.lang.IllegalArgumentException * If any of the provided permissions is {@code null} * * @return The current RoleData instance for chaining convenience */ @Nonnull public RoleData addPermissions(@Nonnull Collection permissions) { Checks.noneNull(permissions, "Permissions"); if (this.permissions == null) this.permissions = 0L; this.permissions |= Permission.getRaw(permissions); return this; } /** * Sets the name for this Role * * @param name * The name * * @throws java.lang.IllegalStateException * If this is the public role * * @return The current RoleData instance for chaining convenience */ @Nonnull public RoleData setName(@Nullable String name) { checkPublic("name"); this.name = name; return this; } /** * Sets the color for this Role * * @param color * The color for this Role * * @throws java.lang.IllegalStateException * If this is the public role * * @return The current RoleData instance for chaining convenience */ @Nonnull public RoleData setColor(@Nullable Color color) { checkPublic("color"); this.color = color == null ? null : color.getRGB(); return this; } /** * Sets the color for this Role * * @param color * The color for this Role, or {@code null} to unset * * @throws java.lang.IllegalStateException * If this is the public role * * @return The current RoleData instance for chaining convenience */ @Nonnull public RoleData setColor(@Nullable Integer color) { checkPublic("color"); this.color = color; return this; } /** * Sets the position for this Role * * @param position * The position * * @throws java.lang.IllegalStateException * If this is the public role * * @return The current RoleData instance for chaining convenience */ @Nonnull public RoleData setPosition(@Nullable Integer position) { checkPublic("position"); this.position = position; return this; } /** * Sets whether the Role is mentionable * * @param mentionable * Whether the role is mentionable * * @throws java.lang.IllegalStateException * If this is the public role * * @return The current RoleData instance for chaining convenience */ @Nonnull public RoleData setMentionable(@Nullable Boolean mentionable) { checkPublic("mentionable"); this.mentionable = mentionable; return this; } /** * Sets whether the Role is hoisted * * @param hoisted * Whether the role is hoisted * * @throws java.lang.IllegalStateException * If this is the public role * * @return The current RoleData instance for chaining convenience */ @Nonnull public RoleData setHoisted(@Nullable Boolean hoisted) { checkPublic("hoisted"); this.hoisted = hoisted; return this; } @Nonnull @Override public DataObject toData() { final DataObject o = DataObject.empty().put("id", Long.toUnsignedString(id)); if (permissions != null) o.put("permissions", permissions); if (position != null) o.put("position", position); if (name != null) o.put("name", name); if (color != null) o.put("color", color & 0xFFFFFF); if (mentionable != null) o.put("mentionable", mentionable); if (hoisted != null) o.put("hoist", hoisted); return o; } protected void checkPublic(String comment) { if (isPublicRole) throw new IllegalStateException("Cannot modify " + comment + " for the public role!"); } } /** * GuildChannel information used for the creation of {@link GuildChannel Channels} within * the construction of a {@link net.dv8tion.jda.api.entities.Guild Guild} via GuildAction. * *

Use with {@link #addChannel(ChannelData) GuildAction.addChannel(ChannelData)}. */ class ChannelData implements SerializableData { protected final ChannelType type; protected final String name; protected final Set overrides = new HashSet<>(); protected Integer position; // Text only protected String topic; protected Boolean nsfw; // Voice only protected Integer bitrate, userlimit; /** * Constructs a data object containing information on * a {@link GuildChannel GuildChannel} to be used in the construction * of a {@link net.dv8tion.jda.api.entities.Guild Guild}! * * @param type * The {@link ChannelType ChannelType} of the resulting GuildChannel *
This may be of type {@link ChannelType#TEXT TEXT} or {@link ChannelType#VOICE VOICE}! * @param name * The name of the channel. * * @throws java.lang.IllegalArgumentException *

    *
  • If provided with an invalid ChannelType
  • *
  • If the provided name is {@code null} or blank
  • *
  • If the provided name is not between 2-100 characters long
  • *
*/ public ChannelData(ChannelType type, String name) { Checks.notBlank(name, "Name"); Checks.check(type == ChannelType.TEXT || type == ChannelType.VOICE || type == ChannelType.STAGE, "Can only create channels of type TEXT, STAGE, or VOICE in GuildAction!"); Checks.check(name.length() >= 2 && name.length() <= 100, "Channel name has to be between 2-100 characters long!"); this.type = type; this.name = name; } /** * Sets the topic for this channel. *
These are only relevant to channels of type {@link ChannelType#TEXT TEXT}. * * @param topic * The topic for the channel * * @throws java.lang.IllegalArgumentException * If the provided topic is bigger than 1024 characters * * @return This ChannelData instance for chaining convenience */ @Nonnull public ChannelData setTopic(@Nullable String topic) { if (topic != null && topic.length() > 1024) throw new IllegalArgumentException("Channel Topic must not be greater than 1024 in length!"); this.topic = topic; return this; } /** * Sets the whether this channel should be marked NSFW. *
These are only relevant to channels of type {@link ChannelType#TEXT TEXT}. * * @param nsfw * Whether this channel should be marked NSFW * * @return This ChannelData instance for chaining convenience */ @Nonnull public ChannelData setNSFW(@Nullable Boolean nsfw) { this.nsfw = nsfw; return this; } /** * Sets the bitrate for this channel. *
These are only relevant to channels of type {@link ChannelType#VOICE VOICE}. * * @param bitrate * The bitrate for the channel (8000-96000) * * @throws java.lang.IllegalArgumentException * If the provided bitrate is not between 8000-96000 * * @return This ChannelData instance for chaining convenience */ @Nonnull public ChannelData setBitrate(@Nullable Integer bitrate) { if (bitrate != null) { Checks.check(bitrate >= 8000, "Bitrate must be greater than 8000."); Checks.check(bitrate <= 96000, "Bitrate must be less than 96000."); } this.bitrate = bitrate; return this; } /** * Sets the userlimit for this channel. *
These are only relevant to channels of type {@link ChannelType#VOICE VOICE}. * * @param userlimit * The userlimit for the channel (0-99) * * @throws java.lang.IllegalArgumentException * If the provided userlimit is not between 0-99 * * @return This ChannelData instance for chaining convenience */ @Nonnull public ChannelData setUserlimit(@Nullable Integer userlimit) { if (userlimit != null && (userlimit < 0 || userlimit > 99)) throw new IllegalArgumentException("Userlimit must be between 0-99!"); this.userlimit = userlimit; return this; } /** * Sets the position for this channel. * * @param position * The position for the channel * * @return This ChannelData instance for chaining convenience */ @Nonnull public ChannelData setPosition(@Nullable Integer position) { this.position = position; return this; } /** * Adds a {@link net.dv8tion.jda.api.entities.PermissionOverride PermissionOverride} to this channel * with the provided {@link RoleData RoleData}! *
Use {@link #newRole() GuildAction.newRole()} to retrieve an instance of RoleData. * * @param role * The target role * @param allow * The permissions to grant in the override * @param deny * The permissions to deny in the override * * @throws java.lang.IllegalArgumentException * If the provided role is {@code null} * * @return This ChannelData instance for chaining convenience */ @Nonnull public ChannelData addPermissionOverride(@Nonnull GuildAction.RoleData role, long allow, long deny) { Checks.notNull(role, "Role"); this.overrides.add(new PermOverrideData(PermOverrideData.ROLE_TYPE, role.id, allow, deny)); return this; } /** * Adds a {@link net.dv8tion.jda.api.entities.PermissionOverride PermissionOverride} to this channel * with the provided {@link GuildAction.RoleData RoleData}! *
Use {@link #newRole() GuildAction.newRole()} to retrieve an instance of RoleData. * * @param role * The target role * @param allow * The permissions to grant in the override * @param deny * The permissions to deny in the override * * @throws java.lang.IllegalArgumentException *
    *
  • If the provided role is {@code null}
  • *
  • If any permission is {@code null}
  • *
* * @return This ChannelData instance for chaining convenience */ @Nonnull public ChannelData addPermissionOverride(@Nonnull GuildAction.RoleData role, @Nullable Collection allow, @Nullable Collection deny) { long allowRaw = 0; long denyRaw = 0; if (allow != null) { Checks.noneNull(allow, "Granted Permissions"); allowRaw = Permission.getRaw(allow); } if (deny != null) { Checks.noneNull(deny, "Denied Permissions"); denyRaw = Permission.getRaw(deny); } return addPermissionOverride(role, allowRaw, denyRaw); } @Nonnull @Override public DataObject toData() { final DataObject o = DataObject.empty(); o.put("name", name); o.put("type", type.getId()); if (topic != null) o.put("topic", topic); if (nsfw != null) o.put("nsfw", nsfw); if (bitrate != null) o.put("bitrate", bitrate); if (userlimit != null) o.put("user_limit", userlimit); if (position != null) o.put("position", position); if (!overrides.isEmpty()) o.put("permission_overwrites", overrides); return o; } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy