chatlog.py が蓄積するデータ構造のリファレンスです。通常は直接編集する必要はありません。

単一形式

1 チャンネル 1 ファイル。

{
  "channel": "general",
  "service": "discord",
  "retrievedAt": "2024-02-02T05:10:00+00:00",
  "users": { "1002": "bob" },
  "messages": [
    { "id": "…", "ts": "…", "time": "…", "name": "alice",
      "text": "こんにちは <@1002>", "files": ["plan.pdf"] }
  ]
}
キー 説明
channel チャンネル名
service 取得元("slack" / "discord")。ビューアが描画方式の切替に使う(無い場合は slack 扱い)
retrievedAt 取得した時刻(UTC の ISO 8601)。実行のたびに更新される
users ユーザー ID → 名前のマップ(メンション解決用)
messages メッセージの配列(ts の昇順)
messages[].id Discord のみ。メッセージ ID(一意。Discord の重複判定のキー)
messages[].ts タイムスタンプ(エポック秒。ビューアが日付・時刻表示に使う。Slack の重複判定のキー)
messages[].time ts を整形した日時(UTC, YYYY-MM-DD HH:MM:SS)。人が読むための補助項目で、ビューアは使わない(ビューアは ts から JST を計算して表示する)
messages[].name 発言者名
messages[].text 本文(Slack は実体参照済み・<@ID><url\|text>、Discord は生テキスト・<@ID><@!ID>
messages[].blocks Slack のみ・書式付きメッセージのみ。Slack の rich_text ブロック(太字・斜体・取り消し線・コード・リスト・引用・コードブロック)。ビューアは blocks があればこれを描画し、無ければ text を使う。プレーンな本文やメンション・リンクだけの投稿には付かない(text で再現できるため)
messages[].files 添付ファイルの表示名一覧(添付がある場合のみ)
error 取得エラーが起きた場合のみ記録({"message": …, "at": …}

重複判定のキーはサービスで異なります(Slack は ts、Discord は id)。分割保存の突合も id があれば id、無ければ ts を使います。

分割形式

分割すると、エントリファイル(例 general.json)はマニフェストになり、本体は期間ごとのチャンク(例 general.2024.json)に分かれます。

{
  "channel": "general",
  "format": 2,
  "by": "year",
  "service": "discord",
  "users": { "1002": "bob" },
  "chunks": [
    { "file": "general.2024.json", "from": "…", "to": "…",
      "count": 1200, "dates": ["2024/01/15", "…"] }
  ],
  "maxTs": "…",
  "retrievedAt": "…"
}

チャンクは { "messages": [ … ] } の形。usersservice はマニフェスト側に持ちます。convert/merge.py で単一形式に戻せます。