Skip to main content

Notifications et présence

Notifications envoyées pardepuis le GameUnity

Le Game envoie les notifications au backend Web. Game.NotificationManager.SaveNotification() appellelance la coroutine BackEndBase.SaveNotification(), qui effectue POST /saveNotification avec userUid, notificationType, isImportant et extraData.

L'inbox,userUid est le profil jeu du destinataire (products_code.game_oid); extraData.simUid identifie la simulation. NotificationController, protégé par AuthGuardUser, délègue à GameNotificationService.notifyGameProfile().

Le serveur vérifie le format, exclut les notificationstypes tempsréservés réelau serveur et contrôle que l'expéditeur et le destinataire appartiennent à la simulation BrainCloud. Le profil jeu destinataire est ensuite converti en compte Web pour NotificationService.notify().

La notification est enregistrée dans l'inbox Redis avant son annonce aux connexions du compte. Le push sontest documentéstenté ensuite; un échec du push n'annule pas l'entrée enregistrée. L'inbox possède une limite de taille et une durée de rétention configurées dans NOTIFICATION_CONFIG.

Le Web charge GET /notifications, marque une entrée comme lue via POST /notifications/:notificationUid/read et la supprime via DELETE /notifications/:notificationUid. La réception live utilise notification.created sur le socket du compte /account.

Voir Notifications et Push.

L'interfacepour accessiblele au-dessussystème duWeb, jeu possède sa propre page :et Panel Web — interface superposée au jeu et intégration Unity. Ellepour décritson laaffichage barreau-dessus d'outils,du lejeu.

support

Trois intégré, le centremécanismes de notifications et le cycle d'ouverture.

Présence : connexion et évaluationprésence

La présence comprend deux données différentes :

NotionMécanisme RôleDonnée et usage MécanismeCode
ConnexionPrésence /du onlinecompte Web SavoirStatut sionline/away l'utilisateuret estjeu connecté.actif du compte; utilisé par les interfaces Web. EndpointAccountSocketService, heartbeat,socket appelé/account, environupdateStatus touteset updateGamePresence.
Heartbeat du Game Session du jeu et derniers heartbeats utilisés par l'UI Unity pour les 5utilisateurs secondes.de la simulation. User.DoHeartbeat(), endpoint /heartBeat et UsersLastHeartbeats. Présence évaluée By Year EnregistrerParticipation laenregistrée présencepar dansétudiant, leactivité contexteet pédagogiqueannée, Byutilisée Year.pour calculer un score. _command/set_presence.js et les stubs annuels de présence.evaluation.presence[actUid][yearId].

UnLe utilisateurnouveau connectéstatut n'impliqueWeb ne remplace pas automatiquement uneles notedeux deusages présence,Game : le code local conserve des appels et unedes présenceconsommateurs évaluée ne garantit pas que l'utilisateur est actuellement connecté.distincts.

EnregistrementPrésence deWeb ladu présencecompte

set_presence.jsAccountSocketService suit l'activité du navigateur, le focus et l'inactivité pour émettre online ou away. PageWebglComponent appelle setGamePresence(pid, gameUid) après validation de l'accès au jeu, puis clearGamePresence() à sa destruction.

À la reconnexion du socket, le service réémet le jeu actif conservé en mémoire. Cette information désigne le jeu ouvert; elle ne crée pas d'entrée de présence pédagogique dans BrainCloud.

Heartbeat utilisé par Unity

LoadUserState démarre le heartbeat. User.DoHeartbeat() utilise HEARTBEAT_RATE_SECONDS = 5 : l'intervalle d'attente est de 5 secondes entre les appels. La réponse peut mettre à jour les derniers heartbeats dans le controller de simulation.

SimulationBaseController.IsUserOnline() et ActivityBaseController.IsUserOnline() considèrent un utilisateur online si le dernier heartbeat date de moins de 5 × 12 = 60 secondes. ProfileImageControl consomme cet état pour l'affichage. Le heartbeat a donc encore un consommateur Unity.

Présence évaluée By Year

BackEndBrainCloud.SetPresence() appelle _command/set_presence. Le script traite seulement les utilisateurs avec isTeacher == 0, charge userDetails, puis laleur simulation et l'activité pourcourante, maintenirpuis enregistre la présence uniquement si currentYearState == 1.

setYearPresence() écrit true dans evaluation.presence[actUid][yearId] si l'entrée n'existe pas déjà, sauvegarde le contextedocument courant.et envoie user_new_presence_eval à l'étudiant et au professeur.

EngetPresenceScore() Bycompte Year,les années enregistrées entre 0 et yearId, puis divise le cumul de 100 points par le nombre d'années. StudentState et ActivityByYearController appellent encore SetPresence() dans leurs transitions.

startYear() initialiseenvoie un nouveaule stub de présencescore pourà chaque étudiant; il ne marque pas tous les étudiants.étudiants Lesprésents. helpersL'enregistrement setYearPresence()effectif et deleteYearPresence() maintiennent les données lors des changements d'état. Une réouverture doit traiter la présence de l'année concernée correctement.

Voir Évaluations, logbook, scénarios et rankings By Year pour le cycle annuel et Système d'évaluation commun pour les évaluations.

Diagnostic

    Statut online incorrect : vérifier le heartbeat et la connexion du client. Présence évaluée incorrecte : vérifier userDetails, la simulation, l'activité, l'année et le traitementrelève de set_presence. Notification absente

    Réouverture : point à contrôler

    utils_reopen_year.js appelle deleteYearPresence(student, actData.currentYear + 1, actData). Dans la version locale inspectée, le helper utilise actUid sans le définir localement à partir de actData.uid. La suppression dépend donc d'une résolution externe de cette variable; ce parcours ne peut pas être présenté comme validé sans vérifier l’envoison àcontexte /saveNotificationd'exécution.

    puis

    Faut-il retirer la présence Game ?

    Le code inspecté ne permet pas de la retirer comme un simple doublon : le traitementheartbeat Webalimente décritl'UI dans NotificationsUnity, et Push.

    la présence By Year alimente les évaluations BrainCloud. Pour les remplacer par la présence Web, il faudrait migrer explicitement ces consommateurs et la persistance des scores.

    Sources vérifiées

    Game : Assets/Src/Game/Notifications/NotificationManager.cs, Game/BackEnd/BackEndBase.cs, BackEndBrainCloud.cs, Game/User.cs, Game/GameStates/StudentState.cs, LoadUserState.cs, les controllers de simulation/activité et UI/ProfileImageControl.cs. BrainCloud : _command/set_presence.js, _utils/utils_by_year.js, utils_eval.js et _utils/command/utils_reopen_year.js.

    Web : uniksim-back-end/src/app.controller.ts, service/game-notification.service.ts, notification.service.ts; frontend : service/account/account-socket.service.ts et Pages/PageWebgl/PageWebgl.component.ts.

    Vérification par lecture du code local de master/game, master/node.js et uniksimweb, le 30 septembre 2026. Aucun envoi de notification ou changement de présence réel n'a été exécuté pour cette vérification.