Table des matières

, , ,

Rappel des dates d'anniversaire pour nerds

Vous avez le plus grand mal à penser aux dates d'anniversaire de votre famille et de vos amis ?
Pour compliquer les choses, ceux-ci se reproduisent de manière exponentielle ?(et la génération des petits enfants commence à peine)
Vous avez renoncé à facebook même si vous trouviez bien pratique de trouver toutes ces infos au même endroit ?
Vous passez plus de temps le nez dans la fenêtre sombre d'un terminal plutôt que dans les livres de photos souvenir ?
VOICI LA SOLUTION

anniv.py (cliquer pour afficher le code)

anniv.py
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
 
bdays = """\
23-8-1754   Louis XVI
24-8-1948   Jean-Michel Jarre
15-6-1943   Johnny Hallyday
28-9-1934   Brigitte Bardot
"""
 
from datetime import date
 
 
def str2date(str_date):
    d, m, y = str_date.split('-')
    return (int(y), int(m), int(d))
 
 
def find_next(bdays, md):
    if not bdays:
        return []
 
    match = []
    for l in bdays:
        next_date = (l[0][1], l[0][2])
        if len(match):
            # Check if there is another bday the same day
            if next_date == (match[0][0][1], match[0][0][2]):
                match.append(l)
            else:
                break
        elif next_date >= md:
            match.append(l)
 
    return match if len(match) else find_next(bdays, (0,0))
 
 
if __name__ == "__main__":
    converted = []
    for l in bdays.splitlines():
        tokens = l.strip().split()
        if tokens:
            converted.append((str2date(tokens[0]), ' '.join(tokens[1:])))
 
    # Sort by month and day
    sorted_bdays = sorted(converted, key=lambda d: (d[0][1], d[0][2]))
 
    today = date.today()
    md = (today.month, today.day)
    next_bdays = find_next(sorted_bdays, md)
    for bday in next_bdays:
        bmd = (bday[0][1], bday[0][2])
        if bmd == md:
            print(f"* Aujourd'hui : Anniversaire de {bday[1]} ({today.year-bday[0][0]} ans)\n")
        else:
            isnextyear = bmd < md
            dt = date(today.year if not isnextyear else today.year+1, bmd[0], bmd[1]) - today
            print(f"* Anniversaire de {bday[1]} dans {dt.days} jours ({today.year-bday[0][0]} ans)\n")

Utilisation

Téléchargez le script çi-dessus et copiez-le à l'endroit de votre choix sur votre système.

Éditez le script pour ajouter les dates d'anniversaire et les noms de vos amis ou autres personnalités préférés.
Il est important de respecter format de la date JJ-MM-AAAA.
L'ordre chronologique n'a pas d'importance (la liste est triée à chaque exécution du script).

Vous pouvez lancer le script dans un terminal avec la commande :

$ python3 anniv.py

Mais bon comme ça, en brut, c'est un peu austère. Pour un plus bel effet vous pouvez utiliser l'appli cowsay

Pour installer cowsay (moins de 100 Ko) :

$ sudo apt install cowsay

Nous pouvons maintenant afficher la sortie de notre script au travers cowsay :

$ python3 anniv.py | cowsay
 ______________________________________
/ Aujourd'hui : Anniversaire de Michel \
\ 7 ans                                /
 --------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Afficher le message à l'ouverture du terminal

Dans un terminal :

$ echo "python3 ~/anniv.py | cowsay" >> ~/.bashrc

Remplacer l'emplacement du script ~/anniv.py en fonction de l'endroit où vous l'avez mis sur votre machine.