summaryrefslogtreecommitdiff
path: root/src/api/endpoints/othello/match.ts
blob: b73e105ef04cf6854b1d980dbc41a49b7c47fcf7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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 publishUserStream, { publishOthelloStream } from '../../event';
import { eighteight } from '../../../common/othello/maps';

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
		});

		// Create game
		const game = await Game.insert({
			created_at: new Date(),
			user1_id: exist.parent_id,
			user2_id: user._id,
			user1_accepted: false,
			user2_accepted: false,
			is_started: false,
			is_ended: false,
			logs: [],
			settings: {
				map: eighteight.data,
				bw: 'random',
				is_llotheo: false
			}
		});

		// Reponse
		res(await packGame(game, user));

		publishOthelloStream(exist.parent_id, 'matched', await packGame(game, exist.parent_id));

		const other = await Matching.count({
			child_id: user._id
		});

		if (other == 0) {
			publishUserStream(user._id, 'othello_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({
			parent_id: user._id
		});

		// セッションを作成
		const matching = await Matching.insert({
			created_at: new Date(),
			parent_id: user._id,
			child_id: child._id
		});

		// Reponse
		res();

		const packed = await packMatching(matching, child);

		// 招待
		publishOthelloStream(child._id, 'invited', packed);

		publishUserStream(child._id, 'othello_invited', packed);
	}
});