From 20fbd7a5aa7da4fc0fb57dc1799483d0afe522f6 Mon Sep 17 00:00:00 2001 From: zhl Date: Wed, 3 Feb 2021 10:18:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BB=9F=E4=B8=80=E7=9A=84?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E5=AE=8C=E6=88=90=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/api.md | 10 ++++- package-lock.json | 13 +++++++ package.json | 1 + src/common/GConfig.ts | 2 + src/constants/BaseConst.ts | 1 + src/controllers/ActivityController.ts | 48 ++++++++++++++++++++++++ src/controllers/AdController.ts | 23 ++++++------ src/models/{AdRecord.ts => ActRecord.ts} | 18 ++++++--- 8 files changed, 96 insertions(+), 20 deletions(-) create mode 100644 src/controllers/ActivityController.ts rename src/models/{AdRecord.ts => ActRecord.ts} (55%) diff --git a/docs/api.md b/docs/api.md index d28352f..a486f66 100644 --- a/docs/api.md +++ b/docs/api.md @@ -630,14 +630,20 @@ ``` -### 24. 视频广告上报 +### 24. 事件上报 1. Method: POST -2. URI: /api/:accountid/adresult +2. URI: /api/:accountid/update_event | 字段 | 说明 | | -------- | -------------------------------------- | | accountid | 帐号id | +> POST参数 + + +| 字段 |说明 | +| -------- | -------------------------------------- | +|id |事件id | 3. Response: JSON diff --git a/package-lock.json b/package-lock.json index f16f896..eac8019 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1002,6 +1002,19 @@ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==" }, + "node": { + "version": "14.15.1", + "resolved": "https://registry.npmjs.org/node/-/node-14.15.1.tgz", + "integrity": "sha512-BeTf2muiTEC7o3w0sUJ83GHORQ+FLNZCouQUM3VJk3LKf1keQ6ldghELrOo6nBUNZBBS5I++pgDSYPhHWcpp8w==", + "requires": { + "node-bin-setup": "^1.0.0" + } + }, + "node-bin-setup": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.0.6.tgz", + "integrity": "sha512-uPIxXNis1CRbv1DwqAxkgBk5NFV3s7cMN/Gf556jSw6jBvV7ca4F9lRL/8cALcZecRibeqU+5dFYqFFmzv5a0Q==" + }, "npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", diff --git a/package.json b/package.json index cee3518..e062506 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "mongoose": "5.10.3", "mongoose-findorcreate": "^3.0.0", "nanoid": "^3.1.20", + "node": "^14.15.1", "redis": "^2.8.0", "tracer": "^1.1.4", "urlencode": "^1.1.0" diff --git a/src/common/GConfig.ts b/src/common/GConfig.ts index d72944a..a4b9179 100644 --- a/src/common/GConfig.ts +++ b/src/common/GConfig.ts @@ -9,6 +9,7 @@ import { MatchCfg } from '../cfg/parsers/MatchCfg' import { ItemFuncCfg } from '../cfg/parsers/ItemFuncCfg' import ItemCtrl from "../logic/ItemCtrl"; import { EffectCardCfg } from '../cfg/parsers/EffectCardCfg' +import { IncomeCfg } from '../cfg/parsers/IncomeCfg' export function initData() { @@ -21,6 +22,7 @@ export function initData() { rP(BaseConst.ITEMCARD, ItemCardCfg); rP(BaseConst.MATCH, MatchCfg); rP(BaseConst.ITEMFUNC, ItemFuncCfg); + rP(BaseConst.INCOME, IncomeCfg); DataParser.loadAll(); ItemCtrl.initItems(); } diff --git a/src/constants/BaseConst.ts b/src/constants/BaseConst.ts index ab9cd6c..23da483 100644 --- a/src/constants/BaseConst.ts +++ b/src/constants/BaseConst.ts @@ -72,6 +72,7 @@ export class BaseConst { public static readonly ITEMCARD = "itemcard"; public static readonly MATCH = "match"; public static readonly ITEMFUNC = "itemfunc"; + public static readonly INCOME = "income"; /** * 缓存的机器人信息在redis中的key */ diff --git a/src/controllers/ActivityController.ts b/src/controllers/ActivityController.ts new file mode 100644 index 0000000..7dd85e7 --- /dev/null +++ b/src/controllers/ActivityController.ts @@ -0,0 +1,48 @@ +import BaseController from '../common/base.controller' +import { router } from '../decorators/router' +import { ActRecord } from '../models/ActRecord' +import { BaseConst } from '../constants/BaseConst' +import { ZError } from '../common/ZError' +import { ItemInfo } from '../logic/ItemDef' +import ItemCtrl from '../logic/ItemCtrl' +import { BagItem } from '../models/BagItem' + +export default class ActivityController extends BaseController { + + @router('post /api/:accountid/update_event') + async generalEvent(req: any) { + let { id,accountid } = req.params + let cfgMap = global.$cfg.get(BaseConst.INCOME) + id = +id + if (!cfgMap.has(id)) { + throw new ZError(11, 'no cfg found') + } + let cfg = cfgMap.get(id) + let day + if (cfg.repeat) { + day = (new Date()).format('yyyy-MM-dd', true) + } else { + day = (new Date(0)).format('yyyy-MM-dd', true) + } + let record = (await ActRecord.findOrCreate({accountid, day})).doc + if (!cfg.repeat && record.count > 0) { + throw new ZError(12, 'already goted') + } + if (cfg.repeat && record.count >= cfg.frequency ) { + throw new ZError(13, 'reach today max count') + } + if (cfg.interval && (Date.now() - record.lasttime) < cfg.interval) { + throw new ZError(14, '操作太快了') + } + if (cfg.id == 9003 && record.count == 0) { + cfg = cfg.get(9004) + } + record.count += 1 + record.lasttime = Date.now() + await record.save() + const itemInfos: ItemInfo[] = ItemCtrl.getItemsByInfo(cfg.income) + await BagItem.addItems(accountid, itemInfos) + await record.save() + return itemInfos + } +} diff --git a/src/controllers/AdController.ts b/src/controllers/AdController.ts index a2c1501..5e471bb 100644 --- a/src/controllers/AdController.ts +++ b/src/controllers/AdController.ts @@ -1,6 +1,5 @@ import BaseController from '../common/base.controller' -import { router } from '../decorators/router' -import { AdRecord } from '../models/AdRecord' + export default class AdController extends BaseController { /** @@ -8,14 +7,14 @@ export default class AdController extends BaseController { * @param req * @return {Promise<{}>} */ - @router('post /api/:accountid/adresult') - async drawCard(req: any) { - let { accountid } = req.params - let day = (new Date()).format('yyyy-MM-dd', true) - let record = (await AdRecord.findOrCreate({accountid, day})).doc - record.count += 1 - //TODO:: 读取配置, 查看次数是否达到上限, 添加物品 - await record.save() - return {} - } + // @router('post /api/:accountid/adresult') + // async drawCard(req: any) { + // let { accountid } = req.params + // let day = (new Date()).format('yyyy-MM-dd', true) + // let record = (await AdRecord.findOrCreate({accountid, day})).doc + // record.count += 1 + // //TODO:: 读取配置, 查看次数是否达到上限, 添加物品 + // await record.save() + // return {} + // } } diff --git a/src/models/AdRecord.ts b/src/models/ActRecord.ts similarity index 55% rename from src/models/AdRecord.ts rename to src/models/ActRecord.ts index 21cc1fd..18fb311 100644 --- a/src/models/AdRecord.ts +++ b/src/models/ActRecord.ts @@ -15,28 +15,34 @@ import { import findOrCreate from 'mongoose-findorcreate' -interface AdRecordClass extends Base, TimeStamps { +interface ActRecordClass extends Base, TimeStamps { } @dbconn() -@index({ 'accountid': 1 , 'day': 1}, { unique: true }) +@index({ 'accountid': 1 , actid: 1, 'day': 1}, { unique: true }) @plugin(findOrCreate) @modelOptions({ schemaOptions: - { collection: 'ad_record', timestamps: true } + { collection: 'act_record', timestamps: true } }) -class AdRecordClass extends FindOrCreate { +class ActRecordClass extends FindOrCreate { @prop() public accountid: string + @prop() + public actid: string + @prop() public day: string @prop({ default: 0 }) public count: number + @prop({default: Date.now()}) + public lasttime: number + } -export const AdRecord = getModelForClass(AdRecordClass, +export const ActRecord = getModelForClass(ActRecordClass, // @ts-ignore - { existingConnection: AdRecordClass['db'] }) + { existingConnection: ActRecordClass['db'] })