This commit is contained in:
aozhiwei 2024-07-12 17:21:25 +08:00
parent 7affbd8c60
commit fd749fb398
12 changed files with 0 additions and 1141 deletions

View File

@ -1,22 +0,0 @@
package task
import (
"f5"
"fmt"
"q5"
"time"
)
type DailyTaskMgr struct {
SeasonRankMgr
}
func (this *DailyTaskMgr) Init() {
//sleepTime := f5.GetApp().GetNowDaySeconds() + 3600*24 - f5.GetApp().GetNowSeconds()
f5.GetTimer().SetInterval(
1000*3600*24,
func(e int32, args *q5.Args) {
this.SeasonRankMgr.CalcRanking()
fmt.Printf("DailyTask.sleepTime:%v \n", time.Now())
})
}

View File

@ -1,94 +0,0 @@
package task
import (
"fmt"
"math"
"q5"
)
func _xif(cond bool, trueVal int64, falseVal int64) int64 {
if cond {
return trueVal
} else {
return falseVal
}
}
func _round(x float64, y int64) float64 {
var num float64
if y == 0 {
num = math.Round(x)
} else {
//roundedNum := math.Round(x*100) / 100
strFmt := "%." + q5.ToString(y) + "f"
result := fmt.Sprintf(strFmt, x)
num = q5.ToFloat64(result)
}
//t := q5.ToString(result)
return num
}
func celTopX(ranking int64) int64 {
t := _xif(ranking > 0, 1, 0)*_xif(ranking <= 3, 1, 0)*1 +
_xif(ranking > 3, 1, 0)*_xif(ranking <= 10, 1, 0)*2 +
_xif(ranking > 10, 1, 0)*_xif(ranking <= 50, 1, 0)*3 +
_xif(ranking > 50, 1, 0)*_xif(ranking <= 100, 1, 0)*4 +
_xif(ranking > 100, 1, 0)*_xif(ranking <= 500, 1, 0)*5 +
_xif(ranking > 500, 1, 0)*_xif(ranking <= 1000, 1, 0)*6 +
_xif(ranking > 1000, 1, 0)*_xif(ranking <= 2000, 1, 0)*7 +
_xif(ranking > 2000, 1, 0)*_xif(ranking <= 5000, 1, 0)*8 +
_xif(ranking > 5000, 1, 0)*_xif(ranking <= 10000, 1, 0)*9 +
_xif(ranking > 10000, 1, 0)*10
return t
}
func celUserRankingPoint(ranking int64, topX int64) float64 {
//let XX = this.startTopX(topTd+1) ? this.startTopX(topTd+1):10001;
var x float64
if topX > 9 {
x = 10001
} else {
x = startTopX(topX + 1)
}
////TopX排位赛标准分配额=MAX(ROUND(TopX梯队最高值-(TopX梯队最高值-TopX梯队最低值)/(TopX梯队开始值(TopX梯队+1)-TopX梯队开始值-1)*(TopX-TopX梯队开始值),2),TopX梯队最低值)
//return Math.max(jsRound(this.maxTopX(topTd)-(this.maxTopX(topTd)-this.minTopX(topTd))/(XX-this.startTopX(topTd)-1)*(top-this.startTopX(topTd)),2),this.minTopX(topTd));
t := maxTopX(topX) - (maxTopX(topX)-minTopX(topX))/
(x-startTopX(topX)-1)*
(q5.ToFloat64(ranking)-startTopX(topX))
return math.Max(_round(t, 2), minTopX(topX))
}
func startTopX(topX int64) float64 {
t := _xif(topX == 1, 1, 0)*1 +
_xif(topX == 2, 1, 0)*4 +
_xif(topX == 3, 1, 0)*11 +
_xif(topX == 4, 1, 0)*51 +
_xif(topX == 5, 1, 0)*101 +
_xif(topX == 6, 1, 0)*501 +
_xif(topX == 7, 1, 0)*1001 +
_xif(topX == 8, 1, 0)*2001 +
_xif(topX == 9, 1, 0)*5001 +
_xif(topX == 10, 1, 0)*10001
return q5.ToFloat64(t)
}
func maxTopX(topX int64) float64 {
//TopX梯队最高值=ROUND(20000*0.6^(TopX梯队-1)*0.8*0.9^(TopX梯队-1),0)
//return jsRound(20000 * Math.pow(0.6,topTd-1) * 0.8 * Math.pow(0.9,topTd-1),0);
t := 20000 * math.Pow(0.6, q5.ToFloat64(topX-1)) * 0.8 * math.Pow(0.9, q5.ToFloat64(topX-1))
return _round(t, 0)
}
func minTopX(topX int64) float64 {
//TopX梯队最低值=ROUND(20000*0.6^(TopX梯队)*0.8*0.9^(TopX梯队-1),0)
//return jsRound(20000 * Math.pow(0.6,topTd) * 0.8 * Math.pow(0.9,topTd-1),0);
t := 20000 * math.Pow(0.6, q5.ToFloat64(topX)) * 0.8 * math.Pow(0.9, q5.ToFloat64(topX-1))
return _round(t, 0)
}
func ceilEx(number float64, decimals float64) float64 {
intPart := math.Floor(number)
floatPart := number - intPart
finallyFloatPart := math.Ceil(floatPart*math.Pow(q5.ToFloat64(10), decimals)) / math.Pow(q5.ToFloat64(10), decimals)
return intPart + finallyFloatPart
}

