From 5f18d9ca5405aa3c1e78645e155b8ed5ebf7eeb5 Mon Sep 17 00:00:00 2001
From: Bastien Le Querrec <blq@laquadrature.net>
Date: Sun, 1 Dec 2024 19:02:06 +0100
Subject: [PATCH] =?UTF-8?q?Attrap=5Fbot:=20stocke=20la=20date=20de=20d?=
 =?UTF-8?q?=C3=A9tection=20du=20dernier=20RAA=20vu?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Attrap_bot.py    | 81 ++++++++++++++++++++++++++++--------------------
 requirements.txt |  1 +
 2 files changed, 48 insertions(+), 34 deletions(-)

diff --git a/Attrap_bot.py b/Attrap_bot.py
index fa16364..192684d 100644
--- a/Attrap_bot.py
+++ b/Attrap_bot.py
@@ -4,6 +4,7 @@ import hashlib
 import json
 import logging
 import os
+import pytz
 import requests
 import smtplib
 import ssl
@@ -156,10 +157,13 @@ class Attrap_bot:
                 status_file_path = f'{query_id}.latest.txt'
                 if os.path.isfile(status_file_path):
                     status = open(status_file_path, 'r').read().strip()
+                    last_raa_id = status.split('|')[0]
+                    last_raa_first_seen_on = datetime.datetime.fromtimestamp(float(status.split('|')[1]), pytz.utc)
                     send_results = True
                 else:
                     logger.info('Requête lancée pour la première fois, les résultats ne seront pas envoyés')
-                    status = '0000000000000000000000000000000000000000000000000000000000000000'
+                    last_raa_id = '0000000000000000000000000000000000000000000000000000000000000000'
+                    last_raa_first_seen_on = datetime.datetime.now(pytz.utc)
                     if self.config['send_on_new_queries']:
                         send_results = True
                     else:
@@ -173,59 +177,68 @@ class Attrap_bot:
                     if os.path.isfile(status_file_path):
                         os.remove(status_file_path)
                     status_file = open(status_file_path, 'w')
+
+                    status = f'{last_raa_id}|{int(round(last_raa_first_seen_on.timestamp()))}'
                     status_file.write(status)
                     status_file.close()
                 else:
                     # Si le dernier RAA n'est pas celui connu, on analyse les résultats
                     latest = raa[0]
-                    if latest['id'] != status:
+                    if latest['id'] != last_raa_id:
                         email_message = ""
 
                         # On récupère les derniers RAA jusqu'à ce qu'on trouve le dernier analysé
                         raa_candidates = []
                         for result in raa:
-                            if result['id'] != status:
+                            if result['id'] != last_raa_id:
                                 raa_candidates.append(result)
                             else:
                                 break
 
                         # Maintenant, on prend les derniers RAA à analyser, pour commencer par les plus anciens en premier
                         for result in raa_candidates[::-1]:
