Refactorijg

This commit is contained in:
syuilo
2018-07-07 19:01:33 +09:00
parent 2cdcbcc80e
commit 865fd25af1
19 changed files with 46 additions and 44 deletions

View File

@ -0,0 +1,63 @@
import $ from 'cafy'; import ID from '../../../../../cafy-id';
import ReversiGame, { pack } from '../../../../../models/games/reversi/game';
import { ILocalUser } from '../../../../../models/user';
export default (params: any, user: ILocalUser) => 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,33 @@
import $ from 'cafy'; import ID from '../../../../../../cafy-id';
import ReversiGame, { pack } from '../../../../../../models/games/reversi/game';
import Reversi from '../../../../../../games/reversi/core';
import { ILocalUser } from '../../../../../../models/user';
export default (params: any, user: ILocalUser) => 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,16 @@
import Matching, { pack as packMatching } from '../../../../../models/games/reversi/matching';
import { ILocalUser } from '../../../../../models/user';
export default (params: any, user: ILocalUser) => 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/games/reversi/matching';
import ReversiGame, { pack as packGame } from '../../../../../models/games/reversi/game';
import User, { ILocalUser } from '../../../../../models/user';
import publishUserStream, { publishReversiStream } from '../../../../../publishers/stream';
import { eighteight } from '../../../../../games/reversi/maps';
export default (params: any, user: ILocalUser) => 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,10 @@
import Matching from '../../../../../../models/games/reversi/matching';
import { ILocalUser } from '../../../../../../models/user';
export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
await Matching.remove({
parentId: user._id
});
res();
});