JeuWeb - Crée ton jeu par navigateur
Tchat en direct - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Tchat en direct (/showthread.php?tid=366)

Pages : 1 2 3 4 5 6 7 8


RE: Tchat en direct - srm - 10-01-2011

Je ne pense pas que tu ai fait beaucoup d'effort si tu es vraiment dépassé par ce simple exemple.
Où alors il faut remettre en question tes connaissances en programmation.


RE: Tchat en direct - Sephi-Chan - 10-01-2011

(10-01-2011, 05:41 PM)Colmea a écrit : Je suis peut-être un boulet mais j'ai du mal à comprendre où se trouve la vraie doc concernant beacon ?

Où as-tu trouvé la méthode beacon.new et beacon.publish ?

J'ai juste quelques pages sur le site, mais rien de très concret quant à l'utilisation approfondie de l'api ?

Toute la documentation est réunie sur le Developer's Guide.

Pour le moment, Beacon ne fournit pas de classes d'accès. Elles sont toutes fournies par la communauté (Cf. Open-source contributions).

Comme leur API est une API REST, tout se fait via HTTP, c'est donc très simple d'implémenter les différents appels. En l'occurrence, la classe Beacon (de mon crû, comme expliqué dans l'article) n'implémente qu'une méthode pour publier sur un canal. Le code source de cette classe se trouve dans l'archive, dans le fichier lib/beacon.rb.


(10-01-2011, 05:43 PM)Argorate a écrit : Rah, faut pas mal le prendre, c'est juste qu'essai de comprendre que le ruby ne me parle absolument pas! et que tu as pris l'habitude de ne mettre plus que du code ruby, ce qui est bien puisque c'est le langage que tu affectionnes, mais bon je comprend rien a chaque fois que tu en mets donc voilà... Smile

Ce qui me met en colère, c'est que tu me parles de faire des efforts alors que tu n'en fais aucun pour lire quelques lignes de Ruby. Enlève tes œillères, sinon tu ne progresseras jamais.


Sephi-Chan


RE: Tchat en direct - Colmea - 10-01-2011

(10-01-2011, 06:02 PM)Sephi-Chan a écrit : la classe Beacon (de mon crû, comme expliqué dans l'article) n'implémente qu'une méthode pour publier sur un canal. Le code source de cette classe se trouv

Autant pour moi, j'avais mal lu :non:

J'ai du mal à déchiffrer le Ruby (décidément je trouve sa syntaxe imbuvable, y'a rien à faire Big Grin)


RE: Tchat en direct - Argorate - 10-01-2011

(10-01-2011, 07:40 PM)Colmea a écrit : J'ai du mal à déchiffrer le Ruby (décidément je trouve sa syntaxe imbuvable, y'a rien à faire Big Grin)

+1.

Moi je disais ça non pas pour embeter, mais pour transcrire du ruby vers le php, ça s'invente pas! Si on ne maitrise pas le langage source, il est hazardeux de trouver l'équivalant en php...

m'enfin si c'est pour faire des histoires, faites comme si je n'avais rien dit Wink


RE: Tchat en direct - Sephi-Chan - 10-01-2011

J'vais reprendre le code de cette classe point par point.

D'abord l'ensemble, pour être sûr qu'on parle de la même chose.


require 'json'
require 'net/http'

class Beacon

attr_accessor :host, :port, :version, :api_key, Confusedecret_key


def initialize(api_key, secret_key, options = {})
self.api_key = api_key
self.secret_key = secret_key

self.host = options[:host] || 'api.beaconpush.com'
self.port = options[:port] || 80
self.version = '1.0.0'
end


def publish(channel, data)
json_data = JSON.dump(data)
path = "/#{version}/#{api_key}/channels/#{channel}"
request = Net::HTTPGenericRequest.new('POST', true , true, path)

request.body = json_data
request.content_length = json_data.size
request['X-Beacon-Secret-Key'] = secret_key

response = http.request(request)

(200...300).include?(response.code.to_i)
end


private

def http
Net::HTTP.new(host, port)
end

end


Commençons par le début :



require 'json'
require 'net/http'

class Beacon
# ...
end

Notre classe va utiliser d'autres classes. On n'est pas sûr qu'ils soient déjà inclus, dans le doute, on charge ces classes (la méthode require est protégée contre les inclusions multiples). Ici, j'ai besoin de JSON et de Net::HTTP.



attr_accessor :host, :port, :version, :api_key, Confusedecret_key

Ici, on génère des accesseurs (writters et readers) pour différentes propriétés. Ça revient à écrire (sauf que cette solution est plus performantes) :



def host
@host
end

def host=(host)
@host = host
end

# Etc. pour les autres propriétés.

Et ça tu le fais pas en PHP, t'écris (ou tu génères) bêtement tes méthodes, qui prennent de la place inutilement… Smile



def initialize(api_key, secret_key, options = {})
self.api_key = api_key
self.secret_key = secret_key

self.host = options[:host] || 'api.beaconpush.com'
self.port = options[:port] || 80
self.version = '1.0.0'
end

