2016-07-23 15 views
1

Für eine App, die ich erstelle, habe ich eine "Lobby" -Seite, auf der die Leute konfigurieren, an welchem ​​Bereich sie teilnehmen möchten. Ziemlich einfach.Mit ActionCable, gibt es eine Möglichkeit zu zählen, wie viele Abonnenten von innerhalb eines Kanals?

Ich möchte eine laufende Gesamtzahl von aktiven Nutzern haben, die derzeit den Kanal für diese Seite abonniert haben, sodass die Nutzer wissen, ob andere Personen anwesend sind oder nicht.

Gibt es eine einfache Möglichkeit, dies zu tun?

Antwort

0

Yup gibt es eine:

in Ihrer Anwendung/Kanal/what_so_ever_you_called_it.rb:

class WhatSoEverYouCalledItChannel < ApplicationCable::Channel 
    def subscribed 
     stream_from "your_streamer_thingy" 
     @subscriber +=1 #<==== like this 
    end 

    def unsubscribed 
     # Any cleanup needed when channel is unsubscribed 
     @subscriber -=1 #<===== like this 
    end 
    def send_message(data) 
     your_message_mechanic 
    end 

Einrichtung eine Variable in abonnierten erhöht und in unsubscribed abnimmt.

Sie können den Wert in Ihrem "Lobby" -Modell speichern, in diesem Fall kann "@subscriber" @ lobby.connected_total genannt werden, ich weiß nicht, machen Sie das passend für Ihre Bedürfnisse.

Aber dies ist eine Möglichkeit, die Anzahl der Streams zu verfolgen.

Njoy

+0

Es gibt vielleicht einige andere Wege oder Ereignis Ruby ist es ein erster Gedanke;). – plombix

+0

Ich versuche gerade, es direkt in Kaffee-Datei zu tun, ich werde hier Lösung posten, wenn es funktioniert – plombix

0

I definiert eine Hilfsmethode:

app/Kanäle/application_cable/channel.rb

module ApplicationCable 
    class Channel < ActionCable::Channel::Base 

    def connections_info 

     connections_array = [] 

     connection.server.connections.each do |conn| 

      conn_hash = {} 

      conn_hash[:current_user] = conn.current_user 

      conn_hash[:subscriptions_identifiers] = conn.subscriptions.identifiers.map {|k| JSON.parse k} 

      connections_array << conn_hash 

     end 

     connections_array 

    end 

    end 
end 

Jetzt können Sie connections_info eine beliebige Stelle innerhalb der abgeleiteten Kanal anrufen. Die Methode gibt ein Informationsarray mit Daten über alle verfügbaren Server-Socket-Verbindungen, ihre jeweiligen current_user s und alle ihre aktuellen Abonnements zurück. Hier

ist ein Beispiel für meine Daten connections_info Rückkehr:

[1] pry(#<ChatChannel>)> connections_info 
=> [{:current_user=>"D8pg2frw5db9PyHzE6Aj8LRf", 
    :subscriptions_identifiers=> 
    [{"channel"=>"ChatChannel", 
    "secret_chat_token"=>"f5a6722dfe04fc883b59922bc99aef4b5ac266af"}, 
    {"channel"=>"AppearanceChannel"}]}, 
{:current_user=> 
    #<User id: 2, email: "[email protected]", created_at: "2017-03-27 13:22:14", updated_at: "2017-04-28 11:13:37", provider: "email", uid: "[email protected]", first_name: "John", active: nil, last_name: nil, middle_name: nil, email_public: nil, phone: nil, experience: nil, qualification: nil, price: nil, university: nil, faculty: nil, dob_issue: nil, work: nil, staff: nil, dob: nil, balance: nil, online: true>, 
    :subscriptions_identifiers=> 
    [{"channel"=>"ChatChannel", 
    "secret_chat_token"=>"f5a6722dfe04fc883b59922bc99aef4b5ac266af"}]}] 

Sie können dann analysieren diese Struktur, wie Sie wollen und die gewünschten Daten extrahieren. Sie können Ihre eigene Verbindung in dieser Liste durch dieselbe current_user unterscheiden (die current_user Methode ist in class Channel < ActionCable::Channel::Base verfügbar).

Wenn ein Benutzer zweimal (oder öfter) eine Verbindung herstellt, werden die entsprechenden Array-Elemente nur verdoppelt.