bug fix for nft holder check

This commit is contained in:
CounterFire2023 2024-05-13 14:10:04 +08:00
parent 4aa9443c89
commit b26ff6b729
8 changed files with 125 additions and 31 deletions

4
configs/admins.json Normal file
View File

@ -0,0 +1,4 @@
[
"0x50A8e60041A206AcaA5F844a1104896224be6F39",
"0x210b8b648220a4C7e1bbE508C7B9723E2eCdec24"
]

View File

@ -14,7 +14,7 @@
}, },
{ {
"id": "g3zkyh1rk6qs5exdefe", "id": "g3zkyh1rk6qs5exdefe",
"title": "登录游戏", "title": "Log in to the Game",
"desc": "", "desc": "",
"task": "GameLogin", "task": "GameLogin",
"show": true, "show": true,
@ -29,7 +29,7 @@
}, },
{ {
"id": "g3amegdkchm4pdjtjeb", "id": "g3amegdkchm4pdjtjeb",
"title": "参与3场任意模式的比赛", "title": "Complete 3 game matches in any mode",
"desc": "", "desc": "",
"task": "GameBattle", "task": "GameBattle",
"show": true, "show": true,
@ -37,7 +37,7 @@
"category": 1, "category": 1,
"pretasks": ["g3885fwjnddej6jmcha"], "pretasks": ["g3885fwjnddej6jmcha"],
"ticket": 0, "ticket": 0,
"tickettasks": ["g31x9wzja7eg18t3vtm"], "tickettasks": [],
"score": 20, "score": 20,
"checkChain": false, "checkChain": false,
"cfg": { "key": "battleTimes", "amount": 3 }, "cfg": { "key": "battleTimes", "amount": 3 },
@ -45,46 +45,30 @@
}, },
{ {
"id": "g31x9wzja7eg18t3vtm", "id": "g31x9wzja7eg18t3vtm",
"title": "累计完成10次击杀", "title": "Accumulate 10 Kills in Total",
"desc": "", "desc": "",
"task": "GameKill", "task": "GameKill",
"show": true, "show": true,
"type": 2, "type": 2,
"category": 1, "category": 1,
"pretasks": ["g3885fwjnddej6jmcha"], "pretasks": ["g3885fwjnddej6jmcha"],
"ticket": 1, "ticket": 0,
"tickettasks": ["g3amegdkchm4pdjtjeb"], "tickettasks": [],
"score": 20, "score": 20,
"checkChain": false, "checkChain": false,
"cfg": { "key": "kills", "amount": 10 }, "cfg": { "key": "kills", "amount": 10 },
"autoclaim": true "autoclaim": true
}, },
{
"id": "g38gejrp3twh1gvtr2e",
"title": "在Bounty或Rank模式下获得3次胜利",
"desc": "",
"task": "GameWin",
"show": true,
"type": 2,
"category": 2,
"pretasks": ["g3885fwjnddej6jmcha"],
"ticket": 0,
"score": 25,
"checkChain": false,
"checkTime": true,
"cfg": { "key": "winTimes", "amount": 3 },
"autoclaim": true
},
{ {
"id": "g33xf6688x67a2mdrrk", "id": "g33xf6688x67a2mdrrk",
"title": "在Gold模式下获取500金币", "title": "Collect 500 Gold in Gold Mode",
"desc": "", "desc": "",
"task": "GameCoin", "task": "GameCoin",
"show": true, "show": true,
"category": 2, "category": 3,
"pretasks": ["g3885fwjnddej6jmcha"], "pretasks": ["g3885fwjnddej6jmcha"],
"type": 2, "type": 2,
"ticket": 0, "ticket": 1,
"score": 25, "score": 25,
"checkTime": true, "checkTime": true,
"checkChain": false, "checkChain": false,
@ -94,7 +78,7 @@
{ {
"id": "g3s6esb83da9wy9p25a", "id": "g3s6esb83da9wy9p25a",
"title": "Own CounterFile|Founder's Tag", "title": "Founder's Tags Held",
"desc": "", "desc": "",
"task": "NftHolderCheck", "task": "NftHolderCheck",
"show": true, "show": true,
@ -102,7 +86,7 @@
"type": 2, "type": 2,
"category": 3, "category": 3,
"ticket": 0, "ticket": 0,
"score": 100, "score": 0,
"checkChain": false, "checkChain": false,
"checkTime": true, "checkTime": true,
"cfg": { "address": "0xec23679653337d4c6390d0eeba682246a6067777", "chain": "1" }, "cfg": { "address": "0xec23679653337d4c6390d0eeba682246a6067777", "chain": "1" },

View File

@ -355,6 +355,38 @@
"end": "2025-01-01 00:00", "end": "2025-01-01 00:00",
"checkChain": false, "checkChain": false,
"params": { "time": 6, "failRate": 0 } "params": { "time": 6, "failRate": 0 }
},
{
"id": "e286nywaz7cmdf7keq6",
"task": "TwitterRetweet",
"title": "RT - Founder's Tag Utilities Unveiled",
"type": 1,
"desc": "Retweet specific tweets",
"category": "Social Tasks",
"score": 50,
"autoclaim": false,
"pretasks": ["e2yhq2lj30vwcpedv7p"],
"cfg": { "icon": "twitter", "content": "1789288035684921723"},
"start": "2024-01-01 00:00",
"end": "2025-01-01 00:00",
"checkChain": false,
"params": { "time": 6, "failRate": 0 }
},
{
"id": "e2cy5ha5nmre9w3pq3k",
"task": "TwitterLike",
"title": "Like - Founder's Tag Utilities Unveiled",
"type": 1,
"desc": "Like specific tweets",
"category": "Social Tasks",
"score": 50,
"autoclaim": false,
"pretasks": ["e2yhq2lj30vwcpedv7p"],
"cfg": { "icon": "twitter", "content": "1789288035684921723" },
"start": "2024-01-01 00:00",
"end": "2025-01-01 00:00",
"checkChain": false,
"params": { "time": 6, "failRate": 0 }
} }
], ],
"drawTime": 1715245160457, "drawTime": 1715245160457,

