Compare commits

..

3 Commits

Author SHA1 Message Date
70a5b3db89 新增自定义时间记录 2025-09-17 17:40:31 +08:00
40bd9bb254 游戏日志方法封装 2025-09-12 18:47:14 +08:00
ayflying
4473003a36 荣耀消耗后打印更多日志 2025-09-10 12:15:25 +08:00
2 changed files with 76 additions and 22 deletions

View File

@@ -268,25 +268,66 @@ func (sdk *SDK) Shutdown() {
const datetimeFmt = time.DateOnly + " " + time.TimeOnly const datetimeFmt = time.DateOnly + " " + time.TimeOnly
// 记录日志 // 记录日志
func (sdk *SDK) Log(uid, event string, property map[string]any, timezone string) { func (sdk *SDK) Log(uid, event string, property map[string]any, timezone string, customEventTime ...time.Time) {
loc := time.Local loc := time.Local
if _loc := getLocationMapValue(timezone); _loc != nil { if _loc := getLocationMapValue(timezone); _loc != nil {
loc = _loc loc = _loc
} }
if len(property) == 0 {
property = map[string]any{"ts": gtime.Now().Timestamp()}
}
var et *gtime.Time
if len(customEventTime) > 0 {
et = gtime.NewFromTime(customEventTime[0])
} else {
et = gtime.Now()
}
log := GameLog{ log := GameLog{
Uid: uid, Uid: uid,
Event: event, Event: event,
Property: property, Property: property,
EventTimems: gtime.Now().TimestampMilli(), EventTimems: et.TimestampMilli(),
EventTimeLoc: gtime.Now().In(loc).Format(datetimeFmt), EventTimeLoc: et.In(loc).Format(datetimeFmt),
} }
// 线程安全 // 线程安全
sdk.bufferChan <- log sdk.bufferChan <- log
} }
// 按服务器时区记录日志 // 按服务器时区记录日志
func (sdk *SDK) LogLtz(uid, event string, property map[string]any) { func (sdk *SDK) LogLtz(uid, event string, property map[string]any, customEventTime ...time.Time) {
sdk.Log(uid, event, property, time.Local.String()) sdk.Log(uid, event, property, time.Local.String(), customEventTime...)
}
// 用户属性初始化
func (sdk *SDK) Uinit(uid string, property map[string]any, timezone string, customEventTime ...time.Time) {
sdk.Log(uid, "u_init", property, timezone, customEventTime...)
}
func (sdk *SDK) UinitLtz(uid string, property map[string]any, customEventTime ...time.Time) {
sdk.Uinit(uid, property, time.Local.String(), customEventTime...)
}
// 用户属性设置
func (sdk *SDK) Uset(uid string, property map[string]any, timezone string, customEventTime ...time.Time) {
sdk.Log(uid, "u_set", property, timezone, customEventTime...)
}
func (sdk *SDK) UsetLtz(uid string, property map[string]any, customEventTime ...time.Time) {
sdk.Uset(uid, property, time.Local.String(), customEventTime...)
}
// 用户属性删除
func (sdk *SDK) Uunset(uid string, property map[string]any, timezone string, customEventTime ...time.Time) {
sdk.Log(uid, "u_unset", property, timezone, customEventTime...)
}
func (sdk *SDK) UunsetLtz(uid string, property map[string]any, customEventTime ...time.Time) {
sdk.Uunset(uid, property, time.Local.String(), customEventTime...)
}
// 用户属性自增/减
func (sdk *SDK) Uinc(uid string, property map[string]any, timezone string, customEventTime ...time.Time) {
sdk.Log(uid, "u_inc", property, timezone, customEventTime...)
}
func (sdk *SDK) UincLtz(uid string, property map[string]any, customEventTime ...time.Time) {
sdk.Uinc(uid, property, time.Local.String(), customEventTime...)
} }
// 这个方法只会在内部协程调用 // 这个方法只会在内部协程调用

View File

@@ -11,19 +11,29 @@ import (
"net/http" "net/http"
) )
// 响应结果结构体
type Response struct { type Response struct {
Code int `json:"code"` // 结果码 0: 成功,其他: 失败 Code int `json:"code"`
Message string `json:"message"` // 错误信息 Message string `json:"message"`
Data *DataContent `json:"data"` // 包含购买信息的结构体 Data struct {
PurchaseProductInfo string `json:"purchaseProductInfo"`
DataSig string `json:"dataSig"`
SigAlgorithm string `json:"sigAlgorithm"`
} `json:"data"`
} }
// 数据内容结构体对应data字段 //// 响应结果结构体
type DataContent struct { //type Response struct {
PurchaseProductInfo string `json:"purchaseProductInfo"` // 消耗结果数据的JSON字符串 // Code int `json:"code"` // 结果码 0: 成功,其他: 失败
DataSig string `json:"dataSig"` // purchaseProductInfo的签名 // Message string `json:"message"` // 错误信息
SigAlgorithm string `json:"sigAlgorithm"` // 签名算法,云侧加密算法为"RSA" // Data *DataContent `json:"data"` // 包含购买信息的结构体
} //}
//
//// 数据内容结构体对应data字段
//type DataContent struct {
// PurchaseProductInfo string `json:"purchaseProductInfo"` // 消耗结果数据的JSON字符串
// DataSig string `json:"dataSig"` // purchaseProductInfo的签名
// SigAlgorithm string `json:"sigAlgorithm"` // 签名算法,云侧加密算法为"RSA"
//}
func (p *Pay) Notification(r *http.Request) { func (p *Pay) Notification(r *http.Request) {
@@ -37,21 +47,24 @@ func (p *Pay) ConsumeProduct(purchaseToken string) (err error) {
if err != nil { if err != nil {
return return
} }
get, err := g.Client().ContentJson().Header(g.MapStrStr{ var header = g.MapStrStr{
"access-token": token, "access-token": token,
"x-iap-appid": p.AppId, "x-iap-appid": p.AppId,
"purchaseToken": purchaseToken, "purchaseToken": purchaseToken,
}).Post(gctx.New(), url, g.Map{ }
var params = g.Map{
"purchaseToken": purchaseToken, "purchaseToken": purchaseToken,
"developerChallenge": grand.S(16), "developerChallenge": grand.S(16),
})
if err != nil {
return
} }
get := g.Client().ContentJson().Header(header).PostContent(gctx.New(), url, params)
g.Log().Debugf(gctx.New(), "商品消耗请求发送:url=%v, header=%v, params=%v", url, header, params)
g.Log().Debugf(gctx.New(), "商品消耗请求收到回复: %s", get)
var res *Response var res *Response
gjson.DecodeTo(get.ReadAllString(), &res) err = gjson.DecodeTo(get, &res)
if err != nil {
return
}
if res.Code != 0 { if res.Code != 0 {
g.Log().Error(gctx.New(), "商品消耗失败: "+res.Message) g.Log().Error(gctx.New(), "商品消耗失败: "+res.Message)
return errors.New(res.Message) return errors.New(res.Message)