An open API service indexing awesome lists of open source software.

https://github.com/ga0321/twitchdonatemonitor

一款專為實況主設計的多平台斗內監控工具,可即時監控並顯示來自多個金流平台的贊助通知,並支援 OBS 整合功能。
https://github.com/ga0321/twitchdonatemonitor

donate twitch

Last synced: 4 months ago
JSON representation

一款專為實況主設計的多平台斗內監控工具,可即時監控並顯示來自多個金流平台的贊助通知,並支援 OBS 整合功能。

Awesome Lists containing this project

README

          

# TwitchDonateMonitor

一款專為實況主設計的多平台斗內監控工具,可即時監控並顯示來自多個金流平台的贊助通知,並支援 OBS 整合功能。

## 功能特點

- **多平台支援**:同時監控 綠界、歐付寶、Streamlabs、HiveBee
- **插件系統**:透過 Plugin 架構擴充功能,目前支援 SoundAlerts 音效兌換監控
- **即時通知**:透過 SignalR 與 Socket.IO 技術,即時接收並顯示斗內訊息
- **OBS 整合**:自動輸出斗內訊息至文字檔,方便 OBS 讀取並顯示於實況畫面
- **累計顯示**:同一贊助者的斗內金額/贈訂數量會自動累計顯示
- **持久化儲存**:使用 SQLite 資料庫儲存累計資料,程式重啟後資料不會遺失
- **資料管理**:提供完整的資料庫管理介面,可新增、編輯、刪除累計資料,修改後自動儲存
- **CSV 日誌**:按下清除所有累計按鈕後會自動產生當前資料庫內的所有資料到當前目錄
- **自訂訊息格式**:可自訂各平台的顯示訊息格式與別名
- **錯誤容錯**:各平台事件處理皆具備異常捕獲機制,單筆事件處理失敗不影響其他事件,並記錄至錯誤日誌
- **並發安全**:SQLite 連線設定 Busy Timeout,避免多執行緒同時寫入時資料遺失
- **啟動檢查**:可選擇啟動時自動檢查並清除上次的舊資料(可在設定中開關)

## 支援的平台與事件

| 平台 | 事件類型 | 擷取資訊 |
|------|----------|----------|
| 綠界 | 斗內 | 贊助者名稱、金額、訊息 |
| 歐付寶 | 斗內 | 贊助者名稱、金額、訊息 |
| HiveBee | 文字斗內 | 贊助者名稱、金額、訊息 |
| HiveBee | 影片斗內 | 贊助者名稱、金額、訊息 |
| Streamlabs | PayPal | 贊助者名稱、金額、幣別、訊息 |
| Streamlabs | 小奇點 | 贊助者名稱、小奇點數量、訊息 |
| Streamlabs | 贈送訂閱 | 贈送者名稱、訂閱層級、數量 |
| Streamlabs | 新訂閱 | 訂閱者名稱、訂閱層級、月數 |
| Streamlabs | 續訂 | 訂閱者名稱、訂閱層級、月數 |
| SoundAlerts | 音效兌換 | 觀眾名稱、花費點數、點數類型 |

## 系統需求

- Windows 作業系統
- .NET Framework 4.7.2 或更新版本
- WebView2 Runtime(SoundAlerts 插件需要)

## 安裝方式

