purge_weechat_logs.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #!/usr/bin/env python3
  2. #
  3. # This script is supposed to be executed with cron
  4. # (https://en.wikipedia.org/wiki/Cron)
  5. #
  6. # This script also assumes that your weechat logfile mask is:
  7. # /set logger.mask.irc "irc/$server/%Y-%m/%d-$channel.weechatlog"
  8. #
  9. # Once you're set up, remember to change dryrun=True to False to
  10. # actually make the script remove files.
  11. import os
  12. import re
  13. import sys
  14. from datetime import datetime, timedelta
  15. from os.path import join, isfile
  16. # Full path to your weechat IRC log directory
  17. LOG_BASE = "/home/user/.local/share/weechat/logs/irc"
  18. pattern = re.compile(r'(\d{4}-\d{2})/(\d{2})-(.+).weechatlog$')
  19. # Delete logs older than this many days
  20. # In your crontab, you can set it to run every day at 2pm:
  21. # 0 14 * * * /usr/bin/python3 /full/path/to/this/script.py
  22. PURGE_END = datetime.now() - timedelta(days=7)
  23. # Map of "server": ["#channel0", "#channel1", "user"] to purge.
  24. PURGE_MAP = {
  25. "darkfi": ["#dev", "#math", "god"],
  26. "libera": ["##rust"],
  27. }
  28. def main(dryrun=True):
  29. to_delete = []
  30. for server, channels in PURGE_MAP.items():
  31. for dirpath, _dirnames, filenames in os.walk(join(LOG_BASE, server)):
  32. for filename in filenames:
  33. full_path = join(dirpath, filename)
  34. match = pattern.search(full_path)
  35. if match:
  36. date_str = "-".join(match.groups()[:-1])
  37. channel = match.groups()[-1]
  38. if channel not in channels:
  39. continue
  40. file_date = datetime.strptime(date_str, "%Y-%m-%d")
  41. if file_date < PURGE_END:
  42. to_delete.append(full_path)
  43. if dryrun:
  44. for fname in to_delete:
  45. print(f"[DRYRUN] Deleting: {fname}")
  46. return 0
  47. for fname in to_delete:
  48. if isfile(fname):
  49. try:
  50. os.remove(fname)
  51. except:
  52. print(f"[WARNING] Failed to remove {fname}")
  53. continue
  54. return 0
  55. if __name__ == "__main__":
  56. sys.exit(main())