LoginSignup
3
3

More than 5 years have passed since last update.

Socket.ioの部屋毎の分岐のベストプラクティスはないか

Posted at

同じ部屋

roomという概念

階級分けメッセージ

最初にjoinしたユーザから、のちに続くユーザに従ってメッセージを変更、あるいは送信しないなど。
例えば、「◯◯が入場しました。」というメッセージは、新規ユーザから既存ユーザに対してのみ送信されるものになる。また、メッセージ自体は、特別な理由が無ければ同じ部屋の全員に送信されるべきものとなる。

やり方

最も効率が良い方法がわからない。
よって、独自のやり方で書く。ベストプラクティスがあれば、ぜひ教えてください。

socket.ioのサーバを立ち上げ、コネクションを成立させた時にもらえる引数に様々な値がブッ込まれている。セッションの共有などの方法もあるが、同じ部屋のメンバーにメッセージを送信する場合意味合いが異なるのではないかと思い外した。その値を使って、room毎のユーザの認識を行うこととした。
adapterという変数には、room情報が格納されており、ここにはjoinというメソッドにより該当ユーザのidがpushされる。

io.on('connection', function(socket) {
  socket.on("serverMsg", function(data) {
    var arr = new Array(),
        id,
        json,
        // 部屋情報を取得
        room = socket.adapter.rooms[data.room];

    // dataにはroomという変数を用意してあり、メッセージが飛んできた部屋情報を格納してある
    for (room_id in room) {
      // 
      arr.push(room_id);
    }

    // 色々な処理がある(略)

    // 対応した部屋に入っていく
    socket.join(data.room);
    // 自分へ
    socket.emit("sendMyMsg", json);
    // 部屋へ
    socket.to(data.room).emit("sendRoomMsg", json);
  });
});

socket.adapter.roomsに入っている情報から、socket.idによりユーザIDが入っているので、それがあるかどうかで新規ユーザかどうかを判断している。

仕様がややこしい

  • 部屋へのメッセージを送る際に、複数のメッセージを送るとする。
  • その複数のメッセージは新規ユーザに対しては表示したりしなかったりする。
  • 既存ユーザに対しては必ず表示するようにするが、2回目からは表示しないようにする。

何かうまいやり方はないかと探したが、力不足により諦めsocketの中身をゴニョゴニョして力技でコードを書いている。正しいやり方はないものか。作れるが、効率的なやり方を持ってして作りたい。

理想

現在、{ ユーザ: { 部屋ID, 新規ユーザかどうか, JOIN時間, ・・・, など } }というような部屋情報を詰め込んだデータをjsonで作って(サンプルソースのような形で、socketの中身をゴニョゴニョして)から管理しているので、それをうまく処理する、あるいはメソッドなどでヒモ付が出来るようなものがあれば助かるんだけどな。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3