Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions src/main/java/net/dv8tion/jda/api/JDA.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
import net.dv8tion.jda.api.entities.emoji.CustomEmoji;
import net.dv8tion.jda.api.entities.emoji.RichCustomEmoji;
import net.dv8tion.jda.api.entities.sticker.*;
import net.dv8tion.jda.api.requests.restaction.pagination.SubscriptionPaginationAction;
import net.dv8tion.jda.internal.entities.subscription.Subscription;
import net.dv8tion.jda.api.events.GenericEvent;
import net.dv8tion.jda.api.hooks.IEventManager;
import net.dv8tion.jda.api.interactions.commands.Command;
Expand Down Expand Up @@ -2122,6 +2124,51 @@ default RestAction<Void> deleteTestEntitlement(@Nonnull String entitlementId)
@CheckReturnValue
RestAction<Void> deleteTestEntitlement(long entitlementId);

/**
* Retrieves a List of {@link Subscription} by SKU id
*
* @param skuId
* The SKU id of the List
*
* @return {@link SubscriptionPaginationAction}
*/
@Nonnull
@CheckReturnValue
SubscriptionPaginationAction retrieveSubscriptionsBySkuId(@Nonnull SkuSnowflake skuId);

/**
* Retrieves a {@link Subscription} by its id and SKU id
*
* @param skuId
* The SKU id of the List where to find subscription
* @param subscriptionId
* The String id of the subscription to retrieve
*
* @return {@link RestAction} - Type: {@link Subscription}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is an extra newline between @param and @return

* <br> The Subscription with the provided id
*/
@Nonnull
@CheckReturnValue
default RestAction<Subscription> retrieveSubscriptionBySkuId(@Nonnull SkuSnowflake skuId, @Nonnull String subscriptionId)
{
return retrieveSubscriptionBySkuId(skuId, MiscUtil.parseSnowflake(subscriptionId));
}

/**
* Retrieves a {@link Subscription} by its id and SKU id
*
* @param skuId
* The SKU id of the List where to find subscription
* @param subscriptionId
* The id of the subscription to retrieve
*
* @return {@link RestAction} - Type: {@link Subscription}
* <br> The Subscription with the provided id
*/
@Nonnull
@CheckReturnValue
RestAction<Subscription> retrieveSubscriptionBySkuId(@Nonnull SkuSnowflake skuId, long subscriptionId);

