| 123456789101112131415161718192021222324252627282930313233343536373839 |
- """Lecture des fichiers texte (.txt) joints aux messages."""
- from __future__ import annotations
- import codecs
- TEXT_EXTENSIONS = (".txt",)
- # Taille maximale d'un fichier .txt (environ 25 000 tokens, pour limiter le coût d'un message).
- TEXT_FILE_MAX_BYTES = 100_000
- class TextFileError(Exception):
- """Fichier texte illisible ou refusé, avec un message affichable sur Discord."""
- def __init__(self, user_message: str):
- super().__init__(user_message)
- self.user_message = user_message
- def decode_text_file(data: bytes) -> str:
- """Décode le contenu d'un fichier .txt (UTF-16 avec BOM, UTF-8, sinon Windows-1252)."""
- if data.startswith((codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE)):
- # « Unicode » du Bloc-notes : deux octets par caractère, dont beaucoup de \x00.
- try:
- text = data.decode("utf-16")
- except UnicodeDecodeError:
- raise TextFileError("Ce fichier ne contient pas du texte lisible.")
- else:
- try:
- text = data.decode("utf-8-sig")
- except UnicodeDecodeError:
- # Fichiers enregistrés par d'anciens éditeurs Windows (Bloc-notes, etc.).
- text = data.decode("cp1252", errors="replace")
- if "\x00" in text:
- raise TextFileError("Ce fichier ne contient pas du texte lisible.")
- text = text.replace("\r\n", "\n").strip()
- if not text:
- raise TextFileError("Ce fichier texte est vide.")
- return text
|