This commit is contained in:
aozhiwei 2024-06-21 15:25:51 +08:00
parent b50680826d
commit 3896cccbc7
7 changed files with 281 additions and 66 deletions

View File

@ -6,6 +6,8 @@ require q5 v1.0.0
require f5 v1.0.0
require jccommon v1.0.0
require mt v1.0.0
require mtb v1.0.0 // indirect
@ -54,6 +56,8 @@ replace q5 => ../../third_party/q5
replace f5 => ../../third_party/f5
replace jccommon => ../jccommon
replace mt => ./mt
replace mtb => ./mtb

View File

@ -1,14 +1,17 @@
package task
type taskMgr struct {
HourlyTaskMgr
DailyTaskMgr
//HourlyTaskMgr
//DailyTaskMgr
webHook
}
func (t *taskMgr) Init() {
t.HourlyTaskMgr.Init()
func (this *taskMgr) Init() {
//t.HourlyTaskMgr.Init()
//t.DailyTaskMgr.Init()
this.webHook.init()
}
func (t *taskMgr) UnInit() {
func (this *taskMgr) UnInit() {
this.webHook.unInit()
}

View File

@ -0,0 +1,207 @@
package task
import (
"q5"
"f5"
"jccommon"
"main/constant"
"time"
"strings"
)
type webHook struct {
}
func (this* webHook) init() {
go this.loadWebHookEvent(jccommon.ORDER_UPDATE_EVENT, this.orderUpdatedCb)
go this.loadWebHookEvent(jccommon.ACTIVITY_SALE_EVENT, this.activitySaleCb)
}
func (this* webHook) unInit() {
}
func (this* webHook) loadWebHookEvent(eventName string, cb func(ds *f5.DataSet) bool) {
var lastSyncIdx = this.getLastIdx(eventName)
for true {
if lastSyncIdx < 0 {
lastSyncIdx = this.getLastIdx(eventName)
if lastSyncIdx >= 0 {
continue
}
} else {
var newLastSyncIdx int64
f5.GetGoStyleDb().RawQuery(
constant.BCEVENT_DB,
"SELECT * FROM t_webhook_event WHERE idx > ? AND event_name = ? LIMIT 1000",
[]string{
q5.ToString(lastSyncIdx),
eventName,
},
func (err error, ds *f5.DataSet) {
if err == nil {
for ds.Next() {
idx := q5.ToInt64(ds.GetByName("idx"))
if cb(ds) {
if idx > newLastSyncIdx {
newLastSyncIdx = idx
}
} else {
break
}
}
}
})
if newLastSyncIdx > lastSyncIdx {
lastSyncIdx = newLastSyncIdx
this.saveLastIdx(eventName, lastSyncIdx)
}
}
time.Sleep(time.Second * 3)
}
}
func (this* webHook) getLastIdx(eventName string) int64 {
var lastSyncIdx int64 = -1
f5.GetGoStyleDb().OrmSelectOne(
constant.BCEVENT_DB,
"t_webhook_process_last_idx",
[][]string{
{"event_name", eventName},
},
func (err error, ds *f5.DataSet) {
if err != nil {
return
}
if ds.Next() {
lastSyncIdx = q5.ToInt64(ds.GetByName("last_idx"))
} else {
lastSyncIdx = 0
}
})
return lastSyncIdx
}
func (this* webHook) saveLastIdx(eventName string, lastIdx int64) bool {
var result bool = false
nowTime := f5.GetApp().GetRealSeconds()
f5.GetGoStyleDb().Upsert(
constant.BCEVENT_DB,
"t_webhook_process_last_idx",
[][]string{
{"event_name", eventName},
},
[][]string{
{"last_idx", q5.ToString(lastIdx)},
},
[][]string{
{"event_name", eventName},
{"last_idx", q5.ToString(lastIdx)},
{"createtime", q5.ToString(nowTime)},
{"modifytime", q5.ToString(nowTime)},
},
func (err error, lastInsertId int64, rowsAffected int64) {
result = err == nil
})
return result
}
func (this* webHook) orderUpdatedCb(ds *f5.DataSet) bool {
nowTime := f5.GetApp().GetRealSeconds()
rawData := ds.GetByName("raw_data")
p := new(jccommon.OrderUpdatedEvent)
err := q5.DecodeJson(rawData, &p)
netId := 13473
if err == nil {
updateFields := [][]string{
{"order_id", p.Data.Id},
{"chain", p.Chain},
{"status", p.Data.Status.Name},
{"start_time", q5.SafeToString(p.Data.StartAt)},
{"end_time", q5.SafeToString(p.Data.EndAt)},
{"created_at", q5.SafeToString(p.Data.CreatedAt)},
{"updated_at", q5.SafeToString(p.Data.UpdatedAt)},
{"event_id", p.EventId},
{"event_data", rawData},
{"modifytime", q5.ToString(nowTime)},
}
insertFields := [][]string{
{"order_id", p.Data.Id},
{"chain", p.Chain},
{"status", p.Data.Status.Name},
{"net_id", q5.ToString(netId)},
{"token_id", p.Data.Sell[0].TokenId},
{"contract_address", strings.ToLower(p.Data.Sell[0].ContractAddress)},
{"start_time", q5.SafeToString(p.Data.StartAt)},
{"end_time", q5.SafeToString(p.Data.EndAt)},
{"created_at", q5.SafeToString(p.Data.CreatedAt)},
{"updated_at", q5.SafeToString(p.Data.UpdatedAt)},
{"event_id", p.EventId},
{"event_data", rawData},
{"createtime", q5.ToString(nowTime)},
{"modifytime", q5.ToString(nowTime)},
}
f5.GetGoStyleDb().UpsertEx(
constant.BCNFT_DB,
"t_order",
[][]string{
{"net_id", q5.ToString(netId)},
{"contract_address", strings.ToLower(p.Data.Sell[0].ContractAddress)},
{"token_id", p.Data.Sell[0].TokenId},
},
updateFields,
insertFields,
func (err error, lastInsertId int64, rowsAffected int64) {
if err != nil {
return
}
},
func (ds *f5.DataSet) bool {
return p.EventId > ds.GetByName("event_id")
})
}
return true
}
func (this* webHook) activitySaleCb(ds *f5.DataSet) bool {
nowTime := f5.GetApp().GetRealSeconds()
rawData := ds.GetByName("raw_data")
p := new(jccommon.ActivitySaleEvent)
err := q5.DecodeJson(rawData, &p)
netId := 13473
if err == nil {
updateFields := [][]string{
}
insertFields := [][]string{
{"order_id", p.Data.Details.OrderId},
{"chain", p.Chain},
{"net_id", q5.ToString(netId)},
{"token_id", p.Data.Details.Asset[0].TokenId},
{"contract_address", strings.ToLower(p.Data.Details.Asset[0].ContractAddress)},
{"buyer", p.Data.Details.From},
{"seller", p.Data.Details.To},
{"event_id", p.EventId},
{"event_data", rawData},
{"createtime", q5.ToString(nowTime)},
{"modifytime", q5.ToString(nowTime)},
}
f5.GetGoStyleDb().UpsertEx(
constant.BCNFT_DB,
"t_sale",
[][]string{
{"order_id", p.Data.Details.OrderId},
},
updateFields,
insertFields,
func (err error, lastInsertId int64, rowsAffected int64) {
if err != nil {
return
}
},
func (ds *f5.DataSet) bool {
return p.EventId > ds.GetByName("event_id")
})
}
return true
}

View File

@ -9,3 +9,23 @@ const (
ITEM_TYPE_HERO = 3
ITEM_TYPE_GOLD_BULLION = 31
)
const (
ORDER_STATUS_PENDING = "PENDING"
ORDER_STATUS_ACTIVE = "ACTIVE"
ORDER_STATUS_INACTIVE = "INACTIVE"
ORDER_STATUS_CANCELLED = "CANCELLED"
ORDER_STATUS_FILLED = "FILLED"
ORDER_STATUS_EXPIRED = "EXPIRED"
)
const (
ORDER_UPDATE_EVENT = "imtbl_zkevm_order_updated"
TRADE_CREATED_EVENT = "imtbl_zkevm_trade_created"
ACTIVITY_SALE_EVENT = "imtbl_zkevm_activity_sale"
)
const (
CONTRACT_NAME_CFHero = "CFHero"
CONTRACT_NAME_GoldBrick = "GoldBrick"
)

42
server/jccommon/types.go Normal file
View File

@ -0,0 +1,42 @@
package jccommon
type ActivitySaleEvent struct {
EventName string `json:"event_name"`
EventId string `json:"event_id"`
Chain string `json:"chain"`
Data struct {
Details struct {
To string `json:"to"`
From string `json:"from"`
OrderId string `json:"order_id"`
Asset [] struct {
TokenId string `json:"token_id"`
ContractType string `json:"contract_type"`
ContractAddress string `json:"contract_address"`
} `json:"asset"`
} `json:"details"`
} `json:"data"`
}
type OrderUpdatedEvent struct {
EventName string `json:"event_name"`
EventId string `json:"event_id"`
Chain string `json:"chain"`
Data struct {
Id string `json:"id"`
Sell [] struct {
TokenId string `json:"token_id"`
ItemType string `json:"item_type"`
EndAmount string `json:"end_amount"`
StartAmount string `json:"start_amount"`
ContractAddress string `json:"contract_address"`
} `json:"sell"`
Status struct {
Name string `json:"name"`
} `json:"status"`
StartAt interface{} `json:"start_at"`
EndAt interface{} `json:"end_at"`
CreatedAt interface{} `json:"created_at"`
UpdatedAt interface{} `json:"updated_at"`
} `json:"data"`
}

View File

@ -15,47 +15,6 @@ type NftHomeMeta struct {
ExternalLink string `json:"external_link"`
}
type ActivitySaleEvent struct {
EventName string `json:"event_name"`
EventId string `json:"event_id"`
Chain string `json:"chain"`
Data struct {
Details struct {
To string `json:"to"`
From string `json:"from"`
OrderId string `json:"order_id"`
Asset [] struct {
TokenId string `json:"token_id"`
ContractType string `json:"contract_type"`
ContractAddress string `json:"contract_address"`
} `json:"asset"`
} `json:"details"`
} `json:"data"`
}
type OrderUpdatedEvent struct {
EventName string `json:"event_name"`
EventId string `json:"event_id"`
Chain string `json:"chain"`
Data struct {
Id string `json:"id"`
Sell [] struct {
TokenId string `json:"token_id"`
ItemType string `json:"item_type"`
EndAmount string `json:"end_amount"`
StartAmount string `json:"start_amount"`
ContractAddress string `json:"contract_address"`
} `json:"sell"`
Status struct {
Name string `json:"name"`
} `json:"status"`
StartAt interface{} `json:"start_at"`
EndAt interface{} `json:"end_at"`
CreatedAt interface{} `json:"created_at"`
UpdatedAt interface{} `json:"updated_at"`
} `json:"data"`
}
type StreamPagination struct {
NextCursor string `json:"next_cursor"`
PreviousCursor string `json:"previous_cursor"`

View File

@ -14,26 +14,6 @@ const (
MAX_MODULE_IDX
)
const (
ORDER_STATUS_PENDING = "PENDING"
ORDER_STATUS_ACTIVE = "ACTIVE"
ORDER_STATUS_INACTIVE = "INACTIVE"
ORDER_STATUS_CANCELLED = "CANCELLED"
ORDER_STATUS_FILLED = "FILLED"
ORDER_STATUS_EXPIRED = "EXPIRED"
)
const (
ORDER_UPDATE_EVENT = "imtbl_zkevm_order_updated"
TRADE_CREATED_EVENT = "imtbl_zkevm_trade_created"
ACTIVITY_SALE_EVENT = "imtbl_zkevm_activity_sale"
)
const (
CONTRACT_NAME_CFHero = "CFHero"
CONTRACT_NAME_GoldBrick = "GoldBrick"
)
const (
SHOPCART_MAX_GOODS_NUM = 20
)