View File

@ -1,179 +0,0 @@
package task
import (
"f5"
"fmt"
"main/constant"
"mt"
"q5"
)
type HashRateMgr struct {
totalPowerNumber float64
period int32
hashRateMate *mt.HashRateCommon
}
func (this *HashRateMgr) CalPowerByCECReward() {
this.hashRateMate = mt.Table.HashRateCommon.GetLatestPeriod()
this.period = this.hashRateMate.GetId()
var totalPower float64 = 0
f5.NewAsyncTask(
func(task *f5.AsyncTask) {
sql := fmt.Sprintf("SELECT * FROM t_power_exchange_record WHERE period = %d",
this.period)
f5.GetJsStyleDb().SelectCustomQuery(
constant.GAME_DB,
sql,
func(err error, rows *f5.DataSet) {
if err != nil {
task.SetFail()
f5.GetSysLog().Error("HashRateMgr Error1:%v \n", err)
return
}
for rows.Next() {
totalPower += q5.ToFloat64(rows.GetByName("total_num"))
}
if rows.NumOfReaded() <= 0 {
task.SetFail()
} else {
task.SetSucc()
}
},
)
},
).OnSucc(
func(task *f5.AsyncTask) {
if totalPower != 0 {
this.totalPowerNumber = totalPower
this.getAccountGroup()
}
}).OnFail(
func(task *f5.AsyncTask) {
fmt.Printf("Cal Fail")
})
}
func (this *HashRateMgr) getAccountGroup() {
accountIds := []string{}
f5.NewAsyncTask(
func(task *f5.AsyncTask) {
sql := fmt.Sprintf("SELECT account_id,`period` FROM t_power_exchange_record WHERE period = %d group by account_id",
this.period)
f5.GetJsStyleDb().SelectCustomQuery(
constant.GAME_DB,
sql,
func(err error, rows *f5.DataSet) {
if err != nil {
task.SetFail()
f5.GetSysLog().Error("HashRateMgr Error2:%v \n", err)
return
}
for rows.Next() {
accountId := rows.GetByName("account_id")
accountIds = append(accountIds, accountId)
}
task.SetSucc()
},
)
}).OnSucc(
func(task *f5.AsyncTask) {
this.checkAccountIsSettle(accountIds)
}).OnFail(
func(task *f5.AsyncTask) {
})
}
func (this *HashRateMgr) checkAccountIsSettle(param []string) {
var index = 0
f5.NewAsyncTask(
func(task *f5.AsyncTask) {
if index >= len(param) {
task.SetSucc()
return
}
f5.GetJsStyleDb().OrmSelectOne(
constant.GAME_DB,
"t_hash_rate_reward",
[][]string{
{"account_id", q5.ToString(param[index])},
{"period", q5.ToString(this.period)},
},
func(err error, row *f5.DataSet) {
if err != nil {
f5.GetSysLog().Error("HashRateMgr Error3:%v \n", err)
task.SetFail()
return
}
if row.Next() {
index += 1
task.Continue()
} else {
//结算操作
this.getOwnerPower(param[index], func(ownerPower float64) {
target := ceilEx(q5.Min(this.totalPowerNumber/q5.ToFloat64(this.hashRateMate.GetCecPool()), 1), 6)
ratio := ownerPower / this.totalPowerNumber
cecNUm := ceilEx(q5.ToFloat64(this.hashRateMate.GetCecPool())*target*ratio, 2)
this.pushHashRateReward(param[index], cecNUm)
index += 1
task.Continue()
})
}
})
}).OnSucc(
func(task *f5.AsyncTask) {
}).OnFail(
func(task *f5.AsyncTask) {
})
}
func (this *HashRateMgr) getOwnerPower(account string, cb func(param float64)) {
var ownerPower float64 = 0
f5.NewAsyncTask(func(task *f5.AsyncTask) {
sql1 := fmt.Sprintf("SELECT * FROM t_power_exchange_record WHERE account_id = '%s' AND period = %d",
account,
this.period)
f5.GetJsStyleDb().SelectCustomQuery(
constant.GAME_DB,
sql1,
func(err error, rows *f5.DataSet) {
if err != nil {
task.SetFail()
f5.GetSysLog().Error("HashRateMgr Error4:%v \n", err)
return
}
for rows.Next() {
ownerPower += q5.ToFloat64(rows.GetByName("total_num"))
}
task.SetSucc()
},
)
}).OnSucc(func(task *f5.AsyncTask) {
cb(ownerPower)
}).OnFail(func(task *f5.AsyncTask) {
})
}
func (this *HashRateMgr) pushHashRateReward(account string, num float64) {
fields := [][]string{
{"account_id", account},
//q5.GenFieldKvEmptyAsNull("address", v.address),
{"address", q5.ToString("test123456789")},
{"period", q5.ToString(this.period)},
{"reward_cec", q5.ToString(num)},
{"createtime", q5.ToString(f5.GetApp().GetNowSeconds())},
{"modifytime", q5.ToString(f5.GetApp().GetNowSeconds())},
}
f5.GetJsStyleDb().Insert(
constant.GAME_DB,
"t_hash_rate_reward",
fields,
func(err error, id int64, affectedRows int64) {
if err != nil || affectedRows != 1 {
// 插入失败,处理错误逻辑
f5.GetSysLog().Error("HashRateMgr Error5:%v \n", err)
}
},
)
}

