简体中文 English 繁體中文 日本語 Русский
本文为静态镜像,内容以交互版为准 在交互式文档中心打开 →

ErisPulse セッションタイプ標準

このドキュメントでは、ErisPulse がサポートするセッションタイプ標準を定義します。これには、受信イベントタイプと送信ターゲットタイプが含まれます。

1. 核心概念

1.1 受信タイプ && 送信タイプ

ErisPulse は、2 種類のセッションタイプを区別します:

1.2 タイプのマッピング関係

受信タイプ (detail_type)     送信タイプ (Send.To)
─────────────────        ────────────────
private                 →        user
group                   →        group
channel                 →        channel
guild                   →        guild
thread                  →        thread
user                    →        user

重要な点:

2. 標準的な会話タイプ

2.1 OneBot12 標準タイプ

private

group

user

2.2 ErisPulse 拡張タイプ

channel

guild

thread

3. プラットフォームの型マッピング

3.1 マッピングの原則

アダプターは、プラットフォームのネイティブ型を ErisPulse 標準型にマッピングします:

プラットフォームのネイティブ型 → ErisPulse 標準型 → 送信型

3.2 一般的なプラットフォームのマッピング例

Telegram

Telegram 型            ErisPulse 受信型      送信型
─────────────────      ────────────────       ───────────
private                private                user
group                  group                  group
supergroup             group                  group  # group にマッピング
channel                channel                channel

Discord

Discord 型            ErisPulse 受信型      送信型
─────────────────      ────────────────       ───────────
Direct Message         private               user
Text Channel           channel               channel
Guild                  guild                 guild
Thread                 thread                thread

OneBot11

OneBot11 型          ErisPulse 受信型      送信型
─────────────────      ────────────────       ───────────
private              private               user
group                group                 group
discuss              group                 group  # group にマッピング

4. 自定义型の拡張

4.1 自定义型の登録

アダプターは、独自のセッション型を登録することができます。

from ErisPulse.Core.Event import register_custom_type

# 自定义型の登録
register_custom_type(
    receive_type="my_custom_type",
    send_type="custom",
    id_field="custom_id",
    platform="MyPlatform"
)

4.2 自定义型の使用

登録後、システムは自動的にその型の変換と推論を行います。

# 自动推论
receive_type = infer_receive_type(event, platform="MyPlatform")
# 戻り値: "my_custom_type"

# 送信型への変換
send_type = convert_to_send_type(receive_type, platform="MyPlatform")
# 戻り値: "custom"

# 対応するIDの取得
target_id = get_target_id(event, platform="MyPlatform")
# 戻り値: event["custom_id"]

4.3 自定义型の解除登録

from ErisPulse.Core.Event import unregister_custom_type

unregister_custom_type("my_custom_type", platform="MyPlatform")

5. 自動型推論

イベントに明確な detail_type フィールドがない場合、システムは存在する ID フィールドに基づいて型を自動的に推論します。

Note

2.7.0+ の動作変更:detail_type は既知の会話タイプ(標準またはカスタム)である場合にのみ直接採用されます。notice/request イベントの detail_type(例:group_member_increase、friend_increase)は意味論的サブタイプであり、会話タイプではなく、ID フィールドに基づいて正しい会話タイプを推論します。

5.1 推論の優先度

優先度(高い順):
1. group_id     → group
2. channel_id   → channel
3. guild_id     → guild
4. thread_id    → thread
5. user_id      → private

5.2 使用例

# イベントには group_id だけがある
event = {"group_id": "123", "user_id": "456"}
receive_type = infer_receive_type(event)
# 戻り値: "group"(group_id を優先的に使用)

# イベントには user_id だけがある
event = {"user_id": "123"}
receive_type = infer_receive_type(event)
# 戻り値: "private"

# notice イベントの detail_type は意味論的サブタイプであり、2.7.0+ では ID フィールドから推論される
event = {"type": "notice", "detail_type": "group_member_increase", "group_id": "123"}
receive_type = infer_receive_type(event)
# 戻り値: "group"("group_member_increase" ではなく)

6. API 使用例

6.1 メッセージの送信

from ErisPulse import adapter

# ユーザーに送信
await adapter.myplatform.Send.To("user", "123").Text("Hello")

# グループに送信
await adapter.myplatform.Send.To("group", "456").Text("Hello")

