From f5d77f78f2054fd94af2c36330fbf2b04dffb298 Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Fri, 20 Oct 2023 20:12:10 +0200 Subject: [PATCH 01/30] Entitlements updates --- src/Discord/Parts/Guild/Guild.php | 3 + .../Parts/Interactions/Entitlement.php | 121 ++++++++++++++++++ .../Parts/Interactions/Interaction.php | 23 ++++ src/Discord/Parts/OAuth/Application.php | 5 +- src/Discord/Parts/User/User.php | 10 ++ .../Interaction/EntitlementsRepository.php | 47 +++++++ src/Discord/WebSockets/Event.php | 5 + .../WebSockets/Events/EntitlementCreate.php | 44 +++++++ .../WebSockets/Events/EntitlementDelete.php | 49 +++++++ .../WebSockets/Events/EntitlementUpdate.php | 52 ++++++++ .../WebSockets/Events/InteractionCreate.php | 19 +++ src/Discord/WebSockets/Handlers.php | 5 + 12 files changed, 382 insertions(+), 1 deletion(-) create mode 100644 src/Discord/Parts/Interactions/Entitlement.php create mode 100644 src/Discord/Repository/Interaction/EntitlementsRepository.php create mode 100644 src/Discord/WebSockets/Events/EntitlementCreate.php create mode 100644 src/Discord/WebSockets/Events/EntitlementDelete.php create mode 100644 src/Discord/WebSockets/Events/EntitlementUpdate.php diff --git a/src/Discord/Parts/Guild/Guild.php b/src/Discord/Parts/Guild/Guild.php index bb21a57b4..87dfdd5dd 100644 --- a/src/Discord/Parts/Guild/Guild.php +++ b/src/Discord/Parts/Guild/Guild.php @@ -39,6 +39,7 @@ use Discord\Repository\Guild\ScheduledEventRepository; use Discord\Repository\Guild\GuildTemplateRepository; use Discord\Repository\Guild\IntegrationRepository; +use Discord\Repository\Interaction\EntitlementsRepository; use React\Promise\ExtendedPromiseInterface; use ReflectionClass; use Symfony\Component\OptionsResolver\OptionsResolver; @@ -145,6 +146,7 @@ * @property IntegrationRepository $integrations * @property InviteRepository $invites * @property GuildTemplateRepository $templates + * @property EntitlementsRepository $entitlements */ class Guild extends Part { @@ -297,6 +299,7 @@ class Guild extends Part 'integrations' => IntegrationRepository::class, 'invites' => InviteRepository::class, 'templates' => GuildTemplateRepository::class, + 'entitlements' => EntitlementsRepository::class, ]; /** diff --git a/src/Discord/Parts/Interactions/Entitlement.php b/src/Discord/Parts/Interactions/Entitlement.php new file mode 100644 index 000000000..66b46df4a --- /dev/null +++ b/src/Discord/Parts/Interactions/Entitlement.php @@ -0,0 +1,121 @@ + + * + * This file is subject to the MIT license that is bundled + * with this source code in the LICENSE.md file. + */ + +namespace Discord\Parts\Interactions; + +use Discord\Http\Endpoint; +use Discord\Parts\Guild\Guild; +use Discord\Parts\User\User; +use Discord\WebSockets\Event; + + +/** + * Represents an entitlement from Discord. + * + * @link https://discord.com/developers/docs/monetization/entitlements#entitlement-object + * + * @since 10.0.0 + * + * @property string $id ID of the entitlement. + * @property string $sku_id ID of the SKU. + * @property string $application_id ID of the parent application. + * @property string|null $user_id ID of the user that is granted access to the entitlement's sku. + * @property string|null $promotion_id ID of the promotion that applies to the entitlement. + * @property User|null $user User that is granted access to the entitlement's sku. + * @property int $type Type of entitlement. + * @property bool $deleted Entitlement was deleted. + * @property int|null $gift_code_flags Gift code flags that apply to this entitlement. + * @property bool|null $consumed Entitlement has been consumed. + * @property Carbon|null $starts_at Start date at which the entitlement is valid. Not present when using test entitlements. + * @property Carbon|null $ends_at Date at which the entitlement is no longer valid. Not present when using test entitlements. + * @property string|null $guild_id ID of the guild that is granted access to the entitlement's sku. + * @property Guild|null $guild Guild that is granted access to the entitlement's sku. + * @property string|null $subscription_id ID of the subscription. + */ +class Entitlement extends Part +{ + public const TYPE_APPLICATION_SUBSCRIPTION = 8; + + public const GIFT_CODE_FLAG_UNDOCUMENTED = 0; + + /** + * {@inheritDoc} + */ + protected $fillable = [ + 'id', + 'sku_id', + 'application_id', + 'user_id', + 'promotion_id', + 'type', + 'deleted', + 'gift_code_flags', + 'consumed', + 'guild_id', + 'subscription_id', + + // events + 'starts_at', + 'ends_at', + ]; + + /** + * Returns the guild that is granted access to the entitlement's sku. + * + * @return Guild|null + */ + protected function getGuildAttribute(): ?Guild + { + return $this->discord->guilds->get('id', $this->guild_id); + } + + /** + * Returns the user that is granted access to the entitlement's sku. + * + * @return User|null + */ + protected function getUserAttribute(): ?User + { + return $this->discord->users->get('id', $this->user_id); + } + + /** + * Returns the start date at which the entitlement is valid. Not present when using test entitlements. + * + * @return Carbon|null The start date at which the entitlement is valid. Not present when using test entitlements. + * + * @throws \Exception + */ + protected function getStartsAtAttribute(): ?Carbon + { + if ($this->starts_at === null) { + return null; + } + + return new Carbon($this->starts_at); + } + + /** + * Returns the date at which the entitlement is no longer valid. Not present when using test entitlements. + * + * @return Carbon|null The date at which the entitlement is no longer valid. Not present when using test entitlements. + * + * @throws \Exception + */ + protected function getEndsAtAttribute(): ?Carbon + { + if ($this->ends_at === null) { + return null; + } + + return new Carbon($this->ends_at); + } +} diff --git a/src/Discord/Parts/Interactions/Interaction.php b/src/Discord/Parts/Interactions/Interaction.php index ab0294943..e77b26099 100644 --- a/src/Discord/Parts/Interactions/Interaction.php +++ b/src/Discord/Parts/Interactions/Interaction.php @@ -58,6 +58,7 @@ * @property-read ChannelPermission|null $app_permissions Bitwise set of permissions the app or bot has within the channel the interaction was sent from. * @property string|null $locale The selected language of the invoking user. * @property string|null $guild_locale The guild's preferred locale, if invoked in a guild. + * @property-read string|null $entitlements The user's entitlements. */ class Interaction extends Part { @@ -80,6 +81,7 @@ class Interaction extends Part 'app_permissions', 'locale', 'guild_locale', + 'entitlements', ]; /** @@ -402,6 +404,27 @@ public function sendFollowUpMessage(MessageBuilder $builder, bool $ephemeral = f }); } + /** + * Responds to the interaction with PREMIUM_REQUIRED. + * + * @link https://discord.com/developers/docs/monetization/app-subscriptions#gating-premium-interactions + * + * @throws \LogicException Interaction is not Application Command, Message Component, or Modal Submit. + * + * @return ExtendedPromiseInterface + */ + public function respondWithPremiumRequired(): ExtendedPromiseInterface + { + if (! in_array($this->type, [InteractionType::APPLICATION_COMMAND, InteractionType::MESSAGE_COMPONENT, InteractionType::MODAL_SUBMIT])) { + return reject(new \LogicException('You can only acknowledge application command, message component, or modal submit interactions.')); + } + + return $this->respond([ + 'type' => InteractionResponseType::PREMIUM_REQUIRED, + 'data' => [], + ]); + } + /** * Responds to the interaction with a message. * diff --git a/src/Discord/Parts/OAuth/Application.php b/src/Discord/Parts/OAuth/Application.php index c1ef690dc..7d36cb591 100644 --- a/src/Discord/Parts/OAuth/Application.php +++ b/src/Discord/Parts/OAuth/Application.php @@ -14,6 +14,7 @@ use Discord\Parts\Part; use Discord\Parts\Permissions\Permission; use Discord\Parts\User\User; +use Discord\Repository\Interaction\EntitlementsRepository; use Discord\Repository\Interaction\GlobalCommandRepository; /** @@ -50,7 +51,8 @@ * * @property string $invite_url The invite URL to invite the bot to a guild. * - * @property GlobalCommandRepository $commands The application global commands. + * @property EntitlementsRepository $entitlements The application entitlements. + * @property GlobalCommandRepository $commands The application global commands. */ class Application extends Part { @@ -99,6 +101,7 @@ class Application extends Part */ protected $repositories = [ 'commands' => GlobalCommandRepository::class, + 'entitlements' => EntitlementsRepository::class, ]; /** diff --git a/src/Discord/Parts/User/User.php b/src/Discord/Parts/User/User.php index 38e0880e4..c9a35938a 100644 --- a/src/Discord/Parts/User/User.php +++ b/src/Discord/Parts/User/User.php @@ -17,6 +17,7 @@ use Discord\Parts\Channel\Channel; use Discord\Parts\Part; use Discord\Parts\Channel\Message; +use Discord\Repository\Interaction\EntitlementsRepository; use React\Promise\ExtendedPromiseInterface; use function React\Promise\resolve; @@ -50,6 +51,8 @@ * @property int|null $avatar_decoration The user's avatar decoration URL. * @property int|null $avatar_decoration_hash The user's avatar decoration hash. * + * @property Entitlements $entitlements The user's entitlements. + * * @method ExtendedPromiseInterface sendMessage(MessageBuilder $builder) */ class User extends Part @@ -99,6 +102,13 @@ class User extends Part 'public_flags', ]; + /** + * {@inheritDoc} + */ + protected $repositories = [ + 'entitlements' => EntitlementsRepository::class, + ]; + /** * Gets the private channel for the user. * diff --git a/src/Discord/Repository/Interaction/EntitlementsRepository.php b/src/Discord/Repository/Interaction/EntitlementsRepository.php new file mode 100644 index 000000000..da87e45fa --- /dev/null +++ b/src/Discord/Repository/Interaction/EntitlementsRepository.php @@ -0,0 +1,47 @@ + + * + * This file is subject to the MIT license that is bundled + * with this source code in the LICENSE.md file. + */ + +namespace Discord\Repository\Interaction; + +use Discord\Http\Endpoint; +use Discord\Parts\Interaction\Entitlement; +use Discord\Repository\AbstractRepository; + +/** + * Guild/User entitlements. + * + * @see \Discord\Parts\Guild\Guild + * @see \Discord\Parts\User\User + * + * @since 10.0.0 + * + * @method Entitlement|null get(string $discrim, $key) + * @method Entitlement|null pull(string|int $key, $default = null) + * @method Entitlement|null first() + * @method Entitlement|null last() + * @method Entitlement|null find(callable $callback) + */ +class EntitlementsRepository extends AbstractRepository +{ + /** + * {@inheritDoc} + */ + protected $endpoints = [ + 'all' => Endpoint::APPLICATION_LIST_ENTITLEMENTS , + 'create' => Endpoint::APPLICATION_CREATE_TEST_ENTITLEMENTS, + 'delete' => Endpoint::APPLICATION_DELETE_TEST_ENTITLEMENTS, + ]; + + /** + * {@inheritDoc} + */ + protected $class = Entitlement::class; +} diff --git a/src/Discord/WebSockets/Event.php b/src/Discord/WebSockets/Event.php index 58aef011a..1ec74e1bc 100644 --- a/src/Discord/WebSockets/Event.php +++ b/src/Discord/WebSockets/Event.php @@ -113,6 +113,11 @@ abstract class Event public const MESSAGE_REACTION_REMOVE_ALL = 'MESSAGE_REACTION_REMOVE_ALL'; public const MESSAGE_REACTION_REMOVE_EMOJI = 'MESSAGE_REACTION_REMOVE_EMOJI'; + // Entitlements + public const ENTITLEMENT_CREATE = 'ENTITLEMENT_CREATE'; + public const ENTITLEMENT_UPDATE = 'ENTITLEMENT_UPDATE'; + public const ENTITLEMENT_DELETE = 'ENTITLEMENT_DELETE'; + /** * The Discord client instance. * diff --git a/src/Discord/WebSockets/Events/EntitlementCreate.php b/src/Discord/WebSockets/Events/EntitlementCreate.php new file mode 100644 index 000000000..6b9d9337b --- /dev/null +++ b/src/Discord/WebSockets/Events/EntitlementCreate.php @@ -0,0 +1,44 @@ + + * + * This file is subject to the MIT license that is bundled + * with this source code in the LICENSE.md file. + */ + +namespace Discord\WebSockets\Events; + +use Discord\WebSockets\Event; +use Discord\Parts\Interaction\Entitlement; + +/** + * @link https://discord.com/developers/docs/topics/gateway-events#entitlement-create + * + * @since 10.0.0 + */ +class EntitlementCreate extends Event +{ + /** + * {@inheritDoc} + */ + public function handle($data) + { + /** @var Entitlement */ + $entitlementPart = $this->factory->part(Entitlement::class, (array) $data, true); + + $this->discord->application->entitlements->set($data->id, $entitlementPart); + + if (isset($data->guild_id) && $guild = yield $this->discord->guilds->cacheGet($data->guild_id)) { + $guild->entitlements->set($data->id, $entitlementPart); + } + + if (isset($data->user_id) && $user = yield $this->discord->users->cacheGet($data->user_id)) { + $user->entitlements->set($data->id, $entitlementPart); + } + + return $entitlementPart; + } +} diff --git a/src/Discord/WebSockets/Events/EntitlementDelete.php b/src/Discord/WebSockets/Events/EntitlementDelete.php new file mode 100644 index 000000000..a58597fb2 --- /dev/null +++ b/src/Discord/WebSockets/Events/EntitlementDelete.php @@ -0,0 +1,49 @@ + + * + * This file is subject to the MIT license that is bundled + * with this source code in the LICENSE.md file. + */ + +namespace Discord\WebSockets\Events; + +use Discord\Parts\Interaction\Entitlement; +use Discord\WebSockets\Event; + +/** + * @link https://discord.com/developers/docs/topics/gateway-events#entitlement-delete + * + * @since 10.0.0 + */ +class EntitlementDelete extends Event +{ + /** + * {@inheritDoc} + */ + public function handle($data) + { + $entitlementPart = null; + + /** @var ?\Discord\Parts\Interaction\Entitlement */ + if ($entitlementPart = yield $this->discord->application->entitlements->pull($data->id)) { + /** @var User */ + if ($entitlementPart->user_id && $user = $this->discord->users->get('id', $entitlementPart->user_id)) { + $user->entitlements->unset($data->id); + } + + /** @var Guild */ + if ($entitlementPart->guild_id && $guild = $this->discord->guilds->get('id', $entitlementPart->guild_id)) { + $guild->entitlements->unset($data->id); + } + + $entitlementPart->fill((array) $data); + $entitlementPart->created = false; + } + + return $entitlementPart ?? $this->factory->part(Entitlement::class, (array) $data); + } +} diff --git a/src/Discord/WebSockets/Events/EntitlementUpdate.php b/src/Discord/WebSockets/Events/EntitlementUpdate.php new file mode 100644 index 000000000..ed636c93c --- /dev/null +++ b/src/Discord/WebSockets/Events/EntitlementUpdate.php @@ -0,0 +1,52 @@ + + * + * This file is subject to the MIT license that is bundled + * with this source code in the LICENSE.md file. + */ + +namespace Discord\WebSockets\Events; + +use Discord\Parts\Interaction\Entitlement; +use Discord\WebSockets\Event; + +/** + * @link https://discord.com/developers/docs/topics/gateway-events#entitlement-update + * + * @since 10.0.0 + */ +class EntitlementUpdate extends Event +{ + /** + * {@inheritDoc} + */ + public function handle($data) + { + $oldEntitlement = null; + + /** @var Entitlement */ + $entitlementPart = $this->factory->part(Entitlement::class, (array) $data, true); + + if ($oldEntitlement = yield $this->discord->application->entitlements->cacheGet($data->id)) { + // Swap + $entitlementPart = $oldEntitlement; + $oldEntitlement = clone $oldEntitlement; + + $entitlePart->fill((array) $data); + + if ($entitlementPart->guild_id && $part = $this->discord->guilds->get('id', $entitlementPart->guild_id)->entitlements->get('id', $data->id)) { + $part->fill((array) $data); + } + + if ($entitlementPart->user_id && $part = $this->discord->users->get('id', $entitlementPart->user_id)->entitlements->get('id', $data->id)) { + $part->fill((array) $data); + } + } + + return [$entitlementPart, $oldEntitlement]; + } +} diff --git a/src/Discord/WebSockets/Events/InteractionCreate.php b/src/Discord/WebSockets/Events/InteractionCreate.php index 81bc40450..7b0dc4592 100644 --- a/src/Discord/WebSockets/Events/InteractionCreate.php +++ b/src/Discord/WebSockets/Events/InteractionCreate.php @@ -62,6 +62,25 @@ public function handle($data) $this->cacheUser($data->user); } + if (isset($data->entitlements)) { + foreach($data->entitlements as $entitlement) { + $targets = [$this->discord->application]; + if (isset($entitlement->guild_id) && $guild = $this->discord->guilds->offsetGet($entitlement->guild_id)) { + $targets[] = $guild; + } elseif (isset($entitlement->user_id) && $user = $this->discord->users->offsetGet($entitlement->user_id)) { + $targets[] = $user; + } + + foreach($targets as $target) { + if ($entitlementPart = $target->entitlements->get('id', $entitlement->id)) { + $entitlementPart->fill((array) $entitlement); + } else { + $target->entitlements->pushItem($target->entitlements->create($entitlement, true)); + } + } + } + } + if ($data->type == InteractionType::APPLICATION_COMMAND) { $command = $data->data; if (isset($this->discord->application_commands[$command->name])) { diff --git a/src/Discord/WebSockets/Handlers.php b/src/Discord/WebSockets/Handlers.php index b17c8f5e2..892ef4b30 100644 --- a/src/Discord/WebSockets/Handlers.php +++ b/src/Discord/WebSockets/Handlers.php @@ -115,6 +115,11 @@ public function __construct() $this->addHandler(Event::AUTO_MODERATION_RULE_UPDATE, \Discord\WebSockets\Events\AutoModerationRuleUpdate::class); $this->addHandler(Event::AUTO_MODERATION_RULE_DELETE, \Discord\WebSockets\Events\AutoModerationRuleDelete::class); $this->addHandler(Event::AUTO_MODERATION_ACTION_EXECUTION, \Discord\WebSockets\Events\AutoModerationActionExecution::class); + + // Entitlements Event Handlers + $this->addHandler(Event::ENTITLEMENT_CREATE, \Discord\WebSockets\Events\EntitlementCreate::class); + $this->addHandler(Event::ENTITLEMENT_UPDATE, \Discord\WebSockets\Events\EntitlementUpdate::class); + $this->addHandler(Event::ENTITLEMENT_DELETE, \Discord\WebSockets\Events\EntitlementDelete::class); } /** From d265ea63d9efb0929f3cbae287f5c4f52ac11444 Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Fri, 20 Oct 2023 20:26:48 +0200 Subject: [PATCH 02/30] typo fix --- src/Discord/WebSockets/Events/EntitlementUpdate.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord/WebSockets/Events/EntitlementUpdate.php b/src/Discord/WebSockets/Events/EntitlementUpdate.php index ed636c93c..6c795c1b5 100644 --- a/src/Discord/WebSockets/Events/EntitlementUpdate.php +++ b/src/Discord/WebSockets/Events/EntitlementUpdate.php @@ -36,7 +36,7 @@ public function handle($data) $entitlementPart = $oldEntitlement; $oldEntitlement = clone $oldEntitlement; - $entitlePart->fill((array) $data); + $entitlementPart->fill((array) $data); if ($entitlementPart->guild_id && $part = $this->discord->guilds->get('id', $entitlementPart->guild_id)->entitlements->get('id', $data->id)) { $part->fill((array) $data); From a856129cb1f6db953088c6c7c423a5e805a004e1 Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Fri, 20 Oct 2023 20:43:53 +0200 Subject: [PATCH 03/30] Link them better --- src/Discord/WebSockets/Events/EntitlementCreate.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Discord/WebSockets/Events/EntitlementCreate.php b/src/Discord/WebSockets/Events/EntitlementCreate.php index 6b9d9337b..cbbb950f2 100644 --- a/src/Discord/WebSockets/Events/EntitlementCreate.php +++ b/src/Discord/WebSockets/Events/EntitlementCreate.php @@ -30,6 +30,7 @@ public function handle($data) $entitlementPart = $this->factory->part(Entitlement::class, (array) $data, true); $this->discord->application->entitlements->set($data->id, $entitlementPart); + $entitlementPart = $this->discord->application->entitlements->get('id', $data->id); if (isset($data->guild_id) && $guild = yield $this->discord->guilds->cacheGet($data->guild_id)) { $guild->entitlements->set($data->id, $entitlementPart); From ff95829a523c698345fce1a8227d2970fd32ac46 Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Fri, 20 Oct 2023 20:46:57 +0200 Subject: [PATCH 04/30] Update EntitlementDelete.php since it is linked, things should be easier --- .../WebSockets/Events/EntitlementDelete.php | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/src/Discord/WebSockets/Events/EntitlementDelete.php b/src/Discord/WebSockets/Events/EntitlementDelete.php index a58597fb2..d585a3505 100644 --- a/src/Discord/WebSockets/Events/EntitlementDelete.php +++ b/src/Discord/WebSockets/Events/EntitlementDelete.php @@ -26,20 +26,7 @@ class EntitlementDelete extends Event */ public function handle($data) { - $entitlementPart = null; - - /** @var ?\Discord\Parts\Interaction\Entitlement */ - if ($entitlementPart = yield $this->discord->application->entitlements->pull($data->id)) { - /** @var User */ - if ($entitlementPart->user_id && $user = $this->discord->users->get('id', $entitlementPart->user_id)) { - $user->entitlements->unset($data->id); - } - - /** @var Guild */ - if ($entitlementPart->guild_id && $guild = $this->discord->guilds->get('id', $entitlementPart->guild_id)) { - $guild->entitlements->unset($data->id); - } - + if ($entitlementPart = $this->discord->application->entitlements->pull($data->id)) { $entitlementPart->fill((array) $data); $entitlementPart->created = false; } From ee253f64a205b3356537791dc46541a4eb8419a1 Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Fri, 20 Oct 2023 20:47:58 +0200 Subject: [PATCH 05/30] Update EntitlementUpdate.php since it is linked, things should be easier --- src/Discord/WebSockets/Events/EntitlementUpdate.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/Discord/WebSockets/Events/EntitlementUpdate.php b/src/Discord/WebSockets/Events/EntitlementUpdate.php index 6c795c1b5..8621d0c98 100644 --- a/src/Discord/WebSockets/Events/EntitlementUpdate.php +++ b/src/Discord/WebSockets/Events/EntitlementUpdate.php @@ -37,14 +37,6 @@ public function handle($data) $oldEntitlement = clone $oldEntitlement; $entitlementPart->fill((array) $data); - - if ($entitlementPart->guild_id && $part = $this->discord->guilds->get('id', $entitlementPart->guild_id)->entitlements->get('id', $data->id)) { - $part->fill((array) $data); - } - - if ($entitlementPart->user_id && $part = $this->discord->users->get('id', $entitlementPart->user_id)->entitlements->get('id', $data->id)) { - $part->fill((array) $data); - } } return [$entitlementPart, $oldEntitlement]; From 426940efc964b1e02e5cc71cf3020e24ed476801 Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Fri, 20 Oct 2023 20:49:02 +0200 Subject: [PATCH 06/30] Update EntitlementUpdate.php use get instead of cacheget --- src/Discord/WebSockets/Events/EntitlementUpdate.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord/WebSockets/Events/EntitlementUpdate.php b/src/Discord/WebSockets/Events/EntitlementUpdate.php index 8621d0c98..bda7a45b3 100644 --- a/src/Discord/WebSockets/Events/EntitlementUpdate.php +++ b/src/Discord/WebSockets/Events/EntitlementUpdate.php @@ -31,7 +31,7 @@ public function handle($data) /** @var Entitlement */ $entitlementPart = $this->factory->part(Entitlement::class, (array) $data, true); - if ($oldEntitlement = yield $this->discord->application->entitlements->cacheGet($data->id)) { + if ($oldEntitlement = $this->discord->application->entitlements->get('id', $data->id)) { // Swap $entitlementPart = $oldEntitlement; $oldEntitlement = clone $oldEntitlement; From 7256ee4ee24d8879ca5d3f3a06dad56e23cf0739 Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Fri, 20 Oct 2023 20:51:24 +0200 Subject: [PATCH 07/30] Update EntitlementCreate.php use get instead of cacheGet --- src/Discord/WebSockets/Events/EntitlementCreate.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Discord/WebSockets/Events/EntitlementCreate.php b/src/Discord/WebSockets/Events/EntitlementCreate.php index cbbb950f2..39afcf85f 100644 --- a/src/Discord/WebSockets/Events/EntitlementCreate.php +++ b/src/Discord/WebSockets/Events/EntitlementCreate.php @@ -32,11 +32,11 @@ public function handle($data) $this->discord->application->entitlements->set($data->id, $entitlementPart); $entitlementPart = $this->discord->application->entitlements->get('id', $data->id); - if (isset($data->guild_id) && $guild = yield $this->discord->guilds->cacheGet($data->guild_id)) { + if (isset($data->guild_id) && $guild = $this->discord->guilds->get('id', $data->guild_id)) { $guild->entitlements->set($data->id, $entitlementPart); } - if (isset($data->user_id) && $user = yield $this->discord->users->cacheGet($data->user_id)) { + if (isset($data->user_id) && $user = $this->discord->users->get('id', $data->user_id)) { $user->entitlements->set($data->id, $entitlementPart); } From a162632040518e1bcba72b5d612120a6c77e5273 Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Fri, 20 Oct 2023 21:17:22 +0200 Subject: [PATCH 08/30] Update InteractionCreate.php --- .../WebSockets/Events/InteractionCreate.php | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/Discord/WebSockets/Events/InteractionCreate.php b/src/Discord/WebSockets/Events/InteractionCreate.php index 7b0dc4592..fd0fb5990 100644 --- a/src/Discord/WebSockets/Events/InteractionCreate.php +++ b/src/Discord/WebSockets/Events/InteractionCreate.php @@ -64,18 +64,15 @@ public function handle($data) if (isset($data->entitlements)) { foreach($data->entitlements as $entitlement) { - $targets = [$this->discord->application]; - if (isset($entitlement->guild_id) && $guild = $this->discord->guilds->offsetGet($entitlement->guild_id)) { - $targets[] = $guild; - } elseif (isset($entitlement->user_id) && $user = $this->discord->users->offsetGet($entitlement->user_id)) { - $targets[] = $user; - } - - foreach($targets as $target) { - if ($entitlementPart = $target->entitlements->get('id', $entitlement->id)) { - $entitlementPart->fill((array) $entitlement); - } else { - $target->entitlements->pushItem($target->entitlements->create($entitlement, true)); + if ($entitlementPart = $this->discord->application->entitlements->get('id', $entitlement->id)) { + $entitlementPart->fill((array) $entitlement); + } else { + $this->discord->application->entitlements->pushItem$this->discord->application->entitlements->create($entitlement, true)); + $entitlementPart = $this->discord->application->entitlements->get('id', $entitlement->id); + if (isset($entitlement->guild_id) && $guild = $this->discord->guilds->get('id', $entitlement->guild_id)) { + $guild->entitlements->pushItem($entitlementPart); + } elseif (isset($entitlement->user_id) && $user = $this->discord->users->get('id', $entitlement->user_id)) { + $user->entitlements->pushItem($entitlementPart); } } } From b532a79b377e3213ac0cd3db46acf9f43ca41687 Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Sat, 21 Oct 2023 06:35:17 +0200 Subject: [PATCH 09/30] Update EntitlementsRepository.php Change endpoints --- .../Repository/Interaction/EntitlementsRepository.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Discord/Repository/Interaction/EntitlementsRepository.php b/src/Discord/Repository/Interaction/EntitlementsRepository.php index da87e45fa..58511450f 100644 --- a/src/Discord/Repository/Interaction/EntitlementsRepository.php +++ b/src/Discord/Repository/Interaction/EntitlementsRepository.php @@ -35,9 +35,9 @@ class EntitlementsRepository extends AbstractRepository * {@inheritDoc} */ protected $endpoints = [ - 'all' => Endpoint::APPLICATION_LIST_ENTITLEMENTS , - 'create' => Endpoint::APPLICATION_CREATE_TEST_ENTITLEMENTS, - 'delete' => Endpoint::APPLICATION_DELETE_TEST_ENTITLEMENTS, + 'all' => Endpoint::APPLICATION_ENTITLEMENTS, + 'create' => Endpoint::APPLICATION_TEST_ENTITLEMENTS, + 'delete' => Endpoint::APPLICATION_TEST_ENTITLEMENT, ]; /** From 7a1f4294d9a6e48ed9c46e6d4b6f752cb0c400f4 Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Sat, 21 Oct 2023 06:52:56 +0200 Subject: [PATCH 10/30] change pushItem to set --- src/Discord/WebSockets/Events/InteractionCreate.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Discord/WebSockets/Events/InteractionCreate.php b/src/Discord/WebSockets/Events/InteractionCreate.php index fd0fb5990..08246faea 100644 --- a/src/Discord/WebSockets/Events/InteractionCreate.php +++ b/src/Discord/WebSockets/Events/InteractionCreate.php @@ -67,12 +67,12 @@ public function handle($data) if ($entitlementPart = $this->discord->application->entitlements->get('id', $entitlement->id)) { $entitlementPart->fill((array) $entitlement); } else { - $this->discord->application->entitlements->pushItem$this->discord->application->entitlements->create($entitlement, true)); + $this->discord->application->entitlements->set($entitlement->id, $this->discord->application->entitlements->create($entitlement, true)); $entitlementPart = $this->discord->application->entitlements->get('id', $entitlement->id); if (isset($entitlement->guild_id) && $guild = $this->discord->guilds->get('id', $entitlement->guild_id)) { - $guild->entitlements->pushItem($entitlementPart); + $guild->entitlements->set($entitlement->id, $entitlementPart); } elseif (isset($entitlement->user_id) && $user = $this->discord->users->get('id', $entitlement->user_id)) { - $user->entitlements->pushItem($entitlementPart); + $user->entitlements->set($entitlement->id, $entitlementPart); } } } From c5036bada7692b12ac7740ebce1f75f0bd8e51d3 Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Sun, 22 Oct 2023 14:38:21 +0200 Subject: [PATCH 11/30] Update src/Discord/Parts/Interactions/Entitlement.php Co-authored-by: SQKo <87897282+SQKo@users.noreply.github.com> --- src/Discord/Parts/Interactions/Entitlement.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord/Parts/Interactions/Entitlement.php b/src/Discord/Parts/Interactions/Entitlement.php index 66b46df4a..2330ac883 100644 --- a/src/Discord/Parts/Interactions/Entitlement.php +++ b/src/Discord/Parts/Interactions/Entitlement.php @@ -29,7 +29,7 @@ * @property string $application_id ID of the parent application. * @property string|null $user_id ID of the user that is granted access to the entitlement's sku. * @property string|null $promotion_id ID of the promotion that applies to the entitlement. - * @property User|null $user User that is granted access to the entitlement's sku. + * @property-read User|null $user User that is granted access to the entitlement's sku. * @property int $type Type of entitlement. * @property bool $deleted Entitlement was deleted. * @property int|null $gift_code_flags Gift code flags that apply to this entitlement. From 173a0ee60c9ac0f1833002f3c848a4734500bddf Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Sun, 22 Oct 2023 14:38:34 +0200 Subject: [PATCH 12/30] Update src/Discord/Parts/Interactions/Entitlement.php Co-authored-by: SQKo <87897282+SQKo@users.noreply.github.com> --- src/Discord/Parts/Interactions/Entitlement.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord/Parts/Interactions/Entitlement.php b/src/Discord/Parts/Interactions/Entitlement.php index 2330ac883..f4a87b3f1 100644 --- a/src/Discord/Parts/Interactions/Entitlement.php +++ b/src/Discord/Parts/Interactions/Entitlement.php @@ -37,7 +37,7 @@ * @property Carbon|null $starts_at Start date at which the entitlement is valid. Not present when using test entitlements. * @property Carbon|null $ends_at Date at which the entitlement is no longer valid. Not present when using test entitlements. * @property string|null $guild_id ID of the guild that is granted access to the entitlement's sku. - * @property Guild|null $guild Guild that is granted access to the entitlement's sku. + * @property-read Guild|null $guild Guild that is granted access to the entitlement's sku. * @property string|null $subscription_id ID of the subscription. */ class Entitlement extends Part From 8d0979c03005cee3219eb3eb33bfd095328077eb Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Sun, 22 Oct 2023 14:38:49 +0200 Subject: [PATCH 13/30] Update src/Discord/Parts/Interactions/Entitlement.php Co-authored-by: SQKo <87897282+SQKo@users.noreply.github.com> --- src/Discord/Parts/Interactions/Entitlement.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Discord/Parts/Interactions/Entitlement.php b/src/Discord/Parts/Interactions/Entitlement.php index f4a87b3f1..2bdbc5e20 100644 --- a/src/Discord/Parts/Interactions/Entitlement.php +++ b/src/Discord/Parts/Interactions/Entitlement.php @@ -44,7 +44,6 @@ class Entitlement extends Part { public const TYPE_APPLICATION_SUBSCRIPTION = 8; - public const GIFT_CODE_FLAG_UNDOCUMENTED = 0; /** * {@inheritDoc} From d6dae87a8357d8dd55b2baeff3b7eca11ede68bf Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Sun, 22 Oct 2023 14:39:05 +0200 Subject: [PATCH 14/30] Update src/Discord/Parts/Interactions/Entitlement.php Co-authored-by: SQKo <87897282+SQKo@users.noreply.github.com> --- src/Discord/Parts/Interactions/Entitlement.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Discord/Parts/Interactions/Entitlement.php b/src/Discord/Parts/Interactions/Entitlement.php index 2bdbc5e20..da0bfd6b8 100644 --- a/src/Discord/Parts/Interactions/Entitlement.php +++ b/src/Discord/Parts/Interactions/Entitlement.php @@ -60,8 +60,6 @@ class Entitlement extends Part 'consumed', 'guild_id', 'subscription_id', - - // events 'starts_at', 'ends_at', ]; From d2f5d5fde2f2d0f84715f9e51c2af999cb9aeb78 Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Sun, 22 Oct 2023 14:39:36 +0200 Subject: [PATCH 15/30] Update src/Discord/Parts/Interactions/Entitlement.php Co-authored-by: SQKo <87897282+SQKo@users.noreply.github.com> --- src/Discord/Parts/Interactions/Entitlement.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Discord/Parts/Interactions/Entitlement.php b/src/Discord/Parts/Interactions/Entitlement.php index da0bfd6b8..e8cf1526d 100644 --- a/src/Discord/Parts/Interactions/Entitlement.php +++ b/src/Discord/Parts/Interactions/Entitlement.php @@ -71,6 +71,10 @@ class Entitlement extends Part */ protected function getGuildAttribute(): ?Guild { + if (! isset($this->attributes['guild_id'])) { + return null; + } + return $this->discord->guilds->get('id', $this->guild_id); } From c0d894cede1a6812c733b5afacd3366caf0082d1 Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Sun, 22 Oct 2023 14:44:28 +0200 Subject: [PATCH 16/30] Apply suggestions from code review Co-authored-by: SQKo <87897282+SQKo@users.noreply.github.com> --- src/Discord/Parts/Interactions/Entitlement.php | 12 ++++++++---- src/Discord/Parts/Interactions/Interaction.php | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Discord/Parts/Interactions/Entitlement.php b/src/Discord/Parts/Interactions/Entitlement.php index e8cf1526d..c157fe305 100644 --- a/src/Discord/Parts/Interactions/Entitlement.php +++ b/src/Discord/Parts/Interactions/Entitlement.php @@ -85,6 +85,10 @@ protected function getGuildAttribute(): ?Guild */ protected function getUserAttribute(): ?User { + if (! isset($this->attributes['user_id'])) { + return null; + } + return $this->discord->users->get('id', $this->user_id); } @@ -97,11 +101,11 @@ protected function getUserAttribute(): ?User */ protected function getStartsAtAttribute(): ?Carbon { - if ($this->starts_at === null) { + if (! isset($this->attributes['starts_at']) { return null; } - return new Carbon($this->starts_at); + return new Carbon($this->attributes['starts_at']); } /** @@ -113,10 +117,10 @@ protected function getStartsAtAttribute(): ?Carbon */ protected function getEndsAtAttribute(): ?Carbon { - if ($this->ends_at === null) { + if (! isset($this->attributes['ends_at']) { return null; } - return new Carbon($this->ends_at); + return new Carbon($this->attributes['ends_at']); } } diff --git a/src/Discord/Parts/Interactions/Interaction.php b/src/Discord/Parts/Interactions/Interaction.php index e77b26099..ad7afa1cf 100644 --- a/src/Discord/Parts/Interactions/Interaction.php +++ b/src/Discord/Parts/Interactions/Interaction.php @@ -58,7 +58,7 @@ * @property-read ChannelPermission|null $app_permissions Bitwise set of permissions the app or bot has within the channel the interaction was sent from. * @property string|null $locale The selected language of the invoking user. * @property string|null $guild_locale The guild's preferred locale, if invoked in a guild. - * @property-read string|null $entitlements The user's entitlements. + * @property Entitlement|null $entitlements The user's entitlements. */ class Interaction extends Part { From d7d9fa8e74f6cbc490261f6b94cb5b6d25de59d0 Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Sun, 22 Oct 2023 14:46:27 +0200 Subject: [PATCH 17/30] Update EntitlementsRepository.php --- src/Discord/Repository/Interaction/EntitlementsRepository.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Discord/Repository/Interaction/EntitlementsRepository.php b/src/Discord/Repository/Interaction/EntitlementsRepository.php index 58511450f..4f8e16844 100644 --- a/src/Discord/Repository/Interaction/EntitlementsRepository.php +++ b/src/Discord/Repository/Interaction/EntitlementsRepository.php @@ -36,8 +36,8 @@ class EntitlementsRepository extends AbstractRepository */ protected $endpoints = [ 'all' => Endpoint::APPLICATION_ENTITLEMENTS, - 'create' => Endpoint::APPLICATION_TEST_ENTITLEMENTS, - 'delete' => Endpoint::APPLICATION_TEST_ENTITLEMENT, + 'create' => Endpoint::APPLICATION_ENTITLEMENTS, + 'delete' => Endpoint::APPLICATION_ENTITLEMENT, ]; /** From dc1b47824aa873776ef45fd3ec834817346ceae2 Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Sun, 22 Oct 2023 15:09:59 +0200 Subject: [PATCH 18/30] Update Guild.php --- src/Discord/Parts/Guild/Guild.php | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/Discord/Parts/Guild/Guild.php b/src/Discord/Parts/Guild/Guild.php index 87dfdd5dd..87c59dcf0 100644 --- a/src/Discord/Parts/Guild/Guild.php +++ b/src/Discord/Parts/Guild/Guild.php @@ -39,7 +39,6 @@ use Discord\Repository\Guild\ScheduledEventRepository; use Discord\Repository\Guild\GuildTemplateRepository; use Discord\Repository\Guild\IntegrationRepository; -use Discord\Repository\Interaction\EntitlementsRepository; use React\Promise\ExtendedPromiseInterface; use ReflectionClass; use Symfony\Component\OptionsResolver\OptionsResolver; @@ -146,7 +145,6 @@ * @property IntegrationRepository $integrations * @property InviteRepository $invites * @property GuildTemplateRepository $templates - * @property EntitlementsRepository $entitlements */ class Guild extends Part { @@ -299,7 +297,6 @@ class Guild extends Part 'integrations' => IntegrationRepository::class, 'invites' => InviteRepository::class, 'templates' => GuildTemplateRepository::class, - 'entitlements' => EntitlementsRepository::class, ]; /** @@ -444,6 +441,18 @@ public function getInvites(): ExtendedPromiseInterface }); } + /** + * Returns the guilds entitlements. + * + * @link https://discord.com/developers/docs/monetization/entitlements#list-entitlements + * + * @return ExtendedPromiseInterface + */ + public function getEntitlements(array $options = []): ExtendedPromiseInterface + { + // TODO: Use the actual lising query + return $this->discord->application->entitlements->get('guild_id', $this->id); + } /** * Unbans a member. Alias for `$guild->bans->unban($user)`. * From 629e65f5eb1cf9ba4f899607ccd5647d3141ea86 Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Sun, 22 Oct 2023 15:20:08 +0200 Subject: [PATCH 19/30] move and rename --- src/Discord/Parts/Guild/Guild.php | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Discord/Parts/Guild/Guild.php b/src/Discord/Parts/Guild/Guild.php index 87c59dcf0..7fbcfcb54 100644 --- a/src/Discord/Parts/Guild/Guild.php +++ b/src/Discord/Parts/Guild/Guild.php @@ -441,18 +441,6 @@ public function getInvites(): ExtendedPromiseInterface }); } - /** - * Returns the guilds entitlements. - * - * @link https://discord.com/developers/docs/monetization/entitlements#list-entitlements - * - * @return ExtendedPromiseInterface - */ - public function getEntitlements(array $options = []): ExtendedPromiseInterface - { - // TODO: Use the actual lising query - return $this->discord->application->entitlements->get('guild_id', $this->id); - } /** * Unbans a member. Alias for `$guild->bans->unban($user)`. * @@ -1677,4 +1665,16 @@ public function createdTimestamp() { return \Discord\getSnowflakeTimestamp($this->id); } + + /** + * Returns the guilds entitlements for this application. + * + * @link https://discord.com/developers/docs/monetization/entitlements#list-entitlements + * + * @return ExtendedPromiseInterface + */ + public function getMyApplicationEntitlement(): ExtendedPromiseInterface + { + return $this->discord->application->entitlements->get('guild_id', $this->id); + } } From 79290e7e214fcef026eeb378901478990ddcc88e Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Sun, 22 Oct 2023 16:42:17 +0200 Subject: [PATCH 20/30] Update Guild.php --- src/Discord/Parts/Guild/Guild.php | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Discord/Parts/Guild/Guild.php b/src/Discord/Parts/Guild/Guild.php index 7fbcfcb54..a8abfb7e8 100644 --- a/src/Discord/Parts/Guild/Guild.php +++ b/src/Discord/Parts/Guild/Guild.php @@ -1590,6 +1590,18 @@ public function setFeatures(array $features, ?string $reason = null): ExtendedPr }); } + /** + * Returns the guilds entitlements for this application. + * + * @link https://discord.com/developers/docs/monetization/entitlements#list-entitlements + * + * @return Collection[]|Entitlement[] + */ + public function getMyApplicationEntitlement(): Collection + { + return $this->discord->application->entitlements->get('guild_id', $this->id); + } + /** * {@inheritDoc} * @@ -1665,16 +1677,4 @@ public function createdTimestamp() { return \Discord\getSnowflakeTimestamp($this->id); } - - /** - * Returns the guilds entitlements for this application. - * - * @link https://discord.com/developers/docs/monetization/entitlements#list-entitlements - * - * @return ExtendedPromiseInterface - */ - public function getMyApplicationEntitlement(): ExtendedPromiseInterface - { - return $this->discord->application->entitlements->get('guild_id', $this->id); - } } From 157b2afd90c6fba9379ccdf90de33decedeed655 Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Sun, 22 Oct 2023 16:45:13 +0200 Subject: [PATCH 21/30] Update User.php --- src/Discord/Parts/User/User.php | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/Discord/Parts/User/User.php b/src/Discord/Parts/User/User.php index c9a35938a..e076842b7 100644 --- a/src/Discord/Parts/User/User.php +++ b/src/Discord/Parts/User/User.php @@ -17,7 +17,6 @@ use Discord\Parts\Channel\Channel; use Discord\Parts\Part; use Discord\Parts\Channel\Message; -use Discord\Repository\Interaction\EntitlementsRepository; use React\Promise\ExtendedPromiseInterface; use function React\Promise\resolve; @@ -51,8 +50,6 @@ * @property int|null $avatar_decoration The user's avatar decoration URL. * @property int|null $avatar_decoration_hash The user's avatar decoration hash. * - * @property Entitlements $entitlements The user's entitlements. - * * @method ExtendedPromiseInterface sendMessage(MessageBuilder $builder) */ class User extends Part @@ -102,13 +99,6 @@ class User extends Part 'public_flags', ]; - /** - * {@inheritDoc} - */ - protected $repositories = [ - 'entitlements' => EntitlementsRepository::class, - ]; - /** * Gets the private channel for the user. * @@ -298,6 +288,18 @@ protected function getBannerHashAttribute(): ?string return $this->attributes['banner'] ?? null; } + /** + * Returns the users entitlements for this application. + * + * @link https://discord.com/developers/docs/monetization/entitlements#list-entitlements + * + * @return Collection[]|Entitlement[] + */ + public function getMyApplicationEntitlement(): Collection + { + return $this->discord->application->entitlements->get('user_id', $this->id); + } + /** * Returns a timestamp for when a user's account was created. * From 7f4e39e96eb775855fa5ca99977f017ef0423897 Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Sun, 22 Oct 2023 16:47:18 +0200 Subject: [PATCH 22/30] Update Interaction.php --- src/Discord/Parts/Interactions/Interaction.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord/Parts/Interactions/Interaction.php b/src/Discord/Parts/Interactions/Interaction.php index ad7afa1cf..7f2449857 100644 --- a/src/Discord/Parts/Interactions/Interaction.php +++ b/src/Discord/Parts/Interactions/Interaction.php @@ -58,7 +58,7 @@ * @property-read ChannelPermission|null $app_permissions Bitwise set of permissions the app or bot has within the channel the interaction was sent from. * @property string|null $locale The selected language of the invoking user. * @property string|null $guild_locale The guild's preferred locale, if invoked in a guild. - * @property Entitlement|null $entitlements The user's entitlements. + * @property Entitlement|null $entitlements The user's and guild's entitlements for this application. */ class Interaction extends Part { From 15878736e2deef83a4bd1304367748237255e549 Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Sun, 22 Oct 2023 16:51:11 +0200 Subject: [PATCH 23/30] Update EntitlementCreate.php --- src/Discord/WebSockets/Events/EntitlementCreate.php | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/Discord/WebSockets/Events/EntitlementCreate.php b/src/Discord/WebSockets/Events/EntitlementCreate.php index 39afcf85f..a4d2d5017 100644 --- a/src/Discord/WebSockets/Events/EntitlementCreate.php +++ b/src/Discord/WebSockets/Events/EntitlementCreate.php @@ -30,15 +30,6 @@ public function handle($data) $entitlementPart = $this->factory->part(Entitlement::class, (array) $data, true); $this->discord->application->entitlements->set($data->id, $entitlementPart); - $entitlementPart = $this->discord->application->entitlements->get('id', $data->id); - - if (isset($data->guild_id) && $guild = $this->discord->guilds->get('id', $data->guild_id)) { - $guild->entitlements->set($data->id, $entitlementPart); - } - - if (isset($data->user_id) && $user = $this->discord->users->get('id', $data->user_id)) { - $user->entitlements->set($data->id, $entitlementPart); - } return $entitlementPart; } From a9275665f72b81b71a6b0d8c8022bc3de06fd3b0 Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Sun, 22 Oct 2023 16:52:30 +0200 Subject: [PATCH 24/30] Update EntitlementDelete.php --- src/Discord/WebSockets/Events/EntitlementDelete.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord/WebSockets/Events/EntitlementDelete.php b/src/Discord/WebSockets/Events/EntitlementDelete.php index d585a3505..18f4fa9c4 100644 --- a/src/Discord/WebSockets/Events/EntitlementDelete.php +++ b/src/Discord/WebSockets/Events/EntitlementDelete.php @@ -26,7 +26,7 @@ class EntitlementDelete extends Event */ public function handle($data) { - if ($entitlementPart = $this->discord->application->entitlements->pull($data->id)) { + if ($entitlementPart = $this->discord->application->entitlements->cachePull($data->id)) { $entitlementPart->fill((array) $data); $entitlementPart->created = false; } From 5cab51315163e5037cd9f7dcb75f11c89e889d5d Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Sun, 22 Oct 2023 16:54:15 +0200 Subject: [PATCH 25/30] Update EntitlementDelete.php --- src/Discord/WebSockets/Events/EntitlementDelete.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord/WebSockets/Events/EntitlementDelete.php b/src/Discord/WebSockets/Events/EntitlementDelete.php index 18f4fa9c4..0a694886b 100644 --- a/src/Discord/WebSockets/Events/EntitlementDelete.php +++ b/src/Discord/WebSockets/Events/EntitlementDelete.php @@ -26,7 +26,7 @@ class EntitlementDelete extends Event */ public function handle($data) { - if ($entitlementPart = $this->discord->application->entitlements->cachePull($data->id)) { + if ($entitlementPart = yield $this->discord->application->entitlements->cachePull($data->id)) { $entitlementPart->fill((array) $data); $entitlementPart->created = false; } From 8ff0f904f51432134611237b43fcb9d0dcefa936 Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Sun, 22 Oct 2023 16:55:19 +0200 Subject: [PATCH 26/30] Update EntitlementUpdate.php --- src/Discord/WebSockets/Events/EntitlementUpdate.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord/WebSockets/Events/EntitlementUpdate.php b/src/Discord/WebSockets/Events/EntitlementUpdate.php index bda7a45b3..f93030188 100644 --- a/src/Discord/WebSockets/Events/EntitlementUpdate.php +++ b/src/Discord/WebSockets/Events/EntitlementUpdate.php @@ -31,7 +31,7 @@ public function handle($data) /** @var Entitlement */ $entitlementPart = $this->factory->part(Entitlement::class, (array) $data, true); - if ($oldEntitlement = $this->discord->application->entitlements->get('id', $data->id)) { + if ($oldEntitlement = yield $this->discord->application->entitlements->cacheGet('id', $data->id)) { // Swap $entitlementPart = $oldEntitlement; $oldEntitlement = clone $oldEntitlement; From 147e8b3cd7250319868d42d8856b81302554e637 Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Sun, 22 Oct 2023 17:04:51 +0200 Subject: [PATCH 27/30] Update InteractionCreate.php --- src/Discord/WebSockets/Events/InteractionCreate.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/Discord/WebSockets/Events/InteractionCreate.php b/src/Discord/WebSockets/Events/InteractionCreate.php index 08246faea..355ceddbd 100644 --- a/src/Discord/WebSockets/Events/InteractionCreate.php +++ b/src/Discord/WebSockets/Events/InteractionCreate.php @@ -68,12 +68,6 @@ public function handle($data) $entitlementPart->fill((array) $entitlement); } else { $this->discord->application->entitlements->set($entitlement->id, $this->discord->application->entitlements->create($entitlement, true)); - $entitlementPart = $this->discord->application->entitlements->get('id', $entitlement->id); - if (isset($entitlement->guild_id) && $guild = $this->discord->guilds->get('id', $entitlement->guild_id)) { - $guild->entitlements->set($entitlement->id, $entitlementPart); - } elseif (isset($entitlement->user_id) && $user = $this->discord->users->get('id', $entitlement->user_id)) { - $user->entitlements->set($entitlement->id, $entitlementPart); - } } } } From 6a58513d3b9778cef6892e33c50151f47b58f4b7 Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Mon, 6 Nov 2023 11:47:56 +0100 Subject: [PATCH 28/30] Update Guild.php --- src/Discord/Parts/Guild/Guild.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Discord/Parts/Guild/Guild.php b/src/Discord/Parts/Guild/Guild.php index a8abfb7e8..98c95713c 100644 --- a/src/Discord/Parts/Guild/Guild.php +++ b/src/Discord/Parts/Guild/Guild.php @@ -20,6 +20,7 @@ use Discord\Parts\Channel\Channel; use Discord\Parts\Channel\Invite; use Discord\Parts\Channel\StageInstance; +use Discord\PArts\Interactions\Entitlement; use Discord\Parts\Part; use Discord\Parts\User\Member; use Discord\Parts\User\User; @@ -1595,11 +1596,13 @@ public function setFeatures(array $features, ?string $reason = null): ExtendedPr * * @link https://discord.com/developers/docs/monetization/entitlements#list-entitlements * - * @return Collection[]|Entitlement[] + * @return Collection */ public function getMyApplicationEntitlement(): Collection { - return $this->discord->application->entitlements->get('guild_id', $this->id); + return $this->discord->application->entitlements->filter(function ($entitlement) { + return $entitlement->guild_id == $this->id; + }); } /** From 971039af3dfa01c543564d5f0fa141dcf41273ec Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Mon, 6 Nov 2023 11:50:24 +0100 Subject: [PATCH 29/30] Update User.php --- src/Discord/Parts/User/User.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Discord/Parts/User/User.php b/src/Discord/Parts/User/User.php index e076842b7..aec9a8df8 100644 --- a/src/Discord/Parts/User/User.php +++ b/src/Discord/Parts/User/User.php @@ -293,11 +293,13 @@ protected function getBannerHashAttribute(): ?string * * @link https://discord.com/developers/docs/monetization/entitlements#list-entitlements * - * @return Collection[]|Entitlement[] + * @return Collection */ public function getMyApplicationEntitlement(): Collection { - return $this->discord->application->entitlements->get('user_id', $this->id); + return $this->discord->application->entitlements->filter(function ($entitlement) { + return $entitlement->user_id == $this->id; + }); } /** From 544bd52513fa13f2cae9321be5ed026e0823e113 Mon Sep 17 00:00:00 2001 From: Alexander Maassen Date: Mon, 6 Nov 2023 11:50:48 +0100 Subject: [PATCH 30/30] Update Guild.php --- src/Discord/Parts/Guild/Guild.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Discord/Parts/Guild/Guild.php b/src/Discord/Parts/Guild/Guild.php index 98c95713c..2c3f690ad 100644 --- a/src/Discord/Parts/Guild/Guild.php +++ b/src/Discord/Parts/Guild/Guild.php @@ -20,7 +20,6 @@ use Discord\Parts\Channel\Channel; use Discord\Parts\Channel\Invite; use Discord\Parts\Channel\StageInstance; -use Discord\PArts\Interactions\Entitlement; use Discord\Parts\Part; use Discord\Parts\User\Member; use Discord\Parts\User\User;