View File

@ -1,21 +0,0 @@
package task
import (
"f5"
"fmt"
"q5"
"time"
)
type HourlyTaskMgr struct {
HashRateMgr
}
func (this *HourlyTaskMgr) Init() {
f5.GetTimer().SetInterval(
1000*3600,
func(e int32, args *q5.Args) {
this.HashRateMgr.CalPowerByCECReward()
fmt.Printf("HourlyTask.sleepTime:%v \n", time.Now())
})
}

View File

@ -1,151 +0,0 @@
package task
import (
"f5"
"fmt"
"main/constant"
"math"
"mt"
"q5"
"sort"
)
type userDb struct {
idx int64
account_id string
address string
channel int32
rank int32
score int32
score_modifytime int64
}
type sortUserDb []userDb
func (this sortUserDb) Len() int {
return len(this)
}
func (this sortUserDb) Swap(i, j int) {
this[i], this[j] = this[j], this[i]
}
func (this sortUserDb) Less(i, j int) bool {
if this[i].score == this[j].score {
if this[i].score_modifytime == this[j].score_modifytime {
return this[i].idx < this[j].idx
} else {
return this[i].score_modifytime < this[j].score_modifytime
}
} else {
return this[i].score > this[j].score
}
}
type SeasonRankMgr struct {
}
func (this *SeasonRankMgr) CalcRanking() {
seasonMt := mt.Table.RankSeason.GetCurrentSeason()
season := mt.Table.RankSeason.GetLastSeason()
f5.GetJsStyleDb().OrmSelectOne(
constant.GAME_DB,
"t_season_ranking",
[][]string{
{"season", q5.ToString(season.GetId())},
},
func(err error, row *f5.DataSet) {
if err != nil {
f5.GetSysLog().Error("SeasonRankMgr Error1:%v \n", err)
return
}
row.Next()
if row.NumOfReaded() <= 0 && seasonMt == nil {
fmt.Println("OK")
this.goGetUsersRecords()
}
})
}
func (this *SeasonRankMgr) goGetUsersRecords() {
userHash := make(map[int64]*userDb)
userList := []userDb{}
var lastIdx int64 = 0
f5.NewAsyncTask(
func(task *f5.AsyncTask) {
sql := fmt.Sprintf("SELECT * FROM t_user WHERE idx > %d AND score >= %d LIMIT %d",
lastIdx,
constant.BASE_SCORE,
1000)
f5.GetJsStyleDb().SelectCustomQuery(
constant.GAME_DB,
sql,
func(err error, rows *f5.DataSet) {
if err != nil {
task.SetFail()
f5.GetSysLog().Error("SeasonRankMgr Error2:%v \n", err)
return
}
for rows.Next() {
user := userDb{}
user.idx = q5.ToInt64(rows.GetByName("idx"))
user.account_id = q5.ToString(rows.GetByName("account_id"))
user.address = q5.ToString(rows.GetByName("address"))
user.channel = q5.ToInt32(rows.GetByName("channel"))
user.rank = q5.ToInt32(rows.GetByName("rank"))
user.score = q5.ToInt32(rows.GetByName("score"))
user.score_modifytime = q5.ToInt64(rows.GetByName("score_modifytime"))
userHash[user.idx] = &user
userList = append(userList, user)
if user.idx > lastIdx {
lastIdx = user.idx
}
f5.GetSysLog().Info("get User:%s \n", user.idx)
}
task.SetSucc()
},
)
}).OnSucc(
func(task *f5.AsyncTask) {
if userList != nil {
sort.Sort(sortUserDb(userList))
this.pushRankingResult(userList)
}
}).OnFail(
func(task *f5.AsyncTask) {
f5.GetSysLog().Error("SeasonRankMgr Error3 \n")
return
})
}
func (this *SeasonRankMgr) pushRankingResult(record []userDb) {
for i, v := range record {
ranking := i + 1
topX := celTopX(q5.ToInt64(ranking))
point := math.Round(celUserRankingPoint(q5.ToInt64(ranking), topX))
fields := [][]string{
{"ranking", q5.ToString(ranking)},
{"ranking_point", q5.ToString(point)},
{"account_id", v.account_id},
q5.GenFieldKvEmptyAsNull("address", v.address),
{"channel", q5.ToString(v.channel)},
{"rank", q5.ToString(v.rank)},
{"score", q5.ToString(v.score)},
{"season", q5.ToString(2)},
{"createtime", q5.ToString(f5.GetApp().GetNowSeconds())},
{"modifytime", q5.ToString(f5.GetApp().GetNowSeconds())},
}
//f5.GetJsStyleDb().Insert(
// constant.GAME_DB,
// "t_season_ranking",
// fields,
// func(err error, id int64, affectedRows int64) {
// if err != nil || affectedRows != 1 {
// // 插入失败,处理错误逻辑
// fmt.Printf("Failed to insert t_season_ranking: %v", err)
// }
// },
//)
f5.GetSysLog().Info("ranking:%v", fields)
}
}

