zhao/imports/api/methods/newGame.js

47 lines
1.2 KiB
JavaScript

import { Meteor } from "meteor/meteor";
import { Random } from "meteor/random";
import { check } from "meteor/check";
import Rooms from "../collections/Rooms.js";
import Players from "../collections/Players.js";
Meteor.methods({
"newGame": async ({ name }) => {
check(name, String);
name = name.trim();
let roomId = null;
let state = "waitingRoom";
// attempt to get a valid room code 10 times
let remainingAttempts = 10;
let joinCode;
while (roomId === null && remainingAttempts > 0) {
joinCode = Random.hexString(6).toLowerCase();
let started = new Date();
try {
let result = Rooms.insert({ joinCode, started, state });
roomId = result;
break;
} catch (e) {
// BulkWriteError
if (e.code === 11000) {
remainingAttempts -= 1;
} else {
console.log("UNCAUGHT", e);
}
}
}
let playerId = Players.insert({ roomId, name });
Rooms.update(roomId, { $set: { owner: playerId } });
if (remainingAttempts == 0 && roomId === null) {
throw new Meteor.Error("no-more-rooms");
}
let players = {};
players[playerId] = name;
return { players, roomId, joinCode };
},
});