bug fix for nft holder check
This commit is contained in:
parent
4aa9443c89
commit
b26ff6b729
4
configs/admins.json
Normal file
4
configs/admins.json
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
[
|
||||||
|
"0x50A8e60041A206AcaA5F844a1104896224be6F39",
|
||||||
|
"0x210b8b648220a4C7e1bbE508C7B9723E2eCdec24"
|
||||||
|
]
|
@ -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" },
|
||||||
|
@ -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,
|
||||||
|
44
src/controllers/admin.controller.ts
Normal file
44
src/controllers/admin.controller.ts
Normal 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 }
|
||||||
|
}
|
||||||
|
}
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user