View File

@ -1,110 +0,0 @@
package task
import (
"q5"
"f5"
"mt"
"jccommon"
"fmt"
"main/constant"
"main/service"
)
type goldBullionReturn struct {
}
func (this* goldBullionReturn) init() {
go this.loadExpiredGoldBullion()
}
func (this* goldBullionReturn) unInit() {
}
func (this* goldBullionReturn) loadExpiredGoldBullion() {
f5.GetGoStyleDb().LoopLoad(
constant.GAME_DB,
"goldBullionReturn",
"t_gold_bullion",
func () int64 {
return 60 * 5
},
func (lastIdx int64) string {
nowTime := f5.GetApp().GetRealSeconds()
expiredTime := nowTime - 3600 * 24 - 3600
sql := fmt.Sprintf(`
SELECT * FROM t_gold_bullion
WHERE idx > %d AND activated = 0 AND returned = 0 AND status=%d AND createtime < %d LIMIT 100`,
lastIdx,
jccommon.GOLD_BULLION_NO_OPEN,
expiredTime)
return sql
},
[]string{
},
func () int64 {
return 10
},
func () int64 {
return 60 * 5
},
this.returnGold)
}
func (this* goldBullionReturn) returnGold(ds *f5.DataSet) bool {
netId := q5.ToInt32(ds.GetByName("net_id"))
contractMeta := mt.Table.Contract.GetByNetIdName(netId, jccommon.CONTRACT_NAME_GoldBrick)
if contractMeta == nil {
return true
}
accountId := ds.GetByName("src_account_id")
if accountId == "" {
return true
}
contractAddress := contractMeta.GetAddress()
tokenId := ds.GetByName("token_id")
f5.GetSysLog().Info("returnGold net:%d accountId:%s contract_address:%s tokenId: %s",
netId, accountId, contractAddress, tokenId)
{
rspObj := struct {
Result struct {
TokenId string `json:"token_id"`
} `json:"result"`
}{}
url := fmt.Sprintf("%s/v1/chains/%s/collections/%s/nfts/%s",
mt.Table.Config.GetById(0).GetImmutableBaseUrl(),
mt.Table.Config.GetById(0).GetChainName(),
contractAddress,
tokenId)
rsp, data, err := q5.HttpGetEx2(url, map[string]string{})
if err != nil {
f5.GetSysLog().Info("returnGold immutable api:%s request error:%s",
url,
err)
return true
}
f5.GetSysLog().Info("returnGold immutable api:%s statusCode:%d body:%s",
url,
rsp.StatusCode,
data)
if rsp.StatusCode != 404 {
return true
}
if rsp.StatusCode == 200 {
if err := q5.DecodeJson(data, &rspObj); err != nil {
f5.GetSysLog().Info("returnGold immutable api:%s decodeJson error:%s",
url,
err)
return true
}
if rspObj.Result.TokenId == tokenId {
f5.GetSysLog().Info("returnGold tokenId:%s exists",
tokenId)
return true
}
}
}
service.ReturnGoldBullion(accountId, netId, tokenId)
return true
}

