diff options
Diffstat (limited to 'utils.py')
| -rw-r--r-- | utils.py | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..aea653b --- /dev/null +++ b/utils.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 +from pathlib import Path +from datetime import datetime + + +def now_str() -> str: + return datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + +def nots(line: str) -> str: + if line.startswith("[") and "]" in line: + return line.split("]", 1)[1].lstrip() + return line + + +def tail_lines(path: Path, n: int) -> list[str]: + # grabs the last n lines without reading the whole file into memory first, + # since memory.txt only ever grows and reading it fully every message doesn't scale + if n <= 0: + return [] + avg_line_bytes = 200 + with path.open("rb") as f: + f.seek(0, 2) + file_size = f.tell() + if file_size == 0: + return [] + block_size = n * avg_line_bytes + data = b"" + lines = [] + while True: + seek_pos = max(file_size - block_size, 0) + f.seek(seek_pos) + data = f.read(file_size - seek_pos) + lines = data.splitlines() + if len(lines) > n or seek_pos == 0: + break + block_size *= 2 + return [l.decode("utf-8", errors="ignore").strip() for l in lines[-n:] if l.strip()] |
