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.
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 :
AccountSocketService, /account, updateStatus updateGamePresence. |
User.DoHeartbeat(), endpoint /heartBeat et UsersLastHeartbeats.
Présence évaluée By Year
_command/set_presence.js et 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
suit l'activité du navigateur, le focus et l'inactivité pour émettre set_presence.jsAccountSocketServiceonline 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 effectif setYearPresence()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
userDetailsset_presence.
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 d'exécution./saveNotification
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.
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.