View File

@ -1,216 +0,0 @@
package task
import (
"q5"
"f5"
"fmt"
"strings"
"mt"
"jccommon"
"main/constant"
"main/service"
"math/rand"
)
type lockReturnValues struct {
Nft string `json:"nft"`
Sender string `json:"sender"`
To string `json:"to"`
TokenIds []string `json:"tokenIds"`
}
type nftLock struct {
mailCfgHash *q5.ConcurrentMap[string, *jccommon.MailConfig]
}
func (this* nftLock) init() {
this.mailCfgHash = new(q5.ConcurrentMap[string, *jccommon.MailConfig])
this.registerMailConfig(constant.MAIL_GOLD_BULLION_LOCK,
jccommon.MAIL_TAG1_GOLD_BULLION,
jccommon.MAIL_TAG2_GOLD_BULLION_LOCK)
go this.process()
}
func (this* nftLock) unInit() {
}
func (this* nftLock) process() {
f5.GetGoStyleDb().LoopLoad(
constant.BCEVENT_DB,
"nftLock",
"t_nft_lock_event",
func () int64 {
return 3
},
func (lastIdx int64) string {
sql := fmt.Sprintf(`
SELECT * FROM t_nft_lock_event WHERE idx > %d AND (nft_sync_status = 0 OR nft_use_status = 0) LIMIT 100`,
lastIdx,
)
return sql
},
[]string{
},
func () int64 {
return 3
},
func () int64 {
return 60 + q5.ToInt64(rand.Intn(3))
},
this.repair)
}
func (this* nftLock) repair(ds *f5.DataSet) bool {
nftSyncStatus := q5.ToInt32(ds.GetByName("nft_sync_status"))
nftUseStatus := q5.ToInt32(ds.GetByName("nft_use_status"))
netId := q5.ToInt32(ds.GetByName("net_id"))
idx := q5.ToInt64(ds.GetByName("idx"))
lockTo := ds.GetByName("lock_to")
if nftSyncStatus == 0 && lockTo != "" {
p := new(lockReturnValues)
if q5.DecodeJson(ds.GetByName("return_values"), p) == nil {
for _, val := range p.TokenIds {
contractAddress := strings.ToLower(p.Nft)
tokenId := val
if service.NftExists(netId, contractAddress, tokenId) {
service.NftUpdateLock(netId, contractAddress, tokenId, idx, lockTo)
}
}
}
}
if nftUseStatus == 0 {
p := new(lockReturnValues)
if q5.DecodeJson(ds.GetByName("return_values"), p) == nil {
this.useNft(idx, netId, lockTo, p)
}
}
return true
}
func (this *nftLock) useNft(dbIdx int64, netId int32, lockTo string, p *lockReturnValues) {
lockTo = strings.ToLower(lockTo)
contractAddress := strings.ToLower(p.Nft)
goldMeta := mt.Table.Contract.GetByNetIdName(netId, jccommon.CONTRACT_NAME_GoldBrick)
if goldMeta == nil {
return
}
if contractAddress != strings.ToLower(goldMeta.GetAddress()) {
f5.GetGoStyleDb().Update(
constant.BCEVENT_DB,
"t_nft_lock_event",
[][]string {
{"idx", q5.ToString(dbIdx)},
},
[][]string {
{"nft_use_status", q5.ToString(1)},
},
func (err error, lastInsertId int64, rowsAffected int64) {
})
return
}
accountId := service.GetAccountIdByAddress(lockTo)
if accountId == "" {
return
}
ok := true
for _, tokenId := range p.TokenIds {
var itemId int32
if service.GetGoldBullionByNetIdTokenId(netId, tokenId, &itemId) {
if service.OpenGoldBullion(accountId, lockTo, netId, tokenId) {
if this.internalSendMail(dbIdx, lockTo, constant.MAIL_GOLD_BULLION_LOCK, tokenId) {
} else {
ok = false
break
}
} else {
ok = false
break
}
} else {
ok = false
break
}
}
if ok {
f5.GetGoStyleDb().Update(
constant.BCEVENT_DB,
"t_nft_lock_event",
[][]string {
{"idx", q5.ToString(dbIdx)},
},
[][]string {
{"nft_use_status", q5.ToString(1)},
},
func (err error, lastInsertId int64, rowsAffected int64) {
})
}
}
func (this* nftLock) internalSendMail(dbIdx int64, accountAddress string, mailName string, tokenId string) bool {
var itemId int32
if !service.GetGoldBullionItemIdByTokenId(tokenId, &itemId) {
return true
}
goldNum := jccommon.GetGoldBullionGoldNum(itemId)
goldNumStr := this.formatGoldNum(goldNum)
itemMeta := mt.Table.Item.GetById(q5.ToInt64(itemId))
if itemMeta == nil {
return true
}
accountId := service.GetAccountIdByAddress(accountAddress)
if accountId == "" {
return true
}
mailMeta := mt.Table.Mail.GetByName(mailName)
if mailMeta == nil {
return true
}
mailCfg := this.getMailConfig(mailName)
if mailCfg == nil {
return true
}
nowTime := f5.GetApp().GetRealSeconds()
subject := mailMeta.GetTitle()
content := mailMeta.ReplaceContent(map[string]string{
"${item.name}": itemMeta.GetRealName(),
"${gold}": goldNumStr,
})
uniKey := fmt.Sprintf("%s_%s_%d", mailName, tokenId, dbIdx)
sendOk := service.SendSysMail(
uniKey,
accountId,
subject,
content,
q5.ToInt32(nowTime),
q5.ToInt32(nowTime) + 3600 * 24 * 7,
mailCfg.Tag1,
mailCfg.Tag2)
return sendOk
}
func (this *nftLock) formatGoldNum(goldNum int32) string {
if goldNum == 1000 {
return "1,000"
} else if goldNum == 10000 {
return "10,000"
}
return q5.ToString(goldNum)
}
func (this *nftLock) getMailConfig(mailName string) *jccommon.MailConfig {
if v, ok := this.mailCfgHash.Load(mailName); ok {
return *v
} else {
return nil
}
}
func (this *nftLock) registerMailConfig(mailName string, tag1 int32, tag2 int32) {
p := new(jccommon.MailConfig)
p.MailName = mailName
p.Tag1 = tag1
p.Tag2 = tag2
this.mailCfgHash.Store(mailName, p)
}

