Implement surrender of reversi
This commit is contained in:
59
src/server/api/endpoints/games/reversi/games/surrender.ts
Normal file
59
src/server/api/endpoints/games/reversi/games/surrender.ts
Normal file
@ -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();
|
||||
});
|
Reference in New Issue
Block a user