アクティビティ、収益化、Social SDK¶
Discord のアプリは、サーバー内の Bot にとどまりません。このページでは、ユーザーにインストールされるアプリ、アクティビティ、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!")
ユーザーにインストールされるアプリ¶
アプリはサーバーだけでなくユーザーのアカウントにもインストールでき、その場合、コマンドはそのユーザーがいる場所ならどこでも動作します。フレンドとの DM や、Bot がいないサーバーも含まれます。Developer Portal の Installation ページでユーザーインストールを有効にし、スニペットが Bot 全体に対して行っているように、integration_types と contexts でコマンドがそれを使えるようにします(コマンドの登録を参照)。
このようなコンテキストでは、Bot はチャンネルにいません。キャッシュのエントリーもゲートウェイイベントもなく、REST API もそこではほとんどの呼び出しを拒否します。ctx.interaction.authorizing_integration_owners はどのインストールによってインタラクションが可能になったかを、ctx.interaction.context はインタラクションがどこで起きたかを、ctx.interaction.app_permissions はアプリに何が許されているかを示します。応答はいつもどおり動作します。ユーザーにのみインストールされたアプリでは、Discord が許可するフォローアップは 5 件までで、bostie は 6 件目で警告します。
アクティビティ¶
アクティビティは Discord の中で動く Web アプリです。bostie は Bot 側を扱います。
@bot.entry_point(name)は、アプリランチャーに表示されるエントリーポイントコマンドを登録します。詳しくはユーザーコマンド、メッセージコマンド、エントリーポイントコマンドで説明しています。await ctx.launch_activity()は、コマンドやコンポーネントからアクティビティを開き、そのインスタンスの ID を返します。await bot.rest.application.fetch_activity_instance(application_id, instance_id)はActivityInstanceを返します。アクティビティが動いている場所と、参加しているユーザーの ID がわかります。
アクティビティのサンプルは、エントリーポイントと、どちらもアクティビティを起動するスラッシュコマンドを登録します。
収益化¶
収益化を有効にしたアプリは SKU(サブスクリプション、永続アイテム、消費型アイテム)を販売します。ユーザーの購入はエンタイトルメントです。
ctx.interaction.entitlementsは、インタラクションのユーザーとサーバーのエンタイトルメントを列挙します。そのため、コマンドはリクエストを送らずに購入を確認できます。ui.premium_button(sku_id)は、SKU の購入画面を開くボタンを表示します。このボタンが Bot に届くことはありません。fmt.store(application_id, sku_id=None)は、アプリのストアページ、または 1 つの SKU へのリンクを作ります。Discord はこれをカードとして表示します。bot.rest.monetizationは、アプリの SKU を列挙し(list_skus)、ユーザー、サーバー、SKU で絞り込んでエンタイトルメントをたどり(list_entitlements)、1 件を取得し、消費型アイテムを使用済みにします(consume_entitlement)。SKU のサブスクリプションの一覧表示と取得もできます。create_test_entitlement(application_id, sku_id=..., owner_id=..., owner_type=1)は、サーバー(1)またはユーザー(2)に無料のテスト用エンタイトルメントを付与し、delete_test_entitlementはそれを削除します。EntitlementCreate、EntitlementUpdate、EntitlementDeleteイベントと、SubscriptionCreate、SubscriptionUpdate、SubscriptionDeleteイベントは、ゲートウェイ経由で変更を知らせます。エンタイトルメントのイベントはウェブフックイベントとしても届きます。テスト用エンタイトルメントは、本物のエンタイトルメントにある日付を持たないPartialEntitlementとして届きます。
Social SDK¶
Discord Social SDK はゲームの中で動作します。そのサーバー側は REST です。
bot.rest.lobbiesは、ロビーを作成し、そのメタデータとメンバーを編集し(add_member、一度に最大 25 人を更新するbulk_update_members、remove_member)、ロビーを削除し、ユーザーをロビーのリンク先チャンネルに招待し、ロビーのメッセージにモデレーション用のメタデータを設定します。- プレイヤーのトークンを持つ
BearerClientのuser.rest.lobbiesは、シークレットでロビーを作成または参加し(create_or_join)、ロビーから退出し(leave)、Discord のチャンネルをリンクおよびリンク解除し(link_channel、unlink_channel)、メッセージを送信・一覧表示し(send_message、list_messages)、プレイヤー自身をリンク先チャンネルに招待します(create_invite_for_self)。 bot.rest.partner_sdkはトークンを交換します。ゲーム独自のアカウントシステムのプレイヤー向けの仮トークン、外部 ID プロバイダーのトークンと引き換えのトークン、パブリッシャーのトークンと引き換えの子ゲームのトークンです。仮アカウントの統合解除や、ダイレクトメッセージへのモデレーション用メタデータの設定も行います。bot.rest.identitiesは、外部アカウントを連携したユーザーのアプリケーション ID 情報とプロフィールを一覧表示、取得、更新します。
ロビーのメッセージとゲーム内のダイレクトメッセージは、LobbyMessage* と GameDirectMessage* のウェブフックイベントとして届きます。