Активности, монетизация и 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*.