Skip to content

feat: Twitch チャット保存機能を追加#47

Merged
misei-nul merged 20 commits intomainfrom
feature/twitch-chat-badges
Feb 2, 2026
Merged

feat: Twitch チャット保存機能を追加#47
misei-nul merged 20 commits intomainfrom
feature/twitch-chat-badges

Conversation

@FlowingSPDG
Copy link
Member

feat: Twitch チャットメッセージにバッジ情報保存機能を追加

Twitch IRCから取得したバッジ情報(broadcaster、moderator、subscriber等)をデータベースに保存する機能を実装。

主な変更

データベース

  • chat_messagesテーブルに badges TEXT カラムを追加
  • マイグレーション処理を実装

モデル

  • ChatMessage 構造体に badges: Option フィールドを追加
  • JSON形式でバッジ情報を保存(例:{"broadcaster":"1","moderator":"1"})

IRC実装

  • twitch-irc の PrivmsgMessage.badges からバッジ情報を取得
  • HashMap<String, String> 形式でバッジをJSON化
  • バッジがない場合は None として保存

その他

  • YouTube チャットは badges: None(現状未対応)
  • テストコードも更新(channel_id と badges フィールド追加)
  • DatabaseWriter と Utils の処理を badges 対応に更新

技術詳細

  • バッジ情報は JSON 文字列として TEXT カラムに保存
  • フロントエンドでの表示や分析に活用可能
  • 既存データへの影響なし(マイグレーションで自動追加)

Misei added 8 commits February 2, 2026 17:19
手動登録チャンネルに対してTwitch IRCに常時接続し、チャットメッセージを収集・保存する機能を実装。

## 主な変更

### データベース
- chat_messagesテーブルにchannel_idカラムを追加
- stream_idをNULL可能に変更(オフライン時のチャット保存に対応)
- マイグレーション処理を実装

### IRC実装
- tungsteniteからtwitch-ircライブラリへ移行
- 自動メッセージパース、タグ解析、再接続処理
- コード量を600行以上から291行に削減
- user_id自動取得に対応

### 統合
- TwitchCollectorにIRC Managerを統合
- ChannelPollerから配信状態に応じたIRC制御
- 配信開始/終了時のstream_id動的更新
- アプリ起動時の自動IRC接続

### 新規コマンド
- get_irc_connection_status: IRC接続状態取得
- reconnect_irc_channel: IRC再接続

## 技術詳細
- 手動登録(is_auto_discovered=false)かつenabled=trueのチャンネルが対象
- オフライン時も常時IRC接続を維持
- すべてのチャットメッセージを保存(配信中/オフライン問わず)
- バッチ書き込み(100件または5秒間隔)
- エラー時の自動再試行機能
Twitch IRCから取得したバッジ情報(broadcaster、moderator、subscriber等)をデータベースに保存する機能を実装。

## 主な変更

### データベース
- chat_messagesテーブルに badges TEXT カラムを追加
- マイグレーション処理を実装

### モデル
- ChatMessage 構造体に badges: Option<String> フィールドを追加
- JSON形式でバッジ情報を保存(例:{"broadcaster":"1","moderator":"1"})

### IRC実装
- twitch-irc の PrivmsgMessage.badges からバッジ情報を取得
- HashMap<String, String> 形式でバッジをJSON化
- バッジがない場合は None として保存

### その他
- YouTube チャットは badges: None(現状未対応)
- テストコードも更新(channel_id と badges フィールド追加)
- DatabaseWriter と Utils の処理を badges 対応に更新

## 技術詳細
- バッジ情報は JSON 文字列として TEXT カラムに保存
- フロントエンドでの表示や分析に活用可能
- 既存データへの影響なし(マイグレーションで自動追加)
バッジのバージョン情報は不要なため、バッジ名のみを配列として保存。
変更前: {"broadcaster":"1","moderator":"1"}
変更後: ["broadcaster","moderator"]

これにより、SQL での検索やフィルタリングが容易になります。
JSON文字列からDuckDBネイティブの配列型に変更し、効率的なクエリと分析を可能に。

## 主な変更

### データベーススキーマ
- badges カラムを TEXT から TEXT[] に変更
- 既存の TEXT 型データは自動的に TEXT[] に変換(マイグレーション)
- 配列リテラル形式: ARRAY['broadcaster', 'moderator']

### モデル
- ChatMessage.badges: Option<String> → Option<Vec<String>>
- Rust側で Vec<String> として扱う

### データ操作
- INSERT: ARRAY['badge1', 'badge2'] 形式で挿入
- SELECT: 文字列として取得後、配列にパース
- エスケープ処理を実装(シングルクォートの重複化)

### 利点
- SQL検索が容易: `WHERE list_contains(badges, 'moderator')`
- 集計が簡単: `SELECT unnest(badges) as badge, COUNT(*)`
- 型安全性が向上
- JSON文字列よりストレージ効率が良い

