Перейти к содержанию

Активности, монетизация и Social SDK

Приложения Discord — это не только боты на серверах. Эта страница описывает приложения, установленные для пользователей, Активности, продажу SKU и серверную сторону Social SDK.

import bostie
from bostie import (
    ApplicationIntegrationType,
    Context,
    InteractionContextType,
    fmt,
    ui,
)
from bostie.events import EntitlementCreate

PREMIUM_SKU = 1088510058284990888
bot = bostie.Bot(
    contexts=[
        InteractionContextType.GUILD,
        InteractionContextType.BOT_DM,
        InteractionContextType.PRIVATE_CHANNEL,
    ],
    integration_types=[
        ApplicationIntegrationType.GUILD_INSTALL,
        ApplicationIntegrationType.USER_INSTALL,
    ],
)


@bot.command
async def forecast(ctx: Context) -> None:
    """A ten-day forecast for premium users."""
    owned = {entitlement.sku_id for entitlement in ctx.interaction.entitlements}
    if PREMIUM_SKU not in owned:
        await ctx.respond(
            components=[
                ui.text(f"Premium unlocks this. {fmt.store(bot.application_id or 0)}"),
                ui.row(ui.premium_button(PREMIUM_SKU)),
            ],
            ephemeral=True,
        )
        return
    await ctx.respond("Sunny for ten days.", ephemeral=True)


@bot.listen
async def bought(event: EntitlementCreate) -> None:
    if event.entitlement.user_id is not None:
        channel = await bot.rest.channels.create_dm(
            recipient_id=event.entitlement.user_id
        )
        await bot.rest.messages.create(channel.id, "Thanks for going premium!")

Приложения, установленные для пользователей

Приложение можно установить не только на сервер, но и в аккаунт пользователя, и тогда его команды работают везде, где находится этот пользователь, включая личные сообщения с друзьями и серверы без бота. Включите установку для пользователя на странице Installation в Developer Portal, затем разрешите командам её использовать через integration_types и contexts, как пример делает для всего бота («Регистрация команд»).

В таком контексте бота нет в канале: нет записи в кэше, нет событий шлюза, и REST API отклоняет там большинство вызовов. ctx.interaction.authorizing_integration_owners сообщает, какие установки сделали взаимодействие возможным, ctx.interaction.context — где оно произошло, а ctx.interaction.app_permissions — что приложению разрешено. Ответы работают как обычно, и Discord разрешает 5 последующих сообщений для приложения, установленного только для пользователя; bostie предупреждает на шестом.

Активности

Активность — это веб-приложение, которое работает внутри Discord. bostie покрывает сторону бота:

  • @bot.entry_point(name) регистрирует команду точки входа, которую показывает панель запуска приложений (App Launcher), как объясняет раздел «Команды пользователя, сообщения и точки входа».
  • await ctx.launch_activity() открывает Активность из команды или компонента и возвращает ID её экземпляра.
  • await bot.rest.application.fetch_activity_instance(application_id, instance_id) возвращает ActivityInstance: где она запущена и ID пользователей в ней.

Пример Активности регистрирует точку входа и слэш-команду, которые обе её запускают.

Монетизация

Приложение с включённой монетизацией продаёт SKU: подписки, постоянные предметы и расходуемые предметы. Покупки пользователя — это entitlement.

  • ctx.interaction.entitlements перечисляет entitlement пользователя и сервера взаимодействия, так что команда может проверить покупку без запроса.
  • ui.premium_button(sku_id) показывает кнопку, которая открывает покупку SKU; до бота она никогда не доходит. fmt.store(application_id, sku_id=None) даёт ссылку на страницу магазина приложения или на один SKU, которую Discord показывает карточкой.
  • bot.rest.monetization перечисляет SKU приложения (list_skus), перебирает entitlement с фильтрами по пользователю, серверу и SKU (list_entitlements), получает один из них и отмечает расходуемый предмет использованным (consume_entitlement). Он также перечисляет и получает подписки на SKU.
  • create_test_entitlement(application_id, sku_id=..., owner_id=..., owner_type=1) выдаёт бесплатный тестовый entitlement серверу (1) или пользователю (2), а delete_test_entitlement его удаляет.
  • События EntitlementCreate, EntitlementUpdate и EntitlementDelete, а также SubscriptionCreate, SubscriptionUpdate и SubscriptionDelete сообщают об изменениях через шлюз; события entitlement приходят и как события вебхуков. Тестовый entitlement приходит как PartialEntitlement, без дат, которые есть у настоящего.

Social SDK

Discord Social SDK работает внутри игр. Его серверная сторона — это REST:

  • bot.rest.lobbies создаёт лобби, изменяет их метаданные и участников (add_member, bulk_update_members — до 25 за раз, remove_member), удаляет их, приглашает пользователя в канал, связанный с лобби, и задаёт метаданные модерации для сообщений лобби.
  • user.rest.lobbies на BearerClient с токеном игрока создаёт лобби или входит в него по секрету (create_or_join), выходит из него (leave), связывает канал Discord и отменяет связь (link_channel, unlink_channel), отправляет и перечисляет сообщения (send_message, list_messages) и приглашает самого игрока в связанный канал (create_invite_for_self).
  • bot.rest.partner_sdk обменивает токены: временный токен для игрока из собственной системы аккаунтов игры, токен в обмен на токен внешнего поставщика удостоверений, токен дочерней игры в обмен на токен издателя; он также разъединяет временные аккаунты и задаёт метаданные модерации для личных сообщений.
  • bot.rest.identities перечисляет, получает и обновляет удостоверения и профили приложения у пользователей, которые связали внешний аккаунт.

Сообщения лобби и личные сообщения в игре приходят как события вебхуков LobbyMessage* и GameDirectMessage*.