/**
* 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.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package net.dv8tion.jda.api.events.subscription;

import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.internal.entities.subscription.Subscription;
import net.dv8tion.jda.api.events.Event;

import javax.annotation.Nonnull;

/**
* Indicates that an {@link Subscription Subscription} was either created, updated, or deleted
*
* @see SubscriptionCreateEvent
* @see SubscriptionUpdateEvent
* @see SubscriptionDeleteEvent
*/
public abstract class GenericSubscriptionEvent extends Event
{
protected final Subscription subscription;

protected GenericSubscriptionEvent(@Nonnull JDA api, long responseNumber, @Nonnull Subscription subscription)
{
super(api, responseNumber);
this.subscription = subscription;
}

/**
* The {@link Subscription}
*
* @return The {@link Subscription}
*/
@Nonnull
public Subscription getSubscription()
{
return subscription;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package net.dv8tion.jda.api.events.subscription;

import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.internal.entities.subscription.Subscription;

/**
* Indicate that a Subscription for Premium app was created
*/
public class SubscriptionCreateEvent extends GenericSubscriptionEvent
{
public SubscriptionCreateEvent(JDA api, long responseNumber, Subscription subscription)
{
super(api, responseNumber, subscription);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package net.dv8tion.jda.api.events.subscription;

import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.internal.entities.subscription.Subscription;
import org.jetbrains.annotations.NotNull;

/**
* Indicate that a Subscription for Premium app was deleted
*/
public class SubscriptionDeleteEvent extends GenericSubscriptionEvent
{
public SubscriptionDeleteEvent(@NotNull JDA api, long responseNumber, @NotNull Subscription subscription)
{
super(api, responseNumber, subscription);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package net.dv8tion.jda.api.events.subscription;

import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.internal.entities.subscription.Subscription;
import org.jetbrains.annotations.NotNull;

/**
* Indicates that a Subscription for Premium app was updated
*/
public class SubscriptionUpdateEvent extends GenericSubscriptionEvent
{
public SubscriptionUpdateEvent(@NotNull JDA api, long responseNumber, @NotNull Subscription subscription)
{
super(api, responseNumber, subscription);
}
}
10 changes: 10 additions & 0 deletions src/main/java/net/dv8tion/jda/api/hooks/ListenerAdapter.java
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,10 @@
import net.dv8tion.jda.api.events.sticker.GuildStickerAddedEvent;
import net.dv8tion.jda.api.events.sticker.GuildStickerRemovedEvent;
import net.dv8tion.jda.api.events.sticker.update.*;
import net.dv8tion.jda.api.events.subscription.GenericSubscriptionEvent;
import net.dv8tion.jda.api.events.subscription.SubscriptionCreateEvent;
import net.dv8tion.jda.api.events.subscription.SubscriptionUpdateEvent;
import net.dv8tion.jda.api.events.subscription.SubscriptionDeleteEvent;
import net.dv8tion.jda.api.events.thread.GenericThreadEvent;
import net.dv8tion.jda.api.events.thread.ThreadHiddenEvent;
import net.dv8tion.jda.api.events.thread.ThreadRevealedEvent;
Expand Down Expand Up @@ -371,6 +375,11 @@ public void onGuildStickerUpdateTags(@Nonnull GuildStickerUpdateTagsEvent event)
public void onGuildStickerUpdateDescription(@Nonnull GuildStickerUpdateDescriptionEvent event) {}
public void onGuildStickerUpdateAvailable(@Nonnull GuildStickerUpdateAvailableEvent event) {}

//Subscription events
public void onSubscriptionCreate(@Nonnull SubscriptionCreateEvent event) {}
public void onSubscriptionUpdate(@Nonnull SubscriptionUpdateEvent event) {}
public void onSubscriptionDelete(@Nonnull SubscriptionDeleteEvent event) {}

// Entitlement events
public void onEntitlementCreate(@Nonnull EntitlementCreateEvent event) {}
public void onEntitlementUpdate(@Nonnull EntitlementUpdateEvent event) {}
Expand Down Expand Up @@ -420,6 +429,7 @@ public void onGenericScheduledEventGateway(@Nonnull GenericScheduledEventGateway
public void onGenericScheduledEventUser(@Nonnull GenericScheduledEventUserEvent event) {}
public void onGenericForumTag(@Nonnull GenericForumTagEvent event) {}
public void onGenericForumTagUpdate(@Nonnull GenericForumTagUpdateEvent event) {}
public void onGenericSubscription(@Nonnull GenericSubscriptionEvent event) {}

private static final MethodHandles.Lookup lookup = MethodHandles.lookup();
private static final ConcurrentMap<Class<?>, MethodHandle> methods = new ConcurrentHashMap<>();
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/net/dv8tion/jda/api/requests/Route.java
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,12 @@ public static class Users
public static final Route GET_USER = new Route(GET, "users/{user_id}");
}

public static class Sku
{
public static final Route GET_SUBSCRIPTIONS = new Route(GET, "skus/{sku.id}/subscriptions");
public static final Route GET_SUBSCRIPTION = new Route(GET, "skus/{sku.id}/subscriptions/{subscription_id}");
}

public static class Guilds
{
public static final Route GET_GUILD = new Route(GET, "guilds/{guild_id}");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package net.dv8tion.jda.api.requests.restaction.pagination;

import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.entities.UserSnowflake;
import net.dv8tion.jda.internal.entities.subscription.Subscription;

import javax.annotation.CheckReturnValue;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;

/**
* {@link PaginationAction PaginationAction} that paginates over
* {@link Subscription Subscriptions} returned from the
* <a href="https://discord.com/developers/docs/resources/subscription#list-sku-subscriptions"
* target="_blank">List SKU Subscriptions</a> endpoint.
* <br>This action allows retrieval of subscriptions for a specific SKU, optionally filtered by a user.
*
* <p>Use {@link #user(UserSnowflake)} to limit results to a specific user, or {@code null} to remove the filter.
* <br>Results are ordered according to {@link PaginationOrder} and support typical pagination
* parameters such as {@link #limit(int)} and {@link #cache(boolean)}.
*
* @see PaginationAction
* @see Subscription
*/
public interface SubscriptionPaginationAction extends PaginationAction<Subscription, SubscriptionPaginationAction>
{

/**
* Filter {@link Subscription Subscription}s to retrieve by the given user ID
*
* @param user
* The {@link UserSnowflake UserSnowflake} used to filter or {@code null} to remove user filtering.
* This can be a member or user instance of {@link User#fromId(long)}
*
* @return The current {@link SubscriptionPaginationAction SubscriptionPaginationAction} for chaining convenience
*/
@Nonnull
@CheckReturnValue
SubscriptionPaginationAction user(@Nullable UserSnowflake user);
}
19 changes: 18 additions & 1 deletion src/main/java/net/dv8tion/jda/internal/JDAImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@
import net.dv8tion.jda.api.entities.sticker.StickerPack;
import net.dv8tion.jda.api.entities.sticker.StickerSnowflake;
import net.dv8tion.jda.api.entities.sticker.StickerUnion;
import net.dv8tion.jda.api.requests.restaction.pagination.SubscriptionPaginationAction;
import net.dv8tion.jda.internal.entities.subscription.Subscription;
import net.dv8tion.jda.api.events.GatewayPingEvent;
import net.dv8tion.jda.api.events.GenericEvent;
import net.dv8tion.jda.api.events.StatusChangeEvent;
Expand Down Expand Up @@ -75,6 +77,7 @@
import net.dv8tion.jda.internal.requests.*;
import net.dv8tion.jda.internal.requests.restaction.*;
import net.dv8tion.jda.internal.requests.restaction.pagination.EntitlementPaginationActionImpl;
import net.dv8tion.jda.internal.requests.restaction.pagination.SubscriptionPaginationActionImpl;
import net.dv8tion.jda.internal.utils.*;
import net.dv8tion.jda.internal.utils.Helpers;
import net.dv8tion.jda.internal.utils.cache.AbstractCacheView;
Expand Down Expand Up @@ -1257,11 +1260,25 @@ public EntitlementPaginationAction retrieveEntitlements()

@Nonnull
@Override
public RestAction<Entitlement> retrieveEntitlementById(long entitlementId)
public RestAction<Entitlement> retrieveEntitlementById(@Nonnull long entitlementId)
{
return new RestActionImpl<>(this, Route.Applications.GET_ENTITLEMENT.compile(getSelfUser().getApplicationId(), Long.toUnsignedString(entitlementId)));
}

@Nonnull
@Override
public SubscriptionPaginationAction retrieveSubscriptionsBySkuId(@Nonnull SkuSnowflake skuId)
{
return new SubscriptionPaginationActionImpl(this, skuId.getId());
}

@Nonnull
@Override
public RestAction<Subscription> retrieveSubscriptionBySkuId(@Nonnull SkuSnowflake skuId, @Nonnull long subscriptionId)
{
return new RestActionImpl<>(this, Route.Sku.GET_SUBSCRIPTION.compile(Long.toUnsignedString(skuId.getIdLong()), Long.toUnsignedString(subscriptionId)));
}

@Nonnull
@Override
public TestEntitlementCreateAction createTestEntitlement(long skuId, long ownerId, @Nonnull TestEntitlementCreateActionImpl.OwnerType ownerType)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@
import net.dv8tion.jda.api.entities.messages.MessagePoll;
import net.dv8tion.jda.api.entities.messages.MessageSnapshot;
import net.dv8tion.jda.api.entities.sticker.*;
import net.dv8tion.jda.internal.entities.subscription.Subscription;
import net.dv8tion.jda.internal.entities.subscription.SubscriptionImpl;
import net.dv8tion.jda.internal.entities.subscription.SubscriptionStatus;
import net.dv8tion.jda.api.entities.templates.Template;
import net.dv8tion.jda.api.entities.templates.TemplateChannel;
import net.dv8tion.jda.api.entities.templates.TemplateGuild;
Expand Down Expand Up @@ -392,7 +395,8 @@ public GuildImpl createGuild(long guildId, DataObject guildJson, TLongObjectMap<
LOG.error("Guild is missing a SelfMember. GuildId: {}", guildId);
LOG.debug("Guild is missing a SelfMember. GuildId: {} JSON: \n{}", guildId, guildJson);
// This is actually a gateway request
guildObj.retrieveMembersByIds(api.getSelfUser().getIdLong()).onSuccess(m -> {
guildObj.retrieveMembersByIds(api.getSelfUser().getIdLong()).onSuccess(m ->
{
if (m.isEmpty())
LOG.warn("Was unable to recover SelfMember for guild with id {}. This guild might be corrupted!", guildId);
else
Expand Down Expand Up @@ -2613,6 +2617,41 @@ public Entitlement createEntitlement(DataObject object)
);
}

public Subscription createSubscription(DataObject object)
{
DataArray skuIDs = object.getArray("sku_ids");
DataArray entitlementsIDs = object.getArray("entitlement_ids");
DataArray renewalSkuIDs = object.optArray("renewal_sku_ids").orElse(null);
OffsetDateTime canceledAt = object.getOffsetDateTime("canceled_at", null);


List<Long> mappedSkuIds = mapToLongList(skuIDs);
List<Long> mappedEntitlementsIds = mapToLongList(entitlementsIDs);
List<Long> mappedRenewalSkuIds = Optional.ofNullable(renewalSkuIDs)
.map(this::mapToLongList)
.orElse(null);


return new SubscriptionImpl(
object.getUnsignedLong("id"),
object.getUnsignedLong("user_id"),
mappedSkuIds,
mappedEntitlementsIds,
mappedRenewalSkuIds,
object.getOffsetDateTime("current_period_start"),
object.getOffsetDateTime("current_period_end"),
canceledAt,
SubscriptionStatus.fromKey(object.getInt("status"))
);
}

public List<Long> mapToLongList(DataArray dataArray)
{
return IntStream.range(0, dataArray.length())
.mapToObj(dataArray::getLong)
.collect(Collectors.toList());
}

private Map<String, AuditLogChange> changeToMap(Set<AuditLogChange> changesList)
{
return changesList.stream().collect(Collectors.toMap(AuditLogChange::getKey, UnaryOperator.identity()));
Expand Down
Loading