增加开箱信息的抓取

This commit is contained in:
CounterFire2023 2024-03-26 13:31:35 +08:00
parent f542d62057
commit 66e336c2fa
8 changed files with 106 additions and 6 deletions

13
.vscode/launch.json vendored
View File

@ -17,5 +17,18 @@
],
"type": "pwa-node"
},
{
"name": "Debug Scription",
"request": "launch",
"runtimeArgs": [
"run-script",
"dev:scription"
],
"runtimeExecutable": "npm",
"skipFiles": [
"<node_internals>/**"
],
"type": "pwa-node"
},
]
}

View File

@ -2,7 +2,7 @@
{
"chain": 421614,
"rpc": "https://arb-sepolia.g.alchemy.com/v2/EKR1je8ZGia332kkemNc4mtXQuFskIq3",
"fromBlock": 5624211,
"fromBlock": 26760154,
"filters": [{
"key": "input",
"op": "eq",
@ -15,5 +15,22 @@
"value": "0x50a8e60041a206acaa5f844a1104896224be6f39"
}],
"dataModel": "CheckIn"
},
{
"chain": 421614,
"rpc": "https://arb-sepolia.g.alchemy.com/v2/EKR1je8ZGia332kkemNc4mtXQuFskIq3",
"fromBlock": 26760154,
"filters": [{
"key": "input",
"op": "like",
"type": "regex",
"value": "data:,{\"p\":\"cf-20\",\"op\":\"chest_open\",\"id\":\"(.+?)\"}"
},{
"key": "to",
"op": "eq",
"type": "address",
"value": "0x50a8e60041a206acaa5f844a1104896224be6f39"
}],
"dataModel": "ChestRecord"
}
]

View File

@ -28,8 +28,10 @@ export class CheckInClass extends BaseModule {
@prop()
public dateTag: string
// 连签天数
@prop({ default: 0 })
@prop({ default: 1 })
public count: number
@prop({ default: 1 })
public total: number
@prop()
public value: string
@prop()
@ -41,6 +43,8 @@ export class CheckInClass extends BaseModule {
if (preDayEvent) {
event.count = preDayEvent.count + 1
}
const total = await CheckIn.countDocuments({ from: event.from })
event.total = total + 1
try {
await CheckIn.insertOrUpdate({ from: event.from, dateTag: event.dateTag }, event)
} catch (err) {

60
src/models/ChestRecord.ts Normal file
View File

@ -0,0 +1,60 @@
import { getModelForClass, index, modelOptions, prop } from '@typegoose/typegoose'
import { dbconn } from 'decorators/dbconn'
import { BaseModule } from './Base'
import { hexToUtf8 } from 'zutils/utils/string.util'
import logger from 'logger/logger'
@dbconn()
@index({ from: 1 }, { unique: false })
@index({ from: 1, chestId: 1 }, { unique: true })
@index({ from: 1, blockTime: 1 }, { unique: false })
@modelOptions({
schemaOptions: { collection: 'chest_open_record', timestamps: true },
})
export class ChestRecordClass extends BaseModule {
@prop({ required: true })
public from!: string
@prop()
public to: string
@prop({ required: true })
public hash: string
@prop()
public blockNumber: string
@prop()
public blockHash: string
@prop()
public blockTime: number
@prop()
public dateTag: string
@prop()
public chestId: string
@prop()
public value: string
@prop()
public input: string
public static async saveEvent(event: any) {
const dataStr = hexToUtf8(event.input)
const regexp = /data:,{\"p\":\"cf-20\",\"op\":\"chest_open\",\"id\":\"(.+?)\"}/
const match = dataStr.match(regexp)
if (!match) {
logger.log('not a chest open event:', event.hash)
return
}
event.chestId = match[1]
logger.log('open chest with id:', event.chestId)
return ChestRecord.insertOrUpdate({ hash: event.hash }, event)
}
public toJson() {
return {
address: this.from,
day: this.dateTag,
time: this.blockTime,
}
}
}
export const ChestRecord = getModelForClass(ChestRecordClass, {
existingConnection: ChestRecordClass['db'],
})

View File

@ -5,6 +5,7 @@ import { NftHolder } from './NftHolder'
@dbconn()
@index({ chain: 1, hash: 1, logIndex: 1 }, { unique: true })
@index({ chain: 1, address: 1, blockNumber: 1 }, { unique: false })
@modelOptions({
schemaOptions: { collection: 'general_event', timestamps: true },
options: { allowMixed: Severity.ALLOW },

View File

@ -11,14 +11,19 @@ import { IScriptionCfg } from 'interface/IScriptionCfg'
import { buildScriptionFilters } from 'utils/block.util'
import { CheckIn } from 'models/CheckIn'
import { ZRedisClient } from 'zutils'
import { hexToUtf8 } from 'zutils/utils/string.util'
import { ChestRecord } from 'models/ChestRecord'
let svrs: any[] = []
let lock = false
let eventProcessers = {
CheckIn: CheckIn,
ChestRecord: ChestRecord,
}
global.hexToUtf8 = hexToUtf8
async function initEventSvrs() {
const cfgMap: Map<IChain, IScriptionCfg[]> = new Map()
for (let cfg of scriptions) {

View File

@ -180,7 +180,7 @@ export const buildScriptionFilters = (cfg: IScriptionCfg) => {
} else if (filter.type === 'boolean') {
value = !!value
} else {
value = `'${value}'`
value = `${value}`
}
if (op) {
if (op === 'in') {
@ -188,9 +188,9 @@ export const buildScriptionFilters = (cfg: IScriptionCfg) => {
} else if (op === 'nin') {
body += `!(event.${filter.key}.indexOf(${value}) >= 0)`
} else if (op === 'nlike') {
body += `!new RegExp(${value}).test(event.${filter.key})`
body += `!new RegExp(/${value}/).test(hexToUtf8(event.${filter.key}))`
} else if (op === 'like') {
body += new RegExp(value).test(`event.${filter.key}`)
body += `new RegExp(/${value}/).test(hexToUtf8(event.${filter.key}))`
} else {
body += `event.${filter.key}${op}${value}`
}

View File

@ -4,7 +4,7 @@
"name": "chain-client",
"script": "npm",
"args": "run prod:api",
"cwd": "/data/apps/web_chain_client",
"cwd": "/home/kingsome/code/web_chain_client",
"max_memory_restart": "1024M",
"log_date_format": "YYYY-MM-DD HH:mm Z",
"watch": false,