## 技術詳細
- DuckDB の配列リテラル構文を使用
- バッジ名のシングルクォートは '' にエスケープ
- 読み取り時は JSON パースまたは配列リテラルパースに対応
- 空配列は NULL として保存
配列型のデータをバッジ風のUIで表示するように改善。
- 配列要素を個別のバッジとして表示
- 空配列は [] と表示
- インディゴカラーのスタイルで視認性向上
- 配列でないオブジェクトは従来通りJSON表示
バックエンドでDuckDB配列をJSON配列に変換するように修正。

## 問題
- ValueRef::List を文字列として取得
- 失敗時に <LIST> と表示
- フロントエンドで配列として認識できない

## 修正
- parse_duckdb_list_to_json() 関数を追加
- DuckDB配列文字列 ['elem1', 'elem2'] をパース
- JSON配列として返すように変更
- シングル/ダブルクォート、エスケープに対応
- 空配列も正しく処理

これによりフロントエンドのバッジUIが正しく動作します。
- SQLビューワーでLIST型(TEXT[])を自動的にCAST AS VARCHARで変換

- SELECT * FROM table クエリでLIST型カラムを自動検出して文字列化

- 配列をカンマ区切りとバッジ形式で表示するよう改善

- Twitch IRC接続時にlogin nameを使用するように修正(display nameから変更)

- 日本語チャンネル名でのIRC接続エラーを解決
- validate_sql_query関数を追加し、無効なSQLキーワードを事前にチェック

- 複数ステートメントを検出し、最初のステートメントのみを実行

- DuckDBのC++例外によるクラッシュを防ぐため、クエリ検証を強化

- エラーハンドリングをmatch式に変更し、より明確なエラーメッセージを提供

- 日本語のエラーメッセージでユーザー体験を向上
@misei-nul misei-nul linked an issue Feb 2, 2026 that may be closed by this pull request
@misei-nul misei-nul changed the title feat: Twitch チャットメッセージにバッジ情報保存機能を追加 feat: Twitch チャット保存機能を追加 Feb 2, 2026
Misei added 9 commits February 2, 2026 20:19
LineChartに複数ライン描画と2軸表示のサポートを追加

BarChartに複数バー描画のサポートを追加

xKeyをxAxisKeyのエイリアスとして許可

既存の単一系列propsとの後方互換性を維持

エンゲージメント推移、上位チャッター、時間パターンのグラフが正常に表示されるように修正
配信データとチャットログを活用した高度な統計分析機能を実装

Phase 1: テキスト分析(頻出ワード、エモート、メッセージ長)

Phase 2: 相関分析(視聴者-チャット相関、カテゴリ変更影響)

Phase 3: ユーザー行動分析(チャッター活性度スコア、リテンション)

Phase 4: 異常検知(Z-scoreベース、トレンド分析)

バックエンド: 8つの分析関数とTauriコマンド実装(1,500+ lines)

フロントエンド: 5つのタブコンポーネント実装、Recharts可視化、完全ダークモード対応
KeyringStoreのエラー型が非同期タスク間でスレッドセーフでなかったため、全てのエラー型をBox<dyn std::error::Error + Send + Sync>に統一。これにより、Tauriコマンドや非同期コレクターでのコンパイルエラーを解消。
非同期関数で使用するエラー型をBox<dyn std::error::Error + Send + Sync>に統一し、スレッド間での安全な使用を保証。また、型の不一致によるコンパイルエラーを修正。

- twitch_api.rs: 11個の非同期関数の戻り値型を統一

- keyring_store.rs: 8個の関数の戻り値型を統一

- oauth/twitch.rs: Device Code Flow関連関数を修正

- youtube_api.rs: YouTube API関連関数を修正

- collectors/: Collectorトレイトと各実装を修正

- database/: get_connection()の戻り値型を修正

- error.rs: ResultExtトレイトにSend + Sync対応の実装を追加

- analytics.rs: total_days_with_dataの型キャストを修正

- data_science_analytics.rs: タプルパターンマッチを修正
バックエンドとフロントエンドから未使用コードを削除し、ビルド警告をすべて解消。

## Backend Changes
- 15個の未使用Tauriコマンドを削除(greet, migrate_twitch_user_ids, initialize_database等)
- IRC関連の未使用コマンドモジュール(commands/irc.rs)を完全削除
- 10個のunused警告を解消(collectors, database, websocketモジュール)
- get_retention_cohort, create_backup等の未使用関数を削除

## Frontend Changes
- 5個の未使用コンポーネントを削除(SplashScreen, ErrorState, LoadingState等)
- 9個の未使用型定義を削除(ChatStats, RetentionCohort等)
- 4個の未使用ユーティリティ関数を削除
- Recharts型エラーを修正(formatter関数のname引数をオプショナル化)

## Build Status
- Rust: 警告0件、エラー0件
- TypeScript: 警告0件、エラー0件
- 合計: 1,639行削除、117行追加
@misei-nul misei-nul merged commit c3f33f0 into main Feb 2, 2026
9 checks passed
@misei-nul misei-nul deleted the feature/twitch-chat-badges branch February 2, 2026 14:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

twitch Chatへの対応

2 participants