JeuWeb - Crée ton jeu par navigateur
Système de notification - 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 : Système de notification (/showthread.php?tid=6502)



Système de notification - Akira777 - 13-11-2012

Salut à tous,

bon, je réfléchis beaucoup à la manière d'implémenter un système de notification multi-langue basé sur un historique en PHP pour un jeu web et voir votre point de vue / vos solutions / vos implémentations (rayez la mention inutile).

Le contexte :

Pour un jeu en cours de développement, je stocke l'intégralité des actions d'un joueurs en base (une table Maria Engine) sous cette forme :

action_entity_id - varchar - 40 => hash unique correspondant à une entité (joueur, guilde, ...)
action_slug - varchar - 24 => un slug correspondant à une action (item_used, bank_withdraw, ...)
action_data - blob => données json complétant l'action
action_timestamp - int - 10 => timestamp unix de l'action

Ceci me permet de suivre à la trace chaque action des joueurs, et de pouvoir faire du "Time Machine" sur un compte en cas de tricherie. D'une manière plus générale, cela me permet de savoir plein de chose sur le joueur, plusieurs algo simples me permettent de vérifier l'intégrité des actions d'un joueur, et de remettre en place correctement les données d'un module si un bug survient quelque part.

A partir de là, certaines actions lèvent une notification au joueur : quête x terminée, ...

Les notifications sont stockées en base de cette manière :

notice_entity_id - varchar - 40
notice_action_timestamp - int - 10
notice_notified_on - int - 10 => par défaut à 0, et mis à jour dès lors que la notification apparait
notice_read_on - int - 10 => par défaut à 0, et mis à jour dès lors que la notification a été prise en compte par le joueur (à la manière de facebook, si le joueur réçoit 'un message, le système mettra à jour la notification si le joueur voit le message avant d'en lire la notification, mais également lorsque le joueur lit la notification en passant par le lien de cette dernière).

Un worker se charge de supprimer au fur et à mesure, les vieilles notifications lues de plus de 24 heures...

Chaque action répond à une méthode par son slug, qui possède 2 patterns, un pattern d'affichage de l'historique, un pattern d'affichage de la notification. Exemples :

Historique :
"{ quest_name }" terminée en { quest_time_elapsed }. { quest_experience_rewarded } points d'expérience gagnés.

Notification :
Quête terminé : { quest_name }

Bon l'exemple est bateau, certes.
Techniquement, tout est en place, c'est un worker qui s'occupe de fournir tout ça, qui gère le cache et le parsage de la bonne localisation (français, anglais, japonais).

En gros, voilà la situation à laquelle je n'ai pas encore réfléchie. Quelle procédure suivriez-vous pour gèrer cet affichage, et ce cas concret d'utilisation. De l'AJAX ? Du tout Worker, comme ici ? Des events JavaScript sur les liens lors d'un clic sur les notifications ?

J'ai un peu de mal à avoir une vision ergonomique de la chose d'un point de vue interface.

Si vous avez des idées, des questions, ... Je serai ravi de vous lire / de vous répondre.


RE: Système de notification - Klhz - 13-11-2012

Je pense pas que l'ajax soit utile.. On ne cherche pas à avoir les notifications de chacuns en temps réel non?
Sinon je pense qu'il faut subdiviser au maximum les notifications par thèmes =)

Quel genre de notification as tu? Beaucoup?
Si tu as déja une ébauche visuelle, même "moisie", poste la et on aura certainement plus d'idées pour t'aider =)


RE: Système de notification - Akira777 - 13-11-2012

En fait, j'ai un module géant "History" (pattern Flyweight). Chacun des modules du jeu (board, stuff, inventory, messaging, fight, merchant, market, ...) à sa propre implémentation de l'archivage des actions, une classe en somme (stuff_history, inventory_history).
C'est géré automatiquement, je te rassure, c'est mon organisation du code qui le veut comme ça.

Chaque méthode de chacune des classes des modules lève des actions.
Ex : $this->history->raise_action() ou $this->history->raise_notice() ou $this correspond à une classe parente qui va __call directement la bonne classe pour le module appelant. History s'occupe du reste.

Ca, c'est pour stocker tout ça. Pour ce qui est lecture, la classe History gère les opérations : $this->history->parse_action() ou $this->history->parse_notice(). Ces méthodes retournent une chaine parsée comprenant le slug de l'action ou de la notice, ainsi que les données associées.

