Комнаты / каналы и идентификатор пользователя в Meteor.js

Я строю многопользовательскую пошаговую игру, используя meteor.js. Приложение будет обрабатывать несколько игр, поэтому я бы хотел разделить пользователей на комнаты. Я сделал это прежде, чем использовать каналы socket.io, но я изо всех сил пытаюсь понять, как это должно быть сделано в Метеоре.

Поток, которого я хотел бы достичь:

  1. Пользователь посещает http://localhost:3000/join/userId

  2. Я выполняю вызов на стороне сервера для внешнего API, используя "sessionId" в качестве параметра, получая userId пользователя, его назначенный roomId и массив разрешенных userId для этой комнаты

  3. Я хотел бы создать комнату с roomId для пользователя или присоединить его к существующей. Я знаю, что должен создать коллекцию "Комнаты", но я не знаю, как привязать пользователей к своим комнатам и публиковать сообщения только для тех, кто присутствует в этой комнате.

Я хотел бы избежать использования пакета "account", потому что мне не нужна авторизация на стороне - это будет обработано на шаге № 2, упомянутом выше, - но если самый простой и чистый способ сделать это включает добавление этого пакета, Я могу передумать.

1 ответ

Решение

Ваш Rooms Коллекция может выглядеть так:

{
    _id: "<auto-generated>",
    roomId: "roomId",
    users: [ "user1", "user2", "user3", ... ],
    messages: [
        { message: "", userId: "" },
        { message: "", userId: "" },
        { message: "", userId: "" },
        ...
    ]
}

Возврат вызова API на стороне сервера

userId а также roomId среди другой информации.

Так что вы можете сделать

Rooms.update({ roomId: roomId }, { $push: { users: userId } }, { upsert: true });

Это подтолкнет пользователя в выходящую комнату или создаст новую комнату и добавит пользователя.

Ваша функция публикации может выглядеть так:

Meteor.publish("room", function(roomId) {
    // Since you are not using accounts package, you will have to get the userId using the sessionId that you've specified or some other way.
    // Let us assume your function getUserId does just that.

    userId: getUserId( sessionId );
    return Rooms.find({ roomId: roomId, users: userId });

    // Only the room's users will get the data now.

});

Надеюсь это поможет.

Другие вопросы по тегам