Le constructeur de notre classe. Il prend un api_key, une secret_key et une hash d'options. Il donne des valeurs par défaut quand il n'y en a pas. L'équivalent en PHP :


public function __construct($apiKey, $secretKey, $options = array()){
$this->setApiKey($apiKey);
$this->setSecretKey($secretKey);

$this->setHost(array_key_exists('host', $options) ? $options['host'] : "api.beaconpush.com");
$this->setHost(array_key_exists('port', $options) ? $options['port'] : 80);
$this->setVersion('1.0.0');
}

Ah, rien à dire, le Ruby c'est vraiment imbuvable ! Big Grin



private

def http
Net::HTTP.new(host, port)
end

Ici, les méthodes qui suivent le mot clé private sont privées. La méthode http est donc privée. Elle instancie un objet Net::HTTP en leur passant host et port. Comme vous pouvez le voir, on n'a défini aucune variable locale host ou port, Ruby va quand même les chercher : il va tenter sa chance en cherchant des méthodes de l'objet qui portent ce nom : et il trouve ! En effet, on a généré des accesseurs et on les a rempli dans le constructeur.



def publish(channel, data)
json_data = JSON.dump(data)
path = "/#{version}/#{api_key}/channels/#{channel}"
request = Net::HTTPGenericRequest.new('POST', true , true, path)

request.body = json_data
request.content_length = json_data.size
request['X-Beacon-Secret-Key'] = secret_key

response = http.request(request)

(200...300).include?(response.code.to_i)
end

Ici, on a une méthode publish qui prend un channel et des data. On transforme les données en JSON, on génère l'URL du script à appeler. Pour cela, on utilise version, api_key et channel. Comme pour la méthode d'avant, version et api_key appeleront les méthodes de l'objet tandis que channel utilisera la variable locale reçue en argument.

Ensuite, on crée une requête HTTP POST. Pour ça par contre, je vous laisse écrire l'équivalent en PHP avec Curl et le poster dans cette discussion. Smile

Ces requête doit avoir un header X-Beacon-Secret-Key qui contient la clé secrète.
La requête doit également avoir un contenu : ici ce sont nos données à envoyer encodées en JSON et une taille : la longueur du contenu.

La méthode renvoie true si le code de la réponse (200, 301, 404, 500, etc.) est situé entre 200 et 299.



Sephi-Chan


RE: Tchat en direct - Cawrotte - 10-01-2011

Quel travail pour la communauté :o

Alors là merci !!


RE: Tchat en direct - Kassak - 10-01-2011

Pour ma part, j'ai un minichat qui se refresh tout seul, fait avec du php + ajax.

C'est peut être pas le top niveau performance, mais c'est simple et rapide à faire. Tu as ta page avec ton minichat, et une fonction refresh en ajax qui rafraichi le minichat toutes les X secondes (que le minichat pas la page).

Et voilà Wink


RE: Tchat en direct - Colmea - 10-01-2011

Merci d'avoir pris la peine Sephi.
J'ai l'impression d'être un gosse, mais il faut ce qu'il faut :toilette:


RE: Tchat en direct - Sephi-Chan - 10-01-2011

Le push est tout aussi simple à mettre en place que la solution en Ajax, alors qu'elle est bien meilleure en terme de performances, de charge serveur et de confort d'utilisation (les messages arrivent un par un, et pas par groupes).

Dans un chat en Ajax, il faut deux pages : une page à laquelle on envoie des données et qui les stock en base et une page qui affiche les messages avec du Javascript pour demander le rechargement de cette zone d'affichage.

Dans un chat avec push, il faut également deux pages : une page qui envoie les messages au serveur de push (on peut aussi les stocker en complèment) et la page d'affichage, avec le Javascript pour récupérer les messages envoyées par le serveur de push.

Et cette simplicité ne fera que s'accentuer quand Beacon proposera directement des classes pour ton langage. Ça peut paraître compliqué au début car c'est une manière nouvelle d'aborder les choses : rappelez-vous quand vous appreniez à utiliser Ajax (et ça l'est toujours pour certains) !

Le problème d'Ajax, c'est que ça affiche les messages par à-coups, donc ça n'est pas très agréable à utiliser, et que ça scale mal lorsque le nombre de joueur augmente : ça va coûter cher au serveur pour… rien.


Sephi-Chan


RE: Tchat en direct - php_addict - 10-01-2011

(10-01-2011, 09:15 PM)Sephi-Chan a écrit : Le problème d'Ajax, c'est que ça affiche les messages par à-coups, donc ça n'est pas très agréable à utiliser, et que ça scale mal lorsque le nombre de joueur augmente : ça va coûter cher au serveur pour… rien.

et pourquoi ne pas faire un chat en php ou autre mais avec l'emplois des sockets ?

que pensez vous de ce tuto?: http://www.siteduzero.com/tutoriel-3-10118-comment-utiliser-les-sockets-avec-php-comment-creer-un-chat-avec-les-sockets.html

est ce si gourmand que cela en terme de ressources serveur pour un mini chat ?