Portrait de Patrice GADEGBEPatrice GADEGBE

Mooduo

Mooduo est un prototype de journal d’humeur tenu à deux : chaque partenaire indique son humeur sur une échelle à cinq niveaux, et l’application affiche les deux côte à côte, avec leur historique.

Rôle
Auteur unique
Période
Décembre 2021 et janvier 2022
État
Prototype. Prototype, jamais publié
Technologies
Flutter, provider, Django 4, Django Channels, PostgreSQL, Redis
Dépôts
Deux dossiers, sans historique git
Architecture de MooduoL’application Flutter échange avec une API Django par des requêtes ordinaires et par un canal WebSocket. Le serveur enregistre les humeurs dans PostgreSQL et s’appuie sur Redis pour diffuser les signaux aux deux téléphones.ApplicationFlutter, providerdeux téléphonesAPIDjango 4, Channelscinq points d’accèsPostgreSQLduos, humeursRedisdiffusion des signauxHTTP, WebSocket
Figure 1. Architecture de Mooduo. Le trait interrompu désigne le canal WebSocket, par lequel le serveur prévient les deux téléphones.

Contexte

Mooduo représente deux à trois semaines de travail autour du Nouvel An 2022. Chacun des deux partenaires choisit son humeur du moment ; l’application affiche les deux, signale qu’elles coïncident, et conserve un historique que l’on peut filtrer par personne et par période. Le projet n’a pas été poursuivi, et il n’en subsiste pas d’historique git.

Problème

Le prototype cherche à apparier deux téléphones sans création de compte, et à faire apparaître le changement d’humeur de l’un chez l’autre sans que celui-ci ait à rafraîchir l’écran.

Réponse apportée

Un appariement sans compte

Le premier partenaire demande au serveur un identifiant de duo, puis le transmet à l’autre par un lien de partage. Le second téléphone reçoit ce lien, conserve l’identifiant et se déclare comme second membre, après quoi le serveur tient le duo pour validé des deux côtés. Les prénoms ne quittent jamais les téléphones, où ils sont conservés avec l’identifiant.

Une ligne par couple et par heure

Une humeur n’est pas une ligne par personne. Le serveur tient une ligne par duo et par heure, dotée de deux colonnes, et chaque envoi écrit dans la colonne de son auteur. Savoir si les deux partenaires sont d’accord revient alors à comparer deux colonnes d’une même ligne.

today = datetime.today()
try:
    mood = MoodLevel.objects.get(duo=duo,
                                 time__year=today.year,
                                 time__month=today.month,
                                 time__day=today.day,
                                 time__hour=today.hour)
except MoodLevel.DoesNotExist:
    mood = MoodLevel.objects.create(duo=duo, time=today)

if data['duo'] == 1:
    mood.first_duo_level = data['level']
elif data['duo'] == 2:
    mood.second_duo_level = data['level']
else:
    return Response(status=status.HTTP_400_BAD_REQUEST)

mood.save()
Extrait 1. Enregistrement d’une humeur dans la ligne de l’heure en cours.

Un canal qui ne transporte qu’un signal

Le canal WebSocket ne véhicule aucune donnée. Le serveur y pousse une seule lettre, qui indique que le duo est complet ou qu’une humeur a changé, et le téléphone réagit en relisant les données par une requête ordinaire. Le format des données n’existe ainsi qu’à un seul endroit.

Limites et perspectives

L’identifiant de duo est le seul secret du système : quiconque le détient peut lire et écrire les humeurs du couple. Ce choix convenait à un prototype qui n’a tourné que sur mon réseau, et il interdirait une publication en l’état.

L’appariement par lien n’est en outre configuré que pour Android, les rappels quotidiens sont restés inachevés, et l’heure retenue est celle du serveur et non celle de l’utilisateur. Le prototype ne comporte enfin aucun test.

Retour aux autres projets