javascriptmethods.js

Meteor.methods({
	setFriend: function (userId) {
		var query = {};

		query[ alreadyFriends(userId) ? '$pull' : '$push' ] = {
			'profile.friends': userId
		};

		Meteor.users.update(this.userId, query);
	},

	createGame: function (color, opponentId) {
		var otherColor = (color === 'w') ? 'b' : 'w';

		var game = {
			moves: '',
			board: (new Chess).fen()
		};

		game[color] = this.userId;
		game[otherColor] = opponentId;
		game.needsConfirmation = opponentId;

		Games.insert(game, function (err, id) {
			if (err) throw err;

		Conversations.insert({
			game: id,
			users: [this.userId, opponentId],
			message: [{
				name: 'system',
				text: 'Game started' + (new Date).toString()
			}]
	      });
		}.bind(this));
	},
	acceptGame: function (gameId) {
		Games.update(gameId, { $unset: { needsConfirmation: null}});
	},
	declineGame: function (gameId) {
		Games.remove(gameId);
	},
	makeMove: function (gameId, move) {
		var game = Games.findOne(gameId);
		var chess = new Chess();

		chess.load_pgn(game.moves);
		chess.move(move);

		var result = null;

		if (chess.game_over()) {
			result = chess.in_checkmate() ? Meteor.userId() : 'draw';
		}

		Game.update(gameId, {
			$set: {
				board: chess.fen(),
				moves: chess.pgn(),
				result: result
			}
		}, function (err) {
			if (err) throw err;

			var message;

			if (result === 'draw')
				message = 'Game over; draw.';
			else if (result)
				message = getUsername(result) + 'won.';
			else if (chess.in_check())
				message = 'Check by ' + Meteor.user().username
			else
				return;

			Conversations.update({ game: gameId }, {
				$push: {
					name: 'system',
					text: message
				}
			});
		
		});

	}
});