summaryrefslogtreecommitdiff
path: root/src/api/endpoints
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2018-03-07 19:00:15 +0900
committerGitHub <noreply@github.com>2018-03-07 19:00:15 +0900
commita227ef30e8bc8282605361b013d323bb3bbc4e7d (patch)
tree8bd28f1d27a77e061e7b7f56f8794e483fe82f8f /src/api/endpoints
parentv3999 (diff)
parentoops (diff)
downloadsharkey-a227ef30e8bc8282605361b013d323bb3bbc4e7d.tar.gz
sharkey-a227ef30e8bc8282605361b013d323bb3bbc4e7d.tar.bz2
sharkey-a227ef30e8bc8282605361b013d323bb3bbc4e7d.zip
Merge pull request #1197 from syuilo/othello
Othello
Diffstat (limited to 'src/api/endpoints')
-rw-r--r--src/api/endpoints/othello/games.ts26
-rw-r--r--src/api/endpoints/othello/invitations.ts15
-rw-r--r--src/api/endpoints/othello/match.ts77
-rw-r--r--src/api/endpoints/othello/match/cancel.ts9
4 files changed, 127 insertions, 0 deletions
diff --git a/src/api/endpoints/othello/games.ts b/src/api/endpoints/othello/games.ts
new file mode 100644
index 0000000000..39963fcd29
--- /dev/null
+++ b/src/api/endpoints/othello/games.ts
@@ -0,0 +1,26 @@
+import $ from 'cafy';
+import Game, { pack } from '../../models/othello-game';
+
+module.exports = (params, user) => new Promise(async (res, rej) => {
+ // Get 'my' parameter
+ const [my = false, myErr] = $(params.my).optional.boolean().$;
+ if (myErr) return rej('invalid my param');
+
+ const q = my ? {
+ $or: [{
+ black_user_id: user._id
+ }, {
+ white_user_id: user._id
+ }]
+ } : {};
+
+ // Fetch games
+ const games = await Game.find(q, {
+ sort: {
+ _id: -1
+ }
+ });
+
+ // Reponse
+ res(Promise.all(games.map(async (g) => await pack(g, user))));
+});
diff --git a/src/api/endpoints/othello/invitations.ts b/src/api/endpoints/othello/invitations.ts
new file mode 100644
index 0000000000..02fb421fbc
--- /dev/null
+++ b/src/api/endpoints/othello/invitations.ts
@@ -0,0 +1,15 @@
+import Matching, { pack as packMatching } from '../../models/othello-matching';
+
+module.exports = (params, user) => new Promise(async (res, rej) => {
+ // Find session
+ const invitations = await Matching.find({
+ child_id: user._id
+ }, {
+ sort: {
+ _id: -1
+ }
+ });
+
+ // Reponse
+ res(Promise.all(invitations.map(async (i) => await packMatching(i, user))));
+});
diff --git a/src/api/endpoints/othello/match.ts b/src/api/endpoints/othello/match.ts
new file mode 100644
index 0000000000..cb094bbc65
--- /dev/null
+++ b/src/api/endpoints/othello/match.ts
@@ -0,0 +1,77 @@
+import $ from 'cafy';
+import Matching, { pack as packMatching } from '../../models/othello-matching';
+import Game, { pack as packGame } 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,
+ turn_user_id: parentIsBlack ? exist.parent_id : user._id,
+ is_ended: false,
+ logs: []
+ });
+
+ // Reponse
+ res(await packGame(game, user));
+
+ publishOthelloStream(exist.parent_id, 'matched', await packGame(game, exist.parent_id));
+ } 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
+ });
+
+ // セッションを作成
+ const matching = await Matching.insert({
+ created_at: new Date(),
+ parent_id: user._id,
+ child_id: child._id
+ });
+
+ // Reponse
+ res();
+
+ // 招待
+ publishOthelloStream(child._id, 'invited', await packMatching(matching, child));
+ }
+});
diff --git a/src/api/endpoints/othello/match/cancel.ts b/src/api/endpoints/othello/match/cancel.ts
new file mode 100644
index 0000000000..6f751ef835
--- /dev/null
+++ b/src/api/endpoints/othello/match/cancel.ts
@@ -0,0 +1,9 @@
+import Matching from '../../../models/othello-matching';
+
+module.exports = (params, user) => new Promise(async (res, rej) => {
+ await Matching.remove({
+ parent_id: user._id
+ });
+
+ res();
+});