From be9f6ad29433b1403850397c6b24e63d0a15619a Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 4 Aug 2018 22:28:01 +0900 Subject: Implement surrender of reversi --- .../api/endpoints/games/reversi/games/surrender.ts | 59 ++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/server/api/endpoints/games/reversi/games/surrender.ts (limited to 'src/server/api/endpoints') diff --git a/src/server/api/endpoints/games/reversi/games/surrender.ts b/src/server/api/endpoints/games/reversi/games/surrender.ts new file mode 100644 index 0000000000..dc9908aef1 --- /dev/null +++ b/src/server/api/endpoints/games/reversi/games/surrender.ts @@ -0,0 +1,59 @@ +import $ from 'cafy'; import ID from '../../../../../../misc/cafy-id'; +import ReversiGame, { pack } from '../../../../../../models/games/reversi/game'; +import { ILocalUser } from '../../../../../../models/user'; +import getParams from '../../../../get-params'; +import { publishReversiGameStream } from '../../../../../../stream'; + +export const meta = { + desc: { + ja: '指定したリバーシの対局で投了します。' + }, + + requireCredential: true, + + params: { + gameId: $.type(ID).optional.note({ + desc: { + ja: '投了したい対局' + } + }) + } +}; + +export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => { + const [ps, psErr] = getParams(meta, params); + if (psErr) return rej(psErr); + + const game = await ReversiGame.findOne({ _id: ps.gameId }); + + if (game == null) { + return rej('game not found'); + } + + if (game.isEnded) { + return rej('this game is already ended'); + } + + if (!game.user1Id.equals(user._id) && !game.user2Id.equals(user._id)) { + return rej('access denied'); + } + + const winnerId = game.user1Id.equals(user._id) ? game.user2Id : game.user1Id; + + await ReversiGame.update({ + _id: game._id + }, { + $set: { + surrendered: user._id, + isEnded: true, + winnerId: winnerId + } + }); + + publishReversiGameStream(game._id, 'ended', { + winnerId: winnerId, + game: await pack(game._id, user) + }); + + res(); +}); -- cgit v1.2.3-freya