# 自動変換 private → user(推奨されない、互換性の問題が発生する可能性がある)
await adapter.myplatform.Send.To("private", "789").Text("Hello")
# 内部で自動的に Send.To("user", "789") に変換される # 会話タイプとして user を直接使用するのがより良い選択です

6.2 イベントの返信

from ErisPulse.Core.Event import Event

# Event.reply() は自動的に型変換を処理する
await event.reply("返信内容")
# 内部で正しい送信タイプが自動的に使用される

6.3 コマンド処理

from ErisPulse.Core.Event import command

@command(name="test")
async def handle_test(event):
    # システムが自動的に会話タイプを処理する
    # group_id か user_id を手動で判断する必要はない
    await event.reply("コマンドの実行に成功しました")

7. コア API リファレンス

7.1 タイプ変換

from ErisPulse.Core.Event import convert_to_send_type, convert_to_receive_type

# 受信タイプ → 送信タイプ
convert_to_send_type("private")  # → "user"
convert_to_send_type("group")    # → "group"

# 送信タイプ → 受信タイプ
convert_to_receive_type("user")   # → "private"
convert_to_receive_type("group")  # → "group"

7.2 ID フィールドの取得

from ErisPulse.Core.Event import get_id_field, get_receive_type

get_id_field("group")    # → "group_id"
get_id_field("private")  # → "user_id"

get_receive_type("group_id")  # → "group"
get_receive_type("user_id")   # → "private"

7.3 送信情報の取得

from ErisPulse.Core.Event import get_send_type_and_target_id

event = {"detail_type": "private", "user_id": "123"}
send_type, target_id = get_send_type_and_target_id(event)
# send_type = "user", target_id = "123"

# Send.To() に直接使用
await adapter.Send.To(send_type, target_id).Text("Hello")

7.4 目標IDの取得

from ErisPulse.Core.Event import get_target_id

event = {"detail_type": "group", "group_id": "456"}
get_target_id(event)  # → "456"

8. ユーティリティメソッド

from ErisPulse.Core.Event import (
    is_standard_type,
    is_valid_send_type,
    get_standard_types,
    get_send_types,
    clear_custom_types,
)

is_standard_type("private")     # True
is_standard_type("custom_type") # False

is_valid_send_type("user")      # True
is_valid_send_type("invalid")   # False

get_standard_types()  # {"private", "group", "channel", "guild", "thread", "user"}
get_send_types()      # {"user", "group", "channel", "guild", "thread"}

clear_custom_types()                # 全てのカスタムタイプをクリア
clear_custom_types(platform="discord")  # 指定したプラットフォームのカスタムタイプのみをクリア

9. 最善の実践

7.1 アダプタ開発者

  1. 標準マッピングの使用:可能な限り、新しい型を作成するのではなく、標準型にマッピングする。
  2. 正しい変換:送信型と受信型のマッピング関係が正しくなるようにする。
  3. 元のデータの保持:{platform}_raw に元のイベント型を保持する。
  4. ドキュメントの説明:アダプタのドキュメントに型のマッピング関係を説明する。

7.2 モジュール開発者

  1. ツールメソッドの使用:get_send_type_and_target_id() などのツールメソッドを使用する。
  2. ハードコーディングの回避:if group_id else "private" のようなコードを書かない。
  3. すべての型を考慮する:コードは、private/group だけでなく、すべての標準型をサポートするようにする。
  4. 柔軟な設計:イベントラッパーのメソッドを使用する、または直接フィールドにアクセスしないようにする。

7.3 型推論

10. よくある質問

Q1: 送信時に private を user に変換する必要があるのはなぜですか?

A: これは OneBot12 標準の要件です。private は受信時の概念であり、送信時には user を使用することで意味がより明確になります。

Q2: 新しい会話タイプをサポートするにはどうすればよいですか?

A: register_custom_type() を使用してカスタムタイプを登録するか、または標準タイプの channel、guild を直接使用します。

Q3: イベントに detail_type がない場合はどうすればよいですか?

A: システムは存在する ID フィールドに基づいて自動的に推定します。優先順位は以下の通りです:group > channel > guild > thread > user。

Q4: どのようにアダプターが Telegram supergroup をマッピングしますか?

A: アダプターの変換ロジック内で、supergroup を標準の group タイプにマッピングします。

Q5: 電子メールなどの特殊なプラットフォームはどのように扱いますか?

A: 一般的でない、またはプラットフォーム固有のタイプについては、{platform}_raw と {platform}_raw_type を使用して元のデータを保持し、アダプターで独自に処理します。

11. 関連ドキュメント