hikari/monetization.py
# -*- coding: utf-8 -*-
# cython: language_level=3
# Copyright (c) 2020 Nekokatt
# Copyright (c) 2021-present davfsa
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
"""Models for monetized apps & premium features."""
from __future__ import annotations
__all__: typing.Sequence[str] = ("SKUType", "SKUFlags", "EntitlementType", "EntitlementOwnerType", "SKU", "Entitlement")
import datetime
import typing
import attrs
from hikari import snowflakes
from hikari.internal import enums
@typing.final
class SKUType(int, enums.Enum):
"""Represents the type of an entitlement."""
SUBSCRIPTION = 5
"""Represents a recurring subscription"""
SUBSCRIPTION_GROUP = 6
"""System-generated group for each SUBSCRIPTION SKU created"""
@typing.final
class SKUFlags(enums.Flag):
"""Represents the flags of a SKU."""
NONE = 0
"""No flags set"""
AVAILABLE = 1 << 2
"""SKU is available for purchase"""
GUILD_SUBSCRIPTION = 1 << 7
""" Recurring SKU that can be purchased by a user and applied to a single server.
Grants access to every user in that server.
"""
USER_SUBSCRIPTION = 1 << 8
"""Recurring SKU purchased by a user for themselves.
Grants access to the purchasing user in every server.
"""
@typing.final
class EntitlementType(int, enums.Enum):
"""Represents the type of an entitlement."""
APPLICATION_SUBSCRIPTION = 8
"""Entitlement was purchased as an app subscription"""
@typing.final
class EntitlementOwnerType(int, enums.Enum):
"""Represents the type of an entitlement owner."""
GUILD = 1
"""Entitlement is owned by a guild"""
USER = 2
"""Entitlement is owned by a user"""
@attrs.define(kw_only=True, weakref_slot=False)
class SKU(snowflakes.Unique):
"""Represents an SKU (stock-keeping unit).
SKUs on Discord represent premium offerings that can be
made available to your application's users or guilds.
"""
id: snowflakes.Snowflake = attrs.field(hash=True, repr=True)
"""The ID of the SKU"""
type: typing.Union[SKUType, int] = attrs.field(eq=False, hash=False, repr=True)
"""The type of the SKU"""
application_id: snowflakes.Snowflake = attrs.field(eq=False, hash=False, repr=True)
"""The ID of the parent application"""
name: str = attrs.field(eq=False, hash=False, repr=True)
"""Customer-facing name of the SKU"""
slug: str = attrs.field(eq=False, hash=False, repr=True)
"""Discord-generated URL slug based on the SKU's name"""
flags: SKUFlags = attrs.field(eq=False, hash=False, repr=True)
"""The flags for the SKU"""
@attrs.define(kw_only=True, weakref_slot=False)
class Entitlement(snowflakes.Unique):
"""An entitlement represents that a user or guild has access to a premium offering in your application."""
id: snowflakes.Snowflake = attrs.field(hash=True, repr=True)
"""ID of the entitlement"""
sku_id: snowflakes.Snowflake = attrs.field(eq=False, hash=False, repr=True)
"""ID of the SKU"""
application_id: snowflakes.Snowflake = attrs.field(eq=False, hash=False, repr=True)
"""ID of the parent application"""
user_id: typing.Optional[snowflakes.Snowflake] = attrs.field(eq=False, hash=False, repr=True)
"""ID of the user that is granted access to the entitlement's SKU"""
type: typing.Union[EntitlementType, int] = attrs.field(eq=False, hash=False, repr=True)
"""Type of entitlement"""
is_deleted: bool = attrs.field(eq=False, hash=False, repr=False)
"""Whether the entitlement has been deleted"""
starts_at: typing.Optional[datetime.datetime] = attrs.field(eq=False, hash=False, repr=False)
"""Start date at which the entitlement is valid. Not present when using test entitlements."""
ends_at: typing.Optional[datetime.datetime] = attrs.field(eq=False, hash=False, repr=False)
"""Date at which the entitlement is no longer valid. Not present when using test entitlements."""
guild_id: typing.Optional[snowflakes.Snowflake] = attrs.field(eq=False, hash=False, repr=False)
"""ID of the guild that is granted access to the entitlement's SKU"""
# Only partially documented by Discord
subscription_id: typing.Optional[snowflakes.Snowflake] = attrs.field(eq=False, hash=False, repr=False)
"""The ID of the subscription that this entitlement is associated with.
Not present when using test entitlements.
"""