2012-04-12 3 views
0

"Avec socket.io, je souhaite diffuser un message envoyé par l'utilisateur uniquement à un sous-ensemble de tous les clients, le sous-ensemble étant situé à une certaine distance de l'utilisateur émettant le message (disons 1km). besoin d'ajouter quelque chose comme ça (http://stackoverflow.com/questions/27928/how-do-i-calculate-distance-between-two-latitude-longitude-points) à la [socket.on 'broadcast', (message)] section du code ci-dessous (s'il vous plaît noter que ceci est coffeescript et tiré du repo de github d'exemple de géochat de Shoaib Burq (https://github.com/sabman/geochat-example)). " Maintenant, y compris les suggestions de Ricardo, en remplaçant l'ancienne section [socket.on 'broadcast', (message) ->] par son entrée (bien que j'ai changé "user" en "record" pour rester cohérent avec le reste du serveur code .coffee), et la section [find:] à la fin. Quelque chose ne va pas, cependant, et je ne suis pas sûr si cela a à voir avec le code html ou les mises à jour du café. Merci encore à l'avance ..socket.io: diffusion à des clients dans une certaine distance géographique?

Le code ne fonctionne toujours pas. Y compris les plus récentes suggestions de Ricardo:

socket.on 'broadcast', (message) -> 
    # find the sender and extract it's position 
    Character.find { clientId: socket.id }, (record) => 
     chat_data = 
      user: record 
      conversation: message 
     [lat, lng] = record.geometry.coordinates 
     # find everyone within a 1km square 
     km = 1/111 
     area = 
      type: 'Polygon' 
      coordinates: [ 
       [lat - km, lng - km] 
       [lat + km, lng - km] 
       [lat + km, lng + km] 
       [lat - km, lng + km] 
      ] 
     Character.find { within: area }, (record) -> 
      // send message to each user 

    socket.broadcast.send JSON.stringify(chat_data) 

J'ai l'impression que le problème peut résider dans la section 'find'. Par exemple, Ricardo a écrit

console.log ">> find #{JSON.stringify(attrs)}" 

Mais dans le code d'origine, ce lit avec un "=>" au lieu de ">>":

console.log "=> find #{JSON.stringify(attrs)}" 

qs = require 'querystring' 

find: (query, callback) -> 
    console.log ">> find #{JSON.stringify(attrs)}" 

    q = { operator: "or", properties: attrs } 
    url = lyr_config_characters.api_url 
    key = lyr_config_characters.acl.get 

    if query.id? 
     url += "/#{attrs.id}?" + qs.stringify({ key }) 
    else if query.within? 
     url += "/functions/within?" + qs.stringify({ key, input : query.within }) 
    else 
     url += qs.stringify { key, input: q } 

    req = 
     method: "GET" 
     uri: url 
     headers: { "Content-Type": "application/json" } 

    request req, (error, response, body) -> 
     console.log error if error 
     console.log "<< find #{body}" 
     callback JSON.parse body ? '{}' 

Merci!

+0

Qu'est-ce que 'Character'? –

+0

Merci, Ricardo. Le reste du code est ici: https://github.com/sabman/geochat-example/blob/master/server.coffee – keypulsations

Répondre

0

L'exemple que vous utilisez est basé sur spatialdb, qui semble avoir une documentation très incomplète.

De l'apparence de celui-ci, vous avez besoin d'interroger des utilisateurs en utilisant un objet de la géométrie, il renvoie les points (utilisateurs) qui sont contenus dans:

socket.on 'broadcast', (message) -> 
    # find the sender and extract it's position 
    Character.find { clientId: socket.id }, (user) -> 
     chat_data = 
      user: user 
      conversation: message 
     [lat, lng] = user.geometry.coordinates 
     # find everyone within a 1km square 
     km = 1/111 
     area = 
      type: 'Polygon' 
      coordinates: [ 
       [lat - km, lng - km] 
       [lat + km, lng - km] 
       [lat + km, lng + km] 
       [lat - km, lng + km] 
      ] 
     Character.find { within: area }, (users) -> 
      // send message to each user 

Vous aurez également besoin de modifier la méthode find à utilisez la requête within:

find: (attrs, callback) -> 
    console.log "=> find #{JSON.stringify(attrs)}" 
    q = { operator: "or", properties: attrs } 
    if _.contains(_.keys(attrs), "id") 
     url = "#{lyr_config_characters.api_url}/#{attrs.id}?key=#{lyr_config_characters.acl.get}" 
    else if _.contains(_.keys(attrs), "within") 
     url = "#{lyr_config_characters.api_url}/functions/within?key=#{lyr_config_characters.acl.get}&input=#{encodeURIComponent(JSON.stringify(attrs.within))}" 
    else 
     url = "#{lyr_config_characters.api_url}?key=#{lyr_config_characters.acl.get}&input=#{encodeURIComponent(JSON.stringify(q))}" 
    req = { method: "GET", uri: url, headers: {"Content-Type": "application/json"} } 

(qui, pour la santé mentale, je réécrire)

qs = require 'querystring' 

find: (query, callback) -> 
    console.log ">> find #{JSON.stringify(attrs)}" 

    q = { operator: "or", properties: attrs } 
    url = lyr_config_characters.api_url 
    key = lyr_config_characters.acl.get 

    if query.id? 
     url += "/#{attrs.id}?" + qs.stringify({ key }) 
    else if query.within? 
     url += "/functions/within?" + qs.stringify({ key, input : query.within }) 
    else 
     url += qs.stringify { key, input: q } 

    req = 
     method: "GET" 
     uri: url 
     headers: { "Content-Type": "application/json" } 

    request req, (error, response, body) -> 
     console.log error if error 
     console.log "<< find #{body}" 
     callback JSON.parse body ? '{}' 
+0

Ricardo - merci beaucoup pour cette réponse. Je vais l'examiner ce soir! – keypulsations

+0

Ricardo, j'ai édité ma question originale pour incorporer vos suggestions. Il semble toujours y avoir un problème, et je l'ai souligné dans la mise à jour. Vraiment apprécier votre contribution! – keypulsations

+0

@PaulOsetinsky inside socket.on 'broadcast', j'ai changé le paramètre 'record' en' user', donc votre code devrait lire '[lat, lng] = record.geometry.coordinates'. Et le code pour distribuer les messages est toujours manquant :) –

Questions connexes