HPI/my/fbmessenger/export.py
Dima Gerasimov 4626c1bba6 fbmessenger: support config migration for fbmessengerexport source
for now kinda copied from reddit... still thinking about a more generic way
2022-02-05 14:49:12 +00:00

89 lines
2.3 KiB
Python

"""
Facebook Messenger messages
Uses the output of [[https://github.com/karlicoss/fbmessengerexport][fbmessengerexport]]
"""
REQUIRES = [
'git+https://github.com/karlicoss/fbmessengerexport',
]
from dataclasses import dataclass
from pathlib import Path
from typing import Iterator
from my.config import fbmessenger as user_config
import fbmessengerexport.dal as messenger
###
# support old style config
_new_section = getattr(user_config, 'fbmessengerexport', None)
_old_attr = getattr(user_config, 'export_db', None)
if _new_section is None and _old_attr is not None:
from my.core.warnings import high
high("""DEPRECATED! Please modify your fbmessenger config to look like:
class fbmessenger:
class fbmessengerexport:
export_db: PathIsh = '/path/to/fbmessengerexport/database'
""")
class fbmessengerexport:
export_db = _old_attr
setattr(user_config, 'fbmessengerexport', fbmessengerexport)
###
from ..core import PathIsh
@dataclass
class config(user_config.fbmessengerexport):
export_db: PathIsh
def _dal() -> messenger.DAL:
return messenger.DAL(config.export_db)
# TODO Result type?
def messages() -> Iterator[messenger.Message]:
model = _dal()
for t in model.iter_threads():
yield from t.iter_messages()
from ..core import stat, Stats
def stats() -> Stats:
return stat(messages)
### vvv not sure if really belongs here...
def _dump_helper(model: messenger.DAL, tdir: Path) -> None:
for t in model.iter_threads():
name = t.name.replace('/', '_') # meh..
path = tdir / (name + '.txt')
with path.open('w') as fo:
for m in t.iter_messages(order_by='-timestamp'):
# TODO would be nice to have usernames perhaps..
dts = m.dt.strftime('%Y-%m-%d %a %H:%M')
msg = f"{dts}: {m.text}"
print(msg, file=fo)
def dump_chat_history(where: PathIsh) -> None:
p = Path(where)
assert not p.exists() or p.is_dir()
model = _dal()
from shutil import rmtree
from tempfile import TemporaryDirectory
with TemporaryDirectory() as tdir:
td = Path(tdir)
_dump_helper(model, td)
if p.exists():
rmtree(p)
td.rename(p)
td.mkdir() # ugh, hacky way of preventing complaints from context manager