View File

@ -1,129 +0,0 @@
package spec_transfer721
import (
"q5"
"f5"
"main/service"
"main/constant"
"mt"
"jccommon"
"fmt"
)
type goldBullion struct {
mailCfgHash *q5.ConcurrentMap[string, *jccommon.MailConfig]
}
func (this* goldBullion) onMint(dbIdx int64, netId int32, contractAddress string, tokenId string,
from string, to string) bool {
ok := this.internalSendMail(dbIdx, to, constant.MAIL_GOLD_BULLION_MINT, tokenId)
return ok
}
func (this* goldBullion) onLock(dbIdx int64, netId int32, contractAddress string, tokenId string,
from string, to string) bool {
/*
ok := this.internalSendMail(dbIdx, from, constant.MAIL_GOLD_BULLION_LOCK, tokenId)
return ok
*/
return true
}
func (this *goldBullion) onUnlock(dbIdx int64, netId int32, contractAddress string, tokenId string,
from string, to string) bool {
accountAddress := to
accountId := service.GetAccountIdByAddress(accountAddress)
if accountId == "" {
return false
}
{
}
/*
goldDb := service.GetGoldBullionByTokenId(tokenId)
if goldDb == nil {
return false
}*/
ok := this.internalSendMail(dbIdx, to, constant.MAIL_GOLD_BULLION_UNLOCK, tokenId)
return ok
}
func (this* goldBullion) internalSendMail(dbIdx int64, accountAddress string, mailName string, tokenId string) bool {
var itemId int32
if !service.GetGoldBullionItemIdByTokenId(tokenId, &itemId) {
return true
}
goldNum := jccommon.GetGoldBullionGoldNum(itemId)
goldNumStr := this.formatGoldNum(goldNum)
itemMeta := mt.Table.Item.GetById(q5.ToInt64(itemId))
if itemMeta == nil {
return true
}
accountId := service.GetAccountIdByAddress(accountAddress)
if accountId == "" {
return true
}
mailMeta := mt.Table.Mail.GetByName(mailName)
if mailMeta == nil {
return true
}
mailCfg := this.getMailConfig(mailName)
if mailCfg == nil {
return true
}
nowTime := f5.GetApp().GetRealSeconds() + 3600 * 24 * 7
subject := mailMeta.GetTitle()
content := mailMeta.ReplaceContent(map[string]string{
"${item.name}": itemMeta.GetRealName(),
"${gold}": goldNumStr,
})
uniKey := fmt.Sprintf("%s_%s_%d", mailName, tokenId, dbIdx)
sendOk := service.SendSysMail(
uniKey,
accountId,
subject,
content,
q5.ToInt32(nowTime),
q5.ToInt32(nowTime),
mailCfg.Tag1,
mailCfg.Tag2)
if sendOk {
return service.UpdateSpecTransferStatus(dbIdx, 1)
}
return false
}
func (this *goldBullion) getMailConfig(mailName string) *jccommon.MailConfig {
if v, ok := this.mailCfgHash.Load(mailName); ok {
return *v
} else {
return nil
}
}
func (this *goldBullion) registerMailConfig(mailName string, tag1 int32, tag2 int32) {
p := new(jccommon.MailConfig)
p.MailName = mailName
p.Tag1 = tag1
p.Tag2 = tag2
this.mailCfgHash.Store(mailName, p)
}
func (this *goldBullion) formatGoldNum(goldNum int32) string {
return ""
}
func newGoldBullion() *goldBullion {
p := new(goldBullion)
p.mailCfgHash = new(q5.ConcurrentMap[string, *jccommon.MailConfig])
p.registerMailConfig(constant.MAIL_GOLD_BULLION_MINT,
jccommon.MAIL_TAG1_GOLD_BULLION,
jccommon.MAIL_TAG2_GOLD_BULLION_MINT)
p.registerMailConfig(constant.MAIL_GOLD_BULLION_LOCK,
jccommon.MAIL_TAG1_GOLD_BULLION,
jccommon.MAIL_TAG2_GOLD_BULLION_LOCK)
p.registerMailConfig(constant.MAIL_GOLD_BULLION_UNLOCK,
jccommon.MAIL_TAG1_GOLD_BULLION,
jccommon.MAIL_TAG2_GOLD_BULLION_UNLOCK)
return p
}