-                            status = result['id']
-
-                            # On affiche le résultat dans la console
-                            if (self.config['console_output']):
-                                print(f"\033[92m{result['name']}\033[0m ({result['date']}) : {result['url']}")
-
-                            if send_results:
-                                # On ajoute le résultat à la liste des RAA à publier
-                                if send_to_mastodon:
-                                    if not raa_to_publish_mastodon.get(query['mastodon']):
-                                        raa_to_publish_mastodon[query['mastodon']] = {}
-                                    # On regroupe les toots par RAA (un toot par RAA)
-                                    if not raa_to_publish_mastodon[query['mastodon']].get(result['id']):
-                                        raa_to_publish_mastodon[query['mastodon']][result['id']] = result
-                                    # On indique le hashtag de la requête
-                                    if not raa_to_publish_mastodon[query['mastodon']][result['id']].get('hashtags'):
-                                        raa_to_publish_mastodon[query['mastodon']][result['id']]['hashtags'] = []
-                                    raa_to_publish_mastodon[query['mastodon']][result['id']]['hashtags'].append(hashtag)
-
-                                if send_email:
-                                    if not raa_to_publish_email.get(query['email']):
-                                        raa_to_publish_email[query['email']] = {}
-                                    # On regroupe les mails par administration (un mail par administration)
-                                    if not raa_to_publish_email[query['email']].get(result['administration']):
-                                        raa_to_publish_email[query['email']][result['administration']] = {}
-                                    if not raa_to_publish_email[query['email']][result['administration']].get(result['id']):
-                                        raa_to_publish_email[query['email']][result['administration']][result['id']] = result
-                                    # On indique le hashtag de la requête
-                                    if not raa_to_publish_email[query['email']][result['administration']][result['id']].get('queries'):
-                                        raa_to_publish_email[query['email']][result['administration']][result['id']]['queries'] = []
-                                    raa_to_publish_email[query['email']][result['administration']][result['id']]['queries'].append(query_id)
+                            # On vérifie que la date de détection du RAA est plus récente (au cas où l'API n'ait pas renvoyé
+                            # tous les résultats, ce qui arrive pendant une mise à jour de la base de données)
+                            first_seen_on = datetime.datetime.fromisoformat(result['first_seen_on'])
+                            if first_seen_on > last_raa_first_seen_on:
+                                last_raa_id = result['id']
+                                last_raa_first_seen_on = result['first_seen_on']
+
+                                # On affiche le résultat dans la console
+                                if (self.config['console_output']):
+                                    print(f"\033[92m{result['name']}\033[0m ({result['date']}) : {result['url']}")
+
+                                if send_results:
+                                    # On ajoute le résultat à la liste des RAA à publier
+                                    if send_to_mastodon:
+                                        if not raa_to_publish_mastodon.get(query['mastodon']):
+                                            raa_to_publish_mastodon[query['mastodon']] = {}
+                                        # On regroupe les toots par RAA (un toot par RAA)
+                                        if not raa_to_publish_mastodon[query['mastodon']].get(result['id']):
+                                            raa_to_publish_mastodon[query['mastodon']][result['id']] = result
+                                        # On indique le hashtag de la requête
+                                        if not raa_to_publish_mastodon[query['mastodon']][result['id']].get('hashtags'):
+                                            raa_to_publish_mastodon[query['mastodon']][result['id']]['hashtags'] = []
+                                        raa_to_publish_mastodon[query['mastodon']][result['id']]['hashtags'].append(hashtag)
+
+                                    if send_email:
+                                        if not raa_to_publish_email.get(query['email']):
+                                            raa_to_publish_email[query['email']] = {}
+                                        # On regroupe les mails par administration (un mail par administration)
+                                        if not raa_to_publish_email[query['email']].get(result['administration']):
+                                            raa_to_publish_email[query['email']][result['administration']] = {}
+                                        if not raa_to_publish_email[query['email']][result['administration']].get(result['id']):
+                                            raa_to_publish_email[query['email']][result['administration']][result['id']] = result
+                                        # On indique le hashtag de la requête
+                                        if not raa_to_publish_email[query['email']][result['administration']][result['id']].get('queries'):
+                                            raa_to_publish_email[query['email']][result['administration']][result['id']]['queries'] = []
+                                        raa_to_publish_email[query['email']][result['administration']][result['id']]['queries'].append(query_id)
 
                         if os.path.isfile(status_file_path):
                             os.remove(status_file_path)
                         status_file = open(status_file_path, 'w')
+
+                        status = f'{last_raa_id}|{int(round(last_raa_first_seen_on.timestamp()))}'
                         status_file.write(status)
                         status_file.close()
 
diff --git a/requirements.txt b/requirements.txt
index a76ddfe..a4a8a81 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,4 +1,5 @@
 Mastodon.py>=1.8.1
 pycodestyle>=2.12.1
+pytz>=2024.2
 pyyaml>=6.0.2
 requests>=2.32.3
-- 
GitLab