reversi 💮 💯

This commit is contained in:
syuilo 2018-06-17 08:10:54 +09:00
parent 03f20599ba
commit 1ef66c962a
48 changed files with 197 additions and 197 deletions

View file

@ -0,0 +1,62 @@
import $ from 'cafy'; import ID from '../../../../cafy-id';
import ReversiGame, { pack } from '../../../../models/reversi-game';
module.exports = (params, user) => new Promise(async (res, rej) => {
// Get 'my' parameter
const [my = false, myErr] = $.bool.optional().get(params.my);
if (myErr) return rej('invalid my param');
// Get 'limit' parameter
const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
if (limitErr) return rej('invalid limit param');
// Get 'sinceId' parameter
const [sinceId, sinceIdErr] = $.type(ID).optional().get(params.sinceId);
if (sinceIdErr) return rej('invalid sinceId param');
// Get 'untilId' parameter
const [untilId, untilIdErr] = $.type(ID).optional().get(params.untilId);
if (untilIdErr) return rej('invalid untilId param');
// Check if both of sinceId and untilId is specified
if (sinceId && untilId) {
return rej('cannot set sinceId and untilId');
}
const q: any = my ? {
isStarted: true,
$or: [{
user1Id: user._id
}, {
user2Id: user._id
}]
} : {
isStarted: true
};
const sort = {
_id: -1
};
if (sinceId) {
sort._id = 1;
q._id = {
$gt: sinceId
};
} else if (untilId) {
q._id = {
$lt: untilId
};
}
// Fetch games
const games = await ReversiGame.find(q, {
sort,
limit
});
// Reponse
res(Promise.all(games.map(async (g) => await pack(g, user, {
detail: false
}))));
});

View file

@ -0,0 +1,32 @@
import $ from 'cafy'; import ID from '../../../../../cafy-id';
import ReversiGame, { pack } from '../../../../../models/reversi-game';
import Reversi from '../../../../../reversi/core';
module.exports = (params, user) => new Promise(async (res, rej) => {
// Get 'gameId' parameter
const [gameId, gameIdErr] = $.type(ID).get(params.gameId);
if (gameIdErr) return rej('invalid gameId param');
const game = await ReversiGame.findOne({ _id: gameId });
if (game == null) {
return rej('game not found');
}
const o = new Reversi(game.settings.map, {
isLlotheo: game.settings.isLlotheo,
canPutEverywhere: game.settings.canPutEverywhere,
loopedBoard: game.settings.loopedBoard
});
game.logs.forEach(log => {
o.put(log.color, log.pos);
});
const packed = await pack(game, user);
res(Object.assign({
board: o.board,
turn: o.turn
}, packed));
});

View file

@ -0,0 +1,15 @@
import Matching, { pack as packMatching } from '../../../../models/reversi-matching';
module.exports = (params, user) => new Promise(async (res, rej) => {
// Find session
const invitations = await Matching.find({
childId: user._id
}, {
sort: {
_id: -1
}
});
// Reponse
res(Promise.all(invitations.map(async (i) => await packMatching(i, user))));
});

View file

@ -0,0 +1,95 @@
import $ from 'cafy'; import ID from '../../../../cafy-id';
import Matching, { pack as packMatching } from '../../../../models/reversi-matching';
import ReversiGame, { pack as packGame } from '../../../../models/reversi-game';
import User from '../../../../models/user';
import publishUserStream, { publishReversiStream } from '../../../../publishers/stream';
import { eighteight } from '../../../../reversi/maps';
module.exports = (params, user) => new Promise(async (res, rej) => {
// Get 'userId' parameter
const [childId, childIdErr] = $.type(ID).get(params.userId);
if (childIdErr) return rej('invalid userId param');
// Myself
if (childId.equals(user._id)) {
return rej('invalid userId param');
}
// Find session
const exist = await Matching.findOne({
parentId: childId,
childId: user._id
});
if (exist) {
// Destroy session
Matching.remove({
_id: exist._id
});
// Create game
const game = await ReversiGame.insert({
createdAt: new Date(),
user1Id: exist.parentId,
user2Id: user._id,
user1Accepted: false,
user2Accepted: false,
isStarted: false,
isEnded: false,
logs: [],
settings: {
map: eighteight.data,
bw: 'random',
isLlotheo: false
}
});
// Reponse
res(await packGame(game, user));
publishReversiStream(exist.parentId, 'matched', await packGame(game, exist.parentId));
const other = await Matching.count({
childId: user._id
});
if (other == 0) {
publishUserStream(user._id, 'reversi_no_invites');
}
} else {
// Fetch child
const child = await User.findOne({
_id: childId
}, {
fields: {
_id: true
}
});
if (child === null) {
return rej('user not found');
}
// 以前のセッションはすべて削除しておく
await Matching.remove({
parentId: user._id
});
// セッションを作成
const matching = await Matching.insert({
createdAt: new Date(),
parentId: user._id,
childId: child._id
});
// Reponse
res();
const packed = await packMatching(matching, child);
// 招待
publishReversiStream(child._id, 'invited', packed);
publishUserStream(child._id, 'reversi_invited', packed);
}
});

View file

@ -0,0 +1,9 @@
import Matching from '../../../../../models/reversi-matching';
module.exports = (params, user) => new Promise(async (res, rej) => {
await Matching.remove({
parentId: user._id
});
res();
});