mirror of
https://github.com/hellodigua/ChatLab.git
synced 2026-05-21 05:40:23 +08:00
feat: 增加匿名统计选项开关
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
* 使用 Aptabase 进行匿名使用统计
|
||||
*/
|
||||
|
||||
import { app } from 'electron'
|
||||
import { app, ipcMain } from 'electron'
|
||||
import { initialize, trackEvent } from '@aptabase/electron/main'
|
||||
import * as fs from 'fs'
|
||||
import * as path from 'path'
|
||||
@@ -16,6 +16,13 @@ function getAnalyticsPath(): string {
|
||||
// 分析数据结构
|
||||
interface AnalyticsData {
|
||||
lastReportDate: string | null
|
||||
enabled: boolean // 是否启用统计
|
||||
}
|
||||
|
||||
// 默认配置
|
||||
const defaultAnalyticsData: AnalyticsData = {
|
||||
lastReportDate: null,
|
||||
enabled: true, // 默认启用
|
||||
}
|
||||
|
||||
// 读取分析数据
|
||||
@@ -24,12 +31,12 @@ function loadAnalyticsData(): AnalyticsData {
|
||||
const filePath = getAnalyticsPath()
|
||||
if (fs.existsSync(filePath)) {
|
||||
const data = fs.readFileSync(filePath, 'utf-8')
|
||||
return JSON.parse(data)
|
||||
return { ...defaultAnalyticsData, ...JSON.parse(data) }
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('[Analytics] 读取分析数据失败:', error)
|
||||
}
|
||||
return { lastReportDate: null }
|
||||
return { ...defaultAnalyticsData }
|
||||
}
|
||||
|
||||
// 保存分析数据
|
||||
@@ -48,6 +55,13 @@ function getTodayString(): string {
|
||||
return `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查统计是否启用
|
||||
*/
|
||||
export function isAnalyticsEnabled(): boolean {
|
||||
return loadAnalyticsData().enabled
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化分析模块
|
||||
* 必须在 app.whenReady() 之前调用
|
||||
@@ -67,6 +81,24 @@ export function initAnalytics(): void {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册 Analytics IPC 处理器
|
||||
*/
|
||||
export function registerAnalyticsHandlers(): void {
|
||||
// 获取统计启用状态
|
||||
ipcMain.handle('analytics:getEnabled', () => {
|
||||
return loadAnalyticsData().enabled
|
||||
})
|
||||
|
||||
// 设置统计启用状态
|
||||
ipcMain.handle('analytics:setEnabled', (_, enabled: boolean) => {
|
||||
const data = loadAnalyticsData()
|
||||
data.enabled = enabled
|
||||
saveAnalyticsData(data)
|
||||
return { success: true }
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 上报每日活跃事件
|
||||
*/
|
||||
@@ -78,6 +110,12 @@ export function trackDailyActive(): void {
|
||||
|
||||
try {
|
||||
const data = loadAnalyticsData()
|
||||
|
||||
// 检查是否启用统计
|
||||
if (!data.enabled) {
|
||||
return
|
||||
}
|
||||
|
||||
const today = getTodayString()
|
||||
|
||||
// 检查今天是否已经上报过
|
||||
@@ -104,6 +142,11 @@ export function trackAppEvent(eventName: string, properties?: Record<string, str
|
||||
return
|
||||
}
|
||||
|
||||
// 检查是否启用统计
|
||||
if (!isAnalyticsEnabled()) {
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
trackEvent(eventName, properties)
|
||||
} catch (error) {
|
||||
|
||||
@@ -12,6 +12,7 @@ import { registerMergeHandlers, initMergeModule } from './ipc/merge'
|
||||
import { registerAIHandlers } from './ipc/ai'
|
||||
import { registerMessagesHandlers } from './ipc/messages'
|
||||
import { registerCacheHandlers } from './ipc/cache'
|
||||
import { registerAnalyticsHandlers } from './analytics'
|
||||
// 导入 Worker 模块(用于异步分析查询和流式导入)
|
||||
import * as worker from './worker/workerManager'
|
||||
|
||||
@@ -42,6 +43,7 @@ const mainIpcMain = (win: BrowserWindow) => {
|
||||
registerAIHandlers(context)
|
||||
registerMessagesHandlers(context)
|
||||
registerCacheHandlers(context)
|
||||
registerAnalyticsHandlers()
|
||||
|
||||
console.log('[IpcMain] All IPC handlers registered successfully')
|
||||
}
|
||||
|
||||
Vendored
+6
-1
@@ -89,6 +89,8 @@ interface Api {
|
||||
checkUpdate: () => void
|
||||
simulateUpdate: () => void
|
||||
fetchRemoteConfig: (url: string) => Promise<{ success: boolean; data?: unknown; error?: string }>
|
||||
getAnalyticsEnabled: () => Promise<boolean>
|
||||
setAnalyticsEnabled: (enabled: boolean) => Promise<{ success: boolean }>
|
||||
}
|
||||
}
|
||||
|
||||
@@ -358,7 +360,10 @@ interface CacheApi {
|
||||
getInfo: () => Promise<CacheInfo>
|
||||
clear: (cacheId: string) => Promise<{ success: boolean; error?: string; message?: string }>
|
||||
openDir: (cacheId: string) => Promise<{ success: boolean; error?: string }>
|
||||
saveToDownloads: (filename: string, dataUrl: string) => Promise<{ success: boolean; filePath?: string; error?: string }>
|
||||
saveToDownloads: (
|
||||
filename: string,
|
||||
dataUrl: string
|
||||
) => Promise<{ success: boolean; filePath?: string; error?: string }>
|
||||
}
|
||||
|
||||
declare global {
|
||||
|
||||
@@ -1002,6 +1002,18 @@ const extendedApi = {
|
||||
fetchRemoteConfig: (url: string): Promise<{ success: boolean; data?: unknown; error?: string }> => {
|
||||
return ipcRenderer.invoke('app:fetchRemoteConfig', url)
|
||||
},
|
||||
/**
|
||||
* 获取匿名统计开关状态
|
||||
*/
|
||||
getAnalyticsEnabled: (): Promise<boolean> => {
|
||||
return ipcRenderer.invoke('analytics:getEnabled')
|
||||
},
|
||||
/**
|
||||
* 设置匿名统计开关状态
|
||||
*/
|
||||
setAnalyticsEnabled: (enabled: boolean): Promise<{ success: boolean }> => {
|
||||
return ipcRenderer.invoke('analytics:setEnabled', enabled)
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user