Oui, il y a beaucoup de notifications et mon but n'est pas d'être en temps réel, mais au chargement de la page, je veux afficher par exemple un icône avec le nombre de nouvelles notifications et au clic, une liste de 10 notifications récentes, par forcément non lues.

Pour le moment, je pensais faire du implémenter en jQuery, une mise à jour au "mouseover", avec un peu d'AJAX. Sachant que la classe History est RESTful via authentification, ca peut être pas mal. C'est simple pourtant : /api/{hash}/history/notice/{slug}/{time} en POST, mais je trouve ça limite de l'amateurisme averti que de se la couler douce en mode jquery 'mouseover'.


RE: Système de notification - Klhz - 14-11-2012

Tout ce qui importe c'est que ce soit fonctionnel Non?
Tu me parlais plus de vision ergonomique dans ton premier post alors je vais plutôt parler de ça Smile

Déja pense à tes admins et à leurs faire gagner du temps. Il faut pas que les notifications s'affichent apres plusieurs clics.. Moi ça me ferais bien ch*** Par exemple:

L'admin arrive, il clique sur "gestion de personnages" et il doit choisir un perso. ça fait déja deux clics dont du scroll et/ou du temps pour taper son nom entier ou son début de nom dans un module de recherche.

Ensuite tu as plus de 10 modules de jeu et leurs notifications que l'admin va vouloir parcourir. Va falloir que ce soit un peu agréable à l'oeil non? Et 10 listes de notifications ça risque d'être bordélique et peu pratique, surtout que certaines seront déja lues. Pourtant voir les notifications de plusieurs modules l'un à coté de l'autre me parait primordial non?

Alors pourquoi ne pas faire un système où l'admin peux cliquer sur des boutons pour faire afficher les modules de notifications? Par exemple 3 maximum les uns à coté des autres?

Après pour la mise à jour au survol je vois pas le but si c'est pour surveiller en cas de tricheries...
Tu verra bien en te connectant à un joueur si il a triché auparavant! non?
Tu ne va quand même pas rester sur cette page en attendant le méfait :p


RE: Système de notification - niahoo - 14-11-2012

en fait c'est un gros système de log quoi. pourquoi ne pas simplement avoir des workers qui passent les logs en revue et qui font remonter les incohérences/anormalités ?

Y a t'il un intérêt particulier à tout afficher pour les lire manuellement ?


RE: Système de notification - Akira777 - 14-11-2012

Klhz : Ce n'est pas destinés au admins, c'est destiné aux joueurs. Ce sont des notifications comme sur Facebook.
Quand tu te connectes, tu vois les 10 dernières actions effectuées sur ton profil :

- foo t'as transféré 5000 euros
- bar a accepté ton défi dans la zone de combat
- baz t'as transféré 7800 euros
- tu as débloqué la récompense foobar
- [...]

Un système de notification quoi.
Après oui, c'est du log, mais utile aussi vu que ca sert également de système de trigger. Par exemple quand tu débloques une action, le système se sert de ces infos pour savoir si tu as pris la réécompense associée ou non, auquel cas il peut te rediriger vers une page spéciale par exemple.

Pour les modos, même s'ils ont une page spéciale pour suivre en temps réel les actions des joueurs, ils peuvent prendre le contrôle de n'importe quel compte et suivre un joueur en live.


RE: Système de notification - niahoo - 14-11-2012

AAH oui ok pas pigé.

Bon ben c'est le cas typique pour les Server-Sent-Events. Et pour iE un vieux polling toutes les 30 secondes, pas plus.

Citation :Oui, il y a beaucoup de notifications et mon but n'est pas d'être en temps réel, mais au chargement de la page, je veux afficher par exemple un icône avec le nombre de nouvelles notifications et au clic, une liste de 10 notifications récentes, par forcément non lues.

Pour le moment, je pensais faire du implémenter en jQuery, une mise à jour au "mouseover", avec un peu d'AJAX. Sachant que la classe History est RESTful via authentification, ca peut être pas mal. C'est simple pourtant : /api/{hash}/history/notice/{slug}/{time} en POST, mais je trouve ça limite de l'amateurisme averti que de se la couler douce en mode jquery 'mouseover'.

Ben c'est pas de l'amateurisme, c'est simple et ça fonctionne. Tu affiches le nombre de nouvelles notifications aux chargement et tu recharges cette info via polling toutes les minutes.

Les server-sent events ça va te bouffer des connexions supplémentaires pour rien si tu ne veux pas du temps réel pour ça.

Le comportement sur facebook c'est un chargement lors du clic, ça me semble être une bonne base