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
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()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.
