Connexion centrale
Dans le second cas, on gère actuellement ça avec une unique game instance (GI) personnalisée, qui réagit à tous les messages utiles toutes mécaniques confondues. Pour modulariser cette solution, on implémente :
- UPersistentCommGISubsystem, un GI Subsystem (GISub) chargé d’entretenir une connexion websocket avec une api distante. Il publie un événement lorsqu’il reçoit un message.
- UMessageHandlerGISubsystem, un GISub qui souscris aux événéments de UPersistentCommGISubsystem, interprète le message et agit selon son contenu. Il prépare aussi les messages à envoyer vers l’extérieur via UPersistentCommGISubsystem. Pour chaque nouveau système dépendant de la connexion centrale, on crée un nouveau GISub qui hérite de UMessageHandlerGISubsystem.
UPersistentCommGISubsystem
UPersistentCommGISubsystem n’est pas voué à être parent, il contient :
Fonctions
- FString AuthenticateHTTP(FString URL) : émet une requête d’authentification et renvoie un token pour l’instance (NOT USED)
- void CreateWebsocket(FString URL) : crée la websocket persistante, contrôlant l’événement MessageReceived
- void ConnectWebsocket() : démarre la connexion websocket
- Void SendMessage(FString msg) : envoie msg sur la websocket si prête à la communication
- void Ping() : utile pour maintenir des connexions limitées dans le temps
Variables
- FString Token : token du module, permettant d’identifier l’instance de jeu
- FString FriendlyName : nom présentable associé à l’instance de jeu (à compléter d’autres credentials)
- Float PingDelay : intervalle entre les appels de Ping(), une valeur nulle vaut OnTick(), négative vaut jamais.
Event Dispatcher
- MessageReceived(FString msg) : publie msg à disposition des autres éléments
UMessageHandlerGISubsystem
UMessageHandlerGISubsystem contient :
Fonctions :
- Pure virtual void HandleMsg(FString msg) : interprète msg et applique le traitement approprié (pure virtual car la fonction est totalement dépendante de la logique du module)
- void SendHttpRequest(FString URL, FString Verb, FString Content, void *Function((FHttpRequestPtr, FHttpResponsePtr))) : émet une requête à URL avec Verb et en corps le Json Content, applique Function sur la réponse reçue (une requête se compose en deux fonctions, une construisant la requête et appelant SendHttpRequest, l'autre traitant la réponse et utilisée en callback)
Event Listener :
- MessageReceived(FString msg) : intercepte msg lors de sa réception, lance son traitement avec HandleMsg(msg).