Déblocage et grandes avancées

March 21, 2022

Et enfin, on a fini par trouver !

Petite intro à notre Victoire

On a enfin eut l'idée. L'idée du siècle, faire une API !

A savoir : Une API, en programmation, c'est juste des bouts de codes, permettant d'aider au développement. Elles aident les développeurs en les mettant tous sur une même base de projet car elle regroupe tous les points communs dont le projet à besoin pour avancer beaucoup plus efficacement.

Retraçons le cours des évènements et admirons la résolution des problèmes !

Quelle satisfaction quand tous les problèmes disparaissent uns à uns !
Le résumé de ces deux dernières semaines :

  • L'exécution de jeux, avec enregistrement de la partie

Tout d'abord, nous réfléchissions sur le projet, et nous réfléchissions sur : Comment faire pour que les parties soient enregistrées ?
Et c'est en essayant d'exécuter par commande un jeu, pour se détendre, que l'idée est apparue :

Double cliquer sur une icône d'application ou de jeu ne reviens qu'a exécuter la commande en Batch -> "start %chemin_de_l'appli%".
Et en fait, a chaque commande qu'on exécute, on cible une application, un jeu ou un programme pour l'exécuter (exemple : la commande "calc" est exactement l'équivalent du double clic sur l'icône de la calculatrice sur le bureau). Or, on sait qu'une commande peut avoir des arguments... Donc on en conclut qu'on pourrait exécuter la commande "start %chemin% %arguments...%", et dans Python, il est très simple d'exécuter une commande grâce à la librairie "os" avec la fonction "os.system(...)". Il ne nous restait plus qu'a récupérer ces fameux arguments, appelés Arguments Systèmes.
Et c'est là qu'on a découvert une variable incluse de la librairie système "sys", la liste "sys.argsv". Elle est en fait de type "list[str]" et contient donc tous les arguments systèmes passés lors de l'exécution. Il ne nous restait plus qu'à passer en arguments les informations de connexion du joueur.

On avait donc là une Solution au problème d'exécution !

  • Récupérer les informations du joueur et du jeu, avant, après et pendant la partie

Oui mais le simple fait d'avoir le nom et a la limite, le mot de passe du joueur en argument ne suffisait pas, il fallait pouvoir récupérer son nom, son meilleur score, etc... Donc on a copié la classe User pour la coller dans les fichiers de notre jeu. Aussi également importer (copier / coller) la classe UUID pour palier aux erreur d'imports.
Mais pour avoir le meilleur score, il fallait également définir le uuid et pour la mise à jour, avoir une version, donc importer (encore une fois copier / coller) la classe Version (explications au dernier post).

Ainsi, on avait une solution pour ce problème.

  • Transfère de fichier pour les Mises à Jours et pour les images

Un autre problème faisait face... Le problème du transfère de fichier pour effectuer des mises à jour, ou juste télécharger les miniatures des jeu ou des photos de profils des autres utilisateurs. Mais comment faire ?
Il y avait un moyen de le faire en passant par la base de données, c'était sûr, car depuis l'interface phpMyAdmin c'était possible de stocker des gros tableaux binaires (appelés Blobs). Mais par requêtes ?

Alors on a essayé de convertir le fichier en binaire. Trop long. Alors on l'a récupéré en hexadécimal mais.. le mettre dans la requête ne fonctionnait pas : si on mettait des guillemets, il prenait ça comme un String et non un Blob, mais si on en mettait pas, il disait que le type n'était pas reconnu et qu'il fallait des guillemets. Et comme pour passer un nombre dans une requête, on peut garder les guillemets (le SQL le prendra quand même pour un nombre), alors on pensait que le problème venait de l'encodage qui n'était pas bon. Et sur Internet.. rien. Comme si personne ne l'avait fait où comme si c'était évident pour tout le monde. Mais il était tard et nous n'avions plus de temps... donc nous avons mis le problème sur le côté et attendu en espérant avoir une révélation pendant presque une semaine.

Et elle est venue.
La révélation. Elle était là. On est parti analyser les requêtes directement sur le phpMyAdmin en ajoutant des fichiers binaires très simples.. Et effectivement, ça nous a débloqué, personne n'y avait penser mais... écrire "1", c'est l'équivalent d'écrire "0d1" !!! Car on est en base Décimale !!! Pour du binaire, c'est "0b1" donc pour du hexadécimal, c'est "0x1" !! On avait donc un truc final qui ressemblait à "0xd1e3baf25bc5e1a13d89f740b8 ..." et contrairement à toute attente... C'est passé !

Donc à présent, on ne télécharge plus que le launcher (l'interface qui lance les jeu), si on veux jouer à un jeu, c'est quand on appuie sur "Lancer le Jeu" qu'il se télécharge ou se met à jour si besoin ! Ca permet de garder tout à jour automatiquement ainsi que de décharger grandement le launcher !
Et un problème en plus de résolu !

  • Redondance, et risque si modification

Mais au développement que chaque jeu, il nous fallait un moyen de palier aux copiés collés intempestifs et beaucoup trop utilisés, car ils n'étaient pas optimales et à chaque changement, on rencontrerai problèmes et problèmes... Donc une idée nous est venue, faire une API !

Le principe est simple, mettre tout ce qu'on a besoin comme code dans un dossier, et ensuite rendre le dossier public et utilisable par toutes les autres branches du projet ! (Ici, l'API sera utilisée comme Lib Python).
On y a donc mis toutes les classes citées dans le dernier sujet de blog (sur le SQL) et voilà, en y ajoutant un fichier Manager.py, avec toutes les fonctions utiles, le développement des jeu devenait simple comme bonjour (ou du moins, l'implémentation sur l'interface) grâce à quelques simples fonctions : manager.register_new_game(uuid) et manager.add_score(user, score) ! Aussi simple que ça !

Notre dernier gros problème était résolu !

Prochaine étape

Ajouter des jeux afin de compléter le projet !

Et évidemment, régler tous les bugs que les nouvelles solutions vont poser.. car une solution, en développement, ramène forcément une autre erreur à corriger !

- Dernière modification :
March 21, 2022