View File

@ -0,0 +1,44 @@
import { ActivityUser } from 'models/ActivityUser'
import { BaseController, ZError, router } from 'zutils'
import { toEIP55 } from 'zutils/utils/chain.util'
import { createSigner } from 'fast-jwt'
const sourceList = require('../../configs/admins.json')
const adminSet = new Set()
for (let o of sourceList) {
adminSet.add(o.toLowerCase())
}
/**
*
*/
class AdminController extends BaseController {
/**
*
*/
@router('get /api/g3y357zt67qryz3v6d6/fake_token/:address')
async taskList(req) {
const user = req.user
if (!adminSet.has(user.address.toLowerCase())) {
throw new ZError(10, 'not admin')
}
let { address } = req.params
address = toEIP55(address)
let record = await ActivityUser.findOne({
address,
})
if (!record) {
throw new ZError(11, 'user not found')
}
const signSync = createSigner({
key: process.env.API_TOKEN_SECRET,
})
const token = signSync({
id: record.id,
address: record.address,
activity: 'uaw_activity',
})
return { token }
}
}

View File

@ -81,10 +81,13 @@ class InGameController extends BaseController {
for (let sub of list) { for (let sub of list) {
const Task = allTasks.get(sub.task) const Task = allTasks.get(sub.task)
const taskInstance = new Task.default({ user, activity: req.activity }) const taskInstance = new Task.default({ user, activity: req.activity })
if (sub.status >= 0 && (await taskInstance.check(sub, gameData))) { const checkResult = await taskInstance.check(sub, gameData)
if (sub.status >= 0 && !!checkResult) {
sub.status = 2 sub.status = 2
if (sub.task === 'GoogleConnect') { if (sub.task === 'GoogleConnect') {
sub.status = 3 sub.status = 3
} else if (sub.task === 'NftHolderCheck') {
sub.ticket = checkResult
} }
} }
sub.status = recordSet.has(sub.id) ? 3 : sub.status === 0 ? 1 : sub.status sub.status = recordSet.has(sub.id) ? 3 : sub.status === 0 ? 1 : sub.status

View File

@ -5,12 +5,15 @@ import { BaseModule } from './Base'
@dbconn() @dbconn()
@index({ address: 1, tokenId: 1, dateTag: 1 }, { unique: true }) @index({ address: 1, tokenId: 1, dateTag: 1 }, { unique: true })
@index({ address: 1, dateTag: 1 }, { unique: false }) @index({ address: 1, dateTag: 1 }, { unique: false })
@index({ user: 1 }, { unique: false })
@modelOptions({ @modelOptions({
schemaOptions: { collection: 'nft_claim_record', timestamps: true }, schemaOptions: { collection: 'nft_claim_record', timestamps: true },
}) })
class NftClaimRecordClass extends BaseModule { class NftClaimRecordClass extends BaseModule {
@prop() @prop()
public address: string public address: string
@prop()
public user: string
@prop() @prop()
public tokenId: string public tokenId: string

View File

@ -3,6 +3,7 @@ import { ITask } from './base/ITask'
import { formatDate } from 'utils/utcdate.util' import { formatDate } from 'utils/utcdate.util'
import { NftClaimRecord } from 'models/NftClaimRecord' import { NftClaimRecord } from 'models/NftClaimRecord'
import { ZError } from 'zutils' import { ZError } from 'zutils'
import { InGameStats } from 'models/InGameStats'
const sourceList = require('../../configs/nft_202403.json') const sourceList = require('../../configs/nft_202403.json')
const commonSet = new Set() const commonSet = new Set()
@ -65,10 +66,22 @@ export default class NftHolderCheck extends ITask {
let claimRecord = new NftClaimRecord({ let claimRecord = new NftClaimRecord({
address, address,
tokenId: record.tokenId, tokenId: record.tokenId,
user: this.user.id,
dateTag, dateTag,
}) })
await claimRecord.save() await claimRecord.save()
} }
if (ticket > 0) {
let saveRes = await InGameStats.findOneAndUpdate(
{ user: this.user.id },
{ $inc: { ticket } },
{
new: false,
upsert: false,
includeResultMetadata: true,
},
)
}
return { score, ticket } return { score, ticket }
} }
@ -81,6 +94,17 @@ export default class NftHolderCheck extends ITask {
historySet.add(history.tokenId) historySet.add(history.tokenId)
} }
let records = await NftHolder.find({ chain, address, user: this.user.address.toLowerCase() }) let records = await NftHolder.find({ chain, address, user: this.user.address.toLowerCase() })
return records.length > 0 records = records.filter(o => !historySet.has(o.tokenId))
let ticket = 0
for (let record of records) {
if (commonSet.has(parseInt(record.tokenId))) {
ticket += rarityMap.get('Common')
} else if (legendarySet.has(parseInt(record.tokenId))) {
ticket += rarityMap.get('Legendary')
} else if (rareSet.has(parseInt(record.tokenId))) {
ticket += rarityMap.get('Rare')
}
}
return ticket
} }
} }

View File

@ -54,7 +54,7 @@ export abstract class ITask {
let ticket = 0 let ticket = 0
if (cfg.ticket > 0 && Date.now() >= this.activity.drawTime) { if (cfg.ticket > 0 && Date.now() >= this.activity.drawTime) {
let canGet = false let canGet = false
if (cfg.tickettasks) { if (cfg.tickettasks && cfg.tickettasks.length > 0) {
let records = await InGameTaskRecord.find({ user: user.id, dateTag, task: { $in: cfg.tickettasks } }) let records = await InGameTaskRecord.find({ user: user.id, dateTag, task: { $in: cfg.tickettasks } })
if (records.length === cfg.tickettasks.length) { if (records.length === cfg.tickettasks.length) {
canGet = true canGet = true
@ -70,7 +70,7 @@ export abstract class ITask {
return { score, ticket } return { score, ticket }
} }
public async check(cfg: any, gameData: any) { public async check(cfg: any, gameData: any): Promise<boolean | number> {
const subCfg = cfg.cfg const subCfg = cfg.cfg
const val = parseInt(gameData[subCfg.key] || '0') const val = parseInt(gameData[subCfg.key] || '0')
return val >= subCfg.amount return val >= subCfg.amount