package point import ( "gitea.weitiangame.com/sdk/wt-game/utils/ahttp" "github.com/go-resty/resty/v2" "go.uber.org/zap" "sync" ) var ( instance *Point once sync.Once ) // Point 是用于事件上报的核心结构体 // Point is the core structure for event reporting type Point struct { clientID string logger *zap.Logger client *resty.Client // 线程安全的HTTP客户端 / Thread-safe HTTP client debug bool curl bool mu sync.Mutex // 保护并发访问配置字段 / Mutex to protect concurrent access to configuration fields } // New 返回Point的单例实例 // New returns the singleton instance of Point // 注意:首次调用后的参数变更将不会生效(单例模式特性) // Note: Parameter changes after the first call will not take effect (singleton pattern characteristic) func New(clientID string, logger *zap.Logger) *Point { once.Do(func() { // 初始化线程安全的HTTP客户端 // Initialize thread-safe HTTP client baseClient := ahttp.New(nil).SetLog(logger).Client() instance = &Point{ clientID: clientID, logger: logger, client: baseClient, } }) return instance } // Debug 启用调试模式(非线程安全,建议初始化阶段调用) // Debug enables debug mode (not thread-safe, recommended to call during initialization) func (p *Point) Debug() *Point { p.mu.Lock() defer p.mu.Unlock() p.debug = true return p } // Curl 启用CURL命令生成(非线程安全,建议初始化阶段调用) // Curl enables CURL command generation (not thread-safe, recommended to call during initialization) func (p *Point) Curl() *Point { p.mu.Lock() defer p.mu.Unlock() p.curl = true return p } // Event 发送事件到指定端点 // Event sends an event to the specified endpoint // 参数data会被复制以避免原始数据修改(并发安全设计) // The data parameter is copied to avoid original data modification (concurrency-safe design) func (p *Point) Event(data map[string]interface{}) (*resty.Response, error) { data["client_id"] = p.clientID // 获取当前配置的调试和CURL设置 // Get current debug and curl configuration p.mu.Lock() debugEnabled := p.debug curlEnabled := p.curl p.mu.Unlock() // 创建新的请求实例并配置参数 // Create new request instance and configure parameters request := p.client.R(). SetBody(data). SetDebug(debugEnabled) if curlEnabled { request.EnableTrace() // 启用跟踪以生成CURL命令 / Enable trace to generate CURL command } // 发送请求并返回结果 // Send request and return results return request.Post("https://e.tapdb.net/v2/event") }