匹配游戏中途退出, 无法在此进入游戏

This commit is contained in:
zhl 2021-01-29 15:58:49 +08:00
parent 4ebf1c3626
commit 0f719d4bd1
5 changed files with 25 additions and 6 deletions

View File

@ -45,9 +45,13 @@ export default class AccountController extends BaseController {
} }
return result return result
} }
@router('get /svr/:accountid/uinfo') @router('post /svr/:accountid/uinfo')
async simpleInfo(req: any) { async simpleInfo(req: any) {
let account = req.user let account = req.user
let {isMatch} = req.params
if (isMatch) {
await setGameing(account._id, 15 * 60)
}
return { return {
accountid: account._id, accountid: account._id,
nickname: account.nickname, nickname: account.nickname,
@ -92,7 +96,7 @@ export default class AccountController extends BaseController {
account.isnew = 0 account.isnew = 0
await account.save() await account.save()
} }
await setGameing(accountid) await setGameing(accountid, 30)
return { return {
accountid: account._id, accountid: account._id,
nickname: account.nickname, nickname: account.nickname,

View File

@ -4,6 +4,7 @@ import { BaseConst } from '../constants/BaseConst'
import { ZError } from '../common/ZError' import { ZError } from '../common/ZError'
import { MatchCfg } from '../cfg/parsers/MatchCfg' import { MatchCfg } from '../cfg/parsers/MatchCfg'
import { BagItem } from '../models/BagItem' import { BagItem } from '../models/BagItem'
import { checkGameing, setGameing } from '../service/rank'
export default class MatchController extends BaseController { export default class MatchController extends BaseController {
@ -14,6 +15,10 @@ export default class MatchController extends BaseController {
if (!cfg || !cfg.consume) { if (!cfg || !cfg.consume) {
throw new ZError(10, 'match not found') throw new ZError(10, 'match not found')
} }
let gameing = await checkGameing(accountid)
if (gameing) {
throw new ZError(12, 'gameing')
}
let itemObj = cfg.consume.split(':') let itemObj = cfg.consume.split(':')
let itemid: number = parseInt(itemObj[0]) let itemid: number = parseInt(itemObj[0])
let count: number = parseInt(itemObj[1]) let count: number = parseInt(itemObj[1])
@ -28,4 +33,5 @@ export default class MatchController extends BaseController {
await record.save() await record.save()
return {} return {}
} }
} }

View File

@ -9,7 +9,7 @@ import { MatchCfg } from '../cfg/parsers/MatchCfg'
import ItemCtrl from '../logic/ItemCtrl' import ItemCtrl from '../logic/ItemCtrl'
import { ItemInfo } from '../logic/ItemDef' import { ItemInfo } from '../logic/ItemDef'
import { BagItem } from '../models/BagItem' import { BagItem } from '../models/BagItem'
import { updateRank } from '../service/rank' import { setGameEnd, updateRank } from '../service/rank'
export default class RecordController extends BaseController { export default class RecordController extends BaseController {
@role('anon') @role('anon')
@ -56,7 +56,7 @@ export default class RecordController extends BaseController {
error(`save game record, account not found: ${ player.accountid }`) error(`save game record, account not found: ${ player.accountid }`)
continue continue
} }
await setGameEnd(player.accountid)
user.season_score = Math.max((user.season_score + player.scoreChange) | 0, fc.get(70002).number) user.season_score = Math.max((user.season_score + player.scoreChange) | 0, fc.get(70002).number)
await updateRank(user._id, user.season_score) await updateRank(user._id, user.season_score)
if (!user.season_data) { if (!user.season_data) {

View File

@ -95,6 +95,11 @@ export class RedisClient {
this.pub.setex(key, seconds, value, resolve)); this.pub.setex(key, seconds, value, resolve));
} }
public async expire(key: string, seconds: number) {
return new Promise((resolve) =>
this.pub.expire(key, seconds, resolve));
}
public async get(key: string) { public async get(key: string) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.pub.get(key, (err, data) => { this.pub.get(key, (err, data) => {

View File

@ -27,12 +27,16 @@ export async function usersByScore(min: number, max: number) {
/** /**
* *
* @param {string} accountid * @param {string} accountid
* @param seconds
* @return {Promise<void>} * @return {Promise<void>}
*/ */
export async function setGameing(accountid: string) { export async function setGameing(accountid: string, seconds: number) {
await new RedisClient().setex('gameing_' + accountid, (Date.now() / 1000 | 0) + '', 30) await new RedisClient().setex('gameing_' + accountid, (Date.now() / 1000 | 0) + '', seconds)
} }
export async function setGameEnd(accountid: string) {
await new RedisClient().expire('gameing_' + accountid, 0)
}
/** /**
* *
* @param {string} accountid * @param {string} accountid