1. [下載最新版本的發行檔案](https://github.com/ga0321/TwitchDonateMonitor/releases/)
2. 解壓縮至任意資料夾
3. 執行 `DonateMonitor.exe`

## 使用說明

### 初始設定

啟動程式後,需設定至少一個金流平台:

1. **綠界**:填入您的綠界贊助成功動畫網址 (綠界廠商專區 > 實況主收款 > 贊助成功動畫網址)
2. **歐付寶**:填入您的歐富寶贊助成功動畫網址 (官網上方功能選單 > 我要收款 >實況主收款 > 實況主收款設定 > 贊助成功動畫網址)
3. **Streamlabs**:填入您的Streamlabs Socket API 符記 (官網右側頭像 > 帳戶設定 > API設定 > 應用程式符記 > Socket API 符記)
4. **HiveBee**:填入您的通知網址 (官網左側直播互動箱 > 互動工具箱 > 通知 > 通知網址)
5. **SoundAlerts**:填入您的 SoundAlerts Overlay 網址

點擊「進入監控頁面」後,程式將開始監控已設定的平台。

若資料庫中存在上次的舊資料,程式會詢問是否清除(選擇清除前會自動匯出 CSV 備份)。此行為可在設定中關閉。

### 監控視窗

- 主視窗會即時顯示來自各平台的斗內通知
- 上方狀態列顯示各平台的連線狀態(有效/無效),包含 SoundAlerts 狀態
- **清除累計按鈕**:點擊可清除所有累計紀錄,清除前會自動匯出 CSV 備份檔案(檔名格式:`donate_backup_YYYYMMDD_HHmmss.csv`)

### 資料管理

切換至「資料管理」分頁可管理 donate.db 中的所有累計資料:

- **重新載入**:從資料庫重新讀取所有資料
- **新增**:開啟新增資料表單,填寫完成後新增一筆記錄
- **刪除選取**:刪除目前選取的資料列
- **自動儲存**:直接在表格中編輯任何欄位,修改後自動儲存至資料庫並即時更新 obs.txt
- **增加金額**:在金額欄位上按右鍵,可快速增加金額(使用 DB 原子操作,避免並發問題)
- **即時同步**:新資料進入時,資料管理頁會自動刷新顯示

#### 可編輯欄位
| 欄位 | 說明 |
|------|------|
| 時間 | 資料建立時間 |
| 類型 | 下拉選單,可選擇:綠界、歐富寶、HiveBee、Paypal(Streamlabs)、新訂閱、續訂、贈訂、小奇點、音效(SoundAlerts) |
| 帳號 | 贊助者帳號 |
| 顯示名稱 | 贊助者顯示名稱 |
| 金額 | 贊助金額或數量 |
| 幣別 | 貨幣單位 |
| 訊息 | 贊助訊息 |
| 方案 | 訂閱層級(如:層一、層二、層三) |

### 設定選項

點擊「設定」可自訂以下項目:

#### OBS 輸出模式
- **多行模式**:每則斗內訊息獨立一行
- **單行模式**:所有訊息以空格分隔(適合跑馬燈)

#### 啟動時檢查舊資料
- 開啟時,程式啟動會檢查資料庫是否有上次的舊紀錄並詢問是否清除
- 關閉後不再詢問

#### 訊息格式
可自訂各平台的訊息顯示格式,支援以下變數:
- `{0}` - 贊助者名稱
- `{1}` - 金額
- `{2}` - 幣別
- `{3}` - 訂閱等級(僅訂閱事件)

#### 輸出開關
- **新訂閱輸出**:開啟/關閉新訂閱事件的 OBS 輸出
- **續訂輸出**:開啟/關閉續訂事件的 OBS 輸出

#### 自訂別名
- 匿名贊助者名稱
- 訂閱等級名稱(層級 1/2/3)
- 小奇點名稱
- 贈送訂閱名稱

## OBS 整合

程式會將斗內訊息輸出至程式目錄下的 `obs.txt` 檔案。

### 設定步驟

1. 在 OBS 中新增「文字 (GDI+)」來源
2. 勾選「從檔案讀取」
3. 選擇 `obs.txt` 檔案路徑
4. 依需求調整字型、大小、顏色等樣式

## 累計功能

程式會自動累計同一贊助者的斗內金額和贈訂數量:

- **金額累計**:同一贊助者在同一平台的斗內金額會自動累加
- **贈訂累計**:同一贈送者的贈訂數量會按訂閱層級分開累計
- **層一贈訂**:採用累計合併儲存,同一贈送者+層級在資料庫中只保留一筆記錄,Amount 累加
- **層二/層三贈訂**:逐筆儲存,每次贈訂事件獨立一筆記錄
- **SoundAlerts 累計**:同一觀眾的音效兌換花費會自動累加
- **持久化**:所有累計資料儲存於 `donate.db` SQLite 資料庫,程式重啟後會自動載入
- **清除功能**:點擊「清除累計」按鈕可重置所有累計,清除前會自動備份至 CSV 檔案

### 累計範例

| 事件 | OBS 輸出 |
|------|----------|
| 小明 贊助 100 元 | `小明: 100TWD` |
| 小明 再贊助 50 元 | `小明: 150TWD` |
| 大王 贈訂 3 個層一 | `大王: 3贈訂(層一)` |
| 大王 贈訂 2 個層二 | `大王: 3贈訂(層一)` + `大王: 2贈訂(層二)` |
| viewer1 兌換 100 點音效 | `viewer1: 100channel_points` |

## 插件系統

程式支援 Plugin 架構來擴充功能,目前內建:

### SoundAlerts

透過 WebView2 載入 SoundAlerts Overlay 頁面,注入 JavaScript Bridge 攔截 Firestore 回應,即時擷取觀眾音效兌換事件。

- **自動攔截**:Hook WebSocket、fetch、XHR 等瀏覽器 API,捕獲所有音效兌換資料
- **Firestore 解析**:支援 JSON 結構解析與 Regex 原始文字解析兩種模式
- **去重機制**:3 秒內相同的 `(last_user, cost, cost_type)` 事件會自動去重
- **隱藏運作**:WebView2 控制項隱藏在背景,不影響 UI

## 日誌檔案

- **累計資料庫**:`donate.db` - SQLite 資料庫,儲存累計資料
- **OBS 輸出檔**:`obs.txt` - OBS 讀取的文字檔,儲存累計顯示訊息
- **備份檔案**:`donate_backup_YYYYMMDD_HHmmss.csv` - 清除累計時自動產生的備份檔案
- **錯誤日誌**:`error.log` - 記錄程式執行期間的錯誤訊息
- **除錯日誌**:`debug.log` - 記錄各平台原始事件資料(含 SoundAlerts Bridge 訊息)

程式啟動時會自動載入 donate.db 中的累計資料,並在監控視窗顯示已讀取的資料筆數。

## 技術細節

### 並發與資料安全

- 各平台的 Socket/SignalR 事件回調可能在不同執行緒上並發執行
- Streamlabs 事件處理已卸載至背景執行緒(`Task.Run`),避免阻塞 SocketIO 接收循環導致心跳逾時斷線
- 同一事件內的贈訂(subgift)會先按贈送者+訂閱層級聚合後再批次寫入 DB,大幅減少高併發時的 DB 操作次數
- 所有資料庫寫入操作(Write、Insert、Update、Delete、AccumulateSubGift、AddAmountById、Clear)共用同一把 `lock` 序列化,防止背景事件與 UI 資料管理併發寫入導致崩潰
- `AddAmountById` 使用 `UPDATE ... SET Amount = Amount + @delta` 原子操作配合 Transaction,避免 read-modify-write 競爭
- SQLite 連線字串設定 `Busy Timeout=60000`,避免並發寫入時因鎖競爭導致 `SQLITE_BUSY` 錯誤
- 層一贈訂使用 Transaction 保證讀取累計→刪除舊記錄→寫入合併記錄的原子性
- 所有事件處理器與 UI 資料管理操作皆包裹 try-catch,異常記錄至 `error.log`,不會導致程式崩潰

### 資料管理頁並發保護

- **操作鎖定**(`_dataOperationInProgress`):資料管理操作(新增、刪除、清除、增加金額、自動儲存)期間,防止 Timer 刷新 DataGridView 造成重入(MessageBox/ShowDialog 會觸發 message pump)
- **事件佇列**(`_pendingEvents`):操作鎖定期間,背景進來的新事件不直接寫 DB,而是暫存至佇列,待操作結束後由 Timer 統一 flush
- **同步保護**(`_dataSyncing`):佇列 flush 期間若使用者嘗試修改資料,顯示「資料同步中,請稍後」
- **自動儲存**:DataGridView 儲存格值變更時自動觸發單筆 UpdateById + ReloadObsData,無需手動按儲存按鈕
- **ComboBox 立即提交**:類型下拉選單選擇後透過 `CurrentCellDirtyStateChanged` 立即 commit,確保 `CellValueChanged` 馬上觸發自動儲存
- **即時刷新**:新事件寫入 DB 後設置 `_dataGridDirty` 旗標,50ms Timer 統一刷新 DataGridView,避免高併發重複刷新

## 已知問題

1. 贈訂如果贈超過一個月只會顯示一個月 (StreamLabs API問題)

## 授權

本專案採用開源授權,詳見 [LICENSE.txt](LICENSE.txt)。