View File

@ -1,104 +0,0 @@
package spec_transfer721
import (
"q5"
"f5"
"main/service"
"main/constant"
"mt"
"jccommon"
"fmt"
)
type hero struct {
mailCfgHash *q5.ConcurrentMap[string, *jccommon.MailConfig]
}
func (this* hero) onMint(dbIdx int64, netId int32, contractAddress string, tokenId string,
from string, to string) bool {
if jccommon.IsAirDropNft(tokenId) {
return service.UpdateSpecTransferStatus(dbIdx, 1)
}
ok := this.internalSendMail(dbIdx, to, constant.MAIL_HERO_MINT, tokenId)
return ok
}
func (this* hero) onLock(dbIdx int64, netId int32, contractAddress string, tokenId string,
from string, to string) bool {
ok := this.internalSendMail(dbIdx, from, constant.MAIL_HERO_LOCK, tokenId)
return ok
}
func (this *hero) onUnlock(dbIdx int64, netId int32, contractAddress string, tokenId string,
from string, to string) bool {
ok := this.internalSendMail(dbIdx, to, constant.MAIL_HERO_UNLOCK, tokenId)
return ok
}
func (this* hero) internalSendMail(dbIdx int64, accountAddress string, mailName string, tokenId string) bool {
var itemId, heroQuality int32
if !service.GetHeroByTokenId(tokenId, &itemId, &heroQuality) {
return true
}
itemMeta := mt.Table.Item.GetById(q5.ToInt64(itemId))
if itemMeta == nil {
return true
}
accountId := service.GetAccountIdByAddress(accountAddress)
if accountId == "" {
return true
}
mailMeta := mt.Table.Mail.GetByName(mailName)
if mailMeta == nil {
return true
}
mailCfg := this.getMailConfig(mailName)
if mailCfg == nil {
return true
}
nowTime := f5.GetApp().GetRealSeconds() + 3600 * 24 * 7
subject := mailMeta.GetTitle()
content := mailMeta.ReplaceContent(map[string]string{
"${hero.name}": itemMeta.GetRealName(),
"${hero.quality}": q5.ToString(heroQuality),
})
uniKey := fmt.Sprintf("%s_%s_%d", mailName, tokenId, dbIdx)
sendOk := service.SendSysMail(
uniKey,
accountId,
subject,
content,
q5.ToInt32(nowTime),
q5.ToInt32(nowTime),
mailCfg.Tag1,
mailCfg.Tag2)
if sendOk {
return service.UpdateSpecTransferStatus(dbIdx, 1)
}
return false
}
func (this *hero) getMailConfig(mailName string) *jccommon.MailConfig {
if v, ok := this.mailCfgHash.Load(mailName); ok {
return *v
} else {
return nil
}
}
func (this *hero) registerMailConfig(mailName string, tag1 int32, tag2 int32) {
p := new(jccommon.MailConfig)
p.MailName = mailName
p.Tag1 = tag1
p.Tag2 = tag2
this.mailCfgHash.Store(mailName, p)
}
func newHero() *hero {
p := new(hero)
p.mailCfgHash = new(q5.ConcurrentMap[string, *jccommon.MailConfig])
p.registerMailConfig(constant.MAIL_HERO_MINT, jccommon.MAIL_TAG1_HERO, jccommon.MAIL_TAG2_HERO_MINT)
p.registerMailConfig(constant.MAIL_HERO_LOCK, jccommon.MAIL_TAG1_HERO, jccommon.MAIL_TAG2_HERO_LOCK)
p.registerMailConfig(constant.MAIL_HERO_UNLOCK, jccommon.MAIL_TAG1_HERO, jccommon.MAIL_TAG2_HERO_UNLOCK)
return p
}

