aozhiwei 57fea86b5d 1
2022-04-22 09:40:37 +08:00

138 lines
3.6 KiB
JavaScript

const app = require('j7/app');
const utils = require('j7/utils');
const bcutils = require('j7/bcutils');
const log = require('j7/log');
const event = require('j7/event');
const BaseService = require('./baseservice');
const factory = require('./factory');
const metaFactory = require('../metadata/factory');
const bc = require('../blockchain');
const C = require('../C');
const LIMIT_COUNT = 100;
class EventCenter extends BaseService {
instances = [
{
'name': 'heroInstance',
'last_block_number': 0,
'eventName': 'Transfer',
},
{
'name': 'equipInstance',
'last_block_number': 0,
'eventName': 'Transfer',
},
{
'name': 'chipInstance',
'last_block_number': 0,
'eventName': 'Transfer',
},
{
'name': 'luckboxInstance',
'last_block_number': 0,
'eventName': 'Transfer',
}
];
boxInstance = {
'name': 'boxproxyInstance',
'last_block_number': 0,
'eventName': 'BoxOpened',
};
async init() {
this.lastIdx = 0;
this.pendingConfirmOwnerHash = {};
const {err, conn} = await app.getDbConn('MarketDb0');
if (err) {
throw 'db error:' + err;
}
this.conn = conn;
event.addListener(C.DESTORY_EXEC_CONFIRM_OWNER_EVENT, (tokenId) => {
log.info('destory:' + tokenId);
try {
if (utils.getVal(this.pendingConfirmOwnerHash, tokenId)) {
delete this.pendingConfirmOwnerHash[tokenId];
}
} catch(err) {
log.error('destory confirm owner:' + err);
}
});
this.confirmOwner();
await this.initEventProcess();
}
async initEventProcess() {
{
this.instances.forEach(async (item) => {
factory.create('EventProcess', null)
.init(item, async (event) = {
await factory.create('NftTransferProcess', null).start(this.conn, event);
})
});
}
{
factory.create('EventProcess', null)
.init(this.boxInstance, async (event) = {
await factory.create('BoxOpenedProcess', null).start(this.conn, event);
});
}
}
async addConfirmOwnerRequest(tokenId) {
const pendingRequest = utils.getVal(this.pendingConfirmOwnerHash, tokenId);
if (!pendingRequest) {
const newRequest = new factory.create('ExecConfirmOwner', null);
this.pendingConfirmOwnerHash[tokenId] = newRequest;
newRequest.init(tokenId);
return;
} else {
pendingRequest.addTryCount();
}
}
async confirmOwner() {
let maxIdx = 0;
while (true) {
{
const {err, rows} = await this.conn.execQuery(
'SELECT * FROM t_nft_transfer WHERE `idx` > ? AND ' +
'`owner_confirmed` = 0 LIMIT ' + LIMIT_COUNT,
[this.lastIdx]);
if (!err) {
for (let i in rows) {
const row = rows[i];
this.addConfirmOwnerRequest(row['token_id']);
if (row['idx'] > this.lastIdx) {
this.lastIdx = row['idx'];
}
}
if (rows.length < 1 && this.lastIdx + LIMIT_COUNT < maxIdx) {
this.lastIdx += LIMIT_COUNT;
continue;
}
}
}
{
const {err, row} = await this.conn.execQueryOne(
'SELECT max(idx) max_idx FROM t_nft_transfer', []);
if (!err && row['max_idx'] != null) {
maxIdx = row['max_idx'];
}
}
while (Object.keys(this.pendingConfirmOwnerHash).length > 50) {
await utils.sleep(1000 + utils.randRange(500, 1500));
}
await utils.sleep(2000 + utils.randRange(500, 1500));
}
}
}
module.exports = EventCenter;