diff options
Diffstat (limited to 'src/api/endpoints/othello')
| -rw-r--r-- | src/api/endpoints/othello/match.ts | 80 | ||||
| -rw-r--r-- | src/api/endpoints/othello/sessions/create.ts | 18 | ||||
| -rw-r--r-- | src/api/endpoints/othello/sessions/in.ts | 34 |
3 files changed, 80 insertions, 52 deletions
diff --git a/src/api/endpoints/othello/match.ts b/src/api/endpoints/othello/match.ts new file mode 100644 index 0000000000..2dc22d11f9 --- /dev/null +++ b/src/api/endpoints/othello/match.ts @@ -0,0 +1,80 @@ +import $ from 'cafy'; +import Matching from '../../models/othello-matchig'; +import Game, { pack } from '../../models/othello-game'; +import User from '../../models/user'; +import { publishOthelloStream } from '../../event'; + +module.exports = (params, user) => new Promise(async (res, rej) => { + // Get 'user_id' parameter + const [childId, childIdErr] = $(params.user_id).id().$; + if (childIdErr) return rej('invalid user_id param'); + + // Myself + if (childId.equals(user._id)) { + return rej('invalid user_id param'); + } + + // Find session + const exist = await Matching.findOne({ + parent_id: childId, + child_id: user._id + }); + + if (exist) { + // Destroy session + Matching.remove({ + _id: exist._id + }); + + const parentIsBlack = Math.random() > 0.5; + + // Start game + const game = await Game.insert({ + created_at: new Date(), + black_user_id: parentIsBlack ? exist.parent_id : user._id, + white_user_id: parentIsBlack ? user._id : exist.parent_id, + logs: [] + }); + + const packedGame = await pack(game); + + // Reponse + res(packedGame); + + publishOthelloStream(exist.parent_id, 'matched', { + game + }); + } else { + // Fetch child + const child = await User.findOne({ + _id: childId + }, { + fields: { + _id: true + } + }); + + if (child === null) { + return rej('user not found'); + } + + // 以前のセッションはすべて削除しておく + await Matching.remove({ + parent_id: user._id + }); + + // セッションを作成 + await Matching.insert({ + parent_id: user._id, + child_id: child._id + }); + + // Reponse + res(204); + + // 招待 + publishOthelloStream(child._id, 'invited', { + user_id: user._id + }); + } +}); diff --git a/src/api/endpoints/othello/sessions/create.ts b/src/api/endpoints/othello/sessions/create.ts deleted file mode 100644 index 09c3cff62b..0000000000 --- a/src/api/endpoints/othello/sessions/create.ts +++ /dev/null @@ -1,18 +0,0 @@ -import rndstr from 'rndstr'; -import Session, { pack } from '../../../models/othello-session'; - -module.exports = (params, user) => new Promise(async (res, rej) => { - // 以前のセッションはすべて削除しておく - await Session.remove({ - user_id: user._id - }); - - // セッションを作成 - const session = await Session.insert({ - user_id: user._id, - code: rndstr('a-z0-9', 3) - }); - - // Reponse - res(await pack(session)); -}); diff --git a/src/api/endpoints/othello/sessions/in.ts b/src/api/endpoints/othello/sessions/in.ts deleted file mode 100644 index d4b95bc4f9..0000000000 --- a/src/api/endpoints/othello/sessions/in.ts +++ /dev/null @@ -1,34 +0,0 @@ -import $ from 'cafy'; -import Session from '../../../models/othello-session'; -import Game, { pack } from '../../../models/othello-game'; - -module.exports = (params, user) => new Promise(async (res, rej) => { - // Get 'code' parameter - const [code, codeErr] = $(params.code).string().$; - if (codeErr) return rej('invalid code param'); - - // Fetch session - const session = await Session.findOne({ code }); - - if (session == null) { - return rej('session not found'); - } - - // Destroy session - Session.remove({ - _id: session._id - }); - - const parentIsBlack = Math.random() > 0.5; - - // Start game - const game = await Game.insert({ - created_at: new Date(), - black_user_id: parentIsBlack ? session.user_id : user._id, - white_user_id: parentIsBlack ? user._id : session.user_id, - logs: [] - }); - - // Reponse - res(await pack(game)); -}); |