View File

@ -1,80 +0,0 @@
package spec_transfer721
import (
"q5"
"f5"
"fmt"
"mt"
"jccommon"
"main/constant"
"math/rand"
)
type SpecTransfer721 struct {
handleHash *q5.ConcurrentMap[string, specTransfer721Handle]
}
func (this* SpecTransfer721) Init() {
return
this.handleHash = new(q5.ConcurrentMap[string, specTransfer721Handle])
this.handleHash.Store(jccommon.CONTRACT_NAME_CFHero, newHero())
//this.handleHash.Store(jccommon.CONTRACT_NAME_GoldBrick, newGoldBullion())
go this.process()
}
func (this* SpecTransfer721) UnInit() {
}
func (this* SpecTransfer721) process() {
f5.GetGoStyleDb().LoopLoad(
constant.BCEVENT_DB,
"t_721nft_spec_transfer",
"t_721nft_spec_transfer",
func () int64 {
return 3 + q5.ToInt64(rand.Intn(2))
},
func (lastIdx int64) string {
nowTime := f5.GetApp().GetRealSeconds()
expiredTime := nowTime - 3600 * 24 * 7
sql := fmt.Sprintf(`
SELECT * FROM t_721nft_spec_transfer WHERE idx > %d AND status = 0 AND createtime > %d LIMIT 1000
`,
lastIdx,
expiredTime)
return sql
},
[]string{
},
func () int64{
return 3
},
func () int64 {
return 60 * 1
},
this.dispatch)
}
func (this* SpecTransfer721) dispatch(ds *f5.DataSet) bool {
idx := q5.ToInt64(ds.GetByName("idx"))
netId := q5.ToInt32(ds.GetByName("net_id"))
contractAddress := ds.GetByName("contract_address")
tokenId := ds.GetByName("token_id")
fromAddress := ds.GetByName("from_address")
toAddress := ds.GetByName("to_address")
contractMeta := mt.Table.Contract.GetByNetIdAddress(netId, contractAddress)
nftLockMeta := mt.Table.Contract.GetByNetIdName(netId, jccommon.CONTRACT_NAME_NFTLock)
if contractMeta != nil {
if p, ok := this.handleHash.Load(contractMeta.GetName()); ok {
if q5.IsWeb3ZeroAddress(fromAddress) {
return (*p).onMint(idx, netId, contractAddress, tokenId, fromAddress, toAddress)
} else if nftLockMeta != nil {
if toAddress == nftLockMeta.GetAddress() {
return (*p).onLock(idx, netId, contractAddress, tokenId, fromAddress, toAddress)
} else if fromAddress == nftLockMeta.GetAddress() {
return (*p).onUnlock(idx, netId, contractAddress, tokenId, fromAddress, toAddress)
}
}
}
}
return false
}

View File

@ -1,10 +0,0 @@
package spec_transfer721
type specTransfer721Handle interface {
onMint(dbIdx int64, netId int32, contractAddress string, tokenId string,
from string, to string) bool
onLock(dbIdx int64, netId int32, contractAddress string, tokenId string,
from string, to string) bool
onUnlock(dbIdx int64, netId int32, contractAddress string, tokenId string,
from string, to string) bool
}

View File

@ -1,53 +1,28 @@
package task
import (
//"fmt"
"sync"
//"main/task/spec_transfer721"
)
type taskMgr struct {
//HourlyTaskMgr
//DailyTaskMgr
webHook
goldBullionReturn
//spec_transfer721.SpecTransfer721
repairNft
openGoldLock sync.Mutex
sysMail
repairOrder
refreshMeta
nftLock
}
func (this *taskMgr) Init() {
//t.HourlyTaskMgr.Init()
//t.DailyTaskMgr.Init()
this.webHook.init()
this.goldBullionReturn.init()
//this.SpecTransfer721.Init()
this.repairNft.init()
this.sysMail.init()
this.repairOrder.init()
//this.refreshMeta.init()
this.nftLock.init()
}
func (this *taskMgr) UnInit() {
this.nftLock.unInit()
//this.refreshMeta.unInit()
this.repairOrder.unInit()
this.sysMail.unInit()
this.repairNft.unInit()
//this.SpecTransfer721.UnInit()
this.goldBullionReturn.unInit()
this.webHook.unInit()
}
func (this *taskMgr) LockOpenGodBullion() {
this.openGoldLock.Lock()
}
func (this *taskMgr) UnLockOpenGodBullion() {
this.